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”,解释为:连续多个缓存器之数据读取。

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

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

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

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

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

Function Lrc(dats As String) As String
    Dim i As Integer, sum As Integer
    For i = 1 To Len(dats)
        sum = sum + Asc(Mid(dats, i, 1))        
    Next
    If 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()
    Cls
    Dim code As String
    code = "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 Integer
    Dim inR(0 To 9) As String
    Winsock1.GetData inRbuf
    inRbuf = Mid(inRbuf, 4, 44)
    For i = 0 To 9
        inR(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)解码
    Next
    For i = 0 To 9
        Print inR(i) + "    ";
    Next
    Print
End Sub

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值