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