面向PLC产品的自动化测试系统平台设计与实现
2022-06-24王新月张秀明
王 奚,王新月,李 航,张秀明
(1.北京和利时智能技术有限公司,陕西 西安 710075;to 2.宁波和利时信息安全研究院有限公司,陕西 西安 710075;3.中国移动通信集团黑龙江有限公司,黑龙江 哈尔滨 150028)
0 引言
可编程逻辑控制器(programmable logic controller,PLC)作为通用自动控制装置,具有较强的工作环境适应性,深受工业控制界的欢迎。PLC在现代工业的各个领域都有应用,已成为自动化控制的核心[1]。国际上各大PLC制造企业都倾全力研发满足工业生产需要的PLC,并形成系列化产品,从而在不同领域和地区构建各自的市场[2]。
随着工业4.0概念的推出,各领域都在飞速发展,各类应用场景越来越复杂。工业控制领域中PLC所需要适应的场景、具备的功能越来越多,对PLC产品的测试工作发起挑战。PLC产品的新功能和新应用场景的测试工作会占用更多的时间。而在保证既有功能的产品质量的前提下提高这部分测试工作的效率,是困扰业界的难题。
近年来,自动化测试领域蓬勃发展。相对于手工测试,自动化测试具有以下优点[3-4]:①提高测试效率;②实现更多高难度繁琐操作的测试;③解放人力资源;④增强测试稳定性。这些优势正是PLC测试所需要的。PLC测试需要完整的自动化测试系统,实现从上到下、从软件到硬件的自动化测试平台。
1 自动化测试平台的被测对象
PLC控制器与编程软件通常是捆绑在一起的。编程软件的功能与PLC本身的功能紧密相连[5]。所以通常对PLC产品系统的测试,也包括对PLC编程软件的测试。除了PLC编程软件以外,PLC控制器根据功能的实现又可划分为PLC嵌入式软件和PLC硬件。因此,自动化测试平台的被测对象分为以下3个部分。
①PLC编程软件(基于IEC 61131-3标准)。对PLC 进行编程的软件,一方面能以程序实现过程的自动化,另一方面又能对PLC 的工作状态进行监控[5]。该软件具有编译、下装、仿真、多种数据类型变量、硬件配置、多种编程语言等功能。
②PLC嵌入式软件。PLC主要由嵌入式软件实现部分功能,如Modbus、自由协议、文件操作、多任务等。
③PLC硬件。PLC主要由硬件实现的有DI、DO、AI、AO等通道。
2 PLC编程软件自动化测试的设计与实现
2.1 PLC编程软件自动化测试设计方案
PLC编程软件的自动化测试由Python语言实现。Python是面向对象的脚本语言,具有跨平台、可扩展、解释性强、易学易读等特性[6]。Pywinauto是基于Python、用于自动化测试的脚本模块,主要功能是实现对Windows标准控件操作的可编程处理,包括对窗口的指定、鼠标或键盘操作、获得控件属性等[7]。对PLC编程软件测试的实现就是通过Pywinauto等工具对界面中各个控件的识别,并模拟鼠标和键盘对这些控件进行操作,从而实现对编程软件的自动化测试。
目前,B/S体系的软件自动化测试比较成熟。它的表示层为通用的浏览器[8]。现有的工具Selenium可以完全模拟用户在浏览器上进行各种Web操作[9]。而PLC编程软件作为C/S体系的软件,控件标准程度较低,自动化测试的转化难度远高于B/S软件,使用到的Pywinauto等工具也不如Selenium成熟、稳定。因此,实现方案需要在现有工具的基础上封装一些对控件常用的操作方法,并在测试用例转化时调用这些方法,从而大大提高转化效率以及对后续软件升级的兼容性。
例如,将右键菜单页面的选择封装成1个函数,如下所示。
def right_menu_select(*args):
"""
右键选择 AT最多存在两级右键菜单,支持两级
@Time : 2020/3/6
@Author : wangxi
:param args: 右键菜单元素名称或序号(str/int),逗号隔开,两种类型可组合使用:
"""
m = 0
#标志位
if len(args) > 2:
#输入大于两个元素报错
raise TypeError(' right_menu_select takes 2 positional argument but {} were
given'.format(len(args)))
for input_name in args:
if isinstance(input_name, int):
#输入为int型
Keyboard.SendKeys('{VK_DOWN %d}' % input_name)
Keyboard.SendKeys('{ENTER}')
elif m == 0:
#输入为str型且第一级菜单
popwindow.child_window(title=input_name,
control_type="MenuItem").click_input()
elif m == 1:
#输入为str型且第二级菜单
popmenu.child_window(title=input_name,control_type="MenuItem").click_input()
m = 1
测试用例中,使用到右键菜单选择操作时,调用这个函数并传入相应参数即可。如后续编程软件升级导致右键菜单控件的识别或用法发生变化,则直接修改该函数即可。这对于不断升级的软件的测试非常重要。类似的基础方法封装有80个。这些方法构成了测试框架的基础层。
为了满足常用业务场景,基础方法的上一层作了业务方法的封装,例如变量、硬件配置、程序组织单元(program organization unit,POU),包括程序、功能块、函数等。根据业务的复杂程度,每种业务封装了几个至几十个方法不等。这2层方法的封装不仅可以提高测试用例转化为脚本语言的转化效率,还可大大降低后续的维护成本。
业务层的上一层是用例层。用例层中用到的一些便利方法如下所示。
①ddt数据结构。该结构将测试数据和测试代码分开,提高了代码转化及执行效率,并且便于后期维护。
②ini配置文件。其存储全局变量等信息,便于后期维护。
③异常截图。在用例执行失败或错误后截图保存,可方便定位分析问题。
④测试记录写入。该功能可以将每条用例的执行结果自动填入记录测试结果的excel文档;测试结果自动填入pass/fail/error;执行人自动填入robot。这可以替代手动整理测试记录的工作。
2.2 PLC编程软件的测试框架及测试报告
测试框架采用了Python的单元测试框架unittest。unittest具有能够组织、管理和执行多个测试用例,以及提供丰富的断言方法等优点。每条测试用例写在1个testcase中,执行过程包括测试前准备环境的搭建(setUp)、执行测试代码、还原测试后环境(tearDown),以及根据断言输出pass和fail的测试结果。测试报告使用了HTMLTestRunner,将testcase中断言的结果打印在报告中并进行数据统计。
3 PLC嵌入式软件自动化测试的设计与实现
3.1 PLC嵌入式软件自动化测试的设计方案
嵌入式软件测试采用对PLC编程软件的操作与编写自动化测试工程相结合的方式实现。对PLC编程软件的操作采用了与2.1节中PLC编程软件自动化测试相同的方法实现,使用了Python语言。自动化测试工程是使用PLC编程软件编写的自动化测试工程。每个工程可以测试嵌入式软件某项功能。
例如,Modbus主站功能的自动化测试工程。工程中组态逻辑如下。
①使用Modbus写的功能码向从站(从站通常选用PLC控制器,需配合组态相关从站逻辑)写随机数。
②用Modbus读取功能码读回写入地址上的数据。
③对比每个读取与写入的数据:如相同,则继续;如不同,则记录相关错误信息以及错误次数。
④工程中,组态以逻辑①~逻辑③的方式测试所有PLC支持的Modbus功能码后,由主站通过通信方式通知从站切换到下一种通信参数(波特率校验位停止位的组合);同时,主站切换到下一种通信参数。
⑤切换后,再次进行上述的通信测试,在整个过程中统计丢包率及记录诊断异常信息。
自动化测试工程是整个嵌入式软件自动化测试的核心,可以实现对嵌入式软件功能的测试。但每个自动化测试工程仅实现了针对单一功能的自动化测试。为了将这些单一功能的测试串联起来,就需要对PLC编程软件进行自动化操作,为每个工程编写配置文件,使Python按照配置文件的内容进行一系列操作。例如工程打开关闭、工程下装监视在线读写数据。这就实现了各个子功能测试之间的衔接。
3.2 PLC嵌入式软件自动化测试的工作流程
嵌入式软件自动化测试工作流程如图1所示。
图1 嵌入式软件自动化测试工作流程
嵌入式软件自动化测试工作流程主要通过解析配置文件并按照配置文件描述的信息执行操作步骤,例如下装在线任务启动读写变量等。每个配置文件执行完成后会产生1个pass或fail的测试结果。所有配置文件执行完成后生成测试报告。
4 PLC硬件自动化测试的设计与实现
4.1 PLC硬件自动化测试的设计方案
PLC硬件自动化测试方案采用硬件测试和软件界面相结合的方式。
①硬件测试。国家仪器公司(National Instrument,NI)板卡具有精度高、可靠性高、用户接口功能强大等特点[10]。硬件通道测试采用NI板卡,通过对PLC各输出通道的采集及输入通道的输出控制等实现对PLC硬件功能的测试。
②软件界面。LabVIEW是基于图形编译语言的虚拟仪器软件开发平台。其表现形式和功能类似于实际的仪器,特别适用于实验室等需要经常改变仪器和设备参数及对信号进行分析研究的场合[11]。系统采用LabVIEW实现与控制器数据交互,与NI板卡数据的交互、控制,界面图形的组态,以及数据处理等功能。
硬件自动化测试环境如图2所示。
图2 硬件自动化测试环境
软硬件结合使用实现了对AI/AO精度、稳定度、通道间串扰以及DI/DO逻辑等功能的测试验证。
4.2 PLC硬件自动化测试的测试流程
PLC硬件自动化测试流程如下。
①使用PLC编程软件编写实现相关功能的标准化测试工程。LabVIEW软件调用接口程序下装组态工程到PLC,使PLC硬件通道实现相应功能。
②LabVIEW软件控制NI板卡提供可编程控制器输入、输出信号、通信等功能信号,同时通过动态连接库与PLC进行数据交互,获取测试结果。
③LabVIEW软件控制器完成测试过程,生成测试报告,保存测试数据。
5 流程框架设计及测试场景
完整的测试流程是通过Jenkins调度完成的,具体按照以下步骤进行自动触发调度。
①执行脚本自动安装最新提测软件(编程软件)及升级PLC的固件版本(嵌入式软件),为后续测试作好准备。
②执行UI Test实现对PLC编程软件测试,生成测试报告。
③执行Firmware Test,实现对控制器嵌入式软件的测试,生成测试报告。
④将以上生成的所有测试报告通过邮件形式发送给相关人员。
根据测试需要,步骤②和步骤③可以都执行,也可以选择性执行其中1个。
PLC自动化测试系统平台如图3所示。
图3 PLC自动化测试系统平台示意图
PLC自动化测试系统平台目前已在和利时LE、MC、LK系列产品以及编程软件AutoThink上测试、使用。根据测试需要,测试应用场景分以下3种。
①每日构建:筛选部分自动化测试用例,以确保每日构建软件版本的可用性。
②单元测试:筛选部分自动化测试用例可覆盖基本功能,确保提交集成测试前所有基本功能可用。
③集成/系统测试:根据版本变更范围,执行全部或大部分自动化测试用例,确保除新增/修改功能以外的功能正常。
6 结论
本文设计并实现了以PLC产品及其编程软件为对象的自动化测试系统平台。该平台对3个不同的被测对象选取了不同的测试方案,并使用Jenkins将各部分流程串接起来,实现了整体的自动化测试。该平台可满足每日构建测试、单元测试和集成测试这3种测试场景的使用。该平台的投用大大提升了PLC产品的测试效率及产品稳定性。