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
2
3
4
5
6
7
8
9
Sub multiplication()

Dim a,b,c '定义变量
a=SmartTags("乘数")
b=SmartTags("被乘数")
c=a*b
SmartTags("结果值")=c

End Sub

.SmartTags()连接的是HMI变量表中的变量

2. 带返回值的方法

带返回值,应该只能通过Function返回,且只能返回一个值(网上资料VBS传递值可以用Class name ... End Class,但是在WinccRT上报错,也许是不支持,先保留);

代码内容如下:

1
2
3
4
5
6
7
Function Average(ByRef Value1, ByRef Value2)

If IsNumeric (Value1) = False Then Value1 = 1
If IsNumeric (Value1) = False Then Value1 = 1
Average = (Value1 + Value2)/2

End Function

脚本呈现效果如下:

.返回值需要新建一个HMI_Tags或者PLC变量来接收;
.Value1/Value2被固定输入为int型(有符号位)

3. 随机数和数组

效果画面如图所示:

.需要在HMI变量表里面新建一个数组,我这里建立的是Array[0..9] of Real,为左侧IO域分别分配一个数组元素;
.建立一个Uint类型HMI变量分配给右侧IO域,目的是作为脚本要生成的随机数组的最大值;
.按钮的作用是按下就开始使能脚本内容;

新建一个名为Array_Generators的VBS脚本,代码内容如下:

1
2
3
4
5
6
7
8
9
10
Sub Array_Generator()
Dim Temp_Array(),i
For i=0 To SmartTags("数组最大元素")
ReDim Preserve Temp_Array(i+1) 'Preserve为保留之前数据
Temp_Array(i)=Rnd*1000
Next
For i=0 To SmartTags("数组最大元素")
SmartTags("动态数组Array1显示")(i)=Temp_Array(i)
Next
End Sub

4. 更改元素位置和大小

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
40
41
42
43
44
Sub setColor()
On Error Resume Next
Dim VAL,SHAPE
Set VAL = SmartTags("COLORCODE")
Set SHAPE = HmiRuntime.Screens("画面_1").ScreenItems("圆_1")
Dim b1,b2,b3
Set b1=SmartTags("a1")
Set b2 = SmartTags("a2")
Set b3 = SmartTags("a3")
If b1>255 Or b2>255 Or b3>255 Then
a1=0
a2=0
a3=0
SHAPE.BackColor = RGB(b1,b2,b3)
Else
SHAPE.BackColor = RGB(b1,b2,b3)
End If
'Select Case VAL
' Case 0
' SHAPE.BackColor = RGB(255,255,255)
' Case 1
' SHAPE.BackColor = RGB(255,0,0)
' Case 2
' SHAPE.BackColor = RGB(0,255,0)
' Case 3
' SHAPE.BackColor = RGB(0,0,255)
' Case Else
' SHAPE.BackColor = RGB(0,0,0)
'End Select
If Err.Number <>0 Then
Err.Clear
End If
Dim box1,box2,box3,box4,box
box1=SmartTags("boxA")
box2=SmartTags("boxB")
box3=SmartTags("boxC")
box4=SmartTags("boxD")
Set box=HmiRuntime.Screens("画面_1").ScreenItems("矩形_1")
box.Height=box1
box.Width=box2
box.BackColor = RGB(b2,b1,b3)
box.Top=box3
box.Left=box4
End Sub

5. 条件和循环指令应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub practiceVBS()
'提示:
' 1. 使用 <CTRL+SPACE><CTRL+I> 快捷键打开含所有对象和函数的列表
' 2. 使用 HMI Runtime 对象写入代码。
' 示例:HmiRuntime.Screens("Screen_1")
' 3. 使用 <CTRL+J> 快捷键创建对象引用。
'从此位置起写入代码:
Dim CMD,Count,tt,i
Set CMD = SmartTags.Item("Addflag")
Set Count = SmartTags.Item("AddCountint")
Set tt = SmartTags.Item("flag")
tt.Value = True
If CMD.Value Then
For i=0 To 999
Count.Value=Count.Value + 1
If Count.Value>=100 Then
Count.Value = 0
End If
Next
Else
Count.Value = 0
End If
End Sub

6. 记录停机+恢复时间+生成记录日志

  • 需要创建一个故障开始的变量
  • 需要创建一个故障结束的变量

记录开始时间,新建一个名为Start_Time的VBS脚本,代码内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
Sub Start_Time()

If SmartTags("自动生产状态") = False And SmartTags("做沿用的临时变量") = True Then
SmartTags("问题发生时系统时间") = Now
SmartTags("故障记录激活标志位")=True
End If
SmartTags("做沿用的临时变量") = SmartTags("自动生产状态")
Dim Prompt
Set Prompt=HmiRuntime.Screens("显示窗口名").ScreenItems("文本域控件")
Prompt.Text="故障开始时间脚本正在运行"
Set Prompt=Nothing
End Sub

创建记录事件,新建一个名为Log_Record的VBS脚本,代码内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub Log_Record()

Dim FSO,MyFile,DateVal,StartTim,StopTim
Set StartTim = SmartTags("问题发生时系统时间")
Set StopTim = SmartTags("问题结束时系统时间")
DateVal = DateDiff("s",StartTim.Value,StopTim.Value)
Set FSO=CreateObject("Scripting.FileSystemObject")
Set MyFile=FSO.OpenTextFile("D:\停机时间记录表.csv",8,0) '打开文件并引用,8表示打开模式为在最后一行写入(1=只读;2=写入);0代表ASCii显示方式
MyFile.WriteLine MyFile.Line & Date() &","& Time() &","& "这是故障" &","& DateVal
MyFile.Close

Set FSO=Nothing
Set MyFile=Nothing
Set StartTim=Nothing
Set StopTim=Nothing
Set DateVal=Nothing
End Sub

创建CSV表格,新建一个名为CSV_Generators的VBS脚本,代码内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub CSV_Generators()

Dim FSO,MyFile,Input
Set FSO=CreateObject("Scripting.FileSystemObject")'创建文件系统
If FSO.FileExists("D:\停机时间记录表.csv")=True Then
Call Log_Record
Else
Set MyFile=FSO.CreateTextFile("D:\停机时间记录表.csv")
MyFile.WriteLine"时间,日期,故障,故障时间统计"
MyFile.Close
Set MyFile=Nothing
Call Log_Record
End If
Set FSO=Nothing
End Sub

记录开始时间,新建一个名为End_Time的VBS脚本,代码内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Sub End_Time()

Dim Prompt
If SmartTags("故障记录激活中") = True And SmartTags("自动生产状态") = True Then
SmartTags("问题结束时系统时间") = Now

Set Prompt=HmiRuntime.Screens("显示窗口名").ScreenItems("文本域控件")
Prompt.Text="故障恢复时间脚本正在运行"
Call CSV_Generators
SmartTags("故障记录激活中") = False
End If
Set Prompt=Nothing
End Sub

7. 生成记录报表

想要生成如下图所示的报表:

橘色文本框是建立来调试用的

记录数据,新建一个名为TEST_Record的VBS脚本,代码内容如下:

  • 被下面的Test_TagRecord调用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub 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
    15
    Sub 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 Sub
    刷新数据,新建一个名为 TEST_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
    40
    Sub 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 '依据画面显示的行数,从05一共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

WinCC RT Advance的VBS脚本应用
http://example.com/2024/07/21/WinCC RT Advance的VBS脚本应用/
作者
xiao cuncun
发布于
2024年7月21日
许可协议