Modbus核心要点速记:地址、功能码、超时
2026/8/22 10:12:05 网站建设 项目流程

干自动化这行,Modbus这玩意儿绕不开。跟它打了快十年交道,从刚入行时对着串口抓瞎,到现在闭着眼能画出报文格式,中间踩过的坑能写本书。今天不整那些虚的,纯从实战出发,把这东西彻底掰扯清楚。

一、先说物理层

Modbus最初是为串口设计的,RS232和RS485是亲爹。232就别提了,距离短得可怜,也就调试时用用。真正干活还得是485,两线制,差分信号,1200米妥妥的,32个节点挂上去跟玩儿似的。但记住,485只是物理层,别把它跟Modbus协议混为一谈,很多人这关都没过就开始折腾寄存器,早晚出事儿。

串口参数这地方最容易翻车。波特率、数据位、停止位、校验位,四件套少一个都不行。9600 8 N 1是行业潜规则,但别想当然,我见过用19200 7 E 1的老外设备,折腾了我一下午。校验位这东西,无校验最省心,但工业现场干扰大,偶校验能多道保险,性能损失可以忽略。

二、再说RTU和ASCII

RTU是绝对主力,紧凑,效率高,CRC校验也结实。ASCII那是给老爷设备留的,报文可读性强点,但帧长度翻倍,传输效率直接腰斩,没事别碰。RTU的帧间隔判断是关键,3.5个字符时间,这个得算准,尤其是用单片机软实现时,定时器精度不够就等着收乱码吧。

TCP/IP这层必须单独拎出来说。Modbus TCP就是把RTU报文塞进TCP包,端口502是死规定。跟串口最大的区别是去掉了CRC校验,因为TCP底层有校验,再加就多余了。还有个MBAP报文头,7个字节,事务标识符、协议标识符、长度域这些。事务标识符特别重要,主站发请求时自己维护这个计数器,从站回复时必须原样带回,不然没法匹配请求和响应,尤其是多请求并发时。

三、协议核心就四个常用功能码

01读线圈,03读保持寄存器,02读离散输入,04读输入寄存器。线圈和寄存器都是16位的,别问我为什么不用32位,历史包袱。03和04这俩最容易搞混,保持寄存器可读可写,输入寄存器只读,记住了,现场接线前先看设备手册,把地址范围搞清楚,免得读写半天全是FFFF。

地址这个话题得单独骂两句。很多新人被“40001对应0地址”这种说法搞疯。其实这就是个映射关系,PLC厂商为了直观搞出来的东西。你发报文时地址域填的是0x0000到0xFFFF,至于这地址对应屏上显示的40001还是30001,那是组态软件的事。别在协议层纠结这个,直接看十六进制报文最干净。

报文结构必须手撸一遍。请求帧:从站地址(1字节)+功能码(1字节)+起始地址(2字节)+寄存器数量(2字节)+CRC(2字节)。响应帧:地址+功能码+字节数+数据+CRC。异常响应时功能码最高位置1,比如03变成83,后面跟个异常码,01非法功能,02非法地址,03非法数据,就这几个最常见。

CRC计算别图省事用查表法,虽然快但占ROM。老老实实按位算,代码量也就十几行,移植性还好。特别注意字节序,Modbus是大端模式,高字节在前低字节在后,这个跟x86小端反着来,用联合体或者指针强转时一定小心,我见过不下十个因为字节序搞反导致数据颠倒是非的案例。

性能优化这块,批量读写是王道。别一个寄存器发一帧,把连续地址的一次性读完,帧数量能少一个数量级。超时时间也得讲究,串口一般设200ms,TCP可以设短点,50ms足够,但要看从站响应速度,碰到磨叽的设备该调长还得调。

四、最后说个玄学问题

总线上没数据。查了三小时,最后发现是从站地址设成了0。Modbus规定地址0是广播地址,从站收到广播只执行不回复。这个坑十个人里有八个得踩一次,尤其是新设备出厂默认地址0的时候。

Modbus就这么点东西,说复杂也复杂,说简单也简单。关键是动手抓包,Wireshark加串口监听,报文一目了然。纸上谈兵三年不如现场抓包半天,这话放这儿,爱信不信。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询