WinCC读取串口扫描枪案例

目录

一 MSComm控件注册

二 准备微软脚本调试器

三 WinCC画面制作

四 创建全局脚本VBS

五 项目启动前的配置

六 关于USB扫描枪和串口扫描枪


本文以WinCC通过VBS脚本进行串口通讯,以读取扫描枪为例进行测试

参考资料:

MScomm控件注册方法(以管理员身份运行“命令提示符”,否则会有报错)

模块已加载,但对DllRegisterServer的调用失败

如何在 WinCC 运行系统中通过串口发送接收数据?

WinCC脚本调试和诊断方法

rpc服务器不可用怎么办


一 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的扫描枪也可设置为串口方式输出,需要跟相应厂商获取相应驱动软件,这里不做过多描述,见另外一篇文章。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值