第3章:FTU通信协议基础:IEC 60870-5-101/104协议入门、Modbus协议在FTU中的应用

通信协议,说白了就是FTU跟主站之间“说话”的规矩。你想想看,一个FTU装在电线杆上,主站可能在几十公里外的调度中心,它们之间怎么交换数据?靠的就是协议。这一章,我带你搞定FTU最常用的两套协议:IEC 101/104和Modbus。

3.1 为什么FTU需要通信协议?

没有协议,FTU采集到的电流、电压数据就是一堆乱码。主站不知道哪个字节代表A相电流,哪个字节代表开关状态。协议就是双方约定好的“翻译手册”。

我在现场调试时遇到过这种情况:FTU和主站都通电了,数据就是传不上来。查了半天,发现是协议里的地址位对不上。嗯,这种坑踩过一次就记住了。

3.2 IEC 60870-5-101协议入门

IEC 101,全称IEC 60870-5-101,是电力系统专用的串口通信协议。它基于RS-232或RS-485物理层,在配电网自动化中应用非常广泛。

3.2.1 协议特点

  • 主从模式:主站发起请求,FTU(从站)响应。不会出现两个设备同时说话的情况。
  • 帧格式固定:每个报文都有固定的起始字符、长度、控制域、地址域、用户数据和校验码。
  • 支持多种数据类型:遥测(测量值)、遥信(状态量)、遥控(控制命令)、遥调(设定值)。

3.2.2 典型报文结构

我习惯把IEC 101的报文拆成三部分看:

起始字符(0x68) + 长度(L) + 长度(L) + 起始字符(0x68)
控制域(C) + 地址域(A) + 链路用户数据(ASDU)
校验和(CS) + 结束字符(0x16)

举个例子,一个简单的“召唤全数据”命令:

68 0B 0B 68 73 01 64 01 06 00 01 00 00 00 14 16

这里0x73是控制域,表示“请求/响应”模式。0x01是FTU地址。后面的ASDU部分告诉FTU:“把你所有的遥测遥信都发上来”。

我的经验:调试IEC 101时,最好用串口抓包工具先看原始字节流。我曾经遇到一个FTU,地址设成了0x01,但主站发的地址是0x01 0x00(两字节),结果一直对不上。后来发现是地址长度配置不一致。

3.3 IEC 60870-5-104协议入门

IEC 104是IEC 101的网络版。它把101的报文封装在TCP/IP包里,通过以太网传输。说白了,就是把串口那套东西搬到了网络上。

3.3.1 协议特点

  • 基于TCP/IP:默认端口号2404。主站作为客户端,FTU作为服务器。
  • 支持主动上报:FTU检测到遥信变位(比如开关跳闸),可以主动把数据推给主站,不用等主站来问。
  • 传输更可靠:TCP协议自带重传机制,丢包了会自动补发。

3.3.2 APDU结构

IEC 104的报文叫APDU(应用协议数据单元),结构如下:

启动字符(0x68) + APDU长度(1字节) + 控制域(4字节) + ASDU(可变长度)

控制域里的四个字节很关键。我简单解释一下:

  • 如果是主站发的命令,控制域里包含发送序号和接收序号。
  • 如果是FTU的响应,控制域里也包含序号,用来确认收到了哪些报文。

举个例子,一个“总召唤”命令(让FTU把所有数据都发上来):

68 0E 00 00 00 00 64 01 06 00 01 00 00 00 00 14

注意这里的0x68是启动字符,0x0E是长度(14字节),后面四个0x00是控制域(表示这是I帧,序号从0开始)。

注意:IEC 104的序号管理很容易出错。我曾经调试一个项目,FTU和主站之间的序号对不齐,导致主站一直收不到数据。后来发现是FTU重启后序号重置了,但主站还记着旧的序号。解决办法是在FTU上电后先发一个“复位”命令。

3.4 Modbus协议在FTU中的应用

Modbus协议,我愿称之为“工业界的通用语言”。它简单、轻量、容易实现,很多FTU都支持Modbus,尤其是跟PLC、触摸屏或者第三方系统对接时。

3.4.1 Modbus RTU vs Modbus TCP

特性 Modbus RTU Modbus TCP
物理层 RS-232/RS-485 以太网
报文格式 地址+功能码+数据+CRC MBAP头+功能码+数据
典型应用 短距离、低速率 长距离、高速率
FTU角色 从站(Slave) 服务器(Server)

3.4.2 常用功能码

在FTU里,我常用的Modbus功能码就这几个:

  • 0x03:读取保持寄存器。用来读遥测数据,比如A相电流、B相电压。
  • 0x04:读取输入寄存器。用来读遥信状态,比如开关分合位。
  • 0x06:写单个寄存器。用来发遥控命令,比如合闸、分闸。
  • 0x10:写多个寄存器。用来批量设置参数,比如定值修改。

3.4.3 实际报文示例

假设FTU地址是0x01,主站想读A相电流(存在寄存器地址0x0000):

主站发送:01 03 00 00 00 01 84 0A
FTU响应: 01 03 02 02 1C B9 7D

解释一下:

  • 发送:地址01,功能码03,起始地址0000,读1个寄存器,CRC校验84 0A。
  • 响应:地址01,功能码03,数据长度02(2字节),数据02 1C(十六进制,换算成十进制是540,表示54.0A,如果量程是0.1A/位的话),CRC校验B9 7D。
避坑指南:我曾经在项目里遇到Modbus通信时好时坏。查了半天,发现是RS-485的A/B线接反了。记住:A线接A线,B线接B线,屏蔽层单端接地。还有,终端电阻一定要加,尤其是长距离通信时。

3.5 协议选择建议

在实际项目中,怎么选协议?我个人的习惯是这样的:

  • 跟调度主站通信:首选IEC 104。因为电力系统主站基本都支持104,而且功能完善,支持主动上报。
  • 跟本地PLC或触摸屏通信:用Modbus RTU或TCP。简单、稳定、调试方便。
  • 老旧设备改造:如果主站只支持IEC 101,那就用101。但要注意串口参数(波特率、数据位、校验位)必须一致。

嗯,这一章的内容就到这里。协议这东西,光看文档是学不会的。我建议你找个FTU和串口调试助手,实际抓几个报文看看。把报文里的每个字节都搞明白,你就真正入门了。

核心要点回顾:
  • IEC 101是串口协议,主从模式,适合短距离通信。
  • IEC 104是网络协议,基于TCP/IP,支持主动上报。
  • Modbus简单通用,适合FTU与第三方设备对接。
  • 调试时注意地址、校验、物理连接,这些是常见坑点。