目录
本文以WinCC通过VBS脚本进行串口通讯,以读取扫描枪为例进行测试
参考资料:
MScomm控件注册方法(以管理员身份运行“命令提示符”,否则会有报错)
模块已加载,但对DllRegisterServer的调用失败
一 MSComm控件注册
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能,默认安装的WinCC是没有该控件的,需要自己下载并加载到Windows中,并添加到WinCC的ActiveX控件列表中。(以管理员身份运行“命令提示符”,否则会有报错)
二 准备微软脚本调试器
调试器安装目录
C:\Program Files (x86)\Microsoft Script Debugger
实际运行项目时,打开调试器,并选择“运行的文档”,即可对代码进行调试
三 WinCC画面制作
按“如何在 WinCC 运行系统中通过串口发送接收数据?”说明创建变量和画面,
变量:
"Connection" - 二进制变量
"Buffer" - 文本变量 8 位字符集
"Output" - 文本变量 8 位字符集
其它
对象:
"Main.pdl" - WinCC 画面
"MSComm1" - Microsoft 通讯控件, V6.0
在画面“Main”中插入一个MSComm控件,双击控件,在属性中设置CommPort,即端口号。
之后在页面上添加一个“应用程序窗口”,选择“全局脚本”,之后选择“GSC Diagnostics”,这个窗口也用于调试VB函数用,可用于函数“HMIRuntime.Trace”输出
之后创建“打开端口”,“关闭端口”,“获取值”,“发送值”,“清空”五个按钮和IO域,并分别连接到定义的变量,参考如下
四 创建全局脚本VBS
双击打开“VBS-Editor”
在“动作”一栏创建4个动作,名称如下
注:目前这4个动作代码如下:(红色部分为自己添加的代码)
Open.bac
Option Explicit
Function action
Dim objMSComm1, tagConnection
Set objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1")
Set tagConnection = HMIRuntime.Tags("Connection")
If objMSComm1.PortOpen = False Then
' Assign com port number
objMSComm1.Commport = 6(这个表示端口号,与前面一致)
' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - Stopbit
objMSComm1.Settings = "9600,N,8,1"
objMSComm1.RThreshold = 1
objMSComm1.SThreshold = 1
objMSComm1.InputLen = 0
objMSComm1.PortOpen = True
tagConnection.Write(True)
HMIRuntime.Trace("Port open." & vbCrLf)
Else
HMIRuntime.Trace("Port is already opened." & vbCrLf)
End If
End Function
Read.bac
Option Explicit
Function action
Dim strBuffer, strTemp
Dim objMSComm1, tagBuffer
Set objMsComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1")
Set tagBuffer = HMIRuntime.Tags("Buffer")
strTemp = ""
If objMSComm1.PortOpen = True Then
'read the buffer
strTemp = CStr(objMSComm1.Input)
If strTemp <> "" Then
'checking for the delimited character
If InStr(strTemp, Chr(6)) Then
strBuffer = Left(strTemp,Len(strTemp)-1)
Else
strBuffer = strTemp
End If
tagBuffer.Value = strBuffer
tagBuffer.Write
End If
Else
HMIRuntime.Trace("No port is opened!" & vbCrLf)
End If
End Function
Close.bac
Option Explicit
Function action
Dim objMSComm1, tagConnection
Set objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1")
Set tagConnection = HMIRuntime.Tags("Connection")
If objMSComm1.PortOpen = True Then
objMSComm1.PortOpen = False
tagConnection.Write(False)
HMIRuntime.Trace("Port close." & vbCrLf)
End If
End Function
Send.bac
Option Explicit
Function action
Dim tagOutput, objMSComm1
Set tagOutput = HMIRuntime.Tags("Output")
Set objMSComm1 = HMIRuntime.Screens("Main").ScreenItems("MSComm1")
If objMSComm1.PortOpen = True Then
tagOutput.Read
objMSComm1.Output = tagOutput.Value
tagOutput.Write("")
Else
HMIRuntime.Trace("No port is opened!" & vbCrLf)
End If
End Function
说明:这里所有代码都是放在Function,与参考资料中放在SUB有所不同,具体SUB与Function区别,后续自己再学习补充。
代码添加完成后,需要给每个“动作”添加触发器。
这里都是定义“变量XXX有变化时”作为触发器,而要实现串口内容实时被读取,可以通过设置周期型触发器来实现。参考如下:
补充说明:关于WinCC中触发器类型
五 项目启动前的配置
勾选WinCC“计算机”启动项
勾选WinCC计算机属性“运行系统”中的“启动调试程序”选项,则在实际执行时,可通过微软的“脚本调试器”观看代码的调试,可用于故障查找。
设置计算机服务“Remote Procedure Call(RPC Locator)”为自动,否则会出现MSComm控件调用不成功的现象。
Win+R之后输入“services.msc”可调出“服务”
以上都完成后,激活项目,即可看到
以上只是简单的案例,具体项目使用还需要根据实际情况进行更改,如打开串口的触发器可能是WinCC启动后自动触发,获取串口值得触发器,周期型触发时间的设置等。周期触发会给系统造成较重的负荷。因此最好的方法是为全局动作组态一个事件触发器。
六 关于USB扫描枪和串口扫描枪
USB的扫描枪也可设置为串口方式输出,需要跟相应厂商获取相应驱动软件,这里不做过多描述,见另外一篇文章。