该博文在我的博客已经发过了 搬到这里给大家分享以下
这个主要基于对控件的编程
本通讯方式可以更改控件使用以太网或者其他通讯方式。
WINCC是非常强大的一个软件,但是大多数功能我们都没有用到,对吧。市面上关于WINCC的书籍也不是很多同时也没有讲解更多的高级应用。前段时间很多的网友问我串口通讯的问题,感觉大家都有很强烈的需求所以再次写一篇串口通讯的例子,这次采用全局脚本来进行控制。这里我要说一下,WINCC虽然不是通用型的组态软件,但是它是能够和任何设备任何通讯协议进行通讯的。有网友说老师教的WINCC只能和西门子产品这种观点是错误的。不管是通用还是非通用的组态软件都会有至少一个接口和第三方设备进行通讯的接口。通过WINCC的OPC就能够和大部分设备通讯。再有就是WINCC是一个开放型的组态软件,有很多接口可以提供给第三方软件进行通讯。虽然我这里讲解的只是串口,TCP/IP也是一样的道理。如果我有时间会编写一个完成的MODBUS协议的通讯例子和TCP/IP的例子供大家参考
实验准备:参考上一篇关于串口通讯的例子即可。
要实现全局脚本对串口的控制首先你需要了解如何使用全局脚本编辑器。这里不进行讲解如何使用,我们直接上菜
第一步先写一个动作脚本:
该脚本需要填写变量触发器(做一个二进制内部变量即可),写好保存即可,因为当WINCC启动时会自动执行所有的脚本动作,该脚本实现功能是对串口控件的通讯参数进行赋值。(提示,可以直接填写到控件参数也可以)
Option Explicit
Function action
'=========用于初始化串口参数========================
Dim scr
Dim comcl
Set scr=HMIRuntime.Screens("串口通讯")'绑定串口控件所在画面
Set comcl=scr.ScreenItems("串口控件")'绑定串口控件(控件名本人由原来的控件1改为现在名,这里注意如果改了控件名务必停止WINCC运行然后在启动WINCC)
comcl.commport=1' 设定端口
comcl.settings="9600,n,8,1"' 设置波特率,无校验,8位数据位,1位停止位
comcl.inputmode=1' 设定传输模式(文本为0,二进制为1)
End Function
以上脚本只是启动WINCC时候执行一次
第二步写一个循环执行的脚本(发送数据)
该脚本需要填写触发器,如果是一直需要通讯那么选用周期触发即可,触发时间自己定义。该脚本实现的是周期性扫描执行脚本。同时为了方便调试程序我在里面加了一个START变量来进行控制
Option Explicit
Function action
Dim scr
Dim comcl
Dim start
Dim sendtext
Set scr=HMIRuntime.Screens("串口通讯")'绑定串口控件所在画面
Set comcl=scr.ScreenItems("串口控件")'绑定串口控件(控件名本人由原来的控件1改为现在名,这里注意如果改了控件名务必停止WINCC运行然后在启动WINCC)
Dim receivetext
Set receivetext = HMIRuntime.Tags("receivetext")
'=======================================决定是否进行通讯===================================================
Set sendtext = HMIRuntime.Tags("sendtext")
Set start = HMIRuntime.Tags("start")
If start.Read =1 Then
If comcl.portopen=False Then
comcl.portopen=True '开启串口
End If
receivetext.Write comcl.input '显示接收字符串,注意一旦通讯一次就会自动清空缓冲区的。所以如果你要显示需要处理接收到的字符串
comcl.output= SEND(sendtext.read) '调用标准模块
Else
comcl.portopen=False '关闭串口
End If
End Function
标准模块代码如下
Function SEND(sendtext)
Dim scr
Dim comcl
Dim outData ' 数据暂存
Set scr=HMIRuntime.Screens("串口通讯")'绑定串口控件所在画面
Set comcl=scr.ScreenItems("串口控件")'绑定串口控件(控件名本人由原来的控件1改为现在名,这里注意如果改了控件名务必停止WINCC运行然后在启动WINCC)
outData = UCase(Replace(sendtext, Space(1), Space(0)))' 先去掉空格,再转换为大写字母
comcl.output=outData
End Function
这里加入标准模块调用主要是给大家展示哈标准模块的简单使用
关于使用ONCOMM事件,经过测试能识别到clear-to-send 线变化,但是不能识别到收和发的事件。通过ONCOMM事件来处理数据我是没有成功的。倒是我上面的程序是查询方法可以通过的。在程序不短循环查询中使用即可正常完成收和发,以上程序经过实验能够成功。
以上就能够实现简单的串口通讯