2. Modbus协议核心原理

Modbus之所以能在车站机电系统中长期占据一席之地,根本原因在于它的模型极其简单:一台主站、若干从站、一套固定的报文格式和四类数据区。理解了这套“骨架”,后面无论是配置BAS网关、调试风机变频器,还是排查照明回路点位错位,都能落到具体的字节和地址上,而不是停留在“通信不通”的模糊判断。

一、主从架构:谁发问,谁回答

Modbus采用严格的主从(Master/Slave)架构。总线上只有一个主站,典型对象是车站BAS控制器、PLC或综合监控前置机;从站则是被控设备,如变频器、智能电表、照明控制器、风机水泵控制箱、EPS电源等。通信的发起权完全掌握在主站手里:主站发出请求帧,被寻址的从站才回应;从站之间不通信,也不会主动上报。这一点与很多现场总线不同,意味着“设备有故障但主站不轮询”时,故障信息不会自己冒出来,必须靠主站的轮询周期去覆盖。

每个从站有唯一的站号(Slave ID,1~247,0为广播地址)。主站请求帧中携带站号,只有站号匹配的从站才处理并应答,其余从站保持沉默。因此站号重复是现场最常见的“通信异常”原因之一——两台设备同时应答,主站收到的数据会错乱或校验失败。

二、请求响应模型:一帧请求,一帧应答

Modbus RTU帧结构为:站号 + 功能码 + 数据域 + CRC校验。主站请求与从站应答共用这个结构,区别在于数据域内容。以读保持寄存器为例,主站请求包含起始地址和寄存器数量,从站应答则包含字节数和具体数据。若从站无法执行,会返回“异常应答”:功能码最高位置1(如03变为0x83),数据域给出异常码,常见的有01(非法功能)、02(非法数据地址)、03(非法数据值)、04(从站设备故障)。

工程上要特别注意两点:其一,RTU模式下帧与帧之间需有至少3.5个字符时间的静默间隔作为帧边界,波特率越低这个间隔越长,轮询过密会导致粘帧;其二,主站必须设置合理的超时(常见300~1000ms)和重试次数(一般1~2次),超时太短会误判掉线,太长则拖慢整条总线的轮询周期。

Modbus 主从请求—应答与四类数据区映射 主站 BAS控制器 / PLC 从站(站号=5) 变频器 / 智能电表 请求:05 03 00 00 00 02 CRC 应答:05 03 04 数据 数据 CRC 从站内部四类数据区(按功能码访问) 线圈 0x 可读可写 位 功能码 01 / 05 / 15 例:风机启停命令 离散输入 1x 只读 位 功能码 02 例:风机运行反馈 输入寄存器 3x 只读 16位 功能码 04 例:实测温度值 保持寄存器 4x 可读可写 16位 功能码 03 / 06 / 16 例:频率设定值 地址映射要点: ① 协议报文地址从 0 起算,设备手册常以 1 起算(如 40001 对应报文地址 0x0000),配置时须减 1; ② 同一物理量可能分布在多个区:命令写线圈/保持寄存器,反馈读离散输入/输入寄存器,不可混用功能码; ③ 32位量(如累计电量)占两个连续寄存器,需确认高低字顺序(大端/小端)后再解析。

三、功能码:八个常用码的分工

功能码决定了“访问哪类数据区、做什么操作”。课程涉及的八个功能码可按读写和位/字两个维度归类:

  • 01(读线圈):读取可读写位状态,一次最多2000位,常用于批量读取设备启停命令或状态字。
  • 02(读离散输入):读取只读位,如风机运行反馈、故障干接点状态。
  • 03(读保持寄存器):读取可读写16位寄存器,一次最多125个,是读取频率设定、模式参数的主力。
  • 04(读输入寄存器):读取只读16位寄存器,典型为温度、湿度、电流等实测值。
  • 05(写单个线圈):写一位,数据域用0xFF00表示ON、0x0000表示OFF,用于单台设备启停。
  • 06(写单个寄存器):写一个16位寄存器,如设定频率。
  • 15(写多个线圈):一次写连续多位,适合照明回路分组控制。
  • 16(写多个寄存器):一次写连续多个寄存器,适合下发多参数或批量设定。

选择原则很直接:位操作用01/02/05/15,字操作用03/04/06/16;单点用05/06,批量用15/16。需要提醒的是,05和06的应答是“原样回显”请求帧,主站收到回显即认为写成功,但这只代表从站接收了命令,不代表设备已执行到位——执行结果仍需通过02或04回读确认。

四、地址与数据映射:从手册到报文

这是配置点位时最容易出错的地方。设备手册通常用“40001”“10001”这类五位数表示数据区与序号,而Modbus报文中的地址是从0开始的偏移量。换算规则是:线圈区0x对应报文地址=手册序号−1;离散输入1x同理;输入寄存器3x、保持寄存器4x也各自从0起算。例如手册标注“频率设定 40002”,则报文起始地址为0x0001。

以一个车站排风机变频器为例,假设其点位表如下(示例参数,实际以设备手册为准):运行命令为线圈00001,运行反馈为离散输入10001,输出频率为输入寄存器30002(单位0.01Hz),频率设定为保持寄存器40002(单位0.01Hz)。主站要启动风机并把频率设为35.00Hz,操作序列是:先用05功能码向地址0x0000写0xFF00;再用06功能码向地址0x0001写十进制3500(即0x0DAC);随后用02读地址0x0000确认运行反馈为1,用04读地址0x0001确认输出频率接近3500。若回读频率长期为0而反馈为1,则问题多半在变频器参数源设置,而非通信链路。

配置点位时建议建立“物理量—数据区—功能码—手册地址—报文地址—数据类型—缩放系数”七列对照表,逐台设备核对。缩放系数尤其关键:寄存器里存的是3500还是35,取决于设备定义,解析时乘0.01还是乘1必须与手册一致,否则监控画面上会出现“频率3500Hz”这类明显错误。

五、异常与边界:让原理落到排障上

掌握上述模型后,常见故障可以快速定位。若主站收到异常码02(非法数据地址),说明功能码与数据区不匹配或地址越界,应检查是否把保持寄存器地址用03去读却填了输入寄存器的偏移;若收到异常码03(非法数据值),多因写入值超出设备允许范围,如频率设定超过50.00Hz;若完全无应答,则依次排查站号、波特率与校验位(如9600-8-N-1)、接线A/B极性、终端电阻和超时设置。把这些判断建立在“功能码—数据区—地址”的对应关系上,排障就从猜测变成了逐项排除。

最后强调一个工程习惯:主站轮询应分区、分优先级组织,把关键状态量(故障、运行反馈)放在快周期,把电量、温度等慢变量放在慢周期,并避免对同一从站连续下发写命令而不留处理间隔。Modbus简单,但简单不等于可以随意,帧边界、地址偏移和读写语义这三处细节,恰恰是车站机电点位配置成败的关键。