4. IEC 60870-5-101/104协议解析
在SCADA系统中,IEC 60870-5-101/104是电力仪表与主站之间最常用的通信协议。101用于串口链路,104用于TCP/IP网络,两者共享同一套应用层数据结构——ASDU(Application Service Data Unit,应用服务数据单元)。理解ASDU的字段构成、信息对象地址的分配规则、传输原因的含义,以及遥测遥信数据如何映射到具体信息对象,是解析报文和排查通信问题的核心能力。
一、ASDU的整体结构
一个完整的104报文由APCI(应用规约控制信息)和ASDU两部分组成。APCI固定6字节,包含启动字符0x68、长度字段和4个控制域字节,负责链路层的序号管理和连接控制。ASDU则承载真正的业务数据,其结构由数据单元标识和信息对象两部分构成。
数据单元标识固定6字节,依次为:类型标识(TypeID,1字节)、可变结构限定词(VSQ,1字节)、传输原因(COT,2字节)、公共地址(CA,2字节)。信息对象部分则根据TypeID和VSQ的不同,包含一个或多个信息对象,每个信息对象由信息对象地址(IOA,3字节)和信息元素组成。
TypeID决定信息对象的类型和长度。例如,遥测常用M_ME_NC_1(类型标识13,短浮点数测量值)、M_ME_NA_1(类型标识9,归一化测量值);遥信常用M_SP_NA_1(类型标识1,单点信息)、M_DP_NA_1(类型标识3,双点信息)。VSQ的最高位SQ表示信息对象是否连续寻址,低7位表示信息对象个数。当SQ=0时,每个信息对象都带独立的IOA;当SQ=1时,只给出第一个IOA,后续对象地址依次递增。
二、信息对象地址(IOA)的分配规则
IOA是3字节无符号整数,取值范围0~16777215。在电力仪表接入场景中,IOA通常由主站规划,与仪表的测量点一一对应。常见的分配方式有两种:一是按功能分区,例如1~9999分配给遥信,10000~19999分配给遥测,20000以上分配给电度;二是按设备编号加测点序号组合,例如设备1的A相电压为10001,B相电压为10002,C相电压为10003。
实际工程中,IOA必须与主站点表严格一致。如果仪表侧或通信网关侧配置的IOA与主站点表不匹配,主站会收到数据但无法正确映射到画面或数据库,表现为“有报文无数据”或“数据串点”。排查时,应先在104报文中定位IOA字段,再与点表逐条核对。
三、传输原因(COT)的含义
COT为2字节,低字节为传输原因值,高字节为源发站地址(通常为0)。COT说明“为什么发送这个ASDU”,常见值包括:
- 3:突发(Spontaneous)——仪表检测到遥测越死区或遥信变位时主动上送。
- 5:请求(Request)——主站请求后仪表响应。
- 6:激活(Activation)——主站下发控制命令。
- 7:激活确认(Activation Confirmation)——仪表确认收到控制命令。
- 10:激活终止(Activation Termination)——控制命令执行结束。
- 20:响应站召唤(Interrogated by Station)——总召唤时仪表上送数据。
解析报文时,COT是判断数据性质的关键。例如,收到COT=3的遥测,说明是仪表主动上送的变位数据;收到COT=20的遥测,说明是总召唤响应,通常用于初始化或周期对时后的数据刷新。
四、遥测遥信数据映射
遥信(单点/双点信息)的信息元素通常为1字节,包含SPI(单点信息)或DPI(双点信息)以及品质描述词。单点信息中,SPI=0表示分,SPI=1表示合;双点信息中,DPI=1表示分,DPI=2表示合,DPI=0和3表示中间态或故障态。品质位包括IV(无效)、NT(非当前)、SB(被取代)、BL(被闭锁)、OV(溢出)等,解析时需一并提取。
遥测(测量值)的信息元素根据TypeID不同,可能是归一化值(2字节有符号整数,范围-1~1-2^-15)、标度化值(2字节有符号整数)或短浮点数(4字节IEEE 754)。短浮点数最直观,直接按IEEE 754解析即可得到实际工程值。归一化值则需要乘以量程系数,例如量程为100A,归一化值为0.5,则实际电流为50A。
以某配电室仪表接入为例:主站点表定义IOA=10001为A相电压,TypeID=13,量程0~300V;IOA=20001为断路器位置,TypeID=1。当仪表上送报文68 1A ... 0D 01 03 00 01 00 40 01 00 00 00 00 ...时,解析出IOA=0x000140=320,若点表中320对应A相电压,则值为0.0V;若点表中320对应其他测点,则说明IOA配置错误。
五、实际解析中的常见问题
104协议采用TCP长连接,报文可能粘包或分片。解析时必须先读取APCI中的长度字段,再按长度截取完整ASDU,不能假设一次recv就是一个完整报文。此外,SQ=1的连续寻址模式容易出错:如果VSQ低7位为3,SQ=1,则报文只包含一个IOA,后续两个信息对象的IOA分别为IOA+1和IOA+2。若误按SQ=0解析,会把后续信息元素的前3字节误读为IOA,导致整个报文错位。
时标类型也需注意。CP56Time2a为7字节时标,包含毫秒、秒、分、时、日、月、年。部分TypeID不带时标,部分带时标,解析前应确认TypeID对应的信息元素长度。例如M_ME_NC_1不带时标,信息元素为5字节(4字节浮点+1字节品质);M_ME_NC_1带时标时,信息元素为12字节。
掌握ASDU结构、IOA分配、COT语义和遥测遥信映射规则后,即可用一段简单的解析代码将104报文转换为可读的测点值。实际工程中,建议将点表以CSV或数据库形式维护,解析程序通过IOA查表获取测点名称、量程和单位,从而实现从原始字节到SCADA画面数据的完整链路。