恭喜,你发布的帖子
发布于 2016-01-21 22:30:36
10楼
已经不是第一次碰到业主提出这样的问题: Modbus通讯读取的数据存放到PLC的DB块后,当通讯丢失了以后,WinCC上任然显示的是最后一次通讯正常录入DB数据块的一个正常值,让操作人员和维护人员都误认为一切正常,比如电机温度,轴承温度等。过了很长时间甚至是出了事故后才发现那个值原来一直都没有变过!!
于是有了这样的要求:通讯失败时要报警提示或者清零数据
STL代码:
L P##ErrorTimes // ErrorTime [1..31] of byte 记录了31个从站号分别错误的次数
LAR1 //装载记录错误数组起始地址到指针
L #Slave //当前正在作业的从站号
L 1
-I
ITD
SLD 3
TAR1
+D
LAR1 //根据从站号发生偏移,找到属于改从站记录数组中byte对应的位置
/////////////////////////////////
A #S_ERROR //如果发送错误
JCN a2b0
L DIB [AR1,P#0.0]
L 1
+I
T DIB [AR1,P#0.0] //发送错误那么错误次数累加1
a2b0: CLR
A #S_DONE //如果发送正确
JCN a3b0
L 0
T DIB [AR1,P#0.0] //发送成功后将错误次数清零
a3b0: NOP 0
L DIB [AR1,P#0.0] //该站累计的错误次数超过了设定的最大限度,如错误次数达到5次
L #MaxErrTs
>I
= #ErrorAct //错误次数超出
/////////////////////////////
//以下程序目的是将从站错误标志位放入Dword里(UserStatus )
//如只有Slave1和Slave3从站错误,那么Dowrd的值应该是
//00000000 00000000 00000000 00000101
////////////////////////////////
L #Slave
L 1
-I
L 8
/D
L 3
TAK
-I
ITD
SLD 3
T #ByteReg
/////////////////////////////
L #Slave
L DW#16#1
-D
L DW#16#8
MOD
T #BitReg
//////////////////////////////
L #ByteReg
L #BitReg
+D
T #DwordReg
//////////////////////////////
L P##UserStatus
LAR1
TAR1
L #DwordReg
+D
LAR1 // 以上代码为对应状态字位的算法
//////////////////////////////
A #ErrorAct
= [AR1,P#0.0] //如果错误次数超出设定值就吧相对应的状态字位置1
-----------------------------------------------------------------------------------
然后 :
有了状态字后就可以通过取BooL位来触发报警了。也可以指示从站的错误位置。
请填写推广理由:
分享
只看
楼主