新手请教:VB通过winsock控件连接到plc后,首先给plc发送指令,然后从plc那里接收发回的数据,请教一下senddata的格式?modicon premium的PLC,不知道该怎么写?谢谢~~

解决方案 »

  1.   

    看你的PLC的产品使用说明书,按它指明的协议来做VB的程序.
      

  2.   

    给你看下我的代码 vb.net用WinSocket和欧姆龙Plc通讯 仅供参考
                           Dim b(19) As Byte
                        Dim c(33) As Byte
                        Dim Decimalbyt(63) As Byte
                        Dim sock As Socket
                        sock = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)                    '连接感应PLC
                        sock.Connect(SensorPlcIp, 9600)                    '握手协议
                        b(0) = &H46
                        b(1) = &H49
                        b(2) = &H4E
                        b(3) = &H53
                        b(4) = &H0
                        b(5) = &H0
                        b(6) = &H0
                        b(7) = &HC
                        b(8) = &H0
                        b(9) = &H0
                        b(10) = &H0
                        b(11) = &H0
                        b(12) = &H0
                        b(13) = &H0
                        b(14) = &H0
                        b(15) = &H0
                        b(16) = &H0
                        b(17) = &H0
                        b(18) = &H0
                        '本机Ip最后一段
                        b(19) = changeIp(ServerIp)
                        sock.Send(b)                    '发送感应PLC读命令
                        c(0) = &H46
                        c(1) = &H49
                        c(2) = &H4E
                        c(3) = &H53
                        c(4) = &H0
                        c(5) = &H0
                        c(6) = &H0
                        c(7) = &H1A
                        c(8) = &H0
                        c(9) = &H0
                        c(10) = &H0
                        c(11) = &H2
                        c(12) = &H0
                        c(13) = &H0
                        c(14) = &H0
                        c(15) = &H0
                        c(16) = &H80
                        c(17) = &H0
                        c(18) = &H2
                        c(19) = &H0
                        'PlcIp最后一段
                        c(20) = changeIp(SensorPlcIp.Split(".")(3))
                        c(21) = &H0
                        c(22) = &H0
                        '本机Ip最后一段
                        c(23) = changeIp(ServerIp)
                        c(24) = &H0
                        c(25) = &HFF                    c(26) = &H1
                        c(27) = &H1
                        c(28) = &H82
                        c(29) = &H0                    '通道
                           c(30) = &H5A
                        '位
                        c(31) = &H0
                        
                        c(32) = &H0
                        c(33) = &H1
                        sock.Send(c)                    System.Threading.Thread.Sleep(200)                    '接收感应PLC反馈
                        sock.Receive(Decimalbyt)                   '关闭感应PLC
                        sock.Close()
      

  3.   

    先非常感谢lncgliu的建设性代码:
    在很多BBS上问了都让我看PLC的协议或者产品说明书,关键是太多pdf,也是vb与plc的新手,完全不知道如何看文档!你的代码我知道流程意思,在其他网站也看到类似代码,有疑问是:
    握手协议是干嘛用的?我看到的大多数代码都是先通过IP连接上plc,然后向plc发送一个指令,告诉plc我将要读取到哪个变量,接着plc根据此信息反馈回相应的指令代码,里面包含了要读取得数据,所以请解释一下握手协议的意思?谢谢~~~~~~
      

  4.   

    我知道通过modbus协议传递的但是不知道senddata及dataArrial事件中getdata对应的两个数组(即lncgliu代码中的b与c数组)如何写?请高手举个实例,谢谢~~~~~
      

  5.   

    以下摘自:http://baike.baidu.com/view/15267.htm
    控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
      ASCII模式
      : 地址 功能代码 数据数量 数据1 ... 数据n LRC高字节 LRC低字节 回车 换行
      RTU模式
      地址 功能代码 数据数量 数据1 ... 数据n CRC高字节 CRC低字节
      所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。
      在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。
      1、ASCII模式
      当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
      代码系统
      · 十六进制,ASCII字符0...9,A...F
      · 消息中的每个ASCII字符都是一个十六进制字符组成
      每个字节的位
      · 1个起始位
      · 7个数据位,最小的有效位先发送
      · 1个奇偶校验位,无校验则无
      · 1个停止位(有校验时),2个Bit(无校验时)
      错误检测域
      · LRC(纵向冗长检测)
      2、RTU模式
      当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。
      代码系统
      · 8位二进制,十六进制数0...9,A...F
      · 消息中的每个8位域都是一个两个十六进制字符组成
      每个字节的位
      · 1个起始位
      · 8个数据位,最小的有效位先发送
      · 1个奇偶校验位,无校验则无
      · 1个停止位(有校验时),2个Bit(无校验时)LZ:你得由PLC规定的协议要求的(ASCII模式,RTU模式)那一模式来做你的代码.