资讯动态

Modbus核心要点速记:地址、功能码、超时

发布时间:2026/8/22 10:12:06 来源:尧图企业网站定制
干自动化这行Modbus这玩意儿绕不开。跟它打了快十年交道从刚入行时对着串口抓瞎到现在闭着眼能画出报文格式中间踩过的坑能写本书。今天不整那些虚的纯从实战出发把这东西彻底掰扯清楚。一、先说物理层Modbus最初是为串口设计的RS232和RS485是亲爹。232就别提了距离短得可怜也就调试时用用。真正干活还得是485两线制差分信号1200米妥妥的32个节点挂上去跟玩儿似的。但记住485只是物理层别把它跟Modbus协议混为一谈很多人这关都没过就开始折腾寄存器早晚出事儿。串口参数这地方最容易翻车。波特率、数据位、停止位、校验位四件套少一个都不行。9600 8 N 1是行业潜规则但别想当然我见过用19200 7 E 1的老外设备折腾了我一下午。校验位这东西无校验最省心但工业现场干扰大偶校验能多道保险性能损失可以忽略。二、再说RTU和ASCIIRTU是绝对主力紧凑效率高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小端反着来用联合体或者指针强转时一定小心我见过不下十个因为字节序搞反导致数据颠倒是非的案例。性能优化这块批量读写是王道。别一个寄存器发一帧把连续地址的一次性读完帧数量能少一个数量级。超时时间也得讲究串口一般设200msTCP可以设短点50ms足够但要看从站响应速度碰到磨叽的设备该调长还得调。四、最后说个玄学问题总线上没数据。查了三小时最后发现是从站地址设成了0。Modbus规定地址0是广播地址从站收到广播只执行不回复。这个坑十个人里有八个得踩一次尤其是新设备出厂默认地址0的时候。Modbus就这么点东西说复杂也复杂说简单也简单。关键是动手抓包Wireshark加串口监听报文一目了然。纸上谈兵三年不如现场抓包半天这话放这儿爱信不信。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价