关于工业总线的通信协议:
1)工业总线协议(Modbus RTU/TCP、PROFINET、EtherCAT)的帧结构、通信速率与实时性对比;
2)Modbus 协议的主从机通信实现,如寄存器读写、CRC 校验代码;
3)PROFINET 设备的组态流程(使用 Siemens TIA Portal)、设备名称分配与数据交换。
工业总线协议深度实战:Modbus、PROFINET、EtherCAT
一、工业通信协议全景图
1.1 为什么需要这么多协议?
在工业自动化领域,没有"万能"的通信协议,不同的场景需要不同的"语言"。选错协议的代价可能是生产线停机、产品质量下降,甚至安全事故。
1.2 三大协议实时性对比
三种协议的实时性差距有多大?用一个生动的比喻就能理解:
| 协议 | 典型周期 | 比喻 | 适用场景 |
|---|---|---|---|
| Modbus RTU | 50-200ms | 寄平信(来回需几天) | 温度采集、报表记录 |
| Modbus TCP | 10-30ms | 发微信(秒级响应) | SCADA监控 |
| PROFINET RT | 1-10ms | 打电话(实时对话) | 常规IO控制 |
| PROFINET IRT | 250-500µs | 5G远程手术(精准同步) | 多轴机器人 |
| EtherCAT | 50-250µs | 光纤通信(几乎无延迟) | 高速运动控制 |
二、Modbus协议深度解析
2.1 帧结构详解
Modbus是应用最广泛的工业协议,核心优势是"简单"。它像一个标准信封:不论里面装什么信,信封格式都一样。
Modbus RTU帧结构(二进制紧凑型):
起始静默 地址 功能码 数据 CRC校验 结束静默 [≥3.5字符] [1B] [1B] [0-252B] [2B] [≥3.5字符]关键规则:
- 字节间隔 < 1.5字符时间 → 属于同一帧
- 间隔 > 1.5字符时间 → 视为新帧开始
- CRC校验"低位在前"(Little-Endian)
Modbus TCP帧结构(以太网封装型):
TCP头(20-60B) | MBAP头(7B) | PDU(功能码+数据)MBAP头结构:
| 字段 | 长度 | 说明 |
|---|---|---|
| 事务元标识符 | 2字节 | 请求/响应配对 |
| 协议标识符 | 2字节 | 0=Modbus协议 |
| 长度 | 2字节 | 后续字节数 |
| 单元标识符 | 1字节 | 从站地址 |
2.2 常用功能码
| 功能码 | 名称 | 作用 |
|---|---|---|
| 0x01 | 读线圈 | 读取DO状态 |
| 0x02 | 读离散输入 | 读取DI状态 |
| 0x03 | 读保持寄存器 | 读取AO数据 |
| 0x04 | 读输入寄存器 | 读取AI数据 |
| 0x05 | 写单线圈 | 控制单个DO |
| 0x06 | 写单寄存器 | 设置单个AO |
| 0x0F | 写多线圈 | 批量控制DO |
| 0x10 | 写多寄存器 | 批量设置AO |
2.3 CRC校验代码实现
CRC-16-Modbus是Modbus RTU的核心校验机制,低位在前是其最大特点。
// Modbus CRC-16 计算函数uint16_tmodbus_crc16(uint8_t*buffer,uint16_tlength){uint16_tcrc=0xFFFF;for(uint16_ti=0;i<length;i++){crc^=buffer[i];for(uint8_tj=0;j<8;j++){if(crc&0x0001)crc=(crc>>1)^0xA001;elsecrc>>=1;}}// Modbus CRC 要求低字节在前returncrc;}// 发送带CRC的Modbus命令voidmodbus_send_cmd(uint8_tslave,uint8_tfunc,uint16_treg,uint16_tvalue){uint8_tframe[8];uint16_tcrc;intlen=0;frame[len++]=slave;frame[len++]=func;frame[len++]=(reg>>8)&0xFF;frame[len++]=reg&0xFF;frame[len++]=(value>>8)&0xFF;frame[len++]=value&0xFF;crc=modbus_crc16(frame,len);frame[len++]=crc&0xFF;// CRC低字节frame[len++]=(crc>>8)&0xFF;// CRC高字节uart_send(frame,len);}// 校验接收帧的CRCintmodbus_verify_frame(uint8_t*frame,uint16_tlen){if(len<4)return-1;uint16_trecvd_crc=frame[len-2]|(frame[len-1]<<8);uint16_tcalc_crc=modbus_crc16(frame,len-2);return(recvd_crc==calc_crc)?0:-1;}2.4 完整交互示例
读保持寄存器(从站地址01,起始地址0105,读1个寄存器):
主机发送: 01 03 01 05 00 01 95 F7 从机回复: 01 03 02 56 78 87 C6解析:
01:从站地址03:功能码(读保持寄存器)01 05:起始地址00 01:寄存器数量95 F7:CRC校验
回复解析:
02:数据长度2字节56 78:寄存器值(0x5678)87 C6:CRC校验
三、PROFINET协议详解
3.1 协议分层与实时性
PROFINET不是一个单一协议,而是一个协议族,根据实时性需求分为三个等级:
PROFINET RT帧结构:
以太网头(14B) | VLAN标签(4B,可选) | PN帧ID | PN数据 | FCS(4B)特点:直接在以太网帧上传输,绕过TCP/IP栈,减少协议开销。
PROFINET IRT:通过硬件时间片机制,为IRT通信预留固定的、周期性的时间窗口,实现微秒级抖动,这是西门子在高精度运动控制领域的核心竞争力。
3.2 TIA Portal组态完整流程
以下以S7-1200 G2与ET200SP的PROFINET IO通信为例:
第1步:创建项目并添加设备
1. 打开TIA Portal → 创建新项目 2. 点击"添加新设备" → 选择S7-1200 G2 CPU 3. 等待硬件目录加载完成第2步:添加远程IO设备
1. 切换到"网络视图" 2. 从硬件目录拖入ET200SP接口模块 3. 右键点击IO设备 → 选择"PROFINET接口" → "添加子网"第3步:分配IO控制器
1. 点击ET200SP的"未分配"图标 2. 选择"PLC_1.PROFINET接口_1" 3. 观察连接线出现,表示分配成功第4步:配置设备名称和IP
关键原则:离线配置的设备名称必须在在线时实际分配,这是PROFINET配置中最容易出错的环节。
离线配置: - 右键点击IO设备 → 属性 - PROFINET接口 → 以太网地址 - 设置IP:192.168.0.100 - 设备名称:et200sp_1 在线分配: - 右键点击IO设备 → 分配设备名称 - 更新列表 → 搜索网络节点 - 选中目标设备 → 点击"分配名称" - 状态应变为"确定"第5步:配置IO地址
1. 双击IO设备进入设备视图 2. 添加所需IO模块 3. 查看地址总览,确认映射的PLC地址 4. 例如:输入I2.0映射到DI模块第0位第6步:编译下载
1. 右键项目 → 编译 → 软件(重建所有) 2. 选中PLC → 下载到设备 3. 确认PROFINET连接状态为绿色3.3 GSD文件管理
非西门子设备接入PROFINET网络时,需要导入GSD文件:
1. 菜单栏 → 选项 → 管理通用站描述文件(GSD) 2. 点击"源路径" → 选择GSD文件所在目录 3. 勾选需要安装的文件 → 点击"安装" 4. 等待安装完成 → 重启TIA Portal(如提示) 5. 硬件目录中找到已安装的设备3.4 PROFINET与EtherCAT核心差异
| 维度 | PROFINET IRT | EtherCAT |
|---|---|---|
| 通信机制 | 时间片调度 | 飞行中处理 |
| 硬件要求 | IRT专用交换机 | 无需交换机,线型拓扑 |
| 同步精度 | <1µs | <1µs(分布式时钟) |
| 安全协议 | PROFIsafe | FSoE |
| 生态主导 | 西门子 | 倍福 |
| 配置复杂度 | 中等 | 中等 |
"飞行中处理"是EtherCAT的标志性技术——主站发出一帧数据依次经过所有从站,从站在帧经过时极短暂停留后立即转发,延迟仅数十纳秒。
四、项目文件结构
industrial_bus_project/ ├── modbus/ │ ├── src/ │ │ ├── modbus_rtu_master.c │ │ ├── modbus_rtu_slave.c │ │ ├── modbus_tcp_client.py │ │ └── crc16.c │ └── doc/ │ └── modbus_protocol.md │ ├── profinet/ │ ├── gsd_files/ # GSD文件存储 │ ├── tia_projects/ # TIA Portal项目 │ └── doc/ │ └── profinet_commisioning.md │ ├── ethercat/ │ ├── slave_config/ # ESI文件 │ ├── master_app/ │ └── doc/ │ ├── gateway/ # 协议转换 │ ├── modbus_to_profinet.py │ └── config.yaml │ └── README.md五、总结
| 协议 | 核心优势 | 核心局限 | 选型建议 |
|---|---|---|---|
| Modbus | 简单开放、设备普及 | 实时性差、主从轮询 | 数据采集、仪表通信 |
| PROFINET | 生态完整、诊断强大 | 西门子绑定、成本较高 | 西门子PLC环境 |
| EtherCAT | 速度极快、同步精准 | 以太网不兼容、学习曲线 | 多轴运动控制 |
| TSN | IT/OT融合、灵活调度 | 尚不成熟、配置复杂 | 未来工厂** |
| PROFINET over TSN | IT/OT融合、实时保障 | 尚不成熟、配置复杂 | 未来工厂** |
混合场景下可通过工业网关实现协议互联,例如Modbus转PROFINET、EtherCAT转PROFINET等成熟方案均具备24µs级的极低延时,满足产线数据实时交互要求。