行业动态
ModbusRTU有哪些邪修用法
2025-12-15
ModbusRTU除了常规的通信数据采集,还有哪些邪修的用法。下面分享几个在实战项目中遇到过的案例。
HMI和PLC只通过串口连接,串口只支持ModbusRTU协议。但是在使用的过程,需要通过HMI,读取U盘的文件,传输给PLC。让PLC去执行相关的功能,比如更新工艺数据,更新从模块程序等。一般文件的大小在几K到几十K。
4X寄存器,一个地址是一个字,一共65536个地址,也就是64K*2=128K.
也就是只要文件不超过寄存器范围,就可以这么干。通常文件小于64K,毕竟PLC能开辟出来的内存一般不高。
常见的做法,开辟两段地址空间,一段是文件传输头和标志位等,比如4X9000~4X9099,一共100个字。用于存放标志信息,比如是否开始,是否完成,以及文件的校验信息,简单点的检验可以是文件的和校验32bit,或者CRC32,也就四个字节的校验信息,复杂点的就整个MD5校验。
然后开辟连续一段空间用于存放文件内容。
比如4X10000~4x50000。
要传输文件的时候,先往标志位读写相关标志信息,待传的文件长度等,传输完成后相关标志位生效,PLC校验通过,写标志位,双方完成文件传输过程。
这种应用还是很常见的,大大小小的项目都遇到过应用的案例。
有的PLC功能比较复杂,内存也比较大的,觉得ModbusRTU的寄存器不够大,4X地址只有128K。但是又不想换别的协议,又想扩展地址的。
常见的做法是自定义扩展功能码,但是扩展了功能码之后,就不属于ModbusRTU协议,是自定义的功能,标准的ModbusRTU就不识别了。
这时候就可以通过扩展站号来实现了。
比如,这个PLC的站号可以是1,也同时是2。
站号1对应的128K和站号2对应的128K,加起来就可以表示到256K空间了。
也就是一个设备可以同时拥有两个甚至多个站号。只要在一个通信总线里,区别好就行。
这种一般是在小项目或者定制项目里,针对PLC或者控制器可以修改调试的,自由度比较高的。
我们使用过串口GPS模块的同学应该知道,串口GPS模块有一个特点,就是上电工作后,串口GPS模块就主动向串口发送数据,但是对于HMI或者主控设备来说,主站是向GPS模块获取数据的,但是这些数据是从站主动发送的,因为主从关系发生了变化。
并不是说从设备只能被动等待主控来获取数据,从设备其实也可以主动向外发数据的。
同时,ModbusRTU从设备也可以这么干。
这种一般是针对从设备数据不多,而且不需要快速更新的数据,比如电表,温湿度模块等。
在电力行业,楼宇行业等数据采集常见。
比如电表,有功率,电流,已使用度数,以及其它参数等。而这些数据呢,是主控需要的,但是并不需要快速更新的。
电表就可以简化,主动定时把数据向串口发送就行了。
具体怎么执行呢。
步骤一,[0ms]电表主动向串口发送01 03 00 00 00 0A C5 CD
这条报文表示读4x0地址,读10个。
步骤二,[500ms]电表主动向串口发送01 03 14 00 01 00 16 04 D2 00 42 00 4E 00 2B 09 29 22 B8 00 62 04 D2 AF 49
这条报文表示回复前一条的报文,10个数据。
等待2S后,重复步骤一和步骤二。
有同学就会问了,既然只有10个数据的话,那直接只要步骤二就行了,干嘛还要步骤一。
其实呢,也不是不可以。
原因有二吧。1是为了直观,数据可读性。方便报文的配对。2是有的电表可能不只有4x的10个数据,还有0x的数据,比如是否故障,是否工作等状态。
这种数据主动外发的方法,可以简化电表的工作。不用响应和解析主控设备的请求,减轻电表的负荷。数据更新频率控制权在电表。毕竟不同主控设备,数据采集的频率,间隔,组包长度不一样,一会只读一个4X1,一会要读4X2到4X8。变来变去的,对于电表来说,还不如化繁为简。
这个厉害了。
一般来说,为了提高ModbusRTU的通信效率,我们常建议数据尽量组包,组包长度在合理范围内尽量大。
但是在实际使用上,HMI可能在某个页面或者主控在些场景下,就啥数据都有,但数据长度又都不是很大,比如一会读个4X1,一会读个3X1,一会读个0x10这样的。
比如读4X1和读0x10两个地址。
常规来说,就需要主控发两次请求,先发读4X1的请求,待通信完成后,再发0x10的请求。
这样对ModbusRTU来说,很正常,也不能说慢。
但是如果可以一次同时发送4X1和0x1的请求,从设备再回复。这样只需要交互一次,就能完成两个不同需求的数据读取了。
比如,主控发:01 03 00 00 00 01 84 0A 01 01 00 00 00 01 FD CA
从设备回复:01 03 02 22 B8 A0 96 01 01 01 00 51 88
这种对主控和从设备都有一定的要求,一般在定制项目里或者小项目里见到。很多的主控设备,由于软件框架的原因,只支持单个寄存器的单次请求,根据组包设置对待读寄存器做拆分。混合读的一般都需要主控和从设备的软件框架适配支持。