文章目录
- 一、前言
- 二、资料收集
- 三、lib60870运行示例及协议分析
- 1、代码编译
- 2、IEC101运行示例及协议分析
- 2.1 ISO/OSI网络模型
- 2.2 示例运行测试
- 2.3 帧数据分析
- 3、IEC104运行示例及协议分析
- 3.1 ISO/OSI网络模型
- 3.2 示例运行测试
- 3.3 wireshark抓包分析
- 3.3.1 U帧
- 3.3.2 I帧
- 3.3.3 S帧
- 四、最后
一、前言
IEC 101和IEC 104对于智能变电站来说已经属于旧的协议了,其属于IEC 60870,但目前在电力自动化中仍然流行,对于IEC 61850和IEC 60870混用的场景也存在,目前官方赞助商似乎在推一些转换网关来将对应的协议做转换以此解决这种协议兼容问题,国内似乎也有在做这块的网关的企业。IEC 101为串行模式,而IEC 104走TCP/IP。
二、资料收集
协议开源库:https://github.com/mz-automation/lib60870
IEC 101协议分析:https://www.ipcomm.de/protocol/IEC101/en/sheet.html
IEC 104协议分析:https://www.ipcomm.de/protocol/IEC104/en/sheet.html
lib60870的用户使用指南:https://github.com/mz-automation/lib60870/blob/master/user_guide.adoc
三、lib60870运行示例及协议分析
1、代码编译
没有坑点,cmake直接编译过了
#必要时使用GitHub加速
git clone https://github.com/mz-automation/lib60870.git
cd lib60870/
cd lib60870-C/
mkdir build
cd build/
cmake ..
make clean && make
ls
make install
修改一下我们之前交叉编译libiec61850的全平台编译脚本:
arm_linux_setup.cmake:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools /usr/local/gcc-linaro-7.5.0-2019.12-x86_64_armv8l-linux-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/armv8l-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/armv8l-linux-gnueabihf-g++)
aarch64_linux_setup.cmake:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(tools /usr/local/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)
全平台一键编译脚本:
#!/bin/bash
cd build
cmake ..
make clean && make && make install
cmake -DCMAKE_TOOLCHAIN_FILE=../arm_linux_setup.cmake -DCMAKE_INSTALL_PREFIX=~/workdir/arm/lib60870 ..
make clean && make && make install
cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64_linux_setup.cmake -DCMAKE_INSTALL_PREFIX=~/workdir/aarch64/lib60870 ..
make clean && make && make install
结果:
2、IEC101运行示例及协议分析
IEC 60870-5-101(IEC101)是电力系统监测、控制和相关通信的标准,用于电力系统的远程控制、远程保护和相关通信。这与 iec60870-5-1 至 iec60870-5-5 标准完全兼容,并在 DTE 和 DCE 之间使用标准异步串行远程控制信道接口。该标准适用于点对点、星形、多点等多种配置。(使用主-从模式,和Modbus协议比较相似,主站一般发送内容,从站一般接收内容)
2.1 ISO/OSI网络模型
可以看到平衡模式走RS232串口,那么这种模式我们更好模拟一些。
2.2 示例运行测试
直接运行101的平衡模式示例,利用wsl和虚拟串口工具测试一下(代码就不分析了,比较简单,可以通过argv[1]指定串口端口,不指定的话端口是/dev/ttyUSB0,串口设置波特率是9600,8个数据位,检验位为’E’,停止位1)。
这里我使用虚拟的串口COM3和COM4,在wsl上就是/dev/ttyS3和/dev/ttyS4,先用Windows下的串口工具看一下能否收到主站发送的内容,可以看到能收到:
然后我们运行从站,通过ttyS4和主站通信,收发都没有问题:
2.3 帧数据分析
SEND: 10 c9 03 cc 16
RCVD: 10 c9 03 cc 10
帧格式根据参考文章,示例为固定帧格式,启动字符为0X10,控制域字节为0XC9,链路地址域为0x03,帧校验和为0xCC,结束字符0x16:
- 继续分析控制域0XC9:
再往下的功能码和非平衡模式我们暂时不再具体做分析,实际开发时需要对应获取协议标准文档来做进一步分析处理。
3、IEC104运行示例及协议分析
IEC 104规约由国际电工委员会制定。IEC104规约把IEC101的应用服务数据单元(ASDU)用网络规约TCP/IP进行传输的标准,该标准为远动信息的网络传输提供了通信规约依据。采用104规约组合101规约的ASDU的方式后,可很好的保证规约的标准化和通信的可靠性。104是厂站与配网主站进行通讯的规约,以以太网为载体,服务模式是平衡模式。用于远动控制通信的,用于调度自动化系统,厂站之间的通讯。
IEC 60870-5-104限制了IEC 60870-5-101中定义的信息类型和配置参数,这意味着IEC 60870-5-104并不支持IEC 60870-5-101中提供的所有功能。例如,IEC 60870-5-104不支持短时间戳(3 字节格式),各种地址元素的长度设置为定义的最大值。但在实践中,供应商经常将 IEC 60870-5-101应用层与IEC 60870-5-104传输配置文件结合起来,而不注意这些限制。
3.1 ISO/OSI网络模型
可以看到传输层走TCP。
3.2 示例运行测试
直接运行测试,然后抓包分析:
3.3 wireshark抓包分析
根据参考文章(https://www.jianshu.com/p/772582a9db11)中的内容,主要分为三种帧数据:U帧、I帧、S帧,参考文章中分析过程很详细,参考着抓包再分析梳理一下。
基本的帧格式如下:
wireshark抓包(104apci+104asdu):
3.3.1 U帧
- (1)报文格式
不编号的控制功能格式(U帧),控制用报文,一共6种,如下图所示:
- (2)STARTDT通讯建立,包括TCP连接建立、数据传输启动,数据传输流程如下:
- (3)STOPDT通讯中断,包括数据传输的中断和TCP连接的中断:
这里要说一下,demo中是没有发送STOPDT的,自行在demo中增加后重新编译进行测试(解决编译问题:修改头文件以及增加pthread库链接):
- (3)TESTFR
未激活但已建立的连接通过发送测试APDU( TESTFR=激活)并得到接收站发回的TESTFR=确认,在两个方向上进行周期性测试。
这个没有模拟出来,不确定是demo原因还是没有找到触发机制,长了很多方法都没有发现测试的U帧。
3.3.2 I帧
- (1)、帧格式
编号的信息传输格式(I帧),用于传输应用数据,捎带确认对方的发送。
根据类型标识(TYP)不同,报文形式各有差异。
总体格式为基本格式中的68H+APDU长度+①+②。
- (2)、发送序号和接收序号
I帧中的控制域1与控制域2为发送序号,控制域3与控制域4为接收序号。其格式图如下所示:
序号主要用于判断丢失和重传情况。
- (3)、类型标识
类型标识符,黄色标记为常见类型标识符:
通过asdu查看(这里是11就是测量值,标度化值):
对应原文还介绍了很多标识符的概念,需要的自行查阅,这里就不展开了:
①短时标与CP56Time2a时标(长时标)
②归一化值、标度化值、短浮点数
③品质描述词
- (4)、可变结构限定词
当可变结构限定词最高位为1表示连续,其对应n个信息对象中,第一个信息对象中含有信息体地址(3个字节)表示此帧报文中的信息从这个地址开始,第二个信息对象中不再包含信息体地址,第二个信息对象地址是在第一信息对象中的信息体地址递增。
当可变结构限定词最高位为0表示不连续,每个信息对象中都包含信息体地址。
- (5)、传送原因
共计2个字节。但传送原因实际上只是占两个字节中的6位。其完整结构如下图所示:
其中T代表试验位(0未试验,1试验),它说明了应用服务数据单元是在测试条件下所产生的,被用于测试传输和设备,但不控制过程。工程中很少使用。
P/N位用以对由启动应用功能所请求的激活以肯定或者否定确认。P=0表示肯定确认,P=1表示否定确认。在工程上,主要用于表示遥控选择成功或失败。
传送原因如下图所示:
针对上表中的部分内容进行一个说明:
第一、周期、循环(01H)与背景扫描(02H)光看标准的话会感觉他们两个差不多,我这里仅从实际应用上来讲述它们的区别。
周期、循环(01H)适用于传输变化很慢的数据,例如水位、油温等,这类数据定时主动上送,并且不再响应总召唤过程中传送。而背景扫描(02H)则是从站周期性主动将响应总召唤过程中传送的数据上送,使得主站和从站数据库保持一致。背景扫描数据传送时可被中断,当同时又背景扫描数据和实时数据时,优先传送实时数据。
第二、什么样的情况算是突发(03H)呢?有两种情况:1、当前的背景扫描发现该点的模拟量数据与前一次模拟量数据传输值的差值超出越死区传输设定值。即前后两次的模拟量数据差值不超出死区设定值,但与上次传输数据的累计差值超出死区设定值也立即作为突发数据向主站传输。2、当前的背景扫描发现该点的状态量数据与前一次状态量数据不一致,即发生了状态变位。
第三、对于分组召唤,新版标准已对分组内容不做约定,但一般设计时仍以标准作为参考。
上述结构中还有源发地址,他用来表明来自哪个主站的召唤,一般情况下不适用。规定源发地址不使用时,应置零。
- (6)、ASDU公共地址
首先ASDU地址为2个字节,一般作为站地址,在低版本远动程序中,一般高字节固定为0,1254表示站地址,255表示全局地址。新远动程序则可支持165534为站地址,而65535为全局地址。
全局地址用于再一个特定系统中在所有站在同一时刻同时启动同一个应用功能,一般只用于召唤、电度召唤、时钟同步、复位进程。
控制站将舍弃那些公共地址未定义的ASDU。如果该地址设置与主站不一致,会出现遥测、遥信能正常刷新,但是无法上送初始状态,无法遥控的现象。
- (7)、信息对象地址
通俗来说,信息对象地址即通讯过程中的点号,104规约均对点号范围做了规定,常见问题就是遥测、遥控的起始点号与主站不一致。而且主站提供的点表一般都是从0或1开始的顺序号,我们需要确认0或1对应的实际起始信息体地址。
- (8)、常见I帧报文分析
具体看参考文档中的说明,涉及具体业务时再去参考分析一下,主要也需要参考具体的国标及行业标准文档,这里不再展开了。(遥信(数字量输入DI)、遥控(数字量输出)、遥测(模拟量输入)、遥调(模拟量输出)、遥脉(电度量)、对时、测试、复位进程、初始化结束)
3.3.3 S帧
编号的监视功能格式(S帧),用于无应用数据可传输时,确认对方的发送。
其控制域格式如下:
从上表可以看出,S帧的控制域1+控制域2已经被固定为0001H,即S帧不存在发送序号,只有接收序号。其报文如下所示:
R:68(启动符)04(APDU长度)01 00 (控制域1+控制域2)10 00(接收序号)
主站可按频率发送S帧,比如接收8帧I帧回答一帧S帧,也可以接收1帧I帧就应答1帧S帧。与104规约中的特定参数有关,我这里抓包似乎刚好是8帧I帧一个S帧,第一个S帧的序号也正好是0b1000也就是8:
四、最后
对比一下IEC 60870相较于IEC 61850确实感觉会功能相对少一些,扩展性稍微差一些,但理解上相对简单一些。下一节对照着电力行业标准再来细化分析一下IEC104协议。