西门子S7-300 连用4个L指令是何用法?
在块OB1中LDW#16#AAAAAAAATMD5LDW#16#BBBBBBBBTMD9LDW#16#CCCCCCCCTMD13LDW#16#DDDDDDDDTMD17C...
在块OB1中
L DW#16#AAAAAAAA
T MD 5
L DW#16#BBBBBBBB
T MD 9
L DW#16#CCCCCCCC
T MD 13
L DW#16#DDDDDDDD
T MD 17
CALL FC 1
INPUT_Pointer:=P#M 5.0
L MD 5
L MD 9
L MD 13
L MD 17
问题:
怎样决定由指针类型的传送输入变量组成的函数的对应地址?
解答:
STEP 7将指针参数类型存储在6个字节中。可以从这6个字节决定其地址。下表显示了指针格式的说明:
1514131211109876543210字节 0DB数 ( 或0 )字节 1字节 2内存区(见下)00000bbb字节 3字节 4bbbbbbbbbbbbbxxx字节 5b = 字节地址
x = 位地址
注意事项:
如果指针没有指向数据块,输入“0”作为DM数。
内存区域(字节2)编码如下:
十六进制码区域描述B80I/O直接存储B81E输入内存区B82A输出内存区B83M标记内存区B84DB数据块B85DI情景数据块B86L本地数据(L栈)B87V上一本地数据(V栈)如果将一个指针类型输入参数传送到函数中,那么STEP 7就从指定地址中生成指针格式。生成的数据存储在调用块的本地数据栈中。只有数据的地址(由地址调用)传送到被调用的函数。从函数的角度来说此数据位于上一L栈中,此L栈依次对应到调用块的L栈(OB不能访问V栈)。在 函数中您需要确定实地址。
为了确定传送地址,请将一个指针载入到函数的输入变量中。接下来将累加器的内容传送到地址寄存器。此时地址寄存器中就有了一个地址。在这个地址中是指向数据记录的另一个地址。
累加器1地址寄存器1L p#input_pointer87xxxxxx LAR187xxxxxxV xy.0通过地址寄存器的间接寻址可以从数据记录的字节2中获取到真正的内存区。寻址得到的字节地址可以从字节2到4中过滤出来(例如通过移位操作)。
用以下给出的命令可以将实地址载入到地址寄存器中。
累加器1地址寄存器1L D[AR1, p#2.0] LAR1 实地址在把临时变量赋予指针变量时请注意如果当前载入到AR1中的值寻址到块的L栈(域码16#86),那么通过随后对此区域的访问,可以准确寻址到内存内的本地变量。
L L...[AR1,p#x.y]
T L...[AR1,p#x.y]判断数据块号时要特别注意的几点:
如果把通过DB1寄存器寻址到的一个数据块地址传送到函数中(没有准确说明数据块号,例如p#DBX0.0),那么就不能从字节0和1中确定数据块号。
如果向函数的地址传送发生在功能块中,此功能块中指针指向情景数据块中的一个变量(IN / OUT / IN_OUT / STATIC),那 么就可以决定数据块号。然而应通过DB寄存器访问寻址到的变量。
累加器1地址寄存器1DB 1DB 2L p#input_pointer87xxxxxx LAR187xxxxxxV xy.0 L W[AR1,p#0.0]DB no.V xy.0 T temp_db TO DB[temp_db] <temp_db> TO DI[temp_db] <temp_db><temp_db>样本函数:
以下项目演示了指针向函数的传送。在组织块OB1 下述内容传送到了函数FC1中:
指向标记地址的指针
指向数据块地址的指针。
FC参数:
参数声明数据类型描述INPUT_Pointer输入指针传送起始地址在函数中通过指针变量可同时确定内存区域和字节及位地址。由示例方法,将 16#11111111添加到通过指针寻址到的变量块中.
下载:
下载包含了带有函数FC1、数 据块DB1和从组织块OB1中举例调用的STEP 7 V5项目。
Pointer.exe ( 137 KB )
复制“Pointer.exe”文件到一个单独的目录中然后双击运行它。STEP 7 V5项目将自动解压。然后使用SIMATIC管理器打开该项目。 展开
L DW#16#AAAAAAAA
T MD 5
L DW#16#BBBBBBBB
T MD 9
L DW#16#CCCCCCCC
T MD 13
L DW#16#DDDDDDDD
T MD 17
CALL FC 1
INPUT_Pointer:=P#M 5.0
L MD 5
L MD 9
L MD 13
L MD 17
问题:
怎样决定由指针类型的传送输入变量组成的函数的对应地址?
解答:
STEP 7将指针参数类型存储在6个字节中。可以从这6个字节决定其地址。下表显示了指针格式的说明:
1514131211109876543210字节 0DB数 ( 或0 )字节 1字节 2内存区(见下)00000bbb字节 3字节 4bbbbbbbbbbbbbxxx字节 5b = 字节地址
x = 位地址
注意事项:
如果指针没有指向数据块,输入“0”作为DM数。
内存区域(字节2)编码如下:
十六进制码区域描述B80I/O直接存储B81E输入内存区B82A输出内存区B83M标记内存区B84DB数据块B85DI情景数据块B86L本地数据(L栈)B87V上一本地数据(V栈)如果将一个指针类型输入参数传送到函数中,那么STEP 7就从指定地址中生成指针格式。生成的数据存储在调用块的本地数据栈中。只有数据的地址(由地址调用)传送到被调用的函数。从函数的角度来说此数据位于上一L栈中,此L栈依次对应到调用块的L栈(OB不能访问V栈)。在 函数中您需要确定实地址。
为了确定传送地址,请将一个指针载入到函数的输入变量中。接下来将累加器的内容传送到地址寄存器。此时地址寄存器中就有了一个地址。在这个地址中是指向数据记录的另一个地址。
累加器1地址寄存器1L p#input_pointer87xxxxxx LAR187xxxxxxV xy.0通过地址寄存器的间接寻址可以从数据记录的字节2中获取到真正的内存区。寻址得到的字节地址可以从字节2到4中过滤出来(例如通过移位操作)。
用以下给出的命令可以将实地址载入到地址寄存器中。
累加器1地址寄存器1L D[AR1, p#2.0] LAR1 实地址在把临时变量赋予指针变量时请注意如果当前载入到AR1中的值寻址到块的L栈(域码16#86),那么通过随后对此区域的访问,可以准确寻址到内存内的本地变量。
L L...[AR1,p#x.y]
T L...[AR1,p#x.y]判断数据块号时要特别注意的几点:
如果把通过DB1寄存器寻址到的一个数据块地址传送到函数中(没有准确说明数据块号,例如p#DBX0.0),那么就不能从字节0和1中确定数据块号。
如果向函数的地址传送发生在功能块中,此功能块中指针指向情景数据块中的一个变量(IN / OUT / IN_OUT / STATIC),那 么就可以决定数据块号。然而应通过DB寄存器访问寻址到的变量。
累加器1地址寄存器1DB 1DB 2L p#input_pointer87xxxxxx LAR187xxxxxxV xy.0 L W[AR1,p#0.0]DB no.V xy.0 T temp_db TO DB[temp_db] <temp_db> TO DI[temp_db] <temp_db><temp_db>样本函数:
以下项目演示了指针向函数的传送。在组织块OB1 下述内容传送到了函数FC1中:
指向标记地址的指针
指向数据块地址的指针。
FC参数:
参数声明数据类型描述INPUT_Pointer输入指针传送起始地址在函数中通过指针变量可同时确定内存区域和字节及位地址。由示例方法,将 16#11111111添加到通过指针寻址到的变量块中.
下载:
下载包含了带有函数FC1、数 据块DB1和从组织块OB1中举例调用的STEP 7 V5项目。
Pointer.exe ( 137 KB )
复制“Pointer.exe”文件到一个单独的目录中然后双击运行它。STEP 7 V5项目将自动解压。然后使用SIMATIC管理器打开该项目。 展开
2个回答
展开全部
SET //将RLO(逻辑运算结果保存位)位置1,
SAVE //将RLO结果保存到BR位,以保证下面的程序可以执行。
= L 0.1 //将RLO位保存到L0.1临时存储区位
L #IN3 //装载#IN3这个变量到ACC1
SAVE //将RLO结果保存到BR位,以保证下面的程序可以执行。
ITD //将ACC 1中的数值转换为双整数
DTR //将ACC1的双整数转为浮点数,最终#IN3变成了浮点数,保存在了ACC1
SAVE //将RLO结果保存到BR位
L 1.000000e+001 //装载10.0到ACC2
/R //ACC2除以ACC1,也就是10.0除以#IN3变量,结果保存在ACC1
JO M001 //如果有溢出那么跳转到M001
JU M002 //如果没有溢出那么跳转到M002
M001: CLR //清除RLO位
= L 0.1//RLO结果暂存到L0.1临时存储区
M002: T #IO9 //将ACC1的数据传送给#IO9变量
CLR //清除RLO位
A #STAT65 //检查#STAT65是否为1
NOT //对RLO取反
A #IN0 //检查#IN0是否为1
JCN M003 //如果以上逻辑运算结果为0跳转到M003
L #IO9 //如果逻辑运算结果为1,那么装载#IO9
T #STAT66 //将#IO9传送给#STAT66
L #IO9 //装载#IO9
T #IO10 //将#IO9传送给#IO10
L 0.000000e+000 //装载0.0
T #STAT67 //创送0.0给#STAT67
M003: CLR //清零RLO
SAVE //将RLO结果保存到BR位,以保证下面的程序可以执行。
= L 0.1 //将RLO位保存到L0.1临时存储区位
L #IN3 //装载#IN3这个变量到ACC1
SAVE //将RLO结果保存到BR位,以保证下面的程序可以执行。
ITD //将ACC 1中的数值转换为双整数
DTR //将ACC1的双整数转为浮点数,最终#IN3变成了浮点数,保存在了ACC1
SAVE //将RLO结果保存到BR位
L 1.000000e+001 //装载10.0到ACC2
/R //ACC2除以ACC1,也就是10.0除以#IN3变量,结果保存在ACC1
JO M001 //如果有溢出那么跳转到M001
JU M002 //如果没有溢出那么跳转到M002
M001: CLR //清除RLO位
= L 0.1//RLO结果暂存到L0.1临时存储区
M002: T #IO9 //将ACC1的数据传送给#IO9变量
CLR //清除RLO位
A #STAT65 //检查#STAT65是否为1
NOT //对RLO取反
A #IN0 //检查#IN0是否为1
JCN M003 //如果以上逻辑运算结果为0跳转到M003
L #IO9 //如果逻辑运算结果为1,那么装载#IO9
T #STAT66 //将#IO9传送给#STAT66
L #IO9 //装载#IO9
T #IO10 //将#IO9传送给#IO10
L 0.000000e+000 //装载0.0
T #STAT67 //创送0.0给#STAT67
M003: CLR //清零RLO
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询