王攀
中海油深圳分公司 廣東 深圳 518000
采油樹井下數(shù)據(jù)通過動力電纜信號擬合傳輸?shù)絾尉儔浩?,?jīng)過CHOCK箱引出,經(jīng)過信息解碼處理后進(jìn)入ISP(InterfaceSurfacePanel)監(jiān)視屏供地面人員觀察讀取。數(shù)據(jù)信號轉(zhuǎn)換為Modbus通訊協(xié)議485信號傳輸?shù)轿鏖T子PLC300。數(shù)據(jù)在PLC300中經(jīng)過數(shù)據(jù)整合,工程量轉(zhuǎn)換,在本地上位機(jī)顯示,并通訊傳送到中控供值班人員實時監(jiān)視。油藏相關(guān)人員通過分析井下數(shù)據(jù)來了解油藏地層的變化情況,為油井措施提供重要決策依據(jù)。生產(chǎn)人員也要時刻監(jiān)測油井電泵狀態(tài),保障設(shè)備安全運行。
不同電潛泵廠家配套的ISP的Modbus通訊參數(shù)不同,導(dǎo)致上位機(jī)必須根據(jù)ISP的類型編寫對應(yīng)的數(shù)據(jù)處理程序。隨著油田開發(fā)深入,修井作業(yè)更換電泵廠家等原因造成ISP類型與PLC原始通訊程序不匹配,無法讀取和顯示數(shù)據(jù)。想要解決此類問題,需要修改PLC程序以適配新的ISP。
修改PLC程序下載過程中會造成CPU重啟,會影響到使用PLC控制的設(shè)備正常運行。在特殊行業(yè)必須連續(xù)運行是不允許臨時停機(jī)的。研究外加一個通訊協(xié)議轉(zhuǎn)換器,實現(xiàn)ISP設(shè)備更改后,通訊參數(shù)發(fā)生了變化,通過該通訊協(xié)議轉(zhuǎn)換器,PLC仍然能夠采集到數(shù)據(jù),而不需要進(jìn)行程序修改。
Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語言也是一種通用的工業(yè)標(biāo)準(zhǔn)。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)和其它設(shè)備之間可以通信。它描述了一控制器請求訪問其它設(shè)備、回應(yīng)來自其它設(shè)備的請求以及怎樣偵測錯誤并記錄的過程,制定了消息域格局和內(nèi)容的公共格式[1]。
通訊命令發(fā)送至儀器時,符合相應(yīng)地址碼的設(shè)備接通訊命令,并除去地址碼,讀取信息,如果沒有出錯,則執(zhí)行相應(yīng)的任務(wù);然后把執(zhí)行結(jié)果返送給發(fā)送者。返送的信息中包括地址碼、執(zhí)行動作的功能碼、執(zhí)行動作后結(jié)果的數(shù)據(jù)以及錯誤校驗碼。如果出錯就不發(fā)送任何信息[2]。
地址碼是信息幀的第一字節(jié)。這個字節(jié)表明由用戶設(shè)置地址的從機(jī)將接收由主機(jī)發(fā)送來的信息。主機(jī)發(fā)送的功能碼告訴從機(jī)執(zhí)行什么任務(wù),從01到255有不同的定義。這里主要介紹功能碼03。在主機(jī)發(fā)送讀取指令后,從機(jī)儀表響應(yīng)的命令格式是從機(jī)地址、功能碼、數(shù)據(jù)區(qū)及CRC碼。其他功能碼在本設(shè)計中不需要,不再敘述。數(shù)據(jù)區(qū)包含需要從機(jī)執(zhí)行什么動作或由從機(jī)采集的返送信息。例如,功能碼告訴從機(jī)讀取寄存器的值,則數(shù)據(jù)區(qū)必需包含要讀取寄存器的起始地址及讀取長度。對于不同的從機(jī),地址和數(shù)據(jù)信息都不相同。由于電子噪聲或其它一些干擾,信息在傳輸過程中會發(fā)生細(xì)微的變化,錯誤校驗碼保證了主機(jī)或從機(jī)對在傳送過程中出錯的信息不起作用。這樣增加了系統(tǒng)的安全和效率。校驗采用CRC-16校驗方法。
以A設(shè)備原通訊參數(shù)站號2,起始地址40169,數(shù)據(jù)6個位,更換為B設(shè)備通訊參數(shù)站號2,起始地址0,數(shù)據(jù)6個位進(jìn)行舉例說明。將該轉(zhuǎn)換裝置安裝在更換后的設(shè)備前端,按照原設(shè)備通訊方式接線。與主站通訊的口稱為上口,與從站通訊的口稱為下口。
使用通訊協(xié)議轉(zhuǎn)換器作為中間媒介,轉(zhuǎn)換器上口對PLC模擬原ISP設(shè)備,接收PLC主機(jī)發(fā)送來的詢問信息,主機(jī)向2號從站讀取40169(十六進(jìn)制9CE9)地址開始的6個數(shù)據(jù),命令如下:
?
更換設(shè)備品牌后,由于新設(shè)備數(shù)據(jù)起始地址是0,命令經(jīng)過通訊協(xié)議轉(zhuǎn)換器后,實際轉(zhuǎn)發(fā)給下口新ISP設(shè)備命令如下:
?
新ISP設(shè)備收到命令后,會返回6個數(shù)據(jù),格式如下:
轉(zhuǎn)換器下口接收到新ISP設(shè)備返回信息后,根據(jù)新舊設(shè)備數(shù)據(jù)存儲位置不同進(jìn)行數(shù)據(jù)位調(diào)整重算,通過轉(zhuǎn)換器上口轉(zhuǎn)發(fā)給主機(jī)。示例如下:
?
對于主機(jī)來說,其面向的對象沒有發(fā)生變化,發(fā)出的詢問指令和接收的返回信息均能正確讀取,而實際上,現(xiàn)場設(shè)備的起始地址和數(shù)據(jù)存儲的位置都發(fā)生了變化。
使用STM32單片機(jī),型號:(STM32F103C8T6)作為硬件開發(fā),程序使用Keil5嵌入式編程軟件。
主函數(shù)包括:系統(tǒng)時鐘,定時器,串口配置及中斷、Modbus信號處理等。
由于STM32單片機(jī)固件庫中對時鐘頻率進(jìn)行了簡化,這里只需要調(diào)用即可,設(shè)定系統(tǒng)晶振頻率為72MHZ。設(shè)置定時器時間為1ms,即每1ms產(chǎn)生一次中斷,中斷事件發(fā)生后,程序?qū)⑾葧和U趫?zhí)行的函數(shù),優(yōu)先執(zhí)行中斷函數(shù)。將STM32單片機(jī)串口用到的引腳使能,設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗等,當(dāng)串口接收到數(shù)據(jù)信號時,觸發(fā)相應(yīng)的串口中斷函數(shù)[3]。
單片機(jī)接收數(shù)據(jù)主要依靠SP485EEN模塊,實現(xiàn)485信號與TTL信號轉(zhuǎn)換。由于單片機(jī)只識別TTL電平信號,而485信號屬于半雙工高低壓電平信號,所以需要通過設(shè)置串口參數(shù),將485信號轉(zhuǎn)換為TTL信號,從而實現(xiàn)兩者之間數(shù)據(jù)交互。
通過STM32單片機(jī)使能RE、DE管腳,實現(xiàn)上口、下口數(shù)據(jù)的接收與發(fā)送。引腳PB1、PB0負(fù)責(zé)上口,PLC與STM32單片機(jī)之間的通訊。引腳PA7,PA6負(fù)責(zé)下口、STM32單片機(jī)與ISP之間的通訊。RE與DE為高電平時,發(fā)送數(shù)據(jù),RE與DE為低電平時,接收數(shù)據(jù)。RO與DI管腳實現(xiàn)數(shù)據(jù)交互,為單片機(jī)提供可識別的TTL信號。一旦接收到數(shù)據(jù),串口接收中斷標(biāo)志位會被置1,觸發(fā)中斷函數(shù),程序?qū)?yōu)先執(zhí)行中斷函數(shù)的內(nèi)容。
數(shù)據(jù)處理主要是對接收到的數(shù)據(jù)進(jìn)行判斷、分析與執(zhí)行。
STM32單片機(jī)上口接收到PLC傳輸?shù)腗odbus數(shù)據(jù)后,首先將數(shù)據(jù)寄存在”Modbus.rcbuf[]”數(shù)組中,然后通過數(shù)值傳遞告知Modbus_Event函數(shù),接收到一組數(shù)據(jù),需要分析處理。下口接收到ISP傳遞的Modbus數(shù)據(jù)寄存在”Modbus.sub[]”數(shù)組中。
一幀Modbus數(shù)據(jù),前面為有效數(shù)據(jù),最后兩位為校驗碼,有效數(shù)據(jù)第一位為站地址,第二位功能碼。在分析處理之前,第一步需校驗接收到的數(shù)據(jù)是否正確。首先通過前面的有效數(shù)據(jù)計算CRC校驗碼,然后直接讀取數(shù)組中的后兩位進(jìn)行比較,如果兩者之間的值相等,則認(rèn)為這個數(shù)據(jù)是有效的,否則判斷為在數(shù)據(jù)傳輸過程中,出現(xiàn)了干擾,數(shù)據(jù)失效,退出執(zhí)行。
在Modbus_Event數(shù)據(jù)處理函數(shù)中,若數(shù)據(jù)有效,將讀取數(shù)組中第一位的值,判斷是否發(fā)送給本設(shè)備。本設(shè)備的站地址在”Modbus_Init()“中設(shè)置,如圖,站地址為2。若是,繼續(xù)執(zhí)行。若不是,判斷是否為廣播地址,廣播地址首位為0,其不需要做出回應(yīng),直接退出。
如果轉(zhuǎn)換器上口接收到數(shù)據(jù),并且第二位數(shù)據(jù)為03,則執(zhí)行“Modbus_fun3()”函數(shù),否則將不會對數(shù)據(jù)做任何處理?!癕odbus_fun3()”函數(shù)是在轉(zhuǎn)換器上口接收到PLC的命令數(shù)據(jù)后,將數(shù)組“Reg[]”中預(yù)設(shè)定的讀命令通過轉(zhuǎn)換器下口發(fā)送至新ISP,進(jìn)行井下數(shù)據(jù)讀取。
轉(zhuǎn)換器下口接收到的數(shù)據(jù)第二位為03,則執(zhí)行“Modbus_fun6()”函數(shù)?!癕odbus_fun6()”函數(shù)實現(xiàn)將轉(zhuǎn)換器下口新ISP返回的數(shù)據(jù),經(jīng)過調(diào)位處理,重新計算校驗碼等操作,再將數(shù)據(jù)通過轉(zhuǎn)換器上口發(fā)送至主機(jī)PLC。在“Modbus_fun6()”函數(shù)中,“Modbus.cop[]”數(shù)組通過列序?qū)⒓拇嬖凇盡odbus.sub[]”數(shù)組中新ISP返回的值重組,以獲取目的數(shù)據(jù)。重組后的值再通過校驗函數(shù)重新計算校驗碼,最后將目的數(shù)據(jù)及校驗碼構(gòu)成的Modbus數(shù)據(jù)發(fā)送至主機(jī)PLC。
數(shù)據(jù)的發(fā)送通過使能相應(yīng)串口的RE、DE管腳,使其為高電平,即可發(fā)送數(shù)據(jù)。由STM32單片機(jī)發(fā)送至ISP設(shè)備,使能引腳PA7、PA6,則RE、DE為高電平,SP485EEN模塊處于激發(fā)狀態(tài),預(yù)設(shè)定的讀命令將通過轉(zhuǎn)換器下口發(fā)送出去。由STM23單片機(jī)發(fā)送至主機(jī)PLC,使能引腳PB1、PB0即可。當(dāng)數(shù)據(jù)發(fā)送完畢后,延時2秒,再將RE、DE管腳變?yōu)榈碗娖?,等待下次?shù)據(jù)接收[4]。
在中海油某平臺使用該通訊協(xié)議轉(zhuǎn)換器,2#井ISP信號由斯倫貝謝廠家更改為貝克休斯廠家,通訊協(xié)議發(fā)生了變化后,原PLC上位機(jī)程序不做任何修改仍能夠讀取到現(xiàn)場數(shù)據(jù),能夠?qū)崟r顯示井下數(shù)據(jù)。
在程序中寫入新品牌ISP設(shè)備需要的協(xié)議轉(zhuǎn)換代碼,包括站號和讀數(shù)據(jù)指令。這部分工作可由專業(yè)人員前期寫入,將轉(zhuǎn)換裝置寄送到設(shè)備現(xiàn)場。
接線簡單,使用方便,將協(xié)議轉(zhuǎn)換器串接在原鏈路中即可,不改變原有通訊鏈路結(jié)構(gòu),不影響其他單井的數(shù)據(jù)采集。不需要具有PLC編程能力,可避免直接修改PLC程序下載引起的設(shè)備停機(jī)風(fēng)險,應(yīng)用性強。