用VB写的程序与施耐德PLC(PLC 型号:BMX P34 2020)实现以太网通信。调用winsock控件,采用modbus 协议。 已经顺利实现读线圈、写线圈、读寄存器整数、读寄存器浮点数。(唯独没有写寄存器成功,原因在下) 因为有个很奇怪的问题,在所有的读写过程中,不管是地址还是数据内容,每个字节都不可以超过&H80(十六进制数 80)。 比如:向字寄存器%MW42 写数据,该寄存器存的是整数,数据长度为一个字(也就是16 位二进制,4 位 16 进制字符): 运行结果如下: 一、 向寄存器%MW42(其地址为十六进制数 002A)写入字符&H000F,运行结果如下: %MW42 数据类型如下:整数 1、VB 里的发送数据程序: (1) Private Sub Command1_Click() (2) Dim str2(12) As Byte (3) str2(0) = &H0 '交换识别号高字节,通常为 0 (4) str2(1) = &H0 '交换识别号低字节,通常为 0 (5) str2(2) = &H0 '协议识别号高字节,为 0 (6) str2(3) = &H0 '协议识别号低字节,为 0 (7) str2(4) = &H0 '字节长度高字节 (8) str2(5) = &H6 '字节长度低字节 (9) str2(6) = &HFF '单元识别号,确省为 255 (10) str2(7) = &H6 'modbus 功能码,06 为预置单寄存器 (11) str2(8) = &H0 '寄存器的起始地址高字节 (12) str2(9) = &H2A '寄存器的起始地址低字节 (13) str2(10) = &H0 '数据内容高字节 (14) str2(11) = &HF '数据内容低字节 (15) Dim bStrQ As String (16) Dim Q As Integer (17) For Q = 0 To 11 (18) bStrQ = bStrQ & Chr(str2(Q)) (19) Next (20) Winsock1.SendData bStrQ (21) Exit Sub (22) End Sub 1、运行之前 2、 运行之后 一切正常。 二、向寄存器%MW42 写入字符&H0080(也就是十进制数 128),运行结果如下: 运行前 1、VB 里的发送数据程序: Private Sub Command1_Click() Dim str2(12) As Byte str2(0) = &H0 '交换识别号高字节,通常为 0 str2(1) = &H0 '交换识别号低字节,通常为 0 str2(2) = &H0 '协议识别号高字节,为 0 str2(3) = &H0 '协议识别号低字节,为 0 str2(4) = &H0 '字节长度高字节 str2(5) = &H6 '字节长度低字节 str2(6) = &HFF '单元识别号,确省为 255 str2(7) = &H6 'modbus 功能码,06 为预置单寄...