MODCAR:一种高效并发工业通信协议
什么是 MODCARMODCAR是一个面向工业现场总线与以太网的并发通信协议。它的名字由两部分组成MOD—— 致敬经典的 Modbus 协议继承了其功能码、寄存器/位操作等易用特性。CAR——ConcurrentAccess Response并发访问与响应的缩写寓意像一辆灵活的小汽车Car而不是按固定路线停靠的公交车Bus可以一次携带多个命令让所有设备同时接收、按顺序回复。为什么需要 MODCAR传统 Modbus 采用“一问一答”的轮询方式主站依次询问每个从站总线利用率低命令到达时间差大无法满足多轴同步启动、分布式 IO 批量采集等需求。EtherCAT 等实时以太网虽快但需要专用硬件且成本较高。MODCAR 在保留 RS‑485 和以太网廉价物理层的前提下设计了一种复合帧结构一帧内可包含发给不同从站的多个子请求所有从站同时收到命令然后按主站指定的顺序依次返回响应。它实现了一帧多命令减少总线往返次数。命令同时到达所有从站在同一时刻收到指令没有轮询时间差。响应有序主站可自由指定回复顺序从站无需地址排序。实现简单仅需微控制器 UART 或 Socket 编程无需专用芯片。MODCAR 帧格式统一版MODCAR 同时支持RTURS‑485 串行和TCP/UDP以太网两种版本使用完全相同的帧结构且都保留CRC16校验确保数据完整性。主站请求帧| Len (1B) | N_sub (1B) | 跳转表 (N_sub×1B) | 子请求1 | 子请求2 | ... | 子请求N | CRC16 (2B) |Len1 字节表示从N_sub开始到最后一个子请求末尾的总字节数不包含 Len 自身和 CRC。最大 255满足多数现场总线。N_sub子请求个数1~247。跳转表N 个 1 字节的绝对偏移量。第 i 个值表示第 i 个子请求的起始字节位置从帧的第一个字节即 Len 所在位置算起。子请求[从站地址] [功能码] [参数]地址和数据均为字即 2 字节大端序。CRC16对N_sub到最后一个子请求末尾的所有字节计算多项式 CRC‑16‑CCITT初值 0xFFFF。从站响应帧| Len (1B) | 从站地址 | 功能码 | 响应数据 | CRC16 (2B) |Len表示从站地址到响应数据末尾的字节数不含 CRC。响应数据写操作成功0x06写操作失败0x08地址/数据非法或0x09忙碌/拒绝读操作成功读取的数据长度随功能码变化异常[Len] [地址] [功能码|0x80] [异常码] CRC功能码定义字单位1字2字节码操作请求参数字节成功响应数据0x01读1字[字地址2B][数据2B]0x02读连续2字[起始地址2B][数据1 2B][数据2 2B]0x03读N字[起始地址2B][字数1B][字节数2N][数据...]0x04读不连续字[数量M1B][地址1 2B]...[地址M 2B][字节数2M][数据1 2B]...[数据M 2B]0x05读1位[字地址2B][位掩码1B][位值0/1]0x11写1字[字地址2B][数据2B]0x060x12写连续2字[起始地址2B][数据1 2B][数据2 2B]0x060x13写N字[起始地址2B][字数1B][数据...]0x060x14写不连续字[数量M1B][地址1 2B][数据1 2B]...0x060x15写1位[字地址2B][位掩码1B][位值0/1]0x06位掩码只有 1 个 bit 为 1例如0x04表示 bit2。从站处理流程六步法接收完整帧根据 Len 字节确定帧长度收齐所有字节含 CRC。查找自己的 ID 与排名遍历跳转表指向的地址若匹配则记录排名序号第几个子请求和起始偏移。CRC 校验全局校验错误则丢弃此帧不发送任何响应。截取自己的子请求从偏移处读取功能码和参数。执行命令根据功能码进行读/写操作准备好响应数据含 Len 字段。按排名顺序发送响应排名为 1在帧结束后的最短帧间隔RTU 为 3.5 字符时间后立即发送。排名 1监听总线等待前一个排名的从站响应结束然后发送自己的响应。这样从站无需关心地址大小完全由主站通过子请求顺序控制响应次序。实例一帧控制三个从站场景主站同时向三个从站下达命令从站地址分别为 0x01、0x03、0x05。从站 0x01写 1 个字到地址 0x0001数据 0x0002。功能码 0x11从站 0x03写 2 个连续字从地址 0x0002 开始数据 0x0000、0x0001。功能码 0x12从站 0x05读 1 个字地址 0x0004。功能码 0x01主站请求帧十六进制首先构造子请求原始字节子请求101 11 00 01 00 026 字节子请求203 12 00 02 00 00 00 018 字节子请求305 01 00 044 字节总子请求长度 684 18 字节。N_sub 3跳转表需要 3 个 1 字节偏移。跳转表 [4, 10, 18]因为 Len 占 1 字节N_sub 占 1 字节跳转表占 3 字节共 5 字节前缀子请求1 从偏移 5 开始注意从帧首字节Len算起偏移 0 是 Len偏移1 是 N_sub偏移2~4 是跳转表。所以子请求1 的起始偏移 5子请求2 5611子请求3 11819。但为了与常见例子一致我们使用绝对偏移此处按实际计算。重新计算Len 1(N_sub) 3(跳转表) 18(子请求总长) 22 →0x16跳转地址子请求1 从字节索引 5 开始Len 索引0N_sub索引1跳转表索引2~4 → 5子请求2 从 5611 → 11子请求3 从 11819 → 19跳转表字节05 0B 13最终请求帧不含 CRC16 03 05 0B 13 01 11 00 01 00 02 03 12 00 02 00 00 00 01 05 01 00 04最后附加 CRC16假设计算值为XX YY。从站响应假设全部成功响应顺序由子请求顺序决定先响应地址 01再地址 03最后地址 05。从站 01写成功03 01 11 06 CRC从站 03写成功03 03 12 06 CRC从站 05读成功读出 0x123404 05 01 12 34 CRC主站依次收到这三个响应帧通过 Len 字段可正确解析每个响应的边界。RTU 与 TCP 的区别项目MODCAR‑RTUMODCAR‑TCP/UDP物理层RS‑485 半双工以太网全双工帧边界Len 空闲时间3.5字符LenTCP流需拆包UDP一个报文一帧一帧多从广播到所有从站UDP广播/组播可达到同样效果TCP需分别发送响应冲突从站按排名顺序总线监听避让无冲突独立连接或UDP独立响应CRC必须建议保留统一且开销很小错误处理全局 CRC 错所有从站丢弃整帧无响应。主站超时后重发。子请求执行错误从站返回[Len] [地址] [功能码|0x80] [异常码] CRC主站记录并决定是否重试。响应超时如果主站在预期时间内未收到某个排名的响应则跳过继续等待下一个排名超时结束后统一处理缺失。总结MODCAR 是一个轻量级、高效率的工业通信协议它继承了 Modbus 的易用性通过复合帧跳转表按序响应的设计实现了“一帧多命令、命令同时到达、响应有序”。无论是老旧 RS‑485 网络还是现代以太网都可以轻松部署 MODCAR显著提升多设备协同控制的表现。如果你正在寻找一种比 Modbus 更高效、比 EtherCAT 更简单的协议不妨试试 MODCAR —— 这辆灵活的小汽车。MODCAR 协议版本 1.0开源、免费、欢迎使用和改进