大佬解讀工業(yè)監(jiān)控系統(tǒng),遠(yuǎn)程工業(yè)監(jiān)控系統(tǒng)設(shè)計(下篇)
工業(yè)監(jiān)控系統(tǒng)發(fā)揮著重要作用,對于工業(yè)監(jiān)控系統(tǒng),我們應(yīng)當(dāng)有所了解。前文中,小編對遠(yuǎn)程工業(yè)監(jiān)控系統(tǒng)設(shè)計做過部分介紹。本文中,將對前文提及的遠(yuǎn)程工業(yè)監(jiān)控系統(tǒng)設(shè)計的余下部分予以介紹。如果你對工業(yè)監(jiān)控存在興趣,不妨繼續(xù)往下閱讀哦。
基于Flash遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計
1.系統(tǒng)硬件連接設(shè)計
現(xiàn)場設(shè)備通過串口與數(shù)據(jù)采集模塊通訊,數(shù)據(jù)采集模塊通過工業(yè)以太網(wǎng)與Web服務(wù)器連接,Web服務(wù)器通過以太網(wǎng)與數(shù)據(jù)庫服務(wù)器連接。數(shù)據(jù)采集模塊采用PAC(可編程自動化控制器),支持Modbus/TEP通信協(xié)議。Web服務(wù)器和數(shù)據(jù)庫服務(wù)器采用HP服務(wù)器,安裝操作系統(tǒng)為Windo ws Server 2008 Enterprise.網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)采用星型拓?fù)浣Y(jié)構(gòu),是為了能夠與現(xiàn)場采集設(shè)備建立更有效的連接。Web服務(wù)器存儲數(shù)據(jù)直接面向數(shù)據(jù)庫服務(wù)器,便于減輕整個網(wǎng)絡(luò)負(fù)擔(dān),防止由于數(shù)據(jù)量過大而引起網(wǎng)絡(luò)阻塞。同時數(shù)據(jù)庫服務(wù)器實現(xiàn)雙機(jī)熱備,來提高系統(tǒng)的可靠性。將數(shù)據(jù)庫分為兩部分:中心數(shù)據(jù)庫和企業(yè)級數(shù)據(jù)庫,中心數(shù)據(jù)庫主要存放當(dāng)前數(shù)據(jù),企業(yè)級數(shù)據(jù)庫則存放歷史數(shù)據(jù)以及設(shè)備和用戶的管理數(shù)據(jù),實現(xiàn)動態(tài)數(shù)據(jù)與靜態(tài)數(shù)據(jù)的隔離。網(wǎng)絡(luò)拓?fù)鋱D如下圖所示。
圖示:系統(tǒng)總體架構(gòu)圖
2.系統(tǒng)軟件設(shè)計
軟件設(shè)計的核心內(nèi)容為PAC編程和客戶端Flash編程。PAC編程語言為C語言,編輯環(huán)境為BC編譯器,F(xiàn)lash編程語言為AcTIon Script,編輯環(huán)境為Flash builder4.5.
本系統(tǒng)通過創(chuàng)建一個以TCP數(shù)據(jù)流方式建立的Socket從而實現(xiàn)PAC服務(wù)端與基于Web的Flash客戶端的數(shù)據(jù)傳輸。建立通信的過程為:首先PAC服務(wù)端通過Socket監(jiān)聽自身的Modbus/TCP專用端口502,客戶端程序則通過此端口及PAC服務(wù)端的IP地址作為連接Socket參數(shù),創(chuàng)建一個Socket與PAC服務(wù)端建立連接。網(wǎng)絡(luò)無故障,則連接建立。客戶端通過Flash中Socket的SendMessage()和ReadBytes()方法來發(fā)送和接收信息。
利用Flash創(chuàng)建的基于Modbus/TCP套接字模型為如下圖所示。
圖示:Modbus/TCP套接字模型
3.PAC服務(wù)端程序?qū)崿F(xiàn)
PAC服務(wù)端的實現(xiàn)主要分為通過Socket與上位機(jī)的通信和通過串口服務(wù)與外圍設(shè)備的通信兩大部分。
通過Socket與上位機(jī)的通信主要分為監(jiān)聽和連接。在監(jiān)聽狀態(tài)下負(fù)責(zé)監(jiān)聽客戶端的請求連接,并負(fù)責(zé)接受此連接。本系統(tǒng)PAC端設(shè)計監(jiān)聽類為ServerListen,監(jiān)聽類首先通過int bind(int sockfd,struct sockaddr*my_addr,int addrten)綁定了本地的502端口,然后通過函數(shù)int listen (int sockfd,intbacklog)將客戶端的連接請求放入隊列中等待,直到函數(shù)intaccept(int sockfd,void*addr,int*addrlen)處理它,然后返回一個全新的套接字文件來描述此單個連接。這樣,對于同一個連接就有兩個文件描述符,原先的一個文件描述符正在監(jiān)聽你指定的端口,新的文件描述符可以用來調(diào)用send()和recv()。在連接狀態(tài)下負(fù)責(zé)與客戶端進(jìn)行數(shù)據(jù)的接收和發(fā)送,通過數(shù)據(jù)傳輸類Server Custom來實現(xiàn)。在此類中利用int send(SOCKETs,const char FAR*buf,int len,int flags)函數(shù)將PAC服務(wù)端的數(shù)據(jù)發(fā)送到客戶端,如果網(wǎng)絡(luò)發(fā)生故障或待發(fā)送數(shù)據(jù)的長度len小于當(dāng)前程序要發(fā)送數(shù)據(jù)的緩沖區(qū)的長度,則返回SOCKET_ERROR,利用int recv(SOCKETs,char FAR* buf,int len,int flags)從客戶端接收數(shù)據(jù)。函數(shù)先等待s的發(fā)送緩沖中的數(shù)據(jù)被協(xié)議傳送完畢,如果協(xié)議在傳送s的發(fā)送緩沖中的數(shù)據(jù)時出現(xiàn)網(wǎng)絡(luò)錯誤,則函數(shù)返回SOCKET_ERROR錯誤,如果s的發(fā)送緩沖中沒有數(shù)據(jù)或者數(shù)據(jù)被協(xié)議成功發(fā)送完畢后,函數(shù)先檢查套接字s的接收緩沖區(qū),如果s的接收緩沖區(qū)中沒有數(shù)據(jù)或者協(xié)議正在接收數(shù)據(jù),那么函數(shù)就一直等待,直到協(xié)議把數(shù)據(jù)接收完畢。
對于外圍設(shè)備進(jìn)行通信主要是通過串口服務(wù),首先調(diào)用自己定義的COM口初始化函數(shù)InstallCom將端口初始化,然后通過build_REQ_Read函數(shù)實現(xiàn)根據(jù)ModBusRtu通訊協(xié)議將COM口讀取的外圍設(shè)備的數(shù)據(jù)放入自定義的數(shù)組中,并通過CRC16_modbus進(jìn)行CRC校驗。接收的數(shù)據(jù)正確,則通過analyse_Read_Result分析從串口讀取的數(shù)據(jù),并將讀取的數(shù)據(jù)位存放到Share_Mem[MaxShareMemNum]數(shù)組中。然后將Share_Mem數(shù)組作為REMOTCP_ModServer_Create參數(shù)與上位機(jī)進(jìn)行通訊。對外圍設(shè)備發(fā)送指令,則是通過函數(shù)SendCommand選擇控制對象的COM后,將指令發(fā)送到外圍設(shè)備,外圍設(shè)備接收到指令后動作。
以上便是此次小編帶來的“工業(yè)監(jiān)控”相關(guān)內(nèi)容,希望大家對本文知識具備一定的了解。如果你喜歡本文,不妨持續(xù)關(guān)注我們網(wǎng)站哦,小編將于后期帶來更多精彩內(nèi)容。最后,十分感謝大家的閱讀,have a nice day!