1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > VB通过以太网接口使用winsock的永宏PLC上位机通讯系统设计

VB通过以太网接口使用winsock的永宏PLC上位机通讯系统设计

时间:2019-01-04 00:57:15

相关推荐

VB通过以太网接口使用winsock的永宏PLC上位机通讯系统设计

(1) 开头字符(STX):ASCI I码之开始字符STX,接收方以此判知传输数据之开头;

(2) 从站号码:为两位数之16进制数值,在永宏PLC通讯系统中之网络架构采用主从系统在整个网络系统中只有一个主系统,但可以有254个从系统,每个从系统均有一个独一无二之站号;

(3) 命令号码:为两位数之16进制数值,所谓命令号码系由主系统要求从系统所执行之动作类别,例如要求读取R(46)读M(44)或写入(49)单点状态、填入或读取缓存器数据、强制设定、运转、停止……等;

(4) 本文资料:本文数据可为0(无本文数据)~500个ASCII字符,在命令讯息中此字段数据用以指定命令所要运作或存取之对象(地址)或要写入之数值;

(5) 侦误值(CHECKSUM):侦误值系将前述~各字段之所有ASCII字符之16进制数值以“纵式余数查核法”LRC(Longitudinal Redundancy Check)计算产出一个Byte长度(两个16进制数值00~FF)之侦误值。本通讯协议LRC侦误值之计算方法是将各ASCII字符之16进制数码值(8位长度)从头至,但不考虑进位,因此最终结果仍为8位长度之侦误值;

(6) 结尾字符(ETX):ASCI I码之结尾字符ETX之16进制数码为03H,当接收方收到ETX 字符后便知该次通讯已结束。

本系统运行界面所需的数据是PLC的内部暂存器R0-R9等10个16BIT的数据,依照协议VB设计的通讯程序必须指定一个命令码,主动向PLC请求数据传送,查的该命令码为“46”,解释为:连续多个缓存器之数据读取。

读取R0-R9的PC命令的ASCII码写法为:

“STX+01(站号)+46(命令码)+10(连续数据个数16进制)R00000(数据开始地址)+LRC(侦误值)+ETX”

“STX+01(站号)+44(命令码)+10(连续数据个数16进制)M0000(数据开始地址)+LRC(侦误值)+ETX”

侦误值算法(输入:站号+命令码+连续数据个数+数据开始地址)

写R的PC命令的ASCII码写法为:

“STX+01(站号)+49(命令码)+01(每次写1位)R00000(数据开始地址)0000(16进制每4位一个地址,R是单字4个位)+LRC(侦误值)+ETX”

写DR的PC命令的ASCII码写法为:

“STX+01(站号)+49(命令码)+01(每次写1位)DR00000(数据开始地址)00000000(16进制每8位一个地址,DR是双字8个位,高位在前)+LRC(侦误值)+ETX”

写M的PC命令的ASCII码写法为:

“STX+01(站号)+49(命令码)+01(每次写1位)M0000(数据开始地址)+0(0/1,M是状态值false/true,一个位)+LRC(侦误值)+ETX”

Function Lrc(dats As String) As StringDim i As Integer, sum As IntegerFor i = 1 To Len(dats)sum = sum + Asc(Mid(dats, i, 1)) NextIf Len(Hex(sum + 2)) = 1 Then Hex(sum + 2) = "0" & Hex(sum + 2) Lrc = Right(Hex(sum + 2), 2) End Function

发送方法

Private Sub Command1_Click()ClsDim code As Stringcode = "014610DR02000"Me.Winsock1.SendData (Chr(2) + code + Lrc(code) + Chr(3))End Sub

接收方法

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)Dim inRbuf As String, i As IntegerDim inR(0 To 9) As StringWinsock1.GetData inRbufinRbuf = Mid(inRbuf, 4, 44)For i = 0 To 9inR(i) = Val("&H" + Mid(inRbuf, 4 * (i + 1), 4)) '单字(R)解码'inR(i) = Val("&H" + Mid(inRbuf, 4 * (i + 2), 4) + Mid(inRbuf, 4 * (i + 1), 4))'双字解码'inR(i) = Val("&H" + Mid(inRbuf, 4 + i), 1)) '(M)解码NextFor i = 0 To 9Print inR(i) + " ";NextPrintEnd Sub

当前我只知道查询M命令码是44,查询R命令码是46,写的命令码是49,混合读的命令码是48(感觉比较复杂麻烦,没研究),返回的错误码意思也不知道,有知道其他命令的请不吝分享,谢谢

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。