王攀
中海油深圳分公司 廣東 深圳 518000
采油樹井下數據通過動力電纜信號擬合傳輸到單井變壓器,經過CHOCK箱引出,經過信息解碼處理后進入ISP(InterfaceSurfacePanel)監視屏供地面人員觀察讀取。數據信號轉換為Modbus通訊協議485信號傳輸到西門子PLC300。數據在PLC300中經過數據整合,工程量轉換,在本地上位機顯示,并通訊傳送到中控供值班人員實時監視。油藏相關人員通過分析井下數據來了解油藏地層的變化情況,為油井措施提供重要決策依據。生產人員也要時刻監測油井電泵狀態,保障設備安全運行。
不同電潛泵廠家配套的ISP的Modbus通訊參數不同,導致上位機必須根據ISP的類型編寫對應的數據處理程序。隨著油田開發深入,修井作業更換電泵廠家等原因造成ISP類型與PLC原始通訊程序不匹配,無法讀取和顯示數據。想要解決此類問題,需要修改PLC程序以適配新的ISP。
修改PLC程序下載過程中會造成CPU重啟,會影響到使用PLC控制的設備正常運行。在特殊行業必須連續運行是不允許臨時停機的。研究外加一個通訊協議轉換器,實現ISP設備更改后,通訊參數發生了變化,通過該通訊協議轉換器,PLC仍然能夠采集到數據,而不需要進行程序修改。
Modbus協議是應用于電子控制器上的一種通用語言也是一種通用的工業標準。通過此協議,控制器相互之間、控制器經由網絡和其它設備之間可以通信。它描述了一控制器請求訪問其它設備、回應來自其它設備的請求以及怎樣偵測錯誤并記錄的過程,制定了消息域格局和內容的公共格式[1]。
通訊命令發送至儀器時,符合相應地址碼的設備接通訊命令,并除去地址碼,讀取信息,如果沒有出錯,則執行相應的任務;然后把執行結果返送給發送者。返送的信息中包括地址碼、執行動作的功能碼、執行動作后結果的數據以及錯誤校驗碼。如果出錯就不發送任何信息[2]。
地址碼是信息幀的第一字節。這個字節表明由用戶設置地址的從機將接收由主機發送來的信息。主機發送的功能碼告訴從機執行什么任務,從01到255有不同的定義。這里主要介紹功能碼03。在主機發送讀取指令后,從機儀表響應的命令格式是從機地址、功能碼、數據區及CRC碼。其他功能碼在本設計中不需要,不再敘述。數據區包含需要從機執行什么動作或由從機采集的返送信息。例如,功能碼告訴從機讀取寄存器的值,則數據區必需包含要讀取寄存器的起始地址及讀取長度。對于不同的從機,地址和數據信息都不相同。由于電子噪聲或其它一些干擾,信息在傳輸過程中會發生細微的變化,錯誤校驗碼保證了主機或從機對在傳送過程中出錯的信息不起作用。這樣增加了系統的安全和效率。校驗采用CRC-16校驗方法。
以A設備原通訊參數站號2,起始地址40169,數據6個位,更換為B設備通訊參數站號2,起始地址0,數據6個位進行舉例說明。將該轉換裝置安裝在更換后的設備前端,按照原設備通訊方式接線。與主站通訊的口稱為上口,與從站通訊的口稱為下口。
使用通訊協議轉換器作為中間媒介,轉換器上口對PLC模擬原ISP設備,接收PLC主機發送來的詢問信息,主機向2號從站讀取40169(十六進制9CE9)地址開始的6個數據,命令如下:

?
更換設備品牌后,由于新設備數據起始地址是0,命令經過通訊協議轉換器后,實際轉發給下口新ISP設備命令如下:

?
新ISP設備收到命令后,會返回6個數據,格式如下:
轉換器下口接收到新ISP設備返回信息后,根據新舊設備數據存儲位置不同進行數據位調整重算,通過轉換器上口轉發給主機。示例如下:

?
對于主機來說,其面向的對象沒有發生變化,發出的詢問指令和接收的返回信息均能正確讀取,而實際上,現場設備的起始地址和數據存儲的位置都發生了變化。
使用STM32單片機,型號:(STM32F103C8T6)作為硬件開發,程序使用Keil5嵌入式編程軟件。
主函數包括:系統時鐘,定時器,串口配置及中斷、Modbus信號處理等。
由于STM32單片機固件庫中對時鐘頻率進行了簡化,這里只需要調用即可,設定系統晶振頻率為72MHZ。設置定時器時間為1ms,即每1ms產生一次中斷,中斷事件發生后,程序將先暫停正在執行的函數,優先執行中斷函數。將STM32單片機串口用到的引腳使能,設置波特率、數據位、停止位、奇偶校驗等,當串口接收到數據信號時,觸發相應的串口中斷函數[3]。
單片機接收數據主要依靠SP485EEN模塊,實現485信號與TTL信號轉換。由于單片機只識別TTL電平信號,而485信號屬于半雙工高低壓電平信號,所以需要通過設置串口參數,將485信號轉換為TTL信號,從而實現兩者之間數據交互。
通過STM32單片機使能RE、DE管腳,實現上口、下口數據的接收與發送。引腳PB1、PB0負責上口,PLC與STM32單片機之間的通訊。引腳PA7,PA6負責下口、STM32單片機與ISP之間的通訊。RE與DE為高電平時,發送數據,RE與DE為低電平時,接收數據。RO與DI管腳實現數據交互,為單片機提供可識別的TTL信號。一旦接收到數據,串口接收中斷標志位會被置1,觸發中斷函數,程序將優先執行中斷函數的內容。
數據處理主要是對接收到的數據進行判斷、分析與執行。
STM32單片機上口接收到PLC傳輸的Modbus數據后,首先將數據寄存在”Modbus.rcbuf[]”數組中,然后通過數值傳遞告知Modbus_Event函數,接收到一組數據,需要分析處理。下口接收到ISP傳遞的Modbus數據寄存在”Modbus.sub[]”數組中。
一幀Modbus數據,前面為有效數據,最后兩位為校驗碼,有效數據第一位為站地址,第二位功能碼。在分析處理之前,第一步需校驗接收到的數據是否正確。首先通過前面的有效數據計算CRC校驗碼,然后直接讀取數組中的后兩位進行比較,如果兩者之間的值相等,則認為這個數據是有效的,否則判斷為在數據傳輸過程中,出現了干擾,數據失效,退出執行。
在Modbus_Event數據處理函數中,若數據有效,將讀取數組中第一位的值,判斷是否發送給本設備。本設備的站地址在”Modbus_Init()“中設置,如圖,站地址為2。若是,繼續執行。若不是,判斷是否為廣播地址,廣播地址首位為0,其不需要做出回應,直接退出。
如果轉換器上口接收到數據,并且第二位數據為03,則執行“Modbus_fun3()”函數,否則將不會對數據做任何處理。“Modbus_fun3()”函數是在轉換器上口接收到PLC的命令數據后,將數組“Reg[]”中預設定的讀命令通過轉換器下口發送至新ISP,進行井下數據讀取。
轉換器下口接收到的數據第二位為03,則執行“Modbus_fun6()”函數。“Modbus_fun6()”函數實現將轉換器下口新ISP返回的數據,經過調位處理,重新計算校驗碼等操作,再將數據通過轉換器上口發送至主機PLC。在“Modbus_fun6()”函數中,“Modbus.cop[]”數組通過列序將寄存在”Modbus.sub[]”數組中新ISP返回的值重組,以獲取目的數據。重組后的值再通過校驗函數重新計算校驗碼,最后將目的數據及校驗碼構成的Modbus數據發送至主機PLC。
數據的發送通過使能相應串口的RE、DE管腳,使其為高電平,即可發送數據。由STM32單片機發送至ISP設備,使能引腳PA7、PA6,則RE、DE為高電平,SP485EEN模塊處于激發狀態,預設定的讀命令將通過轉換器下口發送出去。由STM23單片機發送至主機PLC,使能引腳PB1、PB0即可。當數據發送完畢后,延時2秒,再將RE、DE管腳變為低電平,等待下次數據接收[4]。
在中海油某平臺使用該通訊協議轉換器,2#井ISP信號由斯倫貝謝廠家更改為貝克休斯廠家,通訊協議發生了變化后,原PLC上位機程序不做任何修改仍能夠讀取到現場數據,能夠實時顯示井下數據。
在程序中寫入新品牌ISP設備需要的協議轉換代碼,包括站號和讀數據指令。這部分工作可由專業人員前期寫入,將轉換裝置寄送到設備現場。
接線簡單,使用方便,將協議轉換器串接在原鏈路中即可,不改變原有通訊鏈路結構,不影響其他單井的數據采集。不需要具有PLC編程能力,可避免直接修改PLC程序下載引起的設備停機風險,應用性強。