回复:C脚本中使用MSCOMM如何发送

四书五经

  • 帖子

    762
  • 精华

    58
  • 被关注

    30

论坛等级:侠圣

注册时间:2005-12-23

普通 普通 如何晋级?

发布于 2009-12-06 12:43:37

10楼

感谢万版主和 dcount107大侠的帮助,D侠前面帖子提供的链接,前面也看过,不过实在惭愧,当时只是觉得VBS处理数据的能力不如C,一心还是想用C脚本来实现,就没有仔细的去分析链接中提供的程序。诚如D侠所说,通过DLL文件进行相应的类型转换的确可以实现发送大于127的字符,不过VBS的数据处理功能还是较弱,最后还是用C脚本和API函数实现了发送数据,用MSCOMM实现接收数据,实现了简单的MODBUS协议。
在画面打开事件中写如下代码:
Sub OnOpen()
Dim COMM1
Set COMM1 = HMIRuntime.Screens("main").ScreenItems("MScomm1")
HMIRuntime.Trace "OK1"
If COMM1.PortOpen = False Then
COMM1.Commport = 3
' Values: 9600 Baud, N - No Parity, 8 - Databit, 1 - Stopbit
COMM1.Settings = "9600,N,8,1"
COMM1.RThreshold = 8
COMM1.SThreshold = 0
COMM1.InputLen = 0
COMM1.InputMode=1
COMM1.InBufferSize=1024
COMM1.NullDiscard=False
COMM1.PortOpen = True
Else
HMIRuntime.Trace("Port is already opened." & vbCrLf)
End If
End Sub
MSCOMM的OnComm事件中写如下代码:
Sub X63A7X4EF62X0000C_OnComm(Byval Item) Dim st
Dim buff(1024)
Dim n,t,i
Dim rscomm
Dim tagobj

Set rscomm=HMIRuntime.Screens("main").ScreenItems("MScomm1")
HMIRuntime.Trace "inbuffercount=" & rscomm.InBufferCount & vbCrLf
HMIRuntime.Trace "commevent=" & rscomm.CommEvent & vbCrLf
If (rscomm.CommEvent=2 ) And (rscomm.InBufferCount>=8) Then
st=rscomm.input
rscomm.InBufferCount =0
For i=1 To lenb(st)
buff(i)=ASCB(MidB(st,i,1))
HMIRuntime.Trace buff(i) & vbCrLf
Next
'固定的MODBUS协议,CRC校验预先算好,呵呵,VB做CRC较验比较麻烦,客户就是要求读取几个模拟量
If (buff(1)=2) And (buff(2)=3) And (buff(6)=&H04) And (buff(7)=&H44) And (buff(8)=&H3a) Then
HMIRuntime.Trace "ok1" & vbCrLf
Set tagobj=HMIRuntime.Tags("TrigComm") '接收完成,触发全局C动作
tagobj.Read
tagobj.value=True
tagobj.Write
End If
End If
End Sub
帖子太长,下面另起一帖写C脚本代码
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有32564条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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