step 7程序解读(s7——400) 哪位好心的人给我解读一下程序,最好有每一步实现了什么 ,万分感谢

OPN#DB_NRL#DB_ADRSLD7LAR1L#AI_COUNTlp1:T#anzahl_loopLDBW[AR1,P#0.0]T#zs_pewSLD3T#zs_p... OPN #DB_NR

L #DB_ADR
SLD 7
LAR1

L #AI_COUNT
lp1: T #anzahl_loop
L DBW [AR1,P#0.0]
T #zs_pew
SLD 3
T #zs_pew
L IW [#zs_pew]
ITD
DTR
T #zs
L DBD [AR1,P#2.0]
T #scale_low
L DBD [AR1,P#6.0]
T #scale_high

L #scale_high
L #scale_low
-R
L 2.764800e+004
/R
L #zs
*R
L #scale_low
+R
T DBD [AR1,P#10.0]

L IW [#zs_pew]
T #act

SET
= DBX [AR1,P#14.0]
= DBX [AR1,P#14.1]
= DBX [AR1,P#14.2]
L -3455
L #act
>I
R DBX [AR1,P#14.0]
JC end
L 31100
>I
R DBX [AR1,P#14.1]

end: ON DBX [AR1,P#14.0]
ON DBX [AR1,P#14.1]
R DBX [AR1,P#14.2]

A DBX [AR1,P#14.2]
JC IO
L 0.000000e+000
T DBD [AR1,P#10.0]

IO: +AR1 P#16.0
L #anzahl_loop
LOOP lp1
展开
 我来答
sasa7557
2011-07-09 · TA获得超过461个赞
知道小有建树答主
回答量:107
采纳率:100%
帮助的人:180万
展开全部
OPN #DB_NR 打开#DB_NR这个DB块号,#DB_NR是个DB类型的数据。这里是在DB寄存器中载入了DB号。

L #DB_ADR 载入DB_ADR这个变量。具体类型请看输入数据,应该是INT或者是DINT类型的。不过DINT右移7位可能出现负数或者丢位。
SLD 7 右移动七位,相当于乘以128.
LAR1 放入到AR1地址寄存器。

L #AI_COUNT 放入变量AI_COUNT,也就是放入循环初始值
lp1: T #anzahl_loop 传出到anzahl_loop,这是循环计数值。IP1是循环跳转地址。
L DBW [AR1,P#0.0] 放入地址为DBW#DB_ADR*128的地址,地址单位为位。
例如,如果传入数据为0,那么就是放入DBW0开始的的字,如果传入数据为1,就是放入DBW16开始的字(因为DB编号以字节为单位,所以,1*128/8=16,如果是2则为32)这里比较绕。 T #zs_pew 传送到变量#zs_pew
SLD 3 右移三位(乘以8,也就是寻址B)
T #zs_pew 传送到#zs_pew
L IW [#zs_pew] 载入经过变换为地址的IW#zs_pew
ITD int转换DINT(整数变成长整数)
DTR DINT转换REAL(长整数转为浮点数)
T #zs 传送到#zs

就解读到这里,下面的请自己根据语句表的规范解读
L DBD [AR1,P#2.0]
T #scale_low
L DBD [AR1,P#6.0]
T #scale_high

L #scale_high
L #scale_low
-R
L 2.764800e+004
/R
L #zs
*R
L #scale_low
+R
T DBD [AR1,P#10.0]

L IW [#zs_pew]
T #act

SET
= DBX [AR1,P#14.0]
= DBX [AR1,P#14.1]
= DBX [AR1,P#14.2]
L -3455
L #act
>I
R DBX [AR1,P#14.0]
JC end
L 31100
>I
R DBX [AR1,P#14.1]

end: ON DBX [AR1,P#14.0]
ON DBX [AR1,P#14.1]
R DBX [AR1,P#14.2]

A DBX [AR1,P#14.2]
JC IO
L 0.000000e+000
T DBD [AR1,P#10.0]

IO: +AR1 P#16.0
L #anzahl_loop
LOOP lp1
追问
万分感谢,
但是 L DBW [AR1,P#0.0] 不是就是AR1的地址吗?L DBD [AR1,P#2.0] 则地址是AR1+2?
右移三位(乘以8,也就是寻址B)没有明白B是什么意思,
循环的目的是什么?
这个程序是不是实现了一个什么功能啊?是一个模拟量输入的一个转化吗?
追答
是的,
L DBW[ar1,p#0.0]就是载入地址寄存器1指向的地址,载入的大小为W(也就是字,16位),而
L DBW[AR1,P#2.0]就是AR1+P#2.0,也就是便宜两个字节,查找下一个字。

右移动三位,就等于乘以8,这个有特定条件的,第一,右移动的必须是正整数(否则符号位就被丢弃了),第二,右移动必须是比较小的正整数,没有超限,否则就会出现溢出之类的,由于指针型的数据一般不大,所以大部分都采用右移动来代替乘以字节宽度(指针型的数据后三位都为位地址,而int的数据全都是表示数字的),这里的B就是字节,例如,如果你在ACC1载入的数据是int的数1,那么你的最低位为1,如果右移3位,则ACC1里面的数据就为1000,后面三位是位地址,所以这时候的指针相当于p#1.0如果是你寻址L MB[AR1,P#0.0],则等于寻址MB1的内容。

这个功能块前面是寻址DB数据块的内容,顺序读出某个DB块里面的工程数值,并通过模拟量转换,传输到这个数据块的后面的数据。相当于某个数据块中可能有存放工程数据、浮点数据(如频率50.0HZ之类),以及超限状态数据 = DBX [AR1,P#14.0] = DBX [AR1,P#14.1]
= DBX [AR1,P#14.2],这些数据为有结构有规律的多组,通过这个数据转换模块之后,转换出浮点数据和状态数据,更新到这个DB块中,并通过循环将这个数据块的所有数据进行整定。明白了没。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式