如何更好地使用Modbus TCP-现场总线-酷德网 - CoDeSys软件教程下载,CoDeSys工控资讯门户 

酷德网

HSC6490-cn中国制造,中国芯~
查看: 1796|回复: 0

如何更好地使用Modbus TCP

[复制链接]
  • TA的每日心情
    开心
    2017-11-20 22:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2025-2-13 10:57:50 | 显示全部楼层 |阅读模式
    很久没更新文章了。发现更多关注的是更基础的知识和应用。其中最多的莫过于Modbus了。基本国内的大部分工业通信数据采集,还是基于Modbus的。今天就写点关于Modbus TCP的吧。来分享一些在实际中遇到的一些问题及技巧,如何更好地使用Modbus TCP。

    假如你有一个PLC,是支持Modbus TCP通信的。你需要用电脑,或者HMI或者另外的设备,通过Modbus TCP去访问这个PLC。正常的咱们就不讨论了。就聊一些不太正经的通信。我们无非就是希望通信稳定和快。最好是又稳又快了。先来聊聊通信稳定。因为是基于TCP的通信,很少出现说通信不稳定,只要不是网络很拥挤,网线很长的情况。但是有时候会遇到这样的情况,在使用一段时间后,Modbus TCP通信不上了。需要重启设备才能重新连接上。

    我们不考虑从站的情况,我们只考虑主站。主站这边如何处理会让通信更稳定一些呢。那我们就先分析主站的通信过程。1 连接PLC。根据设置的PLCIP和端口连接。只要网络参数没问题,没有MAC地址冲突和IP地址冲突,基本都成连接成功。2 发送读写报文请求。3 等待回复数据。4 根据情况是否断开连接。5 根据实际情况重复1到4。

    01
    如果第1步失败了呢

    连接不上。一般我们就是先排查网路因素,尝试ping设备,看是否网络正常。看PLC的502端口是否开通。
    02
    如果第3步失败了呢
    一般第2步不会失败,因为只要连接上了,就能发送。主要是看发送的数据对不对,地址,站号,请求长度等。当然有条件的,可以抓包看看对方有没有收到之类的。
    03
    如果第5步失败了呢

    想不到吧,通信好好的,突然通信不上了。那我们来看看我们通信异常一般如何处理的。如果连接不上,一般就是反复在那里连接,直到连接成功为止。如果是请求超时呢。是继续反复请求呢,还是会断开连接,然后回到第一步重新连接。

    因为在实际使用中,如果遇到请求超时,是有可能是连接丢失的,比如PLC单方面重启了。这时候主站就得重新连接才能恢复通信的。那如果是反复连接之后,就再也连接不上,PLC还能ping通,但是就是连接不上502端口了。需要PLC重启才可以的。需要发起重新连接的原因很多,比如网络不稳定,出现请求超时,或者某次请求的寄存器或者长度,超过PLC的范围,PLC不响应了。种种原因。就是需要重新连接PLC的。

    为什么会突然再也连接不上了呢
    其实这个问题才是最棘手的,笔者也遇到过多次这样的场合。后来发现根本原因是PLC的502端口做为server的连接超上限的。比如,有的PLC,开放502端口做server,可能设置了上限是10个。主站每连接一个,就占用一个连接资源。主站断开,正常情况下,PLC会把这个资源释放出来,这样就可以反复被连接了。但是会有一些原因,导致这个资源释放不出来的。比如,突然拔网线这种,类似于交换机或者路由器的断电,但是PLC和主站没有断的。或者主站的断开没有通知成功。反正就是PLC的资源连接释放不出来。这就会出现一直连接不上的情况了。

    固定本地端口出妙招
    这种情况下,可以考虑主站这边连接PLC,固定本地端口的方法。比如主站这边固定一个20000的端口去连接PLC的502端口。这样即便主站这边断开再连接,再怎么反复连接,对PLC那边,始终是一个连接的资源。只要曾经连接成功过,再怎么重新连接,PLC那端始终有一个位置留在主站。除非PLC真的被别的设备已经连接满了。不然主站就能一直重新连接上。笔者用这种方法,解决不少一些现场因为这种原因导致的一段时间通信不上的情况。

    如何提升通信效率呢

    通信先稳定了,再考虑如何进一步提升通信效率。
    01
    地址尽量连续

    地址连续,就可以进行组包。减少请求的次数。
    Modbus TCP可以一次请求一百多个寄存器。就算请求最大寄存器个数,对方回复的数据也不会超过TCP的MTU。所以可以放心地组包。报文请求一个字和请求一百字,TCP传输时间是一样的。除非PLC这端处理有特殊情况不能组包。
    02
    组包跨度和长度尽量大

    这个也是为了尽量组包请求。比如你有4X1和4X31两个地址,其实是可以只请求一次就行了。不需要分开两次请求的。这样就提高了通信效率。
    03
    多添加一个主站连接通信

    如果你的PLC支持多个Modbus TCP连接,你的主站是电脑或者HMI的话,也不妨可以多加一个连接。这样一个连接主要进行常规的读写请求。另一个连接可以进行一些需要响应比较快的,数据量少的一些写操作或者重要数据的优先读取。
    04
    合理地调节读写通信请求间隔

    通信不是请求越快越好。PLC也是需要时间处理和响应的。特别是对于写请求,有的PLC需要处理的时间更长(有的PLC是先回复写请求,再去执行写操作的)。在PLC还没有处理完成写操作,主站就着急地发下一包通信,可能PLC会响应不过来,或者响应慢了,主站以为超时了,请求别的读。PLC又回复了,会造成串包等问题。
    05
    对不同的数据设置不同的请求频率或速度

    对于要求不高的数据,可以设置更低的采集周期,一来可以减缓通信压力,二来可以让更重要的数据,得到更快的响应。
    06
    尽量不要使用或者少用字里的位

    Modbus本身有位寄存器,0X,1X。但是就有用户使用4X字寄存器里的位。比如4X1有16个位,就有用户喜欢把16个位单独拿出来读写。比如对4X1的第8位写1,通信上就需要先读4X1的数据,然后将第8位的数据改掉,其它15位的数据保持,然后进行回写。通信就要多花一次请求呢。

    Modbus TCP的站号有用么
    有用,但不多。
    因为ModbusTCP是基于TCP/IP连接的。一般对于网络PLC来说,一个PLC,一个IP和端口,基本只做一个ModbusTCP服务。这样对于站号来说,就显得多余了。所以很多Modbus TCP 服务,一般是可以选择忽略站号。支持忽略站号功能,可以在一定程度上,减少调试工作的。不需要去确认设备的站号和设置。


    但也不是说没有用。
    有的PLC,变量比较多的,超过了65535的数据了怎么办。
    这时候,站号就可以利用起来了。
    比如站号1是访问前64K数据,站号2是访问后64K数据。这样通过站号的区分,还能解决一个服务只能访问65535个地址的问题。


    +10
    不赞一个?
    打赏鼓励一下!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    
    顶部qrcode底部
    关注酷德网订阅号,获取更多资讯!

    QQ|Archiver|手机版|小黑屋|酷德论坛 ( 苏ICP备16065247号-1 )|网站地图

    GMT+8, 2026-10-11 12:36 , Processed in 0.133850 second(s), 43 queries .

    酷德网

    © 2001-2013 Hicodesys. 技术支持 by 酷德网

    快速回复 返回顶部 返回列表