上位机与PLC通讯是工业自动化的核心环节,但不同品牌的PLC往往使用不同的私有协议:西门子用S7、三菱用MC、欧姆龙用FINS,加上跨品牌通用的Modbus与OPC UA,构成了一套复杂的协议生态。理解每种协议的帧结构、地址模型与适用边界,是上位机开发者的必备技能。本文系统解析四种主流PLC通信协议,并给出多品牌混合接入的工程方案。

一、PLC通信协议概述

PLC通信协议之所以"百花齐放",根本原因在于:工业控制对实时性、可靠性要求极高,各厂家从硬件到协议做了端到端优化,私有协议往往比通用协议性能更好;同时厂家出于商业生态考虑,倾向于通过私有协议绑定用户。这种生态在客观上推高了上位机开发的复杂度——一个跨品牌的车间可能需要同时支持四五种协议。

1.1 协议生态概览

协议主导厂商开放程度典型PLC型号
Modbus TCP/RTUModicon(施耐德)完全开放跨品牌通用
S7协议西门子私有(已逆向)S7-200/300/400/1200/1500
MC协议三菱电机私有(文档公开)Q/L/FX5U/iQ-R/iQ-F
FINS协议欧姆龙私有(文档公开)CJ/CP/NJ/NX/CS
OPC UAOPC基金会开放标准跨品牌统一
EtherNet/IP罗克韦尔开放(ODVA)AB ControlLogix/CompactLogix

1.2 选型决策路径

选型遵循"专有协议优先、通用协议兜底"的原则。若现场只有单一品牌PLC,用其专有协议性能更好(如纯西门子现场用S7);若现场多品牌混合、对跨品牌一致性要求高,用Modbus或OPC UA统一接入;若设备本身只支持Modbus(如变频器、仪表),则只能用Modbus。下面分别深入介绍四种主流协议。

二、Modbus协议族

Modbus是1979年由Modicon公司发布的工业通讯协议,后被施耐德电气收购并开放。凭借公开、轻量、易实现的特点,成为工业领域应用最广的"通用方言"。Modbus有三种主流变种:RTU、ASCII、TCP。

2.1 帧结构对比

项目Modbus RTUModbus ASCIIModbus TCP
物理层RS-485/RS-232RS-485Ethernet
传输模式二进制ASCII字符二进制
帧起始3.5字符静默冒号":"MBAP头
帧结束3.5字符静默CRLF长度字段
校验CRC16LRCTCP自带
典型速率9.6k-115.2kbps9.6k-115.2kbps100M/1G以太网

2.2 功能码与寄存器模型

Modbus定义了四类数据对象,对应最常用的功能码:

功能码 01 — 读取线圈状态 (Read Coils)              → 可读写布尔量
功能码 02 — 读取离散输入 (Read Discrete Inputs)    → 只读布尔量
功能码 03 — 读取保持寄存器 (Read Holding Registers) → 可读写16位寄存器
功能码 04 — 读取输入寄存器 (Read Input Registers)   → 只读16位寄存器
功能码 05 — 写入单线圈 (Write Single Coil)
功能码 06 — 写入单寄存器 (Write Single Register)
功能码 15 — 写入多线圈 (Write Multiple Coils)
功能码 16 — 写入多寄存器 (Write Multiple Registers)

2.3 地址映射规则

Modbus地址采用6位编号体系,前缀数字代表数据类型:

地址范围数据类型对应功能码PLC区域示例
000001-065536线圈(Coil)01/05/15M/Y线圈
100001-165536离散输入02X输入
300001-365536输入寄存器04AI模拟量输入
400001-465536保持寄存器03/06/16D/V寄存器

需要注意的是,Modbus协议地址从1开始,但PDU中的地址字段从0开始。例如要读40001寄存器,PDU中地址字段为0x0000。不同PLC厂家把Modbus地址映射到内部区域的规则不同,例如西门子40001映射到DB1.DBD0,三菱40001映射到D0,欧姆龙40001映射到D0,建议每个项目都让电气工程师提供盖章版的地址映射表。

三、西门子S7协议

S7协议是西门子为其S7系列PLC设计的私有通讯协议,运行在ISO-on-TCP(102端口)之上。虽然协议本身未公开,但社区已逆向出完整规范,开源库S7.Net、Snap7均支持完整读写功能。

3.1 协议帧结构

S7协议帧由TPKT(4字节)+ COTP(3-7字节)+ S7头部 + 参数区 + 数据区组成。TPKT提供基本分段信息,COTP负责连接管理,S7头部承载实际业务命令。

┌──────────┬──────────┬──────────┬──────────────────┐
│  TPKT    │  COTP    │  S7 Header │  Param + Data   │
│  4 bytes │ 3-7 bytes│  10-12 bytes│  可变长          │
└──────────┴──────────┴──────────┴──────────────────┘

TPKT格式:
  Version(1B) | Reserved(1B) | High Len(1B) | Low Len(1B)

S7 Header格式:
  Protocol Id(0x32) | ROSCTR(1B) | Redundancy(2B) |
  PDU Reference(2B) | Param Len(2B) | Data Len(2B)

3.2 TSAP地址

S7连接建立时需要指定TSAP(Transport Service Access Point),用于路由到PLC内的具体资源。常用TSAP配置:

  • 机架0槽1(CPU模块):Local TSAP=0x0100,Remote TSAP=0x0301
  • S7-1200/1500默认开启PUT/GET通信:Local TSAP=0x0100,Remote TSAP=0x0301
  • 注意S7-1200/1500需要在TIA Portal中"启用PUT/GET通信访问",否则连接被拒绝

3.3 数据区与地址模型

S7协议通过数据区(Area)+ 偏移(Offset)寻址,常用数据区:

Area Code区域说明
0x04DB区数据块,需指定DB号
0x05C区计数器
0x06T区定时器
0x80I区输入(过程映像)
0x82Q区输出(过程映像)
0x83M区位存储区

举例:读取S7-1200的DB1.DBB0开始的10个字节,Area=0x04,DB Number=1,Offset=0,Length=10。读取M0.0开始的1个位,Area=0x83,Offset=0,Length=1(按位读取)。

3.4 与S7-1200/1500通讯要点

S7-1200/1500的安全模型比S7-300/400严格,需要额外配置:① 在CPU属性中启用"PUT/GET通信访问";② 在"保护"页签中取消"防止PLC内部数据被读取";③ 防护等级设置为"无保护"或允许访问;④ DB块属性中取消"优化的块访问"(启用绝对寻址)。这些设置是新手常踩的坑,会导致连接成功但读不到数据。

四、三菱MC协议

MC协议(MELSEC Communication Protocol)是三菱电机为其PLC设计的私有协议,支持以太网(Q系列、iQ-R、iQ-F、FX5U)和串口(Q系列、FX系列)两种传输方式。MC协议按帧格式分为3E帧、4E帧两种。

4.1 帧格式

帧格式子站编号网络编号PC编号请求目标模块IO请求目标模块站号请求数据长度监视定时器
3E帧不包含不包含不包含不包含不包含2字节2字节
4E帧不包含不包含不包含不包含不包含2字节2字节
3C帧1字节1字节1字节2字节1字节2字节2字节

3E帧是最常用的格式,结构最简洁;4E帧在3E帧基础上增加了4字节的"网络编号+PC编号",用于多网络环境;3C帧包含完整的路由信息,用于跨网络访问。3E帧和4E帧都支持二进制模式和ASCII模式,二进制模式效率更高,ASCII模式更易调试。

4.2 二进制与ASCII模式对比

读取D0开始的2个寄存器(D0, D1):

二进制模式(3E帧,总长度21字节):
50 00 00 FF FF 03 00 0C 00 10 00 01 14 00 00 00 00 04 02 00 00

ASCII模式(3E帧,每个字节用2个ASCII字符表示,长度翻倍):
35 30 30 30 30 30 46 46 46 46 30 33 30 30 30 43 30 30 31 30 30 30 30 31 34 30 30 30 30 30 30 30 34 30 32 30 30 30 30

ASCII模式虽然占用带宽更大,但可直接显示和打印,便于协议调试与故障排查;二进制模式高效紧凑,是生产环境的常用选择。多数三菱PLC默认开启二进制模式。

4.3 命令字与软元件

MC协议通过命令字(Command)+ 子命令(Subcommand)+ 软元件代码+ 起始地址+ 数量 组成读写请求。常用软元件代码:

软元件代码说明
MM*内部继电器(位)
XX*输入(位)
YY*输出(位)
DD*数据寄存器(字)
RR*文件寄存器(字)
TTN定时器当前值(字)

读命令字0x0401(按字读)、0x0401子命令0x0001(按位读);写命令字0x1401(按字写)、0x1401子命令0x0001(按位写)。

五、欧姆龙FINS协议

FINS(Factory Interface Network Service)是欧姆龙为其PLC设计的通讯协议,支持以太网、Controller Link、Sysmac Way等多种传输方式。以太网FINS运行在UDP 9600端口(也可配置TCP),相比S7和MC协议,FINS协议结构更简洁。

5.1 FINS帧结构

┌─────────────┬─────────────┬──────────────────────┐
│ FINS Header │ FINS Command │ Command Data          │
│  10 bytes   │   2 bytes    │  可变长               │
└─────────────┴─────────────┴──────────────────────┘

FINS Header 字段:
  ICN (1B) 信息控制字段
  SID (1B) 服务ID
  GCT (1B) 网关数
  DNA (1B) 目标网络地址
  DA1 (1B) 目标节点地址
  DA2 (1B) 目标单元地址
  SNA (1B) 源网络地址
  SA1 (1B) 源节点地址
  SA2 (1B) 源单元地址
  SID (1B) 服务ID

5.2 CPU单元地址

FINS通过"网络号-节点号-单元号"三级地址寻址。例如"0.10.0"表示0号网络、10号节点、CPU单元(单元号0为CPU本体)。这种结构在多PLC网络中支持跨网关通信,扩展性较好。

5.3 数据区映射

区域代码区域说明
0x30 (CIO)CIO区核心IO区
0x31 (WR)工作区内部继电器
0x32 (HR)保持区掉电保持
0x33 (AR)辅助区系统区
0x82 (DM)DM区数据寄存器
0x02 (TIM)定时器当前值/PV

FINS常用命令:0x0101读内存区、0x0102写内存区、0x0103读内存区(按位)、0x0601读CPU状态、0x0603读CPU单元信息。读取CIO0开始的10个字:命令0x0101,区域代码0x30,起始地址0x0000,数量0x000A。

六、四种协议对比

对比项Modbus TCPS7MCFINS
开放性完全开放私有(已逆向)私有(文档公开)私有(文档公开)
跨品牌兼容仅西门子仅三菱仅欧姆龙
实时性中等较好较好较好
开发难度
开源库支持NModbus等S7.Net/Snap7HslCommunicationHslCommunication
典型场景跨品牌/仪表西门子现场三菱现场欧姆龙现场
地址模型4类对象+偏移Area+DB+Offset软元件代码+地址区域代码+地址

选型建议:纯西门子现场选S7(性能好、开源库成熟);纯三菱现场选MC(三菱原生支持);纯欧姆龙现场选FINS(欧姆龙原生支持);跨品牌混合或接入仪表/变频器选Modbus;多品牌混合且对标准化要求高选OPC UA。

七、多品牌PLC混合接入方案

实际项目中常遇到一个车间既有西门子S7-1500,又有三菱Q系列和欧姆龙NJ,每条产线品牌不同,但都要把数据汇聚到统一的MES系统。这种情况下有三种典型方案。

7.1 协议转换网关

使用工业协议网关(如映翰通、有人物联网网关)在硬件层做协议转换:网关下行支持S7/MC/FINS/Modbus等多协议,上行统一为Modbus TCP或MQTT。优点是上位机只需实现一种协议;缺点是引入中间层增加延迟(典型5-20ms),网关本身要可靠(建议冗余部署)。

7.2 驱动层封装

在上位机的驱动层抽象出统一的IDeviceDriver接口,每种协议实现一套驱动类(如S7DriverMitsubishiMCDriverOmronFinsDriver),上层业务通过统一接口调用,不感知协议差异。这是赢式科技团队的常用方案,灵活性最高,但对开发能力要求高。可借助HslCommunication这类商业库减少开发量。

public interface IDeviceDriver
{
    Task ConnectAsync();
    Task ReadWordsAsync(string address, ushort count);
    Task WriteWordsAsync(string address, ushort[] values);
    Task ReadBitsAsync(string address, ushort count);
    Task WriteBitAsync(string address, bool value);
    bool IsConnected { get; }
}

// 地址格式统一抽象,由具体驱动解析:
//   S7:     "DB1.DBW0"        "M0.0"
//   MC:     "D0"              "M0"
//   FINS:   "D0"              "CIO0.0"
//   Modbus: "40001"           "00001"

7.3 OPC UA统一建模

OPC UA是面向"信息建模"的开放协议,将不同品牌PLC的数据抽象为统一的地址空间(Address Space),上位机通过OPC UA Client统一访问。每个PLC厂家提供自己的OPC UA Server(如西门子Simatic Net、三菱MX OPC Server、KEPware通用Server)。优点是真正的"即插即用",缺点是OPC UA协议本身较重,对小PLC或低性能设备负担大。

7.4 方案选型建议

对于品牌种类少(2-3种)、对延迟敏感的项目,优先用驱动层封装方案,性能与灵活性兼顾;对于品牌多(5种以上)、上线周期紧的项目,用OPC UA方案,工程量小但部署成本高;对于现场已经有协议转换硬件的项目,直接复用网关方案即可。三种方案各有适用边界,没有"最优解"。

八、赢式科技PLC通讯开发服务介绍

上海赢式信息科技有限公司自2010年成立以来,长期深耕上位机与PLC通讯领域,累计交付3000+定制化项目,服务覆盖汽车零部件、新能源电池、食品饮料、智慧能源、环保监测等行业。公司可提供Modbus、S7、MC、FINS、OPC UA等多协议接入方案,支持多品牌PLC混合接入、断线重连、数据补传、远程调试等工程化能力。如果您有PLC通讯或上位机开发需求,欢迎联系赢式科技获取需求评估与方案报价。