浅析RS485上面的Modbus通信

通信网络

624人已加入

描述

在Modbus通信中,使用ModbusRTU还是比较多的,在使用Modbus的串口通信中,使用485的也是比较多,当然,出现问题比较多的还是485的。

那为什么485使用起来那么多问题,还是那么多人选择使用485呢。

那就不得不讲讲485和232的区别了。

串口通信

什么是全双工?简单地说,就像我们现在的手机打电话,两个人可以同时说话的,只是我们习惯了一个人先说,另一个人再说。如果能力允许的话,两个人完全可以同时说话,提高聊天效率的。

那半双工呢,就像以前的对讲机,先有一个说话,说完之后,还要加一句over,然后对方再按开关说话。完了还在补一句over。

而Modbus协议呢,从交互流程来说呢,是属于一问一答的形式。

先由主站发起读或者写请求,从站收到命令之后,再作回复。因此,在这里,全双工的优势并不能发挥出来。

而RS232呢,只能一对一通信,RS485,可以做到一对多通信。这个一对多,指的是,在485总线网络里,只能有一个主站,可以有多个从站。

在这一点上,如果主控制器需要接多个从控制器的,485的优势就发挥出来了。

通信距离,RS232呢,一般是小于15米,也有说是小于20米的,笔者选择保守一些,就小于15米吧。如果是按遵循EIA/TIA-232标准,然后最大线路对地电容量为2500pF,对100pF/m的电缆,则长为25米。所以取个保守点的值吧。

所以通信距离来说,RS485的优势又胜了。

信号传输,RS232是共地传输的,因此也就决定了通信距离,共地传输呢,也容易有共模信号干扰。RS485是差分传输的,所以传输距离也长一些,也因此只需要两根差分信号线就可以了,同时也决定其只能使用半双工的形式。

RS422我们就暂时不介绍了。RS422是综合了RS232和RS485的优点和缺点。

综合来看呢,在很多场合用485就特别合适了。特别是需要一对多的情况,只能非485莫属了。

既然说Modbus 的RS485可以一对多,那最多是允许接多少个设备呢。

听过比较多的答案是32台设备。

当然,这并不是绝对的,很多现场连10台都达不到。有些现场也能超过32台的。

那为什么是32呢。因为是官方Modbus 文档说的,大家也就按这个标准回答了。

那官方说这个数字的依据是什么呢。

所允许的地址,设备使用RS485单元负载总量,以及所需要的线偏置。

其实这里面,实际还是看其负载总量。

简单点说,具体看实际情况。理论只是理论。这可是很有用的废话。

RS485要怎么接呢。

菊花链接法

串口通信

这种接法是最常见,也是RS485建议使用的。

简单点来说,就是A接A,B接B。一个接一个,手拉手式的。如果再画下去,就会像一个菊花瓣的一样的,所以就叫菊花链接法。

总线式接法

串口通信

其实这种接法呢,一般只存在于图片中,因为在实际的485接法中,很容易将总线式接成菊花链接法,因为主要都是一个接一个,手拉手。

谁会好端端地在总线上抠一个口出来,然后把线接上去呢。

或者你会问,那可以都把线从一个主控设备引出来呀。这么做的话,那又变成了星型接法了。

所以说RS485,很少看到有总线型接法的。

星型接法

串口通信

简单地说,就是所有的接线,都从一个地方出来。

星型接法呢,如果对于从设备少的话,比如只有两三个,其实也还少,问题不大的。但是如果设备多了,比如七八个,甚至十个,估计主控的接线端子都扛不住了吧,得拧多大的一坨线端子,带来隐患不说,又不美观,而且看起来还不专业。

当然了,如果从设备多,都想使用星型接法,那在主控这端,可以加一个485集线器,这样从设备都接到集线器这里,再由集线器和主控设备接起来。无端增加一个集线器,何必呢。

所以综合来说,还是建议使用菊花链接法。最多也就两个线接在一个端子上,也不会拧出一大坨线,稍微打扮一下,接线看起来还是比较美观,而且还专业。

线接好了,我们就可以通信了。

Modbus的RS485通信,还有哪些要注意的么。

要正确使用Modbus 的RS485通信,还是有一些前提条件的。

在RS485总线上,只能有一个主站设备。主站设备没有自己的站号。只有从站设备才有站号的概念。

在RS485总线上,Modbus 的从站设备,设备站号不能冲突,且不能为广播站号0。

在RS485总线上,设备要上电,才能进行工作和通信。

这看起来就是一句废话,但是笔者就是在一些现场中,遇到客户忘了给设备上电,然后一直测试发现通信不上。

其实前提条件也不是很苛刻,不过,可能就会有读者有疑惑的。

我们回到读者提问环节。

1)在RS485总线上,Modbus 的从设备站号有限制呢,一定要按顺序嘛。

Modbus的通信,是由主站发起的通信,要访问的设备,是提前在主站设备设置的。

但是呢,有一些主控设备呢,支持动态站号扫描。

比如主控会在启动的过程中,或者出现中断异常之后,需要进行恢复,就会进行站号扫描。

简单点说,就是从站1号,挨个请求,看哪个设备有回复。如果设备号设置太大,就会增加扫描时间或者通信恢复时间。比如设置站号250。扫描一个设备需要100ms左右,那得需要25秒才能扫描上。

所以,建议在使用中,站号尽量往小了设置,然后再依次增加。

2) 梁老师,你写的文章水货,哦,不是,干货真多,能加你微信么。

这位同学,你的想法很可爱,这个嘛,一切看缘分,机缘巧合的话,总会遇到的。

3)在RS485中,是不是每个设备都要求一样的波特率呢,如果遇到设备的波特率不一致怎么办呢?

这个问题问得好。一般来说,乃至绝大多数而言,都要求RS485总线上的设备,串口参数都要一样的,因为主站设备在通信过程中,一般不会动态修改串口参数。

当然,在一些特定的项目中,主控设备如果知道每个站号的具体串口参数,在轮训访问每个从站设备时,都进行相应的串口参数修改,也是可以的。不过,这样的通用性就大大降低了,只能在一些特定的场合或项目中出现。

4)在RS485通信上,如果每个设备的响应时间不一样,怎么处理呢?

这种情况呢,可以说是非常常见的。虽然在485上面挂的都是Modbus设备,但设备类型不一样,有电表,单片机控制器,PLC,电脑,HMI等。还有每个从设备要采集的点数也不一样,最关键的是,每个设备的响应时间不一致。比如有的设备10ms就能回复,有的设备要1000ms才能回复。

这意味着,主站的请求超时时间需要设置,以总线上最慢的那个设备为参考。包括通信间隔也是的。

比如主站访问1号站的回来报文,2号站都能收的,并且,还有过滤掉。如果主站访问1号太快太频繁,导致2号接收不过来,过滤不及时,等到主站访问2号设备的时候,2号就处理不过来,导致通信异常了。

如果条件允许的话,最好可以分组。比如通信比较快的话,放到一组里,通信比较慢的,放到另一个组。如果主控设备,只能一路485,那就没有办法了。

5)在RS485总线上,需要有两个主控设备要进行数据采集怎么办?能不能在两个主站设备上实现一种算法,可以让两个主站跑Modbus呢。

原则来说,RS485总线上不允许出现两个主站进行数据请求的。常见的解决方案是两个主控设备接到一个Modbus 转换器上,再由这个转换器来完成485总线数据采集。不过,这个就增加了个转换器,而且,如果两个主站访问太快,也会有可能出现响应不及时。

至于说,能不能实现一种算法,可以让两个Modbus主站进行访问。

笔者之前就做过一个算法。也可以称为Modbus多主站吧。

算法的思路呢,就是两个主站有令牌环的概念,一个主站请求三到五次左右,然后把令牌交给另一个主站,另一个主站拿到令牌之后,进行访问。这样两个主站轮训采集,这样同一个时刻,也只有一个主站进行访问。

可惜的是,效果不是很理想,交换令牌环容易丢失,导致两个主站要么有时候不访问,有时候一起访问。

原因有两点吧,一个原因笔者的Modbus 多主站算法还没有细化好。

另一个原因就是对于从设备来说,是不可更改的,主站之间的令牌交换通信,也会被从设备接收,从设备需要过滤多余额外的数据,对有些用单片机来说,这是很容易出错的。

想到达到比较好的效果,还需要主站的通信请求不能太快,通信效率自然也下降了。

所以搞Modbus 多主站算法,还是不太可行的,比较难做到通用性,只能在一些特定的项目里使用,所以自然也就不会传开了,也就没有所谓的Modbus多主站了。

在485上面,能实现多主站通信的,目前比较好的,也就BACnet MSTP协议了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分