关于modbus rtu一个主站与多个从站通信的一点总结

一、文章背景

1个master,30个slaver,485 RTU通信。

master主动读取slaver的寄存器信息,下面用来做啥就省略了,本文只介绍如何处理通信逻辑。

关于协议的基本信息省略。

由于计算机加密,文字都是在博客编辑框中现写的。

二、注意点

1、  master不可同时与30个从站通信,必须挨个轮询,而且一问一答,串口的半双工特性就决定了这种通信方式,同一时刻只允许一个人占用这个信道。

2、  广播模式不适用该项目,广播模式通常用于写入slaver,而且slaver不回应数据。

3、  slaver回应时,可能会分几次回应,这一点与tcp类似。

4、  一个机器接30个串口设备,用的扩展板卡,光线缆就一捆,前面说了需要挨个轮询,通常一次通信大约在100ms,30个设备轮询完了就需要3秒钟了,特别要注意这一点,如果对实时性要求很高,则必须将slaver分组,比如用三个串口,每个串口接10个slaver,本文就介绍这种方法。

三、实现方法

1、  使用三个串口、每个串口接10个slaver。相当于三个master,每个master与10个slaver通信。

2、  建立slaverid的映射关系,master编号1、2、3,每组slaver编号1、2、3、4…10,主站获取slaver数据后,往业务层反馈数据时加上master编号,用两个字节表示,第一个字节是主站编号,第二个字节是slaver编号。这样业务层根据id映射就能区分出哪一个slaver设备反馈的数据。

3、  业务层与通信层交互时引入一个转换回调层。

业务层---->回调层(业务数据结构转换成adu)---->通信层

通信层---->回调层(adu转换成业务数据结构)---->业务层

4、  master向slaver发送请求后,需要等到回应后,才能执行下一步操作,前面说了回应可能分几次进行,处理回应数据方式如下:

(1)       根据发送的请求,我们可以知道期望的回应是什么,比如读一个线圈(slaveID=1线圈地址2),则发送adu为01 01 0002 0001 CRC,期望返回是01 01 01 XX,异常则是01 80 XX CRC,因此可以读取功能码判断后面期望的adu的总长度到底是多少。

(2)       回应获取以后crc校验,然后将数据转发给回调层处理,一个slaver的通信逻辑就算完成了,然后执行下一个。

(3)       异常情况,等回应需要加上超时(500ms),把超时的slaver信息回调给上一业务层。

 

四、总结

 要扩展的话,就创建多个master对象就行了,上层业务处理映射关系就行。把启用多少个master及slaver映射放到配置文件,这样 扩展就很方便了。

文章来自:https://www.cnblogs.com/shelwinnee/p/12850844.html
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3