回复:WinCC 6.2与RS232通信

独孤樵夫

  • 帖子

    45
  • 精华

    1
  • 被关注

    2

论坛等级:游士

注册时间:2008-07-30

普通 普通 如何晋级?

发布于 2012-09-06 09:59:29

11楼

多谢楼上各位热心朋友,问题终于解决了。

谢谢万班的耐心,谢谢“逐渐变晕”网友的关键提示。

下面说说我的解决过程。

首先,上网下载MSComm控件,包含三个文件MSCOMM32.OCX,MSCOMM32.DEP,MSCOMM.SRG,网上有关于

这几个文件的使用方法,就不啰嗦了。或者可以下载到已经做好批处理文件的控件,直接运行批处

理文件就可以完成控件的安装注册,我就是下载的这种,很方便,有需要的可以留言哦。

安装好MSComm控件后,在wincc的图形编辑器里的控件窗口中点击鼠标右键添加该控件,名称是

Microsoft Communications Control v6.0,在前面的选择方框中打上钩,确认就可以在控件窗口

中看到这个控件了,然后拖拽一个实体到画面窗口中,出现一个电话的图标。

接下来就是编写脚本了,我采用的是vbs,可以有两种方法使用,一是通过全局脚本,采用变量或

者周期触发,实现定制读取串口数据;二是使用按钮触发,实现一次或者连续的读取串口数据。

建立内部变量comm_text,字符型,在画面中新建输入输出域,与变量comm_text连接

一、全局脚本方式(周期触发)
1、在脚本编辑器里新建脚本编写如下代码:
Option Explicit
Function action
Dim MSComm1
'指定控件所处的画面和控件名称
Set MSComm1 = HMIRuntime.Screens("启动画面").ScreenItems("控件2")

MSComm1.CommPort = 1 '设置通信端口号为COM1
MSComm1.Settings = "9600,n,8,1" '设置串口参数
MSComm1.InputMode = 0 '接收文本型数据,1为二进制数据
MSComm1.RThreshold = 17 '设定触发OnComm 事件的条件
MSComm1.PortOpen =True '打开通信端口1

End Function

2、mscomm控件的对象事件里编写如下脚本:
Sub OnComm(ByVal Item)
Dim MScomm1,MSComm1_text,buff,bufflen

 Set MSComm1=HMIRuntime.Screens("启动画面").ScreenItems("控件2")

buff = MSComm1.Input
bufflen = Len(buff)

If bufflen<>0 Then
MSComm1_text = Mid(buff,7,9) '从输入缓冲区中截取需要的数据
HMIRuntime.Tags("comm_text").Write MSComm1_text,1

Else
MSComm1.RThreshold = 0
MSComm1.PortOpen = False '关闭通信端口1
End If


End Sub

========================================

二、采用画面按钮方式:在画面上建立两个按钮,分别命名为“启动通信”、“关闭通信”

1、启动通信按钮 鼠标动作vb脚本如下:
Sub OnLButtonUp(ByVal Item, ByVal Flags, ByVal x, ByVal y)


Dim MSComm1
Set MSComm1=ScreenItems("控件1")
MSComm1.CommPort = 1 '设置通信端口号为COM1
MSComm1.Settings = "9600,n,8,1" '设置串口参数
MSComm1.InputMode = 0 '接收文本型数据
MSComm1.RThreshold = 17
MSComm1.PortOpen =True '打开通信端口1

End Sub

2、关闭通信按钮 鼠标动作vb脚本如下:
Sub OnLButtonUp(ByVal Item, ByVal Flags, ByVal x, ByVal y)
Dim MScomm1
Set MSComm1=ScreenItems("控件1")
MSComm1.RThreshold = 0
MSComm1.PortOpen = False '关闭通信端口1
End Sub

3、mscomm控件脚本:
Sub OnComm(ByVal Item)
Dim MScomm1,MSComm1_text,buff,bufflen
Set MSComm1=ScreenItems("控件1")

buff = MSComm1.Input
bufflen = Len(buff)

If bufflen<>0 Then
MSComm1_text = Mid(buff,7,9)
'MsgBox(MSComm1_text)
HMIRuntime.Tags("comm_text").Write MSComm1_text,1
End If

End Sub

============================================================================
注:
当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。例如,设置

Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。





以上就是我的解决过程,因为我的数据就是一串数字,而且wincc只是读取,所以没有做发送的测

试。在其中有一个重要的属性就是RThreshold,刚开始的时候没有设置这个属性,默认为0,怎么

都没有数据,后来看了说明才知道是怎么回事。


不足之处,不吝赐教

精华帖版主置评:虽然协议方面仍然不清晰,但毕竟做出来了,而且有始有终,很好。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有32569条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。