第二章:PLC通信基础——串口通信RS232/RS485原理、Modbus RTU协议详解、Modbus TCP协议详解

各位同学,欢迎来到第二章。这一章我们聊聊PLC通信的基础。说实话,很多刚入行的工程师觉得通信协议很神秘,其实说白了,就是两个设备之间约定好怎么说话、用什么语速、怎么确认对方听懂了。

我个人习惯把通信协议比作两个人打电话——你得先拨号建立连接,然后说清楚谁先讲、讲多久、讲完怎么挂断。PLC通信也是这个道理。今天我们就从最基础的串口通信讲起,再到工业界最常用的Modbus协议。

PLC通信基础 - 知识体系 串口通信 RS232 / RS485 全双工 vs 半双工 波特率 / 数据位 / 停止位 Modbus RTU 基于RS485/RS232 16位CRC校验 功能码:01/02/03/04/05/06/15/16 Modbus TCP 基于以太网 无CRC校验(TCP/IP保证) MBAP报文头 核心对比 • RS232:点对点,15米以内,全双工 • RS485:多点通信,1200米,半双工(工业首选) • Modbus RTU vs TCP:RTU用串口+CRC,TCP用网线+MBAP头

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 实战建议:选型与调试

最后给你一些实战建议,都是我用真金白银换来的经验:

  1. 距离短(<15米)、设备少(1对1):用RS232,简单直接。
  2. 距离远(>15米)、设备多(多个从站):用RS485 + Modbus RTU,工业现场首选。
  3. 有以太网环境、数据量大:用Modbus TCP,速度快,调试方便。
  4. 调试工具:我习惯用Modbus Poll(主站模拟)和Modbus Slave(从站模拟),免费版就够用。
  5. 接线注意:RS485的A+接A+,B-接B-,别接反了。我见过有人接反了还调了一天,最后发现是线序问题。

小技巧:调试串口通信时,先用串口助手发个简单的Modbus RTU报文,看从站有没有响应。如果没响应,先检查接线和波特率。波特率不一致是最常见的低级错误,我刚开始也犯过。

好了,这一章的内容就到这里。串口通信和Modbus协议是工业视觉引导项目的基础,后面我们会用实际案例来演示怎么在PLC和视觉系统之间跑通这些协议。记住:理论是死的,现场是活的,多动手比什么都强。


公众号:蓝海资料掘金营,微信deep3321