您的位置:控制工程论坛网论坛 » PLC与PAC » 也谈VB MSCOMM与PLC通讯

sj1127

sj1127   |   当前状态:离线

总积分:887  2024年可用积分:0

注册时间: 2007-03-08

最后登录时间: 2009-04-02

空间 发短消息加为好友

也谈VB MSCOMM与PLC通讯

sj1127  发表于 2007/5/5 17:07:08      1116 查看 1 回复  [上一主题]  [下一主题]

手机阅读

VB的MSCOMM控件用于串口通讯非常方便,在DELPHI中也可引入。

只要在VB设计环境的部件中选择了MicroSoft COMM Control,即可将MSCOMM从控件栏拖入Frame。

所有的设置均可通过该控件属性完成,无需代码。正确的设置除各应用所需的通讯4参数(bps,数据位,效验位,停止位)Settings及通讯端口号CommPort外,还应设置另外两项:InputMode:comInputModeBinary、RThreshold:1。使用2进制输入方式,是因为Text方式相当容易受到干扰而引起通讯长时间堵塞,甚至不能恢复。更改接收阈值=1后,即可使用控件事件OnComm,使程序无需查询端口。其他设置使用控件缺省值即可,一般应用无需更改。

准备完毕后,程序在入口仅需增加MSComm1.PortOpen = True来打开通讯口,既可工作。实用程序中,还应加入错误捕捉检测端口是否存在,以免程序跳出。

由于抗干扰的需要使用了2进制通讯方式,给编程带来一定麻烦,需要使用2进制函数收发数据,剪一段代码如下,代码适用于文本通讯:

接收:

Private Sub MSComm1_OnComm()

    Select Case MSComm1.CommEvent
      Case comEvCTS: MSComm1.Handshaking = comNone
      Case comEvReceive:
        aStr = ""
        bstr = MSComm1.Input
        l = LenB(bstr)
        For i = 1 To l
          aStr = aStr + Chr$(AscB(MidB(bstr, i, 1)))
        Next i

        '此时收到aStr字符串,连续拼装后即可找到完整的接收串。

    End Select
End Sub

发送:

Public Sub SendaStr(ByVal aStr As String)
  Dim aStrB() As Byte
  Dim i As Integer
  Dim l As Integer
  l = Len(aStr) - 1
  If MSComm1.PortOpen Then
    ReDim aStrB(l) As Byte
    For i = 0 To l
      aStrB(i) = Asc(Mid(aStr, i + 1, 1))
    Next i
    MSComm1.Output = aStrB
  End If
End Sub

当需要进行2进制通讯时(如MODICOM),不应使用字符串作为收发缓冲,可将2位码值(HEX())存入字符串进出收发函数,以免VB判定\0为字符串结束。

2进制通讯对于00、01之类的控制码均能接收,进程不会卡死,我还尝试收发中文均能成功,但代码较多。

本人使用MSCOMM控件建立多S7 200的数据通讯网络,比买组态并且学习总是在变的规则简单多了。

1楼 0 0 回复
总共 , 当前 /