一种使用Python实现IEC61850规约的全自动检测技术
2022-06-20王诗清王建伟袁广宝
王诗清, 王建伟, 杨 斌, 袁广宝
(1. 国网辽宁省电力有限公司 电力科学研究院, 辽宁 沈阳 110018;2. 北京四方继保工程技术有限公司, 北京 100085)
0 引 言
规约的一致性测试是IED投入使用前的必要过程[1]. IEC61850-10部分规定的一致性测试是用于验证IED通信接口与IEC61850标准要求的一致性. 该部分规定了实现IEC61850规约一致性测试的标准技术及提出性能参数时要使用的特定测量技术. 使用这些技术将提高系统集成商集成IED、 正确操作IED及支持预期应用的能力. IEC61850规约的一致性测试是保证IED设备实现互联互通互操作性的基础, 如果不能实现互联互通互操作, 规约的制定就没有了意义. IEC61850规约一致性的测试能够在最大程度上保证IED设备间通信接口与IEC61850标准协议相一致, 进而确保设备能够实现互联互通互操作. 但是, 由于IEC61850规约一致性测试内容多、 涉及细节关注点多、 对专业性要求高、 设置配置复杂等原因, 使得完成这类测试需要具备极高的IEC61850规约专业知识的专业技术人员, 并借助不同的工具软件和测试设备才能够完成, 从而导致IEC61850规约一致性的检测效率低、 人工检测易造成细节点的遗漏缺失、 无法遍历全覆盖测试等问题. 因此, 快速、 高效、 准确、 可遍历全覆盖的IEC61850规约一致性自动化测试变的更加必要.
目前, 众多的检测方法和工具被应用于IEC61850服务器规约一致性测试当中. 但不论使用哪种工具, 都需要对IEC61850规范标准非常了解, 且同时需要对server端的设备(被测试设备)进行一些人工操作, 如在进行报告服务测试时, 需要人工操作被测试设备来触发生成变位报告, 同时, 需要抓包对该报告报文进行分析, 判断其是否符合预期. 若对IEC61850规范标准理解不全面不正确, 经常会导致测试结果出现问题和偏差.
针对目前IEC61850服务器规约一致性测试工作中的诸多问题, 鉴于目前开源库资源的日趋丰富及完善, 本文提出了一种基于开源库, 使用Python对IEC61850服务器规约一致性进行全覆盖遍历的全自动化测试方法. 因IEC61850服务器规约一致性测试包括的内容较多, 本文将主要针对报告服务的自动化测试技术的实现提出解决方法. 首先提出IEC61850服务器规约一致性测试的基本过程方法. 针对较难实现自动测试的报告服务提出了通过取代服务模拟置数产生报告的方式, 杜绝人工干预, 从而实现自动触发生成报告, 进而对IEC61850报告服务进行自动测试的方法, 加强一致性测试的可信度和严谨性.
1 IEC61850服务器端规约一致性测试的一般过程
国际上将IEC61850作为变电站通信网络和系统的统一标准, 用于统一变电站内功能和装置等各个方面, 使变电站内装置间的通信变得更加统一便捷. 在这一标准下建立起统一各厂商的通用配置, 支持不同智能电子设备间的信息共享和互操作. 其主要优势和作用在于为同网络上工作的不同设备建立信息比对和命令执行共享途径, 实现通信的统一性, 避免因通讯协议的不同造成设备间繁琐的规约转换. 规约一致性的测试是对IED设备间进行互联互通互操作的基本保障. IEC61850服务器规约一致性检测的基本过程[2]如图 1 所示.
图 1 IEC61850规约一致性测试过程
由图 1 所示的IEC61850规约一致性服务器端的一般测试过程可以看出, 首先, 我们需要对服务器端提供的PICS, MICS, PIXIT文档及IED设备的能力描述文件ICD进行静态的检查[3], 确保文档完备且文档对IEC61850-10中所需要声明的服务内容及服务响应行为都进行了相应说明; 然后, 根据所提供的PICS, PIXIT文档中所提及的服务及服务响应情况, 使用各类工具软件或测试设备, 按照IEC61850-10中的测试用例逐一进行检测验证[4]; 最后, 根据检测情况出具对应的试验报告和过程报文. 以上便是一个完整的一般性的IEC61850规约一致性服务器端的检测过程.
2 IEC61850一致性测试系统
IEC61850一致性测试主要是验证 IED 通信接口与IEC61850标准要求的一致性, 其包括肯定测试用例和否定测试用例, 常见的IEC61850规约一致性测试系统结构如图 2 所示.
图 2 常见IEC61850一致性测试系统结构
图 2 中, 被测试设备(DUT)一般为保护或智能控制设备, 其一致性测试过程如下:
通常用一个通信仿真器(Client Simulator)作为一个IEC61850客户端, 通过以太网向被测设备(DUT)发送服务请求并记录和处理结果信息. 通信仿真器通常采用UniCASim simulator[5].
被测试设备的信号触发等辅助试验可由试验测试仪(Signal Generator)提供, 包括电压电流等模拟量和开关量的输出, 进行环境仿真, 并与通信仿真器(Client Simulator)相互通信.
通常使用一个网络协议报文分析仪(Protocol Analyzer)来监控测试过程中出现的错误, 网络协议分析仪将对整个过程的报文进行记录和解析, 并分析所得检测结果.
最后, 应配置一个时钟同步装置用来对被测试设备、 试验测试仪、 通信仿真器等一致性测试中各个设备的时间进行同步. 以上设备便构成了IEC61850的一致性服务端测试的基本框架.
3 一致性报告服务自动测试的实现
3.1 总体设计
传统的IEC61850服务端报告服务的测试, 需要连接试验测试仪手动进行模拟量或开关量的触发, 被测试设备和测试软件系统之间没有形成有效的闭环, 因需要人工干预触发信息, 不能自动判断结果, 影响测试的全面性.
IEC61850规范明确了需要对取代服务的支持[6], 且目前绝大部分的IED设备也都提供了取代服务. 这样就使得IEC61850规约一致性报告服务的自动检测在不借助外部设备或外部手动置数等手段的情况下可以实现.
基于开源库, 使用Python来实现的IEC61850服务器规约一致性的自动测试[7], 将会使得整个测试验证过程变得“简单、 高效、 集成和智能”, 尤其是对于整个一致性规约测试中最难进行测试的报告服务.
将规约一致性报告服务的测试划分成3个模块:
1)报告触发模块: 使用取代功能模拟置数触发有预期结果的报告;
2)报告分析解析模块: 对触发生成的报告进行解析分析, 并将解析的结果存入到Python的字典中放入消息队列;
3)结果判定运行模块: 从消息队列中获取字典信息, 并通过字典信息的关键字获取对应值和实际预期结果进行比对判断.
整个报告服务自动测试实现过程如图 3 所示.
图 3 报告服务自动测试实现过程
3.2 实现过程
使用Python对规约一致性报告服务的全自动测试技术实现过程如下:
1) 数据信息的准备
自动测试结果运行主线程启动后, 调用初始化功能函数在线获取被测试设备(IED)的数据模型信息, 将其存入到Python的字典中, 通过return返回给主线程.
获取到数据模型的字典信息后, 通过数据模型字典信息中的关键字key(如: dev_content_dict[‘Brcb_List’])获取到被测试设备的报告控制块信息.
然后, 再通过Python的for循环, 对所有报告控制进行初始设置, 设置报告控制的OptFlds和TrgOps, 使报告控制的OptFlds支持Data Reference; TrgOps支持dchg和GI的触发选项.
对报告控制块的初始设置准备完成后, 再次通过Python的for循环, 开始对每个设置完毕的报告控制块列表进行遍历操作, 依次进行RptEna写False, 清除报告控制块缓存报告, 使能RptEna, 写总召GI, 从共享消息队列中获取报告信息并解析返回结果, 得到满足测试要求的报告控制块后退出循环. 实际生成的具有Data Reference的GI总召报告信息如图 4 所示.
图 4 触发生成总召报告报文信息图
最后, 根据以上步骤获取到满足要求的待测试报告控制块的信息及该报告控制块关联的数据集里成员的Data Reference信息, 并将其保存在DataRefNameList列表中. 通过Python的字符串替换功能str.replace()将对应的取代数据信息存放在新建立的列表中(如: BRCB_BeLinked_sub_List). 具体Python实现过程如图 5 所示.
图 5 Python获取待测试报告控制块过程
2) 变位报告的触发
通过第一步“数据信息的准备”操作后, 已经获取到了满足要求的待测试报告控制块信息、 报告控制块关联数据集里成员信息列表以及报告控制块关联数据集对应的取代信息列表. 然后, 通过Python的for循环调用取代函数, 对取代信息列表进行写使能和初始值的设置操作. 写完初始值后再清除该报告控制块的缓存区和共享消息队列.
经过以上操作, 对待测试的报告控制块里的成员数据进行了初始值设置, 并清除了缓存区报告和共享消息队列里的信息, 就可以保证使用write函数对subVal值进行修改时产生的dchg变位报告为预期报告. 整个过程如图 6 所示.
图 6 触发预期结果报告过程
3) 变位报告报文的解析及结果判定
在完成以上操作后, 产生了dchg的变位报文, 该变位报文里的预期结果为通过取代功能写入的subVal值. 因取代触发的变位报文在取代值发生变化时就会立刻产生, 需要使用多线程技术对报告报文进行实时的捕获和解析. 多线程将报告分析解析模块设置为守护线程. 报告分析解析模块使用Python的pcap功能模块, 该功能模块可驱动以太网并根据关键字或关键信息进行过滤, 从而能够有效、 实时地捕获到有用的报告报文.
考虑MMS是按照TLV进行编码[8], 需要按照有效偏移位逐个对捕获到的报告报文进行解析, 如图 7 所示, 将有效Tag位对应的length和value进行解析分析, 并将解析分析后的value值存放在字典中, 最终通过put将字典信息发送到共享队列中.
图 7 报告报文解析过程
自动测试结果运行主线程为整个报告服务自动测试的主程序, 包含IEC61850-10中所有报告服务的测试用例[9]. 主程序的主要作用是按照测试用例要求, 实现测试过程并将预期结果发送给报告触发模块, 使其产生有预期结果的报告报文, 然后, 再从消息队列中获取报告分析解析模块解析出来的实际报告的结果信息, 将预期结果和实际结果进行比较, 从而得出测试结果. 若和预期一致则测试通过, 若不一致则测试不通过, 从而实现了报告服务不依赖外部模拟设备全自动的闭环测试. 整个闭环自动测试过程如图 8 所示.
图 8 规约一致性报告服务闭环自动测试
3.3 技术难点分析及解决
1) 可变模拟量的处理
因报告控制块RCB所关联的数据集DatSet里的成员较多, 有部分成员的值是模拟量值[10], 例如, 反应IED设备的温度量、 电压值等, 这些模拟量值都会伴随环境温度、 时间的变化而改变, 在变化的过程中就会触发一些和测试不相干的报告报文, 这样就容易对测试结果产生不确定的影响. 为了保证测试结果的确定性, 自动测试主线程需要通过取代对该RCB关联的数据集里的所有成员进行取代遍历, 将数据集里的所有成员的初始值设置成固定不变的值, 这样就可以避免因环境温度、 时间等变化而引起的数据集里成员值发生变化的情况, 避免对测试结果不确定的影响. 从而保证了测试结果的正确性.
2) 报告控制块的筛选
对于被测试IED设备来说, 一般都会有多个RCB报告控制块, 而每个报告控制块RCB所关联的数据集DatSet是不同的, 每个数据集DatSet中的成员数也都不同. 为了获取到合适的RCB, 设置完RCB的属性后, 先对RCB进行写总召GI操作, 触发RCB生成总召报告, 通过报告分析解析模块可以获取到该RCB关联数据集的成员数量及成员信息.
3) 分帧报文的处理
因MMS的报告报文有超过1 518 B的情况, 单帧报文无法上送整个报文信息, 对分帧报文的解析分析需要进行特殊处理. 考虑到TCP报文的帧头部分内容是固定的, 对分帧标记的偏移位进行判断, 若分帧标记表示报文有分帧, 则将该报文的固定帧头取出存入到列表headerbuf中, 除去固定报文帧头以外的内容存入到segmentbuf列表中, 当发现分帧报文的尾帧后, for循环遍历重组的segmentbuf列表并进行重新组帧, 具体实现逻辑如图 9 所示.
图 9 报告报文分帧处理逻辑
4 一致性测试报告控制块属性要求
根据IEC61850-10标准要求, 对报告服务及其他服务都有明确要求, 在测试过程的分析和测试结果的判定时都需要参照标准要求. 报告服务的自动测试同样适用该标准. 按照IEC61850标准要求, 报告控制块包含的DA在RptEna=True和RptEna=False情况下具有可写和不可写属性, 如表 1 所示.
表 1 报告控制块属性表
由于篇幅所限, 本文仅针对较为复杂较难实现自动化测试的报告服务提出了实现自动化检测的详细的分析、 建议及解决方法. 旨在对IEC61850服务器规约一致性测试自动化的实现提供一定的参考.
5 检测实例分析
利用基于开源库使用Python实现IEC61850服务器规约一致性自动测试的方法对工程中常见的北京四方继保自动化股份有限公司CSC-122数字式母联保护装置的报告服务进行检测.
缓存报告分段测试, 测试用例描述如表 2 所示.
表 2 报告分段测试用例说明
使用Python进行报告分段自动测试的整个过程如下:
1) 自动选取报告控制块, 自动选取条件为该报告控制块关联的数据集里的成员个数≥6个;
2) 选取成功后, 通过写GI生成总召报告并解析获取到该报告控制块关联数据集里各个成员的reference信息, 如表 3 所示;
表 3 测试报告控制块数据集成员信息
3) 重新设置连接关联初始值PDUSize, 将初始的PDUSize值由65 000设置为600, 如表 4 所示;
表 4 PUD Size设置
4)清除队列, 重新写总召, 产生总召报告, 报告解析模块实时获取到总召报告并将解析结果存入到字典中发送到共享队列中, 如表 5 所示;
表 5 分段报告共享队列及实际报文
5)实时总召GI报告信息, 并根据测试用例要求判断实际结果是否通过, 如表 6 所示;
表 6 分段总召报告内容解析
由表 6 对No.1和No.2的报告内容进行比对分析, 两个报告中的SeqNum都为0, SubSeqNum从0开始递增, MoreSeqmentsFollow最后一个报告该属性值置00, 所有分段报告的TimeOfEntry值相同, 都为‘01778c7c355c’, 3个判断条件同时满足预期, 符合测试用例要求, 测试通过, 如图 10 所示.
图 10 报告分段测试结果图
6 结束语
基于开源库, 使用Python实现IEC61850服务器规约一致性自动测试能够满足一般服务器端IED设备的一致性通信需求, 可以通过Python语言灵活调用开源库的各种接口, 实现IEC61850服务器规约一致性所有服务的测试, 同时由于Python语言的灵活性、 易于维护编写性, 可以实现对取代服务、 读写操作等进行全覆盖的遍历测试, 能够大大提升IEC61850服务器规约一致性测试的覆盖率, 更有利于触发和发现问题. 由于实现了自动化测试, 很好地解决了IEC61850服务器规约一致性测试对技术和专业知识要求高的问题. 进而对智能化变电站里IED设备间的互联互通互操作[11-15]起到积极重要的作用.