行业动态

ModbusRTU有哪些邪修用法

2025-12-15

ModbusRTU除了常规的通信数据采集,还有哪些邪修的用法。下面分享几个在实战项目中遇到过的案例。



01

ModbusRTU 通过4X地址传文件。

HMIPLC只通过串口连接,串口只支持ModbusRTU协议。但是在使用的过程,需要通过HMI,读取U盘的文件,传输给PLC。让PLC去执行相关的功能,比如更新工艺数据,更新从模块程序等。一般文件的大小在几K到几十K

4X寄存器,一个地址是一个字,一共65536个地址,也就是64K*2=128K.

也就是只要文件不超过寄存器范围,就可以这么干。通常文件小于64K,毕竟PLC能开辟出来的内存一般不高。


常见的做法,开辟两段地址空间,一段是文件传输头和标志位等,比如4X9000~4X9099,一共100个字。用于存放标志信息,比如是否开始,是否完成,以及文件的校验信息,简单点的检验可以是文件的和校验32bit,或者CRC32,也就四个字节的校验信息,复杂点的就整个MD5校验

然后开辟连续一段空间用于存放文件内容

比如4X10000~4x50000

要传输文件的时候,先往标志位读写相关标志信息,待传的文件长度等,传输完成后相关标志位生效,PLC校验通过,写标志位,双方完成文件传输过程。


这种应用还是很常见的,大大小小的项目都遇到过应用的案例。


02

巧用多个站号扩展寄存器

有的PLC功能比较复杂,内存也比较大的,觉得ModbusRTU的寄存器不够大,4X地址只有128K。但是又不想换别的协议,又想扩展地址的。

常见的做法是自定义扩展功能码,但是扩展了功能码之后,就不属于ModbusRTU协议,是自定义的功能,标准的ModbusRTU就不识别了。

这时候就可以通过扩展站号来实现了。

比如,这个PLC的站号可以是1,也同时是2

站号1对应的128K和站号2对应的128K,加起来就可以表示到256K空间了。

也就是一个设备可以同时拥有两个甚至多个站号。只要在一个通信总线里,区别好就行。


这种一般是在小项目或者定制项目里,针对PLC或者控制器可以修改调试的,自由度比较高的。


03

化繁为简,化被动为主动

我们使用过串口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是有的电表可能不只有4x10个数据,还有0x的数据,比如是否故障,是否工作等状态。 


这种数据主动外发的方法,可以简化电表的工作不用响应和解析主控设备的请求,减轻电表的负荷。数据更新频率控制权在电表。毕竟不同主控设备,数据采集的频率,间隔,组包长度不一样,一会只读一个4X1,一会要读4X24X8。变来变去的,对于电表来说,还不如化繁为简。


04

多个请求一起发。

这个厉害了。

一般来说,为了提高ModbusRTU的通信效率,我们常建议数据尽量组包,组包长度在合理范围内尽量大。

但是在实际使用上,HMI可能在某个页面或者主控在些场景下,就啥数据都有,但数据长度又都不是很大,比如一会读个4X1,一会读个3X1,一会读个0x10这样的。

比如读4X1和读0x10两个地址。

常规来说,就需要主控发两次请求,先发读4X1的请求,待通信完成后,再发0x10的请求。

这样对ModbusRTU来说,很正常,也不能说慢。

但是如果可以一次同时发送4X10x1的请求,从设备再回复。这样只需要交互一次,就能完成两个不同需求的数据读取了。


比如,主控发: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



这种对主控和从设备都有一定的要求,一般在定制项目里或者小项目里见到。很多的主控设备,由于软件框架的原因,只支持单个寄存器的单次请求,根据组包设置对待读寄存器做拆分。混合读的一般都需要主控和从设备的软件框架适配支持。


在线客服

关闭

微信

客户服务热线

19557160376

在线客服