吳昊罡
摘要:本文基于Modbus通訊協(xié)議,使用VB編寫上位軟件,與西門子CP341-RS422/485模塊進(jìn)行通訊,對(duì)PLC中變量進(jìn)行讀取,并存入SQLServer數(shù)據(jù)庫,實(shí)現(xiàn)對(duì)設(shè)備的實(shí)時(shí)監(jiān)控。
關(guān)鍵詞:Modbus;VB; SQLServer;PLC
在現(xiàn)代工業(yè)中使用PLC設(shè)備進(jìn)行分散化控制,上位機(jī)監(jiān)控軟件提供圖形界面并對(duì)下位設(shè)備進(jìn)行數(shù)據(jù)采集、管理,已經(jīng)成為工業(yè)控制系統(tǒng)中普遍使用的監(jiān)控形式。其中Modbus協(xié)議以標(biāo)準(zhǔn)、開放等優(yōu)點(diǎn)廣泛應(yīng)用于工業(yè)通訊當(dāng)中,本文基于西門子的CP341模塊作為Modbus從站,使用Visual Basic語言進(jìn)行編程,在上位計(jì)算機(jī)中采集、存儲(chǔ)PLC中狀態(tài)變量,實(shí)現(xiàn)對(duì)設(shè)備的實(shí)時(shí)監(jiān)控。
1.Modbus協(xié)議
一個(gè)Modbus通訊數(shù)據(jù)幀由若干個(gè)字節(jié)組成,一般通信數(shù)據(jù)幀的格式包括:地址域、功能碼、數(shù)據(jù)域、錯(cuò)誤校驗(yàn)(16位CRC校驗(yàn))
地址域長度為1個(gè)字節(jié),表示從站的地址。功能碼是數(shù)據(jù)幀中傳送的第二個(gè)字節(jié),不同的功能碼對(duì)應(yīng)數(shù)據(jù)域格式不盡相同,常用的功能碼有1、2、3、4、5、6、15和16,分別表示讀線圈、讀輸入狀態(tài)、讀保持寄存器、讀輸入寄存器、寫單個(gè)線圈、寫單個(gè)輸入狀態(tài)、寫多個(gè)線圈、寫多個(gè)保持寄存器[1]。數(shù)據(jù)幀最后兩個(gè)字節(jié)是CRC錯(cuò)誤校驗(yàn)域。
若需要讀取05從站以00 00為起始地址的兩個(gè)REAL型數(shù)據(jù):3.4和8.9,則主站發(fā)送的報(bào)文:05 03 00 00 00 04 C5 8F,從站返回報(bào)文:05 03 08 40 59 99 9A 41 0E 66 66 D6 72。
2.西門子CP341的組態(tài)與編程
2.1西門子CP341組態(tài)
本文涉及與計(jì)算機(jī)通訊的從站為西門子S7-300PLC加裝CP341-RS422/485模塊。在安裝CP341之前需要插入硬件狗Dongle,安裝驅(qū)動(dòng)軟件CP_PTP_PARAM和Modbus-Slave318,然后才能在Step7中對(duì)CP341進(jìn)行組態(tài)。
設(shè)置模塊時(shí)必須與計(jì)算機(jī)確認(rèn)設(shè)置的內(nèi)容:從站地址、波特率、數(shù)據(jù)位停止位,校驗(yàn)位。CP341模塊的參數(shù)應(yīng)按確認(rèn)后的內(nèi)容進(jìn)行配置,波特率通常設(shè)為9600即可。本文中通訊參數(shù)設(shè)置為9600, 8, 1, n,從站地址為5。
傳輸DINT、REAL數(shù)據(jù)時(shí),應(yīng)設(shè)置FC 03,06,16選項(xiàng)卡,并建立一個(gè)DB塊存儲(chǔ)待傳數(shù)據(jù)。本文中所需傳輸?shù)淖兞繑?shù)據(jù)類型為DINT、REAL。傳輸模式選擇Half-Duplex。配置完成后,向CP341下載Modbus Slave驅(qū)動(dòng)。
2.2PLC編程
在Step7中打開 “zXX21_05_PtP_Com_MODSL”項(xiàng)目,將Modbus通訊程序OB100、FB7、FB8、FB80、DB80復(fù)制到Step7程序中。在程序中調(diào)用FB80,并將通訊數(shù)據(jù)塊名稱DB80和CP341起始地址填入。建立與計(jì)算機(jī)通訊用的FC塊并調(diào)用FB80,將通訊數(shù)據(jù)塊名稱DB80和CP341起始地址填入。其中FB80中的OB_MASK的值應(yīng)始終為1,其余變量根據(jù)需要進(jìn)行分配。
3.Visual Basic編程實(shí)現(xiàn)
為計(jì)算機(jī)安裝RS485通訊卡,添加各個(gè)數(shù)據(jù)顯示控件數(shù)組和MSComm控件。Modbus RTU模式的報(bào)文發(fā)送必須控制好字符間隔,1byte數(shù)據(jù)發(fā)送后延時(shí)應(yīng)小于1.5倍字符時(shí)間,兩幀報(bào)文之間的間隔必須大于3.5倍字符時(shí)間間隔。一個(gè)字符時(shí)間是指按照用戶設(shè)定的波特率傳輸一個(gè)字節(jié)所需要的時(shí)間[2]。
軟件通過串口發(fā)送查詢數(shù)據(jù)幀,對(duì)PLC返回的數(shù)據(jù)分解、顯示,PLC返回的內(nèi)容包括各開關(guān)狀態(tài)、元件狀態(tài)、運(yùn)行速度、運(yùn)行負(fù)荷等。從通訊內(nèi)容來說,包括開關(guān)量、模擬量,其中開關(guān)量均打包為DINT型變量整體發(fā)送。
3.1串口通訊與數(shù)據(jù)處理
在界面中加載VB自帶的MSCOMM控件,在軟件啟動(dòng)時(shí),程序調(diào)用API函數(shù)自動(dòng)從配置文件中讀取設(shè)置的控件屬性參數(shù),在控件的CommEvent事件中編寫響應(yīng)程序。
使用Timer控件按照要求的周期發(fā)送報(bào)文。主站發(fā)出的查詢報(bào)文為05 03 00 00 00 24 44 55(十六進(jìn)制),通過MSComm.Output指令發(fā)送給從站。
取得從站返回給主站的數(shù)據(jù)幀后,從第4個(gè)字節(jié)開始,每4個(gè)字節(jié)為一個(gè)數(shù)據(jù)。數(shù)據(jù)幀中的DINT型變量按位進(jìn)行分解,與相應(yīng)的開關(guān)量對(duì)應(yīng)顯示,浮點(diǎn)數(shù)轉(zhuǎn)換為小數(shù)并顯示在界面上。
3.2數(shù)據(jù)管理
為及時(shí)記錄設(shè)備運(yùn)行狀態(tài),分析設(shè)備使用情況,軟件將打包傳輸?shù)臄?shù)據(jù)存儲(chǔ)在SQLServer數(shù)據(jù)庫中,以備日后查詢,存儲(chǔ)數(shù)據(jù)的過程根據(jù)MSComm.CommEvent事件觸發(fā)。VB應(yīng)用程序開發(fā)中,可以通過ADO對(duì)微軟所支持的數(shù)據(jù)庫進(jìn)行操作。
在數(shù)據(jù)庫中建立存儲(chǔ)表,建立不少于傳輸內(nèi)容的字段,分別存儲(chǔ)各開關(guān)量數(shù)據(jù)、模擬量數(shù)據(jù)。在VB中編寫讀寫數(shù)據(jù)庫的ADO語句對(duì)SQLServer進(jìn)行操作。
Set Cnn = New ADODB.Connection
Cnn.Open strCnn
Cnn.Execute "INSERT INTO Database (iTime, …) VALUES (SQLtxt)"
需要讀取存儲(chǔ)信息時(shí),可使用SQL查詢語句讀取相應(yīng)字段進(jìn)行數(shù)據(jù)轉(zhuǎn)換和位處理即可,本文不再贅述。4 結(jié)論
本文實(shí)現(xiàn)了在Modbus通訊的條件下,使用Visual Basic編程實(shí)現(xiàn)了在計(jì)算機(jī)上讀取PLC中少量數(shù)據(jù),并存儲(chǔ)入SQLServer數(shù)據(jù)庫的功能。在只需要監(jiān)控少量數(shù)據(jù)的情況下,可以不必在計(jì)算機(jī)上安裝其他專業(yè)的工業(yè)控制軟件就能夠滿足需求,只安裝相應(yīng)的控件補(bǔ)丁和硬件驅(qū)動(dòng)即可。本文所實(shí)現(xiàn)的功能降低了監(jiān)控軟件對(duì)計(jì)算機(jī)性能的要求,也使得部署程序更加簡便。
參考文獻(xiàn):
[1]白焰,鐘艷輝,秦宇飛.基于VC的Modbus協(xié)議通信測試軟件的實(shí)現(xiàn)[J].現(xiàn)代電力,2008 25(6):76-80
[2]佟為明,胡素君,劉勇, 李中偉.一種體現(xiàn)Modbus主要技術(shù)的實(shí)驗(yàn)系統(tǒng)[J].電子器件,2009 32(4):833-839.