WinCC RT Advance的VBS脚本应用
本次选择的是WinCC RT Advance而不是用的SIMATIC Comfort Panel来做的主要原因是因Comfort系列HMI虽然是支持VBS脚本的,但是如果要创造一些CSV文件的话,HMI不带USB的情况下是很存取数据的。另一方面向比于PC station嵌入的RT Advance,HMI的运行速度和响应速度也是有差别的。
不用Classic WinCC来做的原因是经典WinCC想实现脚本是个很简单的事;
不用KTP系列的原因是它们根本不支持脚本系统。
1. 一个简单的乘法脚本
需要做成的效果如图:
.使能乘法脚本的按钮在
=
符号中,按下即使能运算
.右键=
,找到事件
,选择单击事件
,把脚本嵌入事件。
新建一个名为multiplication
的VBS脚本,类型选择Sub(不带返回值)
- Sub:不带返回值;
- Function:带返回值,没找到Return,所以应该只能通过Function返回;
- ByVal:按值传参,传入的数不管再脚本内如何被赋值,接口上的值不会改变;
- ByRef:按地址传参,可以在脚本内部改变参数值并传到接口上;
代码内容如下:
1 |
|
.
SmartTags()
连接的是HMI变量表中的变量
2. 带返回值的方法
带返回值,应该只能通过Function返回,且只能返回一个值(网上资料VBS传递值可以用Class name ... End Class
,但是在WinccRT上报错,也许是不支持,先保留);
代码内容如下:
1 |
|
脚本呈现效果如下:
.返回值需要新建一个
HMI_Tags
或者PLC变量
来接收;
.Value1/Value2被固定输入为int型(有符号位)
;
3. 随机数和数组
效果画面如图所示:
.需要在HMI变量表里面新建一个数组,我这里建立的是
Array[0..9] of Real
,为左侧IO域
分别分配一个数组元素;
.建立一个Uint类型
HMI变量分配给右侧IO域,目的是作为脚本要生成的随机数组的最大值;
.按钮的作用是按下就开始使能脚本内容;
新建一个名为Array_Generators
的VBS脚本,代码内容如下:
1 |
|
4. 更改元素位置和大小
1 |
|
5. 条件和循环指令应用
1 |
|
6. 记录停机+恢复时间+生成记录日志
- 需要创建一个故障开始的变量
- 需要创建一个故障结束的变量
记录开始时间,新建一个名为Start_Time
的VBS脚本,代码内容如下:
1 |
|
创建记录事件,新建一个名为Log_Record
的VBS脚本,代码内容如下:
1 |
|
创建CSV表格,新建一个名为CSV_Generators
的VBS脚本,代码内容如下:
1 |
|
记录开始时间,新建一个名为End_Time
的VBS脚本,代码内容如下:
1 |
|
7. 生成记录报表
想要生成如下图所示的报表:
橘色文本框是建立来调试用的
记录数据,新建一个名为TEST_Record
的VBS脚本,代码内容如下:
- 被下面的
Test_TagRecord
调用1
2
3
4
5
6
7
8
9
10
11
12
13Sub TEST_Record()
Dim FSO,MYFILE,RecordNbr 'FSO=访问系统文件对象,MYFILE=访问的文件,RecordNbr=记录条目数
Set FSO=CreateObject("Scripting.FileSystemObject") '创建文件访问对象并引用
Set MYFILE=FSO.OpenTextFile("D:\TEST数据记录.csv",8,0) '打开文件并引用,8表示打开模式为在最后一行写入(1=只读;2=写入);0代表ASCii显示方式
Set RecordNbr=SmartTags("test_数据记录条目") '引用数据记录条数
MYFILE.WriteLine MYFILE.Line-1 & ","& Date()&"," & Time() & "," & SmartTags("test_喷涂量") & "," & SmartTags("test_流量") & "," & SmartTags("test_雾化量") & "," & SmartTags("test_扇形量")
'将变量记录的值写入到数据记录EXCEL中
RecordNbr.Value=RecordNbr.Value+1
MYFILE.Close
Set FSO=Nothing
Set MYFILE=Nothing
Set RecordNbr=Nothing
End Sub
建立表头,新建一个名为TEST_TagRecord
的VBS脚本,代码内容如下:
- 在触发事件来临的时候被调用,它是第一个被调用的脚本刷新数据,新建一个名为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Sub TEST_TagRecord()
'检查变量存储EXCEL是否存在,若不存在则建立新的文件
Dim FSO,MYFILE 'FSO=访问系统文件对象,MYFILE=访问的文件
Set FSO=CreateObject("Scripting.FileSystemObject") '创建文件访问对象并引用
If FSO.FileExists("D:\TEST数据记录.csv")=True Then
Call TEST_Record '若存在,直接进行数据记录
Else
Set MYFILE=FSO.CreateTextFile("D:\TEST数据记录.csv") '创建文件并返回到MYFILE
MYFILE.WriteLine"编号,日期,时间,喷涂量,流量,雾化量,扇形量" '写入表头
MYFILE.Close '关闭文件
Set MYFILE=Nothing
Call TEST_Record '直接进行数据记录
End If
Set FSO=Nothing
End SubTEST_ReadLog
的VBS脚本,代码内容如下: - 为了翻页的时候刷新页面表格的内容,翻页的时候会有一个Int数记录变化的起始索引位置(列表行数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40Sub TEST_ReadLog()
Dim FSO,MYFILE,TEXT,I,HELP 'FSO=访问文件系统和对象,MYFILE=需要访问的文件,TXET=从csv文件中读取的信息,I=整数
Set HELP=HmiRuntime.Screens("VBS脚本测试2").ScreenItems("文本域_19")
HELP.Text="脚本正在运行!"
Set FSO=CreateObject("Scripting.FileSystemObject") '创建引用文件系统对象
If SmartTags("test_当前显示的变量号")<0 Then SmartTags("test_当前显示的变量号")=0 '变量编号不能小于0
If FSO.FileExists("D:\TEST数据记录.csv")= True Then
Set MYFILE=FSO.OpenTextFile("D:\TEST数据记录.csv",1,0) '1=只读打开方式;0=ASCii编码方式
HELP.Text=HELP.Text & Chr(13) & "CSV文件已打开!"
For I=0 To SmartTags("test_当前显示的变量号") '利用FOR..NEXT进行跳过某行,达到从最后一行开始读取的目的
If MYFILE.AtEndOfLine<>True Then '判断是否在最后一行,没有到达则跳转,到达则退出FOR循环
MYFILE.SkipLine
Else
Exit For
End If
Next
'---------------------开始进行文件中信息读取
HELP.Text=HELP.Text & Chr(13) & "开始进行文件中信息读取!"
For I=0 To 5 '依据画面显示的行数,从0到5一共6行
If MYFILE.AtEndOfLine<>True Then
TEXT=Split(MYFILE.ReadLine,",",-1,1) '读取EXCEL文件中的一行数据,并用Split进行分隔,并将分隔后的一维数组赋值给TXET,-1表示输出所有字符串,1表示一维数组
SmartTags("test_temp_编号")(I)=TEXT(0)'左边都是数组变量
SmartTags("test_temp_日期")(I)=TEXT(1)
SmartTags("test_temp_时间")(I)=TEXT(2)
SmartTags("test_temp_喷涂量")(I)=TEXT(3)
SmartTags("test_temp_流量")(I)=TEXT(4)
SmartTags("test_temp_雾化量")(I)=TEXT(5)
SmartTags("test_temp_扇形量")(I)=TEXT(6)
SmartTags("test_当前显示的变量号")=TEXT(0)
HELP.Text=HELP.Text & Chr(13) & "数组读取成功!"
Else
Exit For
End If
Next
MYFILE.Close '关闭文件
Set MYFILE=Nothing '释放
End If
Set FSO=Nothing
Set HELP=Nothing
End Sub