王新月 王奚 李航 张秀明
摘 要:在SCADA系统中,HMI与PLC的数据通讯测试,各个数据区不同类型数据读写的测试占用70%的测试时间。介绍了一种基于python的SCADA与西门子PLC数据通讯测试自动化测试方法,该测试方法不仅实现简单,而且大大提高了测试效率,节省了测试时间。
关键词:SCADA;数据通讯;自动化测试
中图分类号:TP273 文献标识码:A
Data Reading and Writing Between SCADA and Siemens
PLC Based on Python Realization of Automatic Test
WANG Xinyue1, WANG Xi2,LI Hang3,ZHANG Xiuming3
(1. Ningbo Hollysys Information Security Institute Co.,Ltd.,Xian,Shaanxi 710075,China;
2.Beijing Hollysys Intelligent Technology Co.,Ltd., Xian,Shaanxi 710075,China;
3.China Mobile Group Heilongjiang Company limited,Harbin,Heilongjiang 150028,China)
Abstract:In SCADA system, the test of data communication between HMI and PLC takes up 70% of the test time. This paper introduces an automatic test method of data communication between SCADA and Siemens PLC based on python. The test method is not only simple, but also greatly improves the test efficiency and saves the test time.
Key words:SCADA; data communication;automatic test
SCADA系统是以计算机为基础的生产过程控制与调度自动化系统,可以对现场的运行设备进行监视和控制,和利时SCADA产品是国内最早的SCADA产品之一,有20年的发展历程,最初与北京地铁13号线合作,定制开发了组态型SCADA软件,与神华和利时合作开发了煤矿SCADA系统,与中石化合作定制开发了石化SCADA产品,通过这些项目产品的建设,积累了丰富的经验,伴随着工业互联网技术日渐成熟以及工业4.0概念的提出,和用户对SCADA产品开放性的强烈需求,和利时集团开发了面向未来的新一代产品SCADAV4.0,第四代SCADA平台继承了上一代平台的大规模、高实时以及可靠、稳定等核心特性,又融入了OPCUA的开放性、可互操作性、自描述性、安全性及集成能力,同时保持现有产品的兼容性,主要应用在煤矿、食药、能源等领域。
SCADA系统为上、下位机的结构,下位机完成设备的直接控制,而上位机侧重于信息集中管理,上、下位机通过通信网络连接。下位机配置的各种输入设备(DI、AI等)进行数据采集,下位机配置的各种输出设备(DO、AO等)对现场设备进行控制,下位机接收上位机的监控,并且向上位机传输各种现场数据,下位机提供多种数据采集驱动,支持与各主流PLC进行数据通讯。
其中,HMI与西门子PLC通讯测试所涉及的PLC型号包括S7200smart、S7300、S7400、S71200、S71500,可访问PLC的I、Q、M、DB数据区,支持数据双向通信,读数据为周期方式,写数据为实时方式,支持多种数据类型,包括开关量数据(BIT)、1字节无符号整型BYTE、1字节有符号整型CHAR、2字节有符号整型SHORT、2字节无符号整型UNSIGNEDSHORT、4字节有符号整型INT、4字节无符号整型UNSIGNEDINT、8字节有符号整型LONGLONG、8字节无符号整型UNSIGNEDLONGLONG、4字节浮点型FLOAT、8字节浮点型DOUBLE、字符串类型(STRING)、时间类型DTL[1]。
在测试HMI与西门子PLC通讯过程中,不但要测试不同型号PLC的数据读写,而且需要测试的数据类型多達13种,在某种类型数据读写时,还需验证有效最小左边界、无效最大左边界、有效最大右边界、无效最大右边界、中间值等,可以看出除个别数据类型差异外,不同型号PLC的数据通讯测试基本属于重复测试,测试方法与输入参数验证均有重叠,但总的测试工作量较大,因此有必要实现HMI与PLC数据读写的自动化测试。
1 數据读写测试流程介绍
1.1 测试方法
SCADA系统中,S7协议驱动测试主要验证HMI与西门子PLC可寻址区域的数据通讯功能,测试步骤为:(1)组态SCADA工程与PLC工程并下装。(2)在SCADA页面中组态待测试测点并在HMI上展示,上下层测点地址一一对应。(3)将PLC侧的测点放入监视列表。(4)在SCADA侧写值,在PLC侧判断同一地址读值是否写入成功。(5)在PLC侧写值,在SCADA侧判断同一地址数据读值是否成功。详细测试流程见图1。
基于以上测试过程,通过多个版本测试经验积累和对比,发现人工测试存在一些问题,如:
(1)由于数据区和测点类型较多,SCADA与PLC相同地址、相同类型的测点查找较困难
如测试I区第一个字节数据的读写,那么首先需在SCADA的HMI页面上找到这个地址对应的测点,其次在PLC上位机软件监视区找到I区的第一个字节,最后开始数据读写结果的对比,当数据量较大或更换测试人员时,查找起来就更加困难。
(2)SCADA与PLC各自写值时需要点击写值按钮,输入数值并确定,步骤烦琐
写值测试时,每写一个值都需点击SCADA中HMI页面相应测点,打开写值对话框,输入数值,并确定。读值测试时,在PLC中每写一个值也需要相同的操作步骤。
(3)SCADA系统中HMI页面组态测点较多,花费时间较多,环境维护需要时间成本。
若要在HMI界面中写值,首先需组态测点写值页面,测试多少点就组态多少个写值特性,组态成本较高,延长了测试周期。
(4)存在人为误差
在人工测试过程中,出于测试人员知识面和工作状态等原因,测试结果存在误差,如边界值的选取有误、测试地址覆盖不全等。
(5)对测试人员要求较高,需同时了解上位机软件及PLC硬件相关知识
SCADA系统S7协议驱动的测试,需要测试人员有丰富的测试经验,对软硬件知识贯通,才能胜任此项测试。
2 自动测试实现
2.1 自动化测试难点
HMI界面不是标准Windows控件,使用python的pywinauto[2]方法定位不到,这样就无法使HMI界面的各个窗口完成读、写值等操作。同样,西门子PLC上位机软件的各个窗口,也不是完全的标准控件,自动化操作较难,尤其是监视列表,无法分辨出每一行的数据位置,无法完成按数据逐一写值操作,且即使HMI和西门子PLC上位机软件的各个窗口均是标准控件,如果使用传统测试方法,由于是只能按点进行操作,实现起来效率也并不是很高。因此需要采用批量读写值方式进行数据读写测试,批量读写值可以利用SCADA系统中的VBA脚本和PLC上位机编程语言来完成。
2.2 自动化测试方法
SCADA提供的编程环境有的是内嵌VBA编译器,有的是自定义的类似BASIC或类似C语言的编译器。无论是哪种编程环境SCADA都要提供很多访问自身数据的属性、方法,以便在编程环境中与SCADA系统交互。这种内置的编程语言经常称作“动作”,现在更多的称呼是“脚本”。这里的脚本与Excel中的“宏”类似。通过脚本用户可以自由扩展系统功能。脚本与一般编程语言类似,在脚本中提供多种运算操作(如赋值、数学运算、逻辑运算),控制语句(如条件判断,循环,分支),以及内置函数等,有的SCADA还支持自定义函数。本文中所提的SCADA项目提供测点数据自动读写函数DB_read和DB_Write,因此SCADA测数据的批量读写就可通过在VBA脚本中调用DB_read和DB_Write来完成。
PLC侧批量数据读写比较容易实现,使用PLC上位机软件自带编程语言即可。
SCADA与PLC侧批量数据读写功能完成后,python只是起到了一个连接的作用,点击HMI界面上的1个按钮就可触发上位机的批量写操作,python读取PLC上位机软件监视列表的所有值,与预期值作对比。接着利用python置PLC写值标志位为真,完成PLC侧批量写值操作,再在HMI界面点击批量读值按钮完成批量读操作,并把读到的数据与预期作对比。数据读写自动动测试流程见图2。
2.3 自动化测试实现
2.3.1 HMI自动化写值
SCADA上层HMI界面,窗口层级较多,在查找窗口时,只能获得最外层的窗口标题,因此需借助python中win32Gui模块的FindWindow和FindWindowEx函数先找到父窗口句柄[2],再通过父窗口句柄按确定的层级关系查找到写值按钮,python中部分代码如下。
app = Application().connect(path='D:HiaSCADAbinMacsVinci.exe') # app关联上HMI程序
handlex1 = win32gui.FindWindow(None, "HMI监视") # "HMI监视"为最外层窗口标题
handlex2 = win32gui.FindWindowEx(handlex1, 0, None, None)
handlex3 = win32gui.FindWindowEx(handlex2, 0, None, None)
handlex4 = win32gui.FindWindowEx(handlex3, 0, None, None)
handlex5 = win32gui.FindWindowEx(handlex4, 0, None, None) # 查找到写值按钮句柄
app.window(title_re=u'HMI监视').window(handle=handlex5, class_name='Button').click_input() #点击写值按钮
写值按钮被点击后就会触发SCADA内置的VBA批量写值脚本,python等待写值完成弹框,依据弹框中写值完成标志,置PLC读值标志位为真,PLC接收到读值指令,自动读取所有写值地址数据,并返回结果给python,python对比HMI写值数据与PLC读值数据,输出相应的测试报告。
2.3.2 HMI自动化读值
通过python置PLC写值标志位为真,PLC程序接收到写值指令,自动完成批量写值操作,待写值完成后,使用与3.3.1中同样的方法点击HMI界面上的读值按钮,触发SCADA内置的VBA批量读值脚本,用VBA脚本自动判定读取到的值是否与PLC写下的值一致,通过弹框输出测试结果,python获取弹框内容生成相应的测试报告。VBA中读值处理流程精简代码如下。
Private Sub Button_LButtonDown()
Dim var As Variant
Dim iAs Integer
Dim j As Integer
Dim X_data_up(2) As String
Dim X_compare_up() As Variant'变量值对比数组
Dim X_datatype_up() As Variant'变量名称
Dim X_errlist_up() As String‘存储错误变量名
Dim X_errdata_up() As String‘存储错误变量值
Dim S As String
Dim K As String
j = 0
flag = 0
X_compare_up = Array("0", "-32768") '变量值对比数组
X_datatype_up = Array("变量1", "变量2") '变量名称
Library.DB_Read "变量1", var '调用读值接口
X_data_up(0) = var
Library.DB_Read "变量2”, var
X_data_up(1) = var
For i = 0 To 1‘判断读到的值是否正确
If X_data_up(i) = X_compare_up(i) Then
Else
flag = 1
ReDim Preserve X_errlist_up(j + 1)
ReDim Preserve X_errdata_up(j + 1)
X_errlist_up(j) = X_datatype_up(i)
X_errdata_up(j) = X_data_up(i)
j = j + 1
End If
Next
If flag> 0 Then
S = Join(X_errlist_up, ",")
K = Join(X_errdata_up, ",")
MsgBox ("讀上限错误类型:" & S &Chr(10) & "读上限错误数据:" & K)‘不一致时输出错误的变量名和变量值
End If
If flag = 0 Then
MsgBox ("pass")‘一致时输出pass
End If
End Sub
3 结 论
介绍了一种SCADA上层HMI与西门子PLC数据读写自动化测试方法,运用SCADA内置VBA和PLC编程语言实现上下层批量读、写值操作,简化了操作步骤,方法简单,易于实现。
与传统手工测试相比,以200条用例为例,手工测试时间考虑各操作因素及判断因素至少需要6.6 h左右,而自动化测试仅需10 min左右,由此可以看出SCADA上层HMI与西门子PLC数据读写自动化测试的实现大大提高了测试效率,更便于版本间升级测试。
参考文献
[1] 廖常初.S71200 PLC编程及应用[M].北京:机械工业出版社,2010.
[2] Doug Hellmann.python 3 标准库[M].北京:机械工业出版社,2018.