第二章:PLC通信基础——串口通信RS232/RS485原理、Modbus RTU协议详解、Modbus TCP协议详解
各位同学,欢迎来到第二章。这一章我们聊聊PLC通信的基础。说实话,很多刚入行的工程师觉得通信协议很神秘,其实说白了,就是两个设备之间约定好怎么说话、用什么语速、怎么确认对方听懂了。
我个人习惯把通信协议比作两个人打电话——你得先拨号建立连接,然后说清楚谁先讲、讲多久、讲完怎么挂断。PLC通信也是这个道理。今天我们就从最基础的串口通信讲起,再到工业界最常用的Modbus协议。
2.1 串口通信:RS232与RS485
先说说串口通信。你想想看,PLC和传感器、变频器、仪表之间怎么传数据?最原始也最可靠的方式就是串口。我最早接触PLC时,用的就是RS232,一根线连电脑,下载程序全靠它。
RS232——老前辈,但还在用
RS232是串口通信的鼻祖。它用正负电压表示逻辑1和0,比如-3V~-15V是逻辑1,+3V~+15V是逻辑0。嗯,这里要注意:RS232是全双工的,也就是说可以同时收发数据,就像两个人同时说话也能听见对方。
RS232关键参数:
- 传输距离:通常不超过15米(我试过20米,信号就开始飘了)
- 通信方式:点对点(一台设备只能连一台)
- 信号线:至少3根(TX发送、RX接收、GND地线)
- 电平标准:±12V左右
我的经验:RS232虽然老,但在调试阶段特别好用。我习惯用USB转RS232线连PLC,打开串口助手就能看数据。不过工业现场别用RS232走长线,干扰太大,我曾经吃过这个亏。
RS485——工业现场的主力军
RS485就不一样了。它用差分信号传输,说白了就是两根线(A和B)之间的电压差来决定逻辑。抗干扰能力比RS232强太多了。而且它是半双工的,同一时刻只能发或收,不能同时进行。
为什么会这样?因为RS485支持多点通信,一条总线上可以挂最多32个节点(现在有些芯片能挂256个)。如果大家都在发,总线就打架了。所以必须分时复用。
RS485关键参数:
- 传输距离:最远1200米(我实际测过800米,稳定运行)
- 通信方式:多点(一主多从,最多32~256个节点)
- 信号线:2根(A+、B-),有时加GND
- 电平标准:差分信号,A-B > 200mV为逻辑1
避坑指南:我曾经在一条RS485总线上挂了15台变频器,结果通信老是丢包。查了半天发现是终端电阻没加。记住:RS485总线两端必须各加一个120Ω的终端电阻,否则信号反射会让你怀疑人生。
2.2 Modbus RTU协议详解
好了,串口讲完了,我们聊聊Modbus。Modbus是工业界最通用的协议,没有之一。你随便找个PLC,基本都支持Modbus。我个人最喜欢Modbus的一点——它简单到令人发指,但够用。
Modbus RTU是运行在串口(通常是RS485)上的版本。它用二进制格式传输,效率高,适合工业现场。
报文结构
Modbus RTU的报文就三部分:地址码 + 功能码 + 数据 + CRC校验。我拆开给你看:
| 字段 | 长度 | 说明 |
|---|---|---|
| 从站地址 | 1字节 | 0x01~0xF7,0x00为广播地址 |
| 功能码 | 1字节 | 指示操作类型(读/写线圈、寄存器等) |
| 数据区 | N字节 | 寄存器地址、数量、数据值等 |
| CRC校验 | 2字节 | 低字节在前,高字节在后 |
常用功能码
你不需要背所有功能码,记住这几个就够了:
- 0x01:读线圈状态(读DO)
- 0x02:读离散输入(读DI)
- 0x03:读保持寄存器(读AO或数据寄存器)—— 这个最常用
- 0x04:读输入寄存器(读AI)
- 0x05:写单个线圈(写单个DO)
- 0x06:写单个寄存器(写单个AO)
- 0x0F:写多个线圈
- 0x10:写多个寄存器
我的习惯:调试时我一般先用0x03功能码读几个寄存器,确认通信通了,再试写操作。这样一步步来,出问题好定位。
CRC校验怎么算?
Modbus RTU用16位CRC校验,多项式是0x8005。你不用手算,PLC和上位机库都帮你算好了。但你要知道:CRC校验失败,报文直接丢弃。我曾经遇到一个案例,现场干扰大,CRC错误率高达30%,后来换了屏蔽双绞线才解决。
// 一个简单的CRC16计算示例(C语言风格)
uint16_t crc16_modbus(uint8_t *data, uint16_t len) {
uint16_t crc = 0xFFFF;
for (uint16_t i = 0; i < len; i++) {
crc ^= data[i];
for (uint8_t j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
}
2.3 Modbus TCP协议详解
Modbus TCP就是把Modbus搬到以太网上。你想想看,现在工厂里到处都是网线,走TCP/IP多方便。而且Modbus TCP不需要CRC校验,因为TCP/IP协议栈自己会保证数据完整性。
和RTU的区别
说白了,Modbus TCP就是把RTU报文去掉CRC,前面加一个MBAP报文头。MBAP头有7个字节:
| 字段 | 长度 | 说明 |
|---|---|---|
| 事务处理标识符 | 2字节 | 用于匹配请求和响应(随便填,但同一会话要一致) |
| 协议标识符 | 2字节 | 固定为0x0000(表示Modbus协议) |
| 后续长度 | 2字节 | 从单元标识符开始到报文结束的字节数 |
| 单元标识符 | 1字节 | 相当于RTU的从站地址 |
然后后面紧跟着功能码和数据区,和RTU一模一样,只是没有CRC。
Modbus TCP报文示例(读保持寄存器):
请求:00 01 00 00 00 06 01 03 00 00 00 0A
|--MBAP头--| |--PDU--|
事务ID=0x0001
协议ID=0x0000
长度=0x0006(后面6个字节)
单元ID=0x01
功能码=0x03(读保持寄存器)
起始地址=0x0000
寄存器数量=0x000A(10个)
响应:00 01 00 00 00 17 01 03 14 00 01 00 02 ...
长度=0x0017(23个字节)
功能码=0x03
字节数=0x14(20个数据字节)
后面是10个寄存器的值(每个2字节)
端口号
Modbus TCP默认使用端口502。这个端口是IANA分配给Modbus的,一般不会被其他服务占用。但如果你在电脑上调试,记得关掉防火墙或者放行502端口。
我曾经踩过的坑:有一次现场调试,PLC和上位机怎么都连不上Modbus TCP。查了半天,发现IT部门把502端口封了。所以做项目前,一定先和IT确认网络策略。
2.4 实战建议:选型与调试
最后给你一些实战建议,都是我用真金白银换来的经验:
- 距离短(<15米)、设备少(1对1):用RS232,简单直接。
- 距离远(>15米)、设备多(多个从站):用RS485 + Modbus RTU,工业现场首选。
- 有以太网环境、数据量大:用Modbus TCP,速度快,调试方便。
- 调试工具:我习惯用Modbus Poll(主站模拟)和Modbus Slave(从站模拟),免费版就够用。
- 接线注意:RS485的A+接A+,B-接B-,别接反了。我见过有人接反了还调了一天,最后发现是线序问题。
小技巧:调试串口通信时,先用串口助手发个简单的Modbus RTU报文,看从站有没有响应。如果没响应,先检查接线和波特率。波特率不一致是最常见的低级错误,我刚开始也犯过。
好了,这一章的内容就到这里。串口通信和Modbus协议是工业视觉引导项目的基础,后面我们会用实际案例来演示怎么在PLC和视觉系统之间跑通这些协议。记住:理论是死的,现场是活的,多动手比什么都强。
公众号:蓝海资料掘金营,微信deep3321