VB輔導:編程遠程讀取ABPLC的數(shù)據(jù)

字號:

編程遠程讀取AB PLC的數(shù)據(jù)
    AB公司開發(fā)的RSLink是讀取遠程AB PLC數(shù)據(jù)的上佳工具,它能實現(xiàn)讀取AB PLC的名種要求。但在實際的系統(tǒng)集成中,由于遠程PLC的類型多種多樣,于是,我接到一個任務,自主開發(fā)程序讀取各種PLC。
    在我們使用的遠程設備中,有AB的PLC,西門子的PLC,LG的PLC,還有多種的RTU,但都有一個共通的特點:通過串口訪問,只是數(shù)據(jù)協(xié)議不同,找出各方的數(shù)據(jù)協(xié)議,就一切OK了。為此,我對AB PLC進行了一番研究。
    AB公司提供了軟件,它的資料就有點語焉不詳,我不得不得用串口監(jiān)聽技術進行串口監(jiān)聽以獲取更為直觀的資料。
    一、串口的監(jiān)聽
    我利用PORTMON.EXE來監(jiān)聽串口,以下是運行RSLink時我監(jiān)聽到的數(shù)據(jù):
    IRP_MJ_WRITE 41 54 5A 0D
    IRP_MJ_READ 41 54 5A 0D
    IRP_MJ_WRITE 10 02 01 00 06 00 01 08 03 10 03 01 65
    IRP_MJ_READ 10 06 10 02 00 01 46 00 01 08 00 EE 34 49 64 35 2F 30 33 20
    20 20 20 20 20 20 00 00 86 10 10 8D A3 10 10 FC 10 03 18 55
    IRP_MJ_WRITE 10 06
    IRP_MJ_WRITE 100201000F002704A1C80789001003A3F3
    IRP_MJ_READ
    10 06 10 02 00 01 4F 00 27 04
    00 00 C7 0C CF 0C C8 0C C6 0C 88 0C EC 0C AA 0C 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    F3 FF 0D 00 0D 00 00 00 00 00 4C 04 52 03 20 04 8B 03 84 03
    00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00
    00 00 00 00 02 00 00 00 00 00 00 00 1F 00 00 00 00 00 00 00
    00 00 00 00 01 00 02 00 00 00 00 00 00 00 01 00 02 00 03 00
    04 00 05 00 06 00 07 00 00 00 00 00 00 00 00 00 C8 00 00 00
    C2 01 00 00 00 00 76 02 B6 03 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 CF 03 00 00 00 00 00 00 00 00
    5D 00 C7 0C CF 0C C8 0C C6 0C 86 0C EC 0C AA 0C 00 00 00 00
    10 03 8D D8
    IRP_MJ_WRITE 10 06
    由此可以看出,RSLink運行時進行三步:
    1、 初始化MODEM:發(fā)送ATZ,確認MODEM存在。
    2、 查看PLC的數(shù)據(jù)結構,收到后發(fā)1006確認
    3、 查看N7的數(shù)據(jù),收到后發(fā)1006確認
    現(xiàn)在所要做的事步驟都很清楚了,下面的工作是理解發(fā)出的與返回的數(shù)據(jù)的含義。
    二、發(fā)送數(shù)據(jù)請求的格式
    對于查詢PLC的數(shù)據(jù)結構,每次都是相同的請求,沒有必要去花費時間。我們著力在讀取N7數(shù)據(jù)的處理方面:
    發(fā)出的數(shù)據(jù)含義:   *10
     *02
     01
     00
     0F
     00
     27
     04
     A1
     C8
     07
     89
     00
     *10
     03
     A3
     F3
    起始位
     起始位
     目的址
     目的址
     讀數(shù)據(jù)
     保留
     ID號
     ID號
     字個數(shù)
     區(qū)域
     整數(shù)型
     起始字
     結束標志
     結束標志
     校驗位
     校驗位
    *:加*不參與CRC32運算。
    CRC32的計算方法:VB代碼如下:  
    Function CalcCRC(DATA(), Arraylen) As Long
    Dim I, J, K, H As Integer
    For I = 0 To Arraylen
    J = J Xor DATA(I)
    For K = 1 To 8
    H = J Mod 2 'test if bit will be shifted out
    J = Int(J / 2) 'shift right
    If H Then
    J = J Xor &H1000A001 'xor with constant
    J = J - &H10000000 'clear top word
    End If
    Next K
    Next I
    CalcCRC = J
    End Function  
    Private Sub Command1_Click()
    Dim I, J As Long
    Length = (Len(Text3.Text)) / 2 - 1
    ReDim Init(Length)
    For I = 0 To Length
    Init(I) = Val("&H" + Mid(Text3.Text, 2 * I + 1, 2))
    Next I
    J = CalcCRC(Init(), Length)
    Text2.Text = Hex(J Mod 256)
    Text1.Text = Hex(Int(J / 256))
    End Sub  
    發(fā)送這串字符將會能得到得到N7的數(shù)據(jù)返回,返回的數(shù)據(jù)以字為單位,開始字與字個數(shù)決定返回的內(nèi)容。
    三、 接收到的數(shù)據(jù)  
    如上接收到的數(shù)據(jù),以 10 06 10 02開始,00 01 4F 00 27 04為目的址與ID號,現(xiàn)再接著是返回的數(shù)據(jù),每兩個字節(jié)是一組數(shù)據(jù):如我的PLC中的定義如下: Tagname
     address
     description
    Compressure
     n7:68
     控制流量
    flue_1
     n7:33
     1#瞬時流量
    flue_2
     n7:34
     2#瞬時流量
    Inpressue
     n7:37
     總入口壓力
    lowp_alarm
     n7:28
     總壓力報警下限
    lowp_set
     n7:106
     總壓力控制設置下限
    Lowpressure
     n7:26
     總壓力控制下限
    midtank_p
     n7:36
     中間罐壓力
    outp_low_alarm
     n7:29
     出口壓力當前報警下限值
    outp_low_set
     n7:109
     出口壓力報警下限設置
    Outpressure
     n7:35
     出口壓力
    p_c_down
     n7:125
     降低入口壓力
    p_c_up
     n7:124
     提高入口壓力
    upp_alarm
     n7:27
     總壓力報警上限
    upp_set
     n7:105
     總壓力控制設值上限
    Uppressure
     n7:25
     總壓力設值上限
    地址為字,即兩個字節(jié)。
    這樣,我們可以讀取指定的區(qū)域數(shù)據(jù),并根據(jù)你在PLC中的設定分解數(shù)據(jù)你就可以通過自編的程序讀取AB PLC的數(shù)據(jù)了。
    結語
    這就是AB PLC的數(shù)據(jù)協(xié)議,由于AB 的說明書中所言不詳,考試大提示讀取的PLC是另一個公司開發(fā)的程序,所以在數(shù)據(jù)的含義方面花費了不少時間,而在編程方面的時間倒時不多。這次總結出來與大家共享,應能使大家免去摸索之苦