[请教]winsock连接PLC并读取数据的问题? 新手请教:VB通过winsock控件连接到plc后,首先给plc发送指令,然后从plc那里接收发回的数据,请教一下senddata的格式?modicon premium的PLC,不知道该怎么写?谢谢~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看你的PLC的产品使用说明书,按它指明的协议来做VB的程序. 给你看下我的代码 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() 先非常感谢lncgliu的建设性代码:在很多BBS上问了都让我看PLC的协议或者产品说明书,关键是太多pdf,也是vb与plc的新手,完全不知道如何看文档!你的代码我知道流程意思,在其他网站也看到类似代码,有疑问是:握手协议是干嘛用的?我看到的大多数代码都是先通过IP连接上plc,然后向plc发送一个指令,告诉plc我将要读取到哪个变量,接着plc根据此信息反馈回相应的指令代码,里面包含了要读取得数据,所以请解释一下握手协议的意思?谢谢~~~~~~ 我知道通过modbus协议传递的但是不知道senddata及dataArrial事件中getdata对应的两个数组(即lncgliu代码中的b与c数组)如何写?请高手举个实例,谢谢~~~~~ 以下摘自: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模式)那一模式来做你的代码. 求SQL报表打印方法 听说散分可以攒RP,散...... 设计一个Vista透明风格的窗体,能否添加窗体的Caption和Icon? vb中用RND怎么用呢? 关闭excel问题100分求救!!!!!!!!! 用ActiveReports做了一个销售报表,请问如何在每页的销售报表的底部加一个数量和销售金额的小计? 初学API! 中大去芳村搭什么车.?????? windows98装了SQLSERVER个人版,另一台98机了如何连接? 关于ListView的一个小问题。 基于查询的更新失败,因为没有发现要更新的行 菜鸟请教
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()
在很多BBS上问了都让我看PLC的协议或者产品说明书,关键是太多pdf,也是vb与plc的新手,完全不知道如何看文档!你的代码我知道流程意思,在其他网站也看到类似代码,有疑问是:
握手协议是干嘛用的?我看到的大多数代码都是先通过IP连接上plc,然后向plc发送一个指令,告诉plc我将要读取到哪个变量,接着plc根据此信息反馈回相应的指令代码,里面包含了要读取得数据,所以请解释一下握手协议的意思?谢谢~~~~~~
控制器能设置为两种传输模式(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模式)那一模式来做你的代码.