西門子HONEYWELL 05291202 PLC是目前我國應(yīng)用的大中型PLC,研究西門子PLC及
其網(wǎng)絡(luò)的通信技術(shù)有著重要意義。本文通過對貴州鋼繩集團(tuán)2000KN拉力機(jī)測控系統(tǒng)的研究,
探討了在Windows2000環(huán)境下,用VB開發(fā)的鋼絲繩破斷力試驗(yàn)機(jī)測控軟件與CPU-314通信
的實(shí)現(xiàn)問題。結(jié)果表明,通過適當(dāng)?shù)姆椒?,可以?/span>VB與S7-300/400 PLC進(jìn)行良好的通信,
用VB構(gòu)成功能強(qiáng)大數(shù)據(jù)采集及控制軟件。
1軟件總體設(shè)計(jì)
通常情況下,我們一般選用WinCC作為西門子S7-300/400 PLC控制系統(tǒng)的監(jiān)控和數(shù)
據(jù)采集軟件(HMI/SCADA)。由于WinCC內(nèi)置了基于S5/S7協(xié)議的通訊系統(tǒng),并提供了大量面
向這些系統(tǒng)和技術(shù)的組件,從而為WinCC和這些系統(tǒng)的*化通訊和良好的互操作性提供了
保證。但是,作為一種作為一種通用組態(tài)軟件,WinCC的應(yīng)用領(lǐng)域主要是工業(yè)過程控制領(lǐng)域。
而2000KN鋼絲繩拉力試驗(yàn)機(jī)對于上位機(jī)軟件的要求比較特殊:采樣速率較高(20次/秒);
依采樣速率同步顯示曲線和數(shù)據(jù);試驗(yàn)數(shù)據(jù)和曲線要能夠按照試驗(yàn)編號查詢并且調(diào)出顯示。
很明顯,WinCC的趨勢曲線、過程值歸檔等功能不能滿足2000KN拉力機(jī)的工藝要求。VB作
為一種通用的高級編程語言,編程靈活,在開發(fā)圖形曲線顯示、數(shù)據(jù)庫等方面有著WinCC
不可比擬的技術(shù)和成本優(yōu)勢。因此,我們選用VB來開發(fā)2000KN鋼絲繩破斷力試驗(yàn)機(jī)的數(shù)據(jù)
采集和控制軟件。圖1為2000KN拉力機(jī)測控軟件系統(tǒng)及與PLC硬件連接示意圖。
2數(shù)據(jù)通信
2.1通信軟件接口
圖1 HONEYWELL 05291202 拉力機(jī)測控軟件系統(tǒng)及與PLC硬件連接示意圖
該系統(tǒng)能否研究成功的關(guān)鍵問題在于VB和CPU-314 PLC之間的通信。S7-300/400的
MPI(多點(diǎn)通信接口)用于西門子公司的控制產(chǎn)品之間的通信,例如安裝在PC上的STEP7
編程軟件與PLC之間的通信,但是這些通信協(xié)議均未公開。如果用S7-300/400的點(diǎn)對點(diǎn)通
信協(xié)議實(shí)現(xiàn)PC與PLC之間的通信,需要配置的通信處理器模塊或帶點(diǎn)對點(diǎn)通信接口的
CPU31x-2PtP。其點(diǎn)對點(diǎn)通信協(xié)議并不通用,要化較多的時(shí)間熟悉和摸索,才能編寫出PLC
和計(jì)算機(jī)的通信程序。
PRODAVE是用于PC與S7系列PLC之間的數(shù)據(jù)鏈接通信的工具軟件包。PRODAVE是
“Process Data Traffic”(過程數(shù)據(jù)交換)的縮寫,通過PC/MPI適配器(PC-Adaptor)、
MPI通信處理器(CP5611卡)等硬件設(shè)備,可以實(shí)現(xiàn)PC與PLC之間的數(shù)據(jù)鏈接。PRODAVE
的動態(tài)鏈接庫(DLL)提供了大量基于Windows操作系統(tǒng)的DLL函數(shù),供用戶解決PLC與PC
之間的數(shù)據(jù)交換和數(shù)據(jù)處理問題。Windows環(huán)境中的西門子公司的PRODAVE工具箱有PRODAVE
S7(*版)和PRODAVE S7 mini(簡化版)兩種,PRODAVE S7(*版)功能比較全面,可按
位或者字節(jié)讀寫PLC中的輸入過程映像區(qū)、輸出過程映像區(qū)、位存儲區(qū)、定時(shí)器、計(jì)數(shù)器、
數(shù)據(jù)塊等區(qū)域,PRODAVE S7 mini(簡化版)則只能讀寫DB中的字和字節(jié)。
2.2動態(tài)鏈接庫聲明
程序中用到的PRODAVE函數(shù)主要有:
⑴load_tool函數(shù)用于PC機(jī)與PLC系統(tǒng)的初始化鏈接。
⑵unload_tool函數(shù)用于斷開PC機(jī)與PLC系統(tǒng)的鏈接。
⑶db_read函數(shù)用于從PLC的DB塊中讀數(shù)據(jù)字。
⑷db_write函數(shù)用于向PLC的DB塊中寫數(shù)據(jù)字。
首先,HONEYWELL 05291202 在模塊中應(yīng)該聲明程序使用的用戶自定義的數(shù)據(jù)類型PlcAdrType:
Type PlcAdrType
ADDRESS As Byte
SEGMENTID As Byte
SLOTNO As Byte
PACKNO As Byte
End Type
在通信開始之前,首先用load_tool函數(shù)建立與上位機(jī)與PLC的鏈接,通信結(jié)束時(shí)
必須用unload_tool函數(shù)斷開PC與PLC的鏈接,否則會引起上位機(jī)死機(jī)或上位機(jī)系統(tǒng)的異
常狀況。VB在調(diào)用DLL函數(shù)之前,需要用Declare語句在模塊中聲明所要使用的DLL函數(shù)。
聲明DLL函數(shù)的主要作用是指明該函數(shù)所在的DLL庫名及路徑,以及該函數(shù)的參數(shù)說明,以
便Windows能找到該函數(shù),并能正確的執(zhí)行該函數(shù)。
Declare Function load_tool Lib "w95_s7.dll" (ByVal nr As Byte, ByVal dev As
String, adr As PlcAdrType) As Long
//nr是PC要激活的連接的個(gè)數(shù)(1-32個(gè));
//dev是用戶驅(qū)動設(shè)備的名稱MPI接口時(shí)為“S7ONLINE”;
//adr是連接的地址列表;
Declare Function unload_tool Lib "w95_s7.dll" () As Long
//斷開連接
Declare Function db_read Lib "w95_s7.dll" (ByVal blockno As Long, ByVal no
As Long, Amount As Long, value As Byte) As Long
//讀取DB塊號為blockno中的從地址no開始的Amount個(gè)數(shù)據(jù)字。
//讀取的數(shù)據(jù)存放于PC的變量區(qū)value中。
Declare Function db_write Lib "w95_s7.dll" (ByVal blockno As Long, ByVal no
As Long, Amount As Long, value As Byte) As Long
//將PC的變量存儲區(qū)value中的amount個(gè)數(shù)據(jù)字寫入到PLC的數(shù)據(jù)塊DB
中從no開始的數(shù)據(jù)區(qū)。
2.3讀寫函數(shù)使用的注意事項(xiàng)
我們在調(diào)試過程中曾發(fā)現(xiàn)讀入的模擬量(雙字)存在突然變小的情況,在排除硬件故
障后,發(fā)現(xiàn)是由于VB對于字符串的處理比較特殊而造成的錯誤結(jié)果。因此,在使用PRODAVE
工具箱進(jìn)行通信的程序中,要特別注意的是VB在處理字符串時(shí)對“0”是自動舍棄的,現(xiàn)舉
例說明如下:
HONEYWELL 05291202 是4~20mA模擬量輸入信號在PLC中的地址PIW292的數(shù)據(jù)類型是整數(shù),經(jīng)過
數(shù)據(jù)轉(zhuǎn)換存于DB1.DBD36中,DB1.DBD36的數(shù)據(jù)類型是雙整數(shù)。轉(zhuǎn)換的梯形圖如圖2所示。
圖2 HONEYWELL 05291202 模擬量轉(zhuǎn)換為雙整數(shù)的梯形圖
在VB中執(zhí)行下列語句:
Res = db_read(1, 36, 4, Buffer_R(0)) // Buffer_R()是字符串型數(shù)組
Res = db_read(1, 36, 4, Buffer_R(0))執(zhí)行后,DB1.DBD36中的數(shù)據(jù)被VB讀入到
Buffer_R(0)~Buffer_R(3)中,將Buffer_R(0)~Buffer_R(3)中的String 型數(shù)據(jù)變?yōu)?/span>
Single型數(shù)據(jù)后,得到的即為PLC上的傳感器的數(shù)值。將將Buffer_R(0)~Buffer_R(3)中
的String型數(shù)據(jù)變?yōu)?/span>Single型數(shù)據(jù)的方法如下:
Val=CSng(Buffer_R(0)+ Buffer_R(1)+ Buffer_R(2)+ Buffer_R(3))
Val即為Single型的模擬量采樣結(jié)果。
假設(shè)DB1.DBD36中數(shù)值為16進(jìn)制的“00003F12”,經(jīng)過上述轉(zhuǎn)換后,Val的值為
“00003F12”(16進(jìn)制),變?yōu)?/span>10進(jìn)制為“16146”。此時(shí)實(shí)際讀入的結(jié)果是正確的。但是,
當(dāng)Buffer_R()中的字符串有“0”字符時(shí):例如DB1.DBD36中數(shù)值為16進(jìn)制的“00003F02”,
Val中的結(jié)果應(yīng)該是16進(jìn)制的“00003F02 ”,即10進(jìn)制的“16130”。而實(shí)際讀入的數(shù)值為
10進(jìn)制的“1010”,比真實(shí)的模擬量信號變小了近16倍!
為什么會出現(xiàn)如此錯誤的結(jié)果呢?原因如下:當(dāng)傳感器的真實(shí)值為“00003F02”時(shí),
Buffer_R(0)=“00”;
Buffer_R(1)=“00”;
Buffer_R(2)=“3F”;
Buffer_R(3)=“02”;
執(zhí)行Val=CSng(Buffer_R(0)+ Buffer_R(1)+ Buffer_R(2)+ Buffer_R(3))的語句的
過程中,Buffer_R(3)的“02 ”中的“0”被VB自動舍棄,Val變?yōu)?ldquo;003F2”(16進(jìn)制),
也就是“1010”(10進(jìn)制)!這就是模擬量讀入值突然變小的原因。要解決這一故障,需要
在執(zhí)行Val=CSng(Buffer_R(0)+ Buffer_R(1)+ Buffer_R(2)+ Buffer_R(3))語句前進(jìn)行一
下判斷,當(dāng)Buffer_R()的中的低位是“0”時(shí),用程序補(bǔ)上一個(gè)“0”字符以避免錯誤的發(fā)
生。
Reliance Electric AutoMax 57407 4J 574074J Processo NIB
Allen Bradley 1785-L60C D 1785L60C PLC 5/60 Controlnet
Modicon AS-B882-239 ASB882239 High Speed Counter
Modicon PC-0984-385 ASM380006 Mem ASE385904 Exec Carts
Modicon AM-SA85-030 AMSA85030 Modbus MB+ Adapter NIB
Schneider Modicon 110-CPU-722-00 110CPU72200 NIB FS
Allen Bradley 1774-CI2 1774CI2 Computer Interface
Modicon AS-M84A-102 ASM84A102 CPU Processor NIB
Allen Bradley 1785-O5E 1785O5E OSI Interface NIB FS
Schneider Modicon TSXETHPC101M PC Ethway Module
Modicon AS-B239-001 ASB239001 High Speed Counter NIB