第3章:通信协议入门:Modbus RTU/TCP协议详解、IEC 104协议简介、OPC UA在风电中的应用场景

各位好,我是老张。在风电SCADA这个行当摸爬滚打了十几年,今天咱们来聊聊通信协议。说实话,刚入行那会儿,我被这些协议搞得晕头转向——Modbus、IEC 104、OPC UA,每个都号称能“打通数据”,但实际用起来坑一个接一个。

嗯,咱们不搞那些教科书式的罗列。我直接告诉你:在风机SCADA系统里,通信协议就是“翻译官”。风机里的PLC、变频器、传感器说各自的语言,SCADA系统得听懂它们的话,还得把指令传回去。选错协议,轻则数据丢包,重则风机停机——我亲眼见过一个风场因为Modbus轮询周期没算好,导致主控死机,那场面...算了,不吓唬你们了。

核心观点:没有最好的协议,只有最合适的协议。Modbus适合简单点对点,IEC 104适合远动控制,OPC UA适合跨平台集成。选型时别光看技术参数,得看现场环境、设备兼容性和运维成本。

3.1 Modbus RTU/TCP协议详解

Modbus这玩意儿,说白了就是工业界的“普通话”。1979年由Modicon公司发明,到现在还在用,你就知道它有多皮实了。我个人习惯把Modbus分成两种:RTU走串口,TCP走网线。

3.1.1 Modbus RTU:串口上的“老黄牛”

Modbus RTU用RS-232或RS-485物理层。RS-485能跑1200米,抗干扰能力强,风场里那些老机组基本都用它。我遇到过最极端的情况——一个风场用RS-485拉了800米,中间还经过几个塔筒,居然没丢包,只能说Modbus RTU确实皮实。

数据帧结构:

地址码(1字节) + 功能码(1字节) + 数据区(N字节) + CRC校验(2字节)

举个例子,读取风机风速(保持寄存器地址40001):

发送:01 03 00 00 00 01 84 0A
解释:地址01(1号风机) 功能码03(读保持寄存器) 起始地址0000 读取1个寄存器 CRC校验

这里有个坑——地址偏移。Modbus协议里寄存器地址从0开始,但很多设备手册写的是40001。实际上40001对应地址0,40002对应地址1。我曾经因为这个搞错,读回来的风速一直是0,查了三天才发现是地址没对齐。

避坑指南:Modbus RTU的CRC校验是强制性的,但很多国产设备CRC计算有bug。我建议你在SCADA端做二次校验,否则数据错位了都不知道。

3.1.2 Modbus TCP:以太网上的“快车”

Modbus TCP就是把Modbus帧封装在TCP/IP包里。端口号502,没有CRC校验(因为TCP本身有校验)。速度比RTU快得多,适合数据量大的场景。

报文结构:

MBAP头(7字节) + 地址码(1字节) + 功能码(1字节) + 数据区(N字节)

MBAP头包含事务标识符、协议标识符、长度等字段。嗯,这里要注意:Modbus TCP的地址码通常填0xFF,表示广播或忽略从站地址。

我在一个海上风场项目里用过Modbus TCP。当时要采集200多台风机数据,每台风机每秒上报50个点。如果用RTU轮询,周期得10秒以上,根本来不及。换成TCP后,每台风机独立连接,数据实时性直接拉到毫秒级。

个人经验:Modbus TCP虽然快,但别滥用。如果一台SCADA服务器同时连接超过100个TCP客户端,建议用异步I/O或多线程,否则socket会爆。我见过一个哥们用单线程轮询300个连接,结果CPU跑满,数据全丢了。

3.2 IEC 104协议简介

IEC 104是电力系统的“正规军”。它基于TCP/IP,专门用于远动控制(SCADA和RTU之间的通信)。在风电行业,电网调度端几乎清一色用IEC 104,因为国网和南网都要求这个。

核心特点:

  • 面向连接:建立TCP连接后,通过APDU(应用协议数据单元)传输
  • 带时标:每个遥测/遥信数据都带时间戳,精度到毫秒
  • 支持主动上报:不像Modbus那样需要轮询,设备可以主动推送数据

我记得第一次接触IEC 104是在一个风场并网调试现场。电网调度要求风机必须上报“有功功率”、“无功功率”、“电压”、“电流”四个遥测量,而且时标误差不能超过10毫秒。当时我们用的PLC不支持IEC 104,只能加装协议转换器,折腾了整整一周。

典型报文示例(遥测上报):

启动字符 0x68
APDU长度 0x12
控制域 0x53 0x01 0x00 0x00
类型标识 0x09(遥测,归一化值)
可变结构限定词 0x01
传送原因 0x03(自发)
公共地址 0x01 0x00
信息体地址 0x00 0x00 0x01
信息体值 0x00 0x64(100.0,归一化值)
时标 7字节

说实话,IEC 104的报文结构比Modbus复杂得多。但好处是标准化程度高,不同厂家的设备基本能互通。我建议初学者先抓包看几个典型报文,比死记硬背协议文档有效得多。

关键区别:Modbus是“你问我答”,IEC 104是“有变化就报”。在风电场景里,IEC 104更适合电网调度这种需要实时监控的场合,而Modbus更适合风机内部的传感器数据采集。

3.3 OPC UA在风电中的应用场景

OPC UA(统一架构)是工业4.0的“明星协议”。它不光是通信协议,更是一个完整的平台——支持数据建模、安全加密、历史数据访问等。说白了,OPC UA能让不同厂商的设备“说同一种语言”。

在风电中的典型应用:

  • 跨平台数据集成:把不同品牌PLC、变频器、振动传感器的数据统一到OPC UA服务器
  • 远程运维:通过OPC UA的加密通道,安全地访问风场数据
  • 历史数据回放:OPC UA支持按时间戳查询历史数据,方便故障分析

我参与过一个智慧风场项目,要求把10个不同厂家的风机数据统一接入一个平台。当时有西门子PLC、倍福PLC、ABB变频器、SKF振动传感器...每个设备都有自己的协议。最后我们用了OPC UA作为“中间人”——每个设备配一个OPC UA适配器,统一建模后上报给SCADA。嗯,这个方案虽然前期配置工作量大,但后期运维真的省心。

OPC UA地址空间示例(风机模型):

Root
 └── Objects
      └── WindTurbine_01
           ├── Parameters
           │    ├── WindSpeed (Double)
           │    ├── PowerOutput (Float)
           │    └── RotorSpeed (Float)
           ├── Status
           │    ├── Running (Boolean)
           │    ├── FaultCode (Int16)
           │    └── MaintenanceMode (Boolean)
           └── Alarms
                ├── OverSpeedAlarm (AlarmCondition)
                └── VibrationAlarm (AlarmCondition)

你看,OPC UA把数据组织成树形结构,每个节点都有类型、描述、单位等元数据。这比Modbus那种“地址+值”的方式直观多了。不过代价是——OPC UA的报文开销大,对网络带宽要求高。在海上风场那种卫星通信的场景,我建议慎用。

选型建议:如果只是采集几个模拟量(风速、功率、转速),Modbus RTU就够了。如果需要复杂的数据模型和安全通信,上OPC UA。IEC 104则主要用于和电网调度对接,别乱用。

3.4 知识体系总览

下面这张图是我自己画的,把三种协议的核心逻辑串起来了。你看完应该能明白:什么时候用Modbus,什么时候用IEC 104,什么时候上OPC UA。

风电SCADA通信协议知识体系 Modbus RTU/TCP IEC 104 OPC UA 特性 • 简单可靠,1979年诞生 • RTU:串口,1200米距离 • TCP:以太网,502端口 • 轮询机制,一问一答 • 适合传感器级数据采集 • 无安全机制 特性 • 电力系统标准协议 • 基于TCP/IP,面向连接 • 带时标,精度到毫秒 • 支持主动上报 • 适合电网调度对接 • 标准化程度高 特性 • 工业4.0明星协议 • 数据建模,树形结构 • 安全加密,跨平台 • 支持历史数据访问 • 适合系统集成 • 报文开销大 典型应用场景 Modbus:风机内部传感器 → IEC 104:风场并网调度 → OPC UA:智慧风场平台集成

你看,这三种协议各有各的“地盘”。Modbus是“基层员工”,干的是脏活累活;IEC 104是“中层干部”,负责和上级单位对接;OPC UA是“高层管理”,搞的是战略整合。选型时别贪大求全,够用就好。

最后说一句:协议只是工具,别被工具束缚。我见过太多人纠结于“用Modbus还是OPC UA”,结果项目延期了。我的建议是——先跑通,再优化。哪怕用最原始的Modbus RTU,只要数据能稳定传上来,就是好方案。


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