程式設計遠端讀取AB PLC的資料 (轉)

worldblog發表於2007-12-14
程式設計遠端讀取AB PLC的資料 (轉)[@more@] 

讀取AB  PLC的資料

AB公司開發的RSLink是讀取遠端AB PLC資料的上佳工具,它能實現讀取AB PLC的名種要求。但在實際的整合中,由於遠端PLC的型別多種多樣,於是,我接到一個任務,自主開發讀取各種PLC。

在我們使用的遠端裝置中,有AB的PLC,西門子的PLC,LG的PLC,還有多種的RTU,但都有一個共通的特點:透過串列埠訪問,只是資料不同,找出各方的資料協議,就一切OK了。為此,我對AB PLC進行了一番研究。

AB公司提供了,它的資料就有點語焉不詳,我不得不得用串列埠技術進行串列埠監聽以獲取更為直觀的資料。

一、  串列埠的監聽

我利用PORTMON.EXE來監聽串列埠,以下是執行RSLink時我監聽到的資料:

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:namespace prefix = o ns = "urn:schemas--com::office" />

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:傳送ATZ,確認MODEM存在。

2、  檢視PLC的資料結構,收到後發1006確認

3、  檢視N7的資料,收到後發1006確認

現在所要做的事步驟都很清楚了,下面的工作是理解發出的與返回的資料的含義。

二、  傳送資料請求的格式

對於查詢PLC的資料結構,每次都是相同的請求,沒有必要去花費時間。我們著力在讀取N7資料的處理方面:

發出的資料含義:

 

*10

*02

01

00

0F

00

27

04

A1

C8

07

89

00

*10

03

A3

F3

起始位

起始位

目的址

目的址

讀資料

保留

ID號

ID號

字個數

區域

整數型

起始字

結束標誌

結束標誌

校驗位

校驗位

*:加*不參與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

  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

傳送這串字元將會能得到得到N7的資料返回,返回的資料以字為單位,開始字與字個數決定返回的內容。

三、  接收到的資料

如上接收到的資料,以 10 06 10 02開始,00 01 4F 00 27 04為目的址與ID號,現再接著是返回的資料,每兩個位元組是一組資料:如我的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

總壓力設值上限

地址為字,即兩個位元組。

這樣,我們可以讀取指定的區域資料,並根據你在PLC中的設定分解資料你就可以透過自編的程式讀取AB PLC的資料了。

結語

這就是AB PLC的資料協議,由於AB 的說明書中所言不詳,而我讀取的PLC是另一個公司開發的程式,所以在資料的含義方面花費了不少時間,而在程式設計方面的時間倒時不多。這次總結出來與大家共享,應能使大家免去摸索之苦。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993095/,如需轉載,請註明出處,否則將追究法律責任。

相關文章