近,幾個客戶一直在咨詢西門子S7-200型號PLC與工控機通訊的問題,南京研維信息技術解決方案部門針對這方面需求,特意以專題形式予以解答,本文就以研華工控機為典型工控機類型進行介紹,下位機PLC選擇大家比較常見的西門子S7-200型號產品,我們選擇的是微軟的Visual C++作為程序開發語言,具體通訊協議架構如下:
首先,整個示范程序的基本流程架構思路如下:用上位機作主機,向PLC發送讀/寫指令,PLC接收到信息后判斷傳輸正確與否,若錯誤則反饋BCC碼錯誤信息給上位機,若為讀指令,在本系統中則讀取實時壓力值,若為寫指令,則向PLC的M寄存器區寫入數據,從而控制現場設備的運行。同時上位機向PLC詢問寫入數據庫標志位狀態,若為1則將壓力值寫入后臺數據庫。系統中計算機通過COM口發送指令到PLC的PORTO(或PORT1)口,PLC通過RCV接收指令,然后對指令進行譯碼,譯碼后調用相應的讀/寫子程序實現指令要求的操作,并返回指令執行的狀態信息。
然后,我們對上位機進行軟件設計,主要開展通訊接口協議定制開發,主要包括兩方面內容:
一是監控界面要實時反應現場壓力變化,因此需要不斷從PLC中讀取壓力值,二是工控機監控界面的軟鍵盤上的一些控制按鈕需要能完成硬控制面板上所能操作的所有功能,這兩個通訊過程中途都不能被打斷,否則通訊會出錯,因此上位機采用多線程下來實現串行通信。多線程的實現可以使得各端口獨立,準確地實現串行通信,使串口通信具有更廣泛的靈活性與嚴格性,且充分利用了CPU時間。本系統將讀取實時壓力值這一通訊過程放在一個獨立的線程中,采用Sleep()函數,讓上位機在讀取一次壓力值后休眠一段時間再進行下一次讀取,這樣讀取壓力值的過程就可以在后臺進行操作了。
通信程序用CreatFile打開串口,并用SetCommState設置串口值,用ReadFile()和WriteFile()來接收和發送數據,為了實現線程的同步,采用臨界區CriticalSection來實現,保證在同一時刻只能有一個線程對同一內存區進行操作,這樣能夠防止兩個線程同時自主訪問同一內存區所造成的訪問結果的不確定性。采用事件驅動的方式來查詢串口是否有數據到達,當然在進行串行數據傳輸之前,兩個設備必須達成握手協議,只有兩者協議成功以后,才可以進行數據傳輸。
上位機串口設置程序如下:
BOOL MultiDoc::ConfigConnection()
{DCB dcb;
if(!GetCommState(m_hCom,&dcb))
return FALSE;//不能獲取當前配置作錯誤處理
dcb.fBinary=TRUE;
dcb.BaudRate=9600;//數據傳輸速率
dcb.ByteSize=8;//每字節的位數為8
dcb.fParity=FAISE;//不啟用奇偶校驗
dcb.StopBits=ONESTOPBIT;//1個停止位
return SetCommState(m_hCom,&dcb);
//設置串行設備控制參數}
第三步,我們要開展下位機程序設計,由于S7-200 CPU通訊端口是RS485半雙工通訊口,因此發送和接收指令不能同時處于激活狀態。CPU使用SMB30(Port0)和SMB130(Port1)定義通信口的工作模式,用XMT/RCV指令向指定通訊口以字節為單位發送/接收一串數據字符,要發送的字符以數據緩沖區指定,一次發送的字符多為255個,指令執行完成后,會產生一個中斷事件(發送指令Port0為中斷事件9,Port1為中斷事件26,接收指令Port0為中斷事件23,Port1為中斷事件24)。
PLC在次掃描時執行初始化子程序,對端口及RCV指令進行初始化。初始化完成后,運行RCV指令使端口處于接受狀態,接收完后用啟用中斷,中斷程序對指令進行譯碼,同時給校驗子程序入口寄存器置位,發送接收標志位復位,并將寫入接收數據地址指針。計算接收數據的BCC碼,若正確且結束字符為設定值時則給BCC碼正確標志位置位,若標志位為寫,則調用write子程序,向PLC寄存器中寫入控制值,進而控制現場的設備運行,若為讀,則調用read子程序,則從PLC的數據緩沖器中讀取壓力值,如果BCC碼不正確,則直接向上位機發送BCC校驗碼錯誤的信息,如BCC碼正確而結束字符不等于設定值,則向上位機發送指令不合法的信息。
PLC初始化子程序代碼如下:
LD SM0.0
MOVB 16#09,SMB30//初始化自由端口,選擇波特率為9600
MOVB 16#EC,SMB87//允許接收,檢測信息始末字符
MOVB 103,SMB88//信息開始字符“G”
MOVB 71,SMB89//信息開始字符“g”
MOVW +1000,SMW92//信息超時值1s
MOVB 55,SMB94//大接收字符數55
ATCH RCVcomplete,23//接收完成中斷連接到RCV complete子程序
ATCH XMTcomplete,9//發送完成中斷連接到XMT complete子程序
ENI //允許全局中斷
MOVB 2,VB221//設定本PLC地址
MOVD &VB102,VD169//裝載接收緩沖器地址指針
MOVB 0,VB215//清零接收數據BCC碼
MOVD &VB176,VD217/裝載發送緩沖器地址指針
MOVB 0,VB216//清空發送數據BCC碼
值得說明的,我們在進行上位機、下位機設計時,首先需要定義的就是我們的通訊協議設計,我們本程序約定串行通信的波特率為9600b/s,每字節為8位,不采用奇偶校驗位,采用異或校驗法進行檢驗,指令采用ASCII碼進行傳送,計算機每次發送一個38字節長的指令來實現一次讀/寫操作,命令幀(上位機)格式為:字節0為起始字符,標志為指令的開始,本例設定為ASCII碼的“G”,字節1為指令類型,05H代表讀操作,06H代表寫操作,字節2~3為目標PLC站地址,字節4~19為目標寄存器地址,在PLC內部可以用4個字節來表示一個寄存器的地址(但不能表示一個位地址)。前兩個字節表示寄存器類型,后兩個字節表示寄存器號,0000(H)為I寄存器區、0100(H)為Q寄存器區、0200(H)為M寄存器區、0800(H)為V寄存器區(本系統中主要是對M寄存器區寫入控制字,從V寄存器區中讀取數據,同時因為系統工作時為四個工件同時檢測,上位機讀取PLC數據時為同時讀取四個壓力值,故在此使用了16個字節)。字節20~21為讀寫字節數,字節22~35是要寫入的數據,字節36~37為發送BCC校驗碼,字節38為結束字符,本例中為ASCII碼的“g”,其中字節2~37均為十六進制ASCII碼格式。
企業分站 在線客服 : 服務熱線: 025-86136252 / 15062244194 電子郵箱: [email protected]
公司地址:江蘇省南京市江寧區未來科技城
研維信息是一家集研發、生產、銷售為一體的工控機、嵌入式安裝工業平板電腦、加固手持平板電腦、加固類軍用計算機的專業設備提供商,提供各種尺寸和規格的安裝式工業平板電腦,手持三防平板電腦,加固三防軍用級加固計算機。核心研發及市場團隊均有10余年的相關行業背景,尤其是公司的ODM團隊,可以為客戶提供快速、質優、靈活的客戶定制化產品OEM及ODM服務,公司對員工及客戶,都一直秉承合作共贏、以德為先的經營宗旨,為客戶提供優質產品及服務,提升客戶價值。