十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

自动化通信协议怎么选?一文理清UART到EtherCAT的选型与调试

自动化通信协议怎么选?一文理清UART到EtherCAT的选型与调试 做自动化的人十有八九都遇到过这种场面设备明明通了电、编了程但 PLC 就是读不到传感器的数据伺服一使能就报错上位机软件打开以后界面全是灰色。排查到最后十有八九都是通信协议没对上——波特率、帧格式、从站地址、寄存器地址任何一个地方不匹配链路就哑火。自动化领域的通信协议特别多UART、I2C、SPI、CAN、Modbus、PROFIBUS、PROFINET、EtherCAT还有 BLE、Zigbee、LoRa、Wi-Fi。很多人一看到这么多协议就发懵不知道从哪学起也不知道实际项目里该怎么选。这篇文章想做的事情很简单把这些主流协议按应用场景重新梳理一遍告诉你各自擅长什么、不擅长什么、调试时容易踩哪些坑以及自动化测试环节如何用工具验证这些协议。不管你是刚入行的电气工程师、嵌入式开发者还是做设备集成和产线自动化的朋友都能从中找到可以直接落地的经验。1. 自动化里的通信协议到底在解决什么问题1.1 一台设备干活不是自动化多设备协同才是先聊一个很多人忽略的前提单台设备自己动起来其实用不上通信协议。传感器把信号传给控制器控制器驱动执行器这是信号链路的事。但自动化产线从来不是单台设备它是由 PLC、伺服、变频器、机器人、视觉系统、传感器、扫码枪、上位机 MES 组成的一整条链路。设备之间要协同就得把“我这边好了”“你那边到哪一步了”“数据是多少”“该切换配方了”这些信息传过去。通信协议就是双方约定好的一套编码规则解决“谁能发、什么时候发、发什么格式、收不到怎么办”这几个问题。我在实际项目里经常遇到一种误区很多人觉得设备能通信就行协议随便选。真到联调的时候才意识到选型选错了后面所有环节都在填坑。比如一个只需要传几十个开关量的项目有人为了显得“先进”直接上 EtherCAT结果主站选型、从站配置、同步时钟调试折腾了两周还没跑通。而隔壁组用 Modbus RTU一天就联上了。协议没有绝对的好坏只有合不合适。1.2 通信协议要解决的四个核心问题不管协议叫什么名字本质上都在解决四个问题第一物理层怎么连。是走 RS-232、RS-485还是 Ethernet 网线或者是无线电波。这决定了传输距离、抗干扰能力和布线成本。第二数据怎么封装。一帧数据包含起始位、地址、功能码、数据区、校验位这是数据链路层的职责。像 UART 会在每个字节前后加起始位和停止位CAN 会在报文里带仲裁 ID 和 CRC 校验。第三双方怎么对话。谁先发起通信是一次主从问答还是一点对多点的广播这是应用层要考虑的问题。Modbus 是典型的主从问答主站发请求从站应答EtherCAT 则是主站发一个帧经过所有从站从站边走边处理。第四出错怎么办。数据传过去被干扰了接收方怎么知道接收方一直不应答发送方要不要重试CAN 总线有 CRC 校验和错误重发机制Modbus RTU 靠 CRC16 校验PROFINET 则能自动检测链路故障。这四个问题想清楚了再去看协议就轻松很多。每种协议就是在这些维度上做了不同的取舍。1.3 协议分层从物理电气到应用语义搞自动化通信一定要有“分层”的概念。可以把协议想象成寄快递物理层是快递车走的高速公路数据链路层是包裹的外包装和面单网络层是路由分拣系统应用层则是包裹里那件明明白白的商品。工业自动化里最常用的是 OSI 七层模型和 TCP/IP 四层模型的简化版。大多数工程师不需要把每一层都学透但至少要能把“电气接线”和“数据语义”分开。比如 RS-485 只是物理层标准它规定的是差分信号、电压范围、接线方式至于数据怎么组帧是 Modbus RTU 的事。所以 RS-485 可以跑 Modbus、Profibus DP也可以跑自定义协议。把这个概念搞清楚有个直接好处排查问题时有方向。信号传输不通先看物理层查接线和接地数据有内容但全是乱码看波特率、数据位、校验位是否一致通信正常但数值不对大概率是应用层寄存器地址或数据格式解析错了。2. 嵌入式与板级通信UART、I2C、SPI、CAN2.1 UART/RS-485最老但最耐用的串行通信UART 是通用异步收发器的缩写原理上就是两根线TXD 和 RXD一收一发双方事先约定好波特率、数据位、停止位和校验位。它不提供时钟线所以叫“异步”接收端靠起始位来同步时钟。UART 本身是芯片之间的点对点通信但在自动化现场我们会把 UART 信号通过电平转换芯片变成 RS-232 或 RS-485 标准实现更长距离和更多设备的连接。RS-485 可以说是自动化领域最顽强的物理层接口。它用差分信号传输抗共模干扰能力强最远能传 1200 米左右一条总线上最多能挂 32 个现在很多芯片支持更多设备。Modbus RTU 跑在 RS-485 上是中小型自动化项目最常见的组合。我自己的体会是RS-485 布线有几个关键细节必须注意终端电阻。总线段两端要接 120 欧姆终端电阻尤其是在高速率和长距离场景不接容易反射导致数据错乱。接地问题。RS-485 是差分信号但不代表不需要地线。A、B 两根信号线之外建议把各个设备的信号地连起来避免共模电压超过芯片承受范围。屏蔽层单端接地。屏蔽层一端接大地不要两端都接否则会产生地环路电流。调试 UART 通信时最常用的工具就是 USB 转 TTL 小板加串口助手。发送端接对方接收端接收端接对方发送端千万不要同接同端这是新手最常犯的错误。我见过不止一次明明代码逻辑没问题就是因为 TX 接了 TXRX 接了 RX数据死活不出来。2.2 I2C 与 SPI板内通信的两种典型打法I2C 和 SPI 是嵌入式系统里最常见的板级总线主要用于单片机、传感器、存储器、显示屏等器件之间的短距离通信。I2C 用了两根线SCL时钟线和 SDA数据线。所有设备都挂在这两根线上靠设备地址区分彼此。它的传输速率模式有标准模式 100 kbit/s、快速模式 400 kbit/s 和高速模式 3.4 Mbit/s。I2C 的好处是接线少、支持多主机、设备地址可配置适合传感器比较多且速率要求不高的场景。SPI 则是四根线SCLK、MOSI、MISO、CS。它是同步全双工通信主机通过片选信号 CS 选择与哪个从机通信。SPI 的速率比 I2C 高很多常见场景能跑到几十 MHz所以高速 ADC、Flash、SD 卡这些设备通常用 SPI。这里要给做设备集成的朋友提个醒如果你是在做机器人控制器或者视觉控制器内部的设计才需要纠结 I2C 还是 SPI。如果你只是用现成的传感器、驱动器二选一的情况其实不多——更多是看设备本身支持什么接口。比如很多 485 传感器不会给你 SPI 选项而一些高带宽的视觉传感器又只走 Ethernet。在性能需求上我的建议很简单到设备内部短距离高吞吐选 SPI设备多、线束少、速率要求不高选 I2C距离超过一两米就不要用这两者了老老实实上 RS-485 或以太网。2.3 CAN从汽车延伸到自动化设备的“总线之王”CAN 总线最初是为汽车设计的博世在 1986 年提出后来在工业自动化、医疗设备、工程机械领域大规模铺开。CAN 是差分信号的两线制总线CAN_H 和 CAN_L最高速率 1 Mbit/s标准 ISO 11898但速率和总线长度成反比比如 125 kbit/s 时能到 500 米。CAN 和 Modbus RTU 最大的区别在于CAN 是多主总线每个节点都能主动发送数据。它靠仲裁机制解决冲突——每个报文都有一个 IDID 数值越小优先级越高。所以像伺服驱动器这种对实时性要求高的设备可以把报文 ID 设小一点保证紧急数据优先发送。CAN 报文的帧格式也很讲究。标准帧有 11 位 ID扩展帧有 29 位 ID数据段最多 8 个字节。它不像 Modbus 那样有明确的寄存器和功能码定义很多时候需要在应用层再定义一套规则比如 CANopen 或 J1939。实际项目里用 CAN最容易踩的坑是终端电阻。CAN 总线的规范是两端各接一个 120 欧姆终端电阻。有些设备内部已经集成了终端电阻外部再接一个就会导致阻抗不匹配。调试时可以先量一下 CAN_H 和 CAN_L 之间的电阻正常情况下应该在 60 欧姆左右两端各 120 并联如果量出来是 120 或者 40说明终端电阻配置有问题。3. 工业现场总线与工业以太网Modbus、PROFINET、EtherCAT3.1 Modbus一个人人都该掌握的“公共语”Modbus 诞生于 1979 年是施耐德电气当时还是 Modicon开发的。它有一个很大的特点协议规范完全公开、实现简单因此成了自动化行业最通用的“公共语”。Modbus 有几种变体Modbus RTU二进制传输跑在 RS-485/RS-232 上数据紧凑、效率高。Modbus ASCII用 ASCII 字符传输效率低但便于人阅读调试现在用得少了。Modbus TCP跑在以太网上端口 502完全基于 TCP/IP 协议栈可以直接与上位机、SCADA 通信。Modbus 的模型非常简单核心就四张表线圈COIL位输出、离散输入DISCRETE INPUT位输入、保持寄存器HOLDING REGISTER16 位读写、输入寄存器INPUT REGISTER16 位只读。功能码也是固定的01 读线圈02 读离散输入03 读保持寄存器04 读输入寄存器05 写单个线圈06 写单个寄存器0F 写多个线圈10 写多个寄存器。这套模型之所以能活这么多年是因为它抓住了工业控制的基本需求——无外乎就是读开关量、写开关量、读模拟量、写模拟量。即便是做设备集成不需要自己写协议栈也必须懂得怎么去读设备的 Modbus 寄存器表。手册里写“保持寄存器 40001 是速度设定”你就得会用功能码 03 去读、功能码 06 去写。我在项目里遇到过一个比较隐蔽的问题寄存器地址的换算方式。Modbus 协议里寄存器地址从 0 开始但很多设备手册为了让用户直观会用 40001、40002 这种表示法。把 40001 转成实际地址有人直接减 1有人减 40001还有人是按 PLC 的地址映射来算结果写错一两位读出来的数据怎么都不对。这个细节做协议调试时一定要先确认否则会浪费大量时间。3.2 PROFIBUS/PROFINET西门子生态绕不开的选择PROFIBUS 是西门子主导的现场总线在欧洲和中国市场都占有很大份额。PROFIBUS DP 跑在 RS-485 上速率从 9.6 kbit/s 到 12 Mbit/s常用于 PLC 与分布式 I/O、驱动器、阀岛之间的通信。PROFIBUS 的物理层和 RS-485 类似也是两线差分但它的协议栈比 Modbus 复杂得多。每个从站需要 GSD 文件来描述设备能力和参数主站通过组态软件分配站地址然后自动完成参数化和数据交换。这带来的好处是配置完成后通信非常稳定坏处是初次联调相对繁琐而且 GSD 文件版本不匹配容易出各种怪问题。PROFINET 则是西门子拥抱工业以太网的产物在 IT 层面基于标准 Ethernet 和 TCP/IP在实时性上通过 PROFINET RT实时和 IRT同步实时做了增强。它支持拓扑自动发现、设备热插拔、诊断信息丰富是目前西门子新项目的主流选择。如果你的项目用了西门子 S7-1200、S7-1500 这代 PLC建议直接考虑 PROFINET不要再用 PROFIBUS 做新项目了。老设备维护另说新建产线还上 PROFIBUS只会增加后续扩展的成本。PROFINET 用标准网线就能连接调试时可以直接用 Wireshark 抓包看报文比 PROFIBUS 要透明很多。3.3 EtherCAT运动控制场景的确定性实时方案EtherCAT 是德国倍福Beckhoff在 2003 年提出的工业以太网协议特别适合运动控制、多轴同步、高速数据采集这类对实时性要求极高的场景。EtherCAT 的工作方式很有意思主站发送一个以太网帧这个帧会依次经过所有从站每个从站在报文经过时读取属于自己的数据同时把自己的数据写入报文然后传给下一个节点。最后一个从站把帧返回给主站。这样一轮通信所有从站的数据全部更新完毕周期可以做到 100 微秒甚至更快。这种“火车过站上下客”的模式和 Modbus TCP 那种“主站问一个、从站答一个”的方式完全不同效率高出一个数量级。EtherCAT 还支持分布式时钟能够让多个伺服轴在微秒级同步这是它在大规模运动控制中成为主流的重要原因。但 EtherCAT 也挑硬件主站需要标准以太网控制器从站则需要专门的 ESCEtherCAT Slave Controller芯片。不能随意拿普通网卡跑主站虽然有些软件主站方案能用普通网卡做演示但生产环境一般都建议用倍福、欧姆龙或第三方支持的主站板卡或软 PLC。做了这么多项目我的体会是普通逻辑控制、HMI 通信、SCADA 采集Modbus TCP 或者 PROFINET 足够但如果你的设备是六轴机器人、多轴贴片机、高速分拣线这一类需要对多个伺服做精确定位和同步EtherCAT 会是更稳的选择。4. 无线通信协议BLE、Zigbee、LoRa、Wi-Fi4.1 无线方案选型的判断框架自动化产线不全是“有线”的天下。AGV 小车、料箱机器人、无线温湿度传感器、手持扫码终端这些场景天然需要无线通信。无线协议也很多但选型时只要抓住四个维度基本就能锁定范围传输距离、数据速率、功耗、节点数量。要高带宽、实时视频、大量数据采集选 Wi-Fi。要低功耗、小数据量、手机直接连接选 BLE。要低功耗、中距离、大规模组网选 Zigbee。要超远距离、低功耗、小数据量选 LoRa 或 NB-IoT。还有一个容易忽略的维度实时性和确定性。无线传输天然存在竞争和干扰所以对实时性要求高的控制链路通常还是会用有线协议。无线更多用于数据采集、状态监控、调度通信这一层不会把安全相关的控制回路放在无线链路上。4.2 BLE 与 Zigbee小数据量传感网络的优等生BLE低功耗蓝牙是当下物联网设备的主流协议。它的优势是智能手机天然支持不需要额外网关硬件就能以蓝牙方式接入非常适合便携式设备、数据采集终端、穿戴式监测领域。BLE 的通信模型是 GATT通用属性协议设备以服务和特征值的方式暴露数据。做自动化设备对接手机 APP 时可以先把设备端定义好服务 UUID 和特征值 UUID写一个简单的读写通道。BLE 的传输速率不高实际有效吞吐率通常几十 KB/s但控制指令、状态反馈这类小数据量完全够用。Zigbee 基于 IEEE 802.15.4 标准最大特点是支持 mesh 组网。每个节点之间可以互相中继覆盖面可以做得很大单个网络理论上能支持几百个节点。Zigbee 的功耗很低两个 AA 电池供电的传感器节点跑一两年很正常。所以在智能楼宇、仓储环境监测、农业大棚这类“传感器数量多、数据量不大、电池供电”的场景Zigbee 仍然有它的生态位。不过说实话这几年 Zigbee 在消费类市场被 BLE mesh 和 Wi-Fi 挤压得比较厉害但在专业工业领域尤其是一些楼宇自动化和能源管理项目中Zigbee 依然是大量存在的方案。如果你接到这类设备集成项目协议栈和网关的选择要特别注意生态兼容性不同厂家的 Zigbee 设备互相通信并不总是开箱即用。4.3 LoRa 与 Wi-Fi远距离和高带宽的两种极端LoRa 是远距离低功耗无线技术的代表。它在城市环境下的传输距离可以到 1~2 公里开阔地带更远单个网关可以连接几百上千个节点并且穿透能力强。LoRa 的缺点是速率很低从几百 bps 到几十 kbps不适合传大量数据适合传温度、位置、设备状态这类小报文。LoRaWAN 是运行在 LoRa 物理层之上的网络协议定义了设备如何入网、如何上行下行。在自动化场景里LoRa 大显身手的地方往往是野外管网监测、光伏电站运维、园区能耗管理等“广覆盖、低速率、电池供电”的方向。Wi-Fi 则恰恰相反带宽高、生态成熟、部署方便直接用现有 AP 就能覆盖。但 Wi-Fi 的功耗高、节点接入量相对有限、时延不稳定用于工业现场的核心控制要谨慎。不过现在很多智能产线会把 Wi-Fi 用于 AGV 的调度系统、工业相机的图像回传、人员定位标签的通信这种“非实时、大带宽”的场景很合适。我做 AGV 调度项目时就遇到过 Wi-Fi 信道拥塞导致调度指令延迟的问题。后来把 AGV 的实时控制指令改用专用信道把图像回传放到另一个 SSID才把问题解决。无线方案很依赖现场环境不能只看理论参数。5. 自动化测试环节的协议调试与工具实战5.1 协议报文怎么看从示波器到逻辑分析仪不管协议选得多好联调阶段总会遇到通信问题。学会用工具看协议报文是自动化工程师节省时间的核心技能。示波器用来观察物理层信号比如 RS-485 的 A、B 线波形是否正常电平幅度够不够有没有明显的噪声叠加。我常用示波器查两类问题一是线路断开或短路时的波形异常二是终端电阻不匹配导致的波形过冲和振铃。Modbus RTU 在 RS-485 上跑得好不好看波形基本能判断个大概。逻辑分析仪则是看数字信号的时序特别适合 I2C、SPI、UART 这种低速数字总线。把探测夹夹在 SCL/SDA 上设置好采样率就能解析出完整的数据帧。逻辑分析仪比示波器好在协议解码能力强识别出帧的每个字段而且价格友好。市面上一两百元的逻辑分析仪就能满足日常调试需求。总线分析仪用于 CAN、LIN、FlexRay 等车载和工业总线。CAN 分析仪能从总线抓取报文显示 ID、数据、时间戳有些还支持发送报文、模拟节点、记录日志。调试伺服和电机的 CANopen 通信时这类工具几乎是标配。对于 EtherCAT、PROFINET 这类跑在以太网上的协议直接使用Wireshark。标准网卡配合 Wireshark 就能抓包但要注意以太网协议不一定能直接看到EtherCAT 的帧通常带有特殊 EtherTypeWireshark 识别后能够详细解析。软实时和硬实时的工业以太网分析还需要专业的抓包硬件但一般场景下 Wireshark 足够用了。5.2 常用仿真与测试工具做自动化测试和协议联调成熟的仿真工具能省一半时间。Modbus Poll / Modbus SlavePC 端最常用的 Modbus 主站和从站模拟工具。给 PLC 或设备做 Slave 测试时用 Modbus Poll 模拟主站读取数据需要仿真一个 Modbus 从站给上位机调试时用 Modbus Slave。这两个工具能设寄存器初值、轮询周期、显示数据变化操作逻辑非常直观。Proteus / Virtual Serial Port想在没有真实设备的情况下调试上位机可以用虚拟串口工具创建一对互连的 COM 口一个给主站程序一个给模拟从站。CANopen 上位机软件比如 PCAN-View、BusMaster、CANopen Magic 这类工具可以直接读写 SDO、接收 PDO甚至配置对象字典对调试驱动器节点非常实用。MQTT/OPC UA 仿真器在做上位机监控、MES 集成测试时设备端还没就位可以用 MQTT Broker 加模拟客户端或者使用 OPC UA 仿真服务器先把数据链路打通。在我自己的测试经验里尽量把“协议仿真”放在“设备联调”之前。先用模拟从站把上位机的逻辑验证完再用模拟主站把设备端的响应验证完最后才把两边接起来。这个顺序能减少至少一半的联调问题。5.3 自动化测试脚本里如何与协议交互协议调试不仅仅靠 GUI 工具自动化测试脚本同样要和通信协议打交道。现在很多项目的自动化测试框架用的是 pytest结合 pymodbus、pyserial、python-can 这类库就能在脚本里直接收发协议报文。举例来说用 pymodbus 做从站读取测试from pymodbus.client import ModbusTcpClient client ModbusTcpClient(192.168.1.10, port502) client.write_registers(40001, [100, 200], unit1) # 写入保持寄存器 result client.read_holding_registers(40001, count2, unit1) print(result.registers) # 断言寄存器值是否符合预期 client.close()跑串口 Modbus RTU 时用 pyserial 打开串口拼好请求帧接收响应后按 CRC 校验和数据格式解析。CAN 通信则可以用 python-can 配合 PCAN 或 SocketCAN 设备。在自动化测试框架里做协议相关测试我建议遵守三个原则数据要断言不要只是打印。测试用例里必须把接收到的数据和期望值比较失败时自动高亮。要考虑超时和异常。设备断电、线缆故障、从站地址错误这些都要模拟并验证系统能否正确提示。日志要完整。把请求帧、响应帧、耗时、错误码全部记录下来出问题时才有据可查。6. 选型经验与故障排查速查6.1 我的选型决策清单回到最核心的问题面对这么多协议项目里到底怎么选我这些年形成了一套自己的决策清单分享出来供参考先看距离和介质设备在同一个控制柜或板卡上选 I2C、SPI距离在几十米到一千米优先 RS-485 Modbus RTU需要高速高可靠多主通信选 CAN要跑产线级以太网优先 PROFINET 或 EtherCAT。再看实时性普通数据采集和状态监控Modbus TCP/PROFINET 足够多轴伺服同步、高速运动控制选 EtherCAT 或者专用运动总线对安全控制回路则要选带 FSoE、PROFIsafe 这类功能安全协议的方案。还要考虑生态和人设备供应商大多是西门子用户优先 PROFINET如果团队只熟悉 Modbus那就别强行上复杂的现场总线如果项目周期特别紧优先选最容易快速联调的方案功能扩展以后再说。最后看维护和备件老设备维护项目大概率还要沿用原来的协议新建项目尽量选主流协议方便后续招人、买备件、扩展功能。6.2 常见通信故障与排查步骤我把这些年排查通信故障的经验总结成一张速查表遇到问题可以按图索骥故障现象可能原因排查方法完全收不到数据接线错误、波特率不一致、设备未上电先看信号波形再用串口助手或总线工具监听数据乱码波特率不一致、校验位/数据位设置错误核对两边参数检查地线是否接好偶发丢包干扰严重、终端电阻缺失、线缆过长加终端电阻检查屏蔽层接地用屏蔽双绞线设备能通信但数值不对寄存器地址偏移、字节序不对、数据类型错误抓包查看原始报文逐字节解析确认总线冲突多主站同时发送、从站地址重复检查设备地址确保从站地址唯一确认主从规则CAN 通信瞬间故障终端电阻错误、CAN_H/CAN_L接反量终端电阻正常 60 欧姆左右检查极性无线丢包延迟信道拥塞、距离过远、同频干扰换信道、调整 AP 位置用专用 SSID确认信号强度排查顺序上我习惯从物理层开始接线松不松、地线接没接、终端电阻对不对。物理层没问题再谈参数波特率、地址、功能码。最后才怀疑协议栈和软件逻辑。这个顺序能规避掉大量“本来软件没问题最后发现是线没插紧”的尴尬情况。自动化通信协议的难点不在于某一个协议复杂到学不会而在于种类太多每种的适用边界又不同。把这几种主流协议的定位和取舍搞清楚项目里再遇到通信需求就可以快速收敛到最适合的方案上。我自己的习惯是多花一点时间梳理需求和约束而不是急着选协议、买设备。选对了协议后面的联调、测试、维护都会顺畅很多。
返回列表