AB公司開發(fā)的RSbbbb是讀取遠(yuǎn)程AB PLC數(shù)據(jù)的上佳工具,它能實(shí)現(xiàn)讀取AB PLC的名種要求。但在實(shí)際的系統(tǒng)集成中,由于遠(yuǎn)程PLC的類型多種多樣,于是,我接到一個(gè)任務(wù),自主開發(fā)程序讀取各種PLC。
在我們使用的遠(yuǎn)程設(shè)備中,有AB的PLC,西門子的PLC,LG的PLC,還有多種的RTU,但都有一個(gè)共通的特點(diǎn):通過串口訪問,只是數(shù)據(jù)協(xié)議不同,找出各方的數(shù)據(jù)協(xié)議,就一切OK了。為此,我對(duì)AB PLC進(jìn)行了一番研究。
AB公司提供了軟件,它的資料就有點(diǎn)語(yǔ)焉不詳,我不得不得用串口監(jiān)聽技術(shù)進(jìn)行串口監(jiān)聽以獲取更為直觀的資料。
一、 串口的監(jiān)聽
我利用PORTMON.EXE來(lái)監(jiān)聽串口,以下是運(yùn)行RSbbbb時(shí)我監(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
由此可以看出,RSbbbb運(yùn)行時(shí)進(jìn)行三步:
1、 初始化MODEM:發(fā)送ATZ,確認(rèn)MODEM存在。
2、 查看PLC的數(shù)據(jù)結(jié)構(gòu),收到后發(fā)1006確認(rèn)
3、 查看N7的數(shù)據(jù),收到后發(fā)1006確認(rèn)
現(xiàn)在所要做的事步驟都很清楚了,下面的工作是理解發(fā)出的與返回的數(shù)據(jù)的含義。
二、 發(fā)送數(shù)據(jù)請(qǐng)求的格式
對(duì)于查詢PLC的數(shù)據(jù)結(jié)構(gòu),每次都是相同的請(qǐng)求,沒有必要去花費(fèi)時(shí)間。我們著力在讀取N7數(shù)據(jù)的處理方面:
發(fā)出的數(shù)據(jù)含義:
*:加*不參與CRC32運(yùn)算。
CRC32的計(jì)算方法: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 'bbbbb 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" + m i* d(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ā)送這串字符將會(huì)能得到得到N7的數(shù)據(jù)返回,返回的數(shù)據(jù)以字為單位,開始字與字個(gè)數(shù)決定返回的內(nèi)容。
三、 接收到的數(shù)據(jù)
如上接收到的數(shù)據(jù),以 10 06 10 02開始,00 01 4F 00 27 04為目的址與ID號(hào),現(xiàn)再接著是返回的數(shù)據(jù),每?jī)蓚€(gè)字節(jié)是一組數(shù)據(jù):如我的PLC中的定義如下:
地址為字,即兩個(gè)字節(jié)。
這樣,我們可以讀取指定的區(qū)域數(shù)據(jù),并根據(jù)你在PLC中的設(shè)定分解數(shù)據(jù)你就可以通過自編的程序讀取AB PLC的數(shù)據(jù)了。
結(jié)語(yǔ)
這就是AB PLC的數(shù)據(jù)協(xié)議,由于AB 的說明書中所言不詳,而我讀取的PLC是另一個(gè)公司開發(fā)的程序,所以在數(shù)據(jù)的含義方面花費(fèi)了不少時(shí)間,而在編程方面的時(shí)間倒時(shí)不多。這次總結(jié)出來(lái)與大家共享,應(yīng)能使大家免去摸索之苦。
陳小冬 【求購(gòu)】 洗地機(jī) 2025-1-3
許東升 【求購(gòu)】 精軋螺紋鋼 2025-1-2
龔先生 【求購(gòu)】 激光粉塵儀 2024-12-30
帥立軍 【求購(gòu)】 儲(chǔ)能集裝箱 2024-12-27
雷 【求購(gòu)】 聚乙烯墊板 2024-12-27
王 【求購(gòu)】 數(shù)控車床 2024-12-27
王先生 【求購(gòu)】 鋼結(jié)構(gòu) 2024-12-27