回复:【分享】Modbus通讯失败后数据一直保持不变,差点引起事故,检查Modbus通讯失败次数

若年

  • 帖子

    72
  • 精华

    2
  • 被关注

    7

论坛等级:侠客

注册时间:2015-08-16

普通 普通 如何晋级?

发布于 2016-01-21 22:30:36

10楼

展开查看
以下是引用宁超在2015-12-02 09:15: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位来触发报警了。也可以指示从站的错误位置。


,问题在工程中隐藏较深,不易发现,察觉或发现也是要付出一些代价的。没有相当经验和严谨细致的追求,在设计阶段难以发现和预处理,有很好的借鉴意义和分享价值。 2,编程规整,易读,有水平。值得封精推荐。
一切源于梦想
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。