薛青娜
(西安鐵路職業技術學院,西安710014)
目前,出于成本的考慮,大部分的小型PLC并沒有集成CAN通信接口,部分大型 PLC集成有CAN通訊接口,但價格較貴。隨著應用技術的發展,經常會出現一些應用場合,在面積較大的范圍內,需要多臺PLC協同完成一個系統的綜合控制[1]。許多制造業用戶特別是大型企業,為了避免過分依賴一家系統提供商,通常會采用幾家不同廠商的控制系統。PLC之間的通信格式不兼容,給企業內部的系統集成、集中管理和升級帶來了極大的困難。因此,研究一種統一的通信協議,以使不同品牌的PLC可以統一監控和互相自由通信具有重要的現實意義。
CAN總線具有多主工作方式、各站依據優先權進行總線訪問的機制、無破壞性的總線仲裁技術、短幀結構不易受干擾、自動檢錯、發送期間若丟失仲裁或由于出錯而遭到破壞的幀可實現自動重發等性能。直接通信距離最遠可達10km(傳輸速率為5kbit/s),最高通信速率可達1Mbit/s(傳輸距離為40m),非常適合用于組建PLC通信網絡[2]。
提出了一種基于CAN總線的PLC網絡方案,能夠對多臺聯網的PLC實現遠程配置、數據通信,并能夠在投入較低硬件成本的基礎上,實現良好的系統運行性能。這個方案也充分發揮了現場總線CAN-bus的實時、可靠、高速、遠距離、易維護等特點[3]。通過單片機將PLC的通訊協議轉化為CAN協議,并組成CAN總線網絡,以實現各PLC之間的相互訪問,同時可使用上位機檢測各PLC的工作和通信狀況。這種方式組建的PLC網絡,與選擇集成CAN通訊功能的PLC設備相比,具有更加靈活的系統擴展能力,也能夠獲得更好的性價比[4]。

圖1 基于CAN總線的PLC網絡方案
在該方案中與上位機聯系的歐姆龍PLC通過轉換網關連接,而下位機的 PLC1,PLC2,…,PLCn則是不同公司的PLC產品,有歐姆龍的PLC,有三菱的SC-09,還有滿足MODBUS通信協議的控制產品。這里轉換網關的作用就是搭建不同PLC協議與CAN協議之間的橋梁,并滿足不同PLC協議之間的無縫銜接。為了開發方便起見,轉換網關使用周立功的DP51+開發板來進行實現,其中的CAN功能通過CAN控制芯片SJA1000來完成。
在CAN與多PLC協議轉換方案中,主要是通過軟件來實現協議之間的轉換,這里有歐姆龍通信協議、三菱SC-09、Modbus RTU。這里在DP51+的軟件中使用f_serial_1.c和f_can_1.c:實現歐姆龍通信協議和CAN協議的互相轉換;f_serial_2.c和f_can_2.c:實現三菱SC-09通信協議和CAN協議的互相轉換;f_serial_3.c和f_can_3.c:實現Modbus RTU通信協議和CAN協議的互相轉換。在軟件檢測到不同協議的時候,通過中斷方式來調用上述函數完成協議轉換。
在上位機中嚴格按照OMRON專用協議編寫通信程序。這樣PLC才能理解上位機發來的命令幀,而上位機才能理解PLC發回的響應幀[5]。響應幀在PLC的上位鏈接單元中自動生成,在PLC中無需用戶再編寫通信程序,因此可以沒有PLC的主動參與而進行通信。PLC也有能力在必須主動參與時發起數據傳輸。當多節點參與通信時,必須為上位機鏈接通信設置節點號,用以區分不同的節點,本文中每個DP51+上只有一個PLC,節點號設置為00。從上位計算機發送一個命令時,必須遵循上位機連接通信協議。
程序f_can_1.C用來將CAN接口接收到的命令轉化為歐姆龍的通信協議。主函數void f_can_1()首先發送各命令共同的起始字符'@'和節點號"00",unsigned char m_canchar[]中保存了主程序中接收到的CAN命令,其中第一個字節為該命令的控制字符,根據該字節的值區別不同的命令并分別處理。
f_serial_1.C程序用來將串口接收到的歐姆龍響應命令轉化為CAN命令。CAN命令幀的地址為讀取命令中包含的發送節點地址,命令碼為將相應命令碼的第7位置1,unsigned char m_serialchar[]中保存了主程序中接收到的歐姆龍PLC通過串口發送的字符,其中第四和第五字節保存了命令的標題碼,程序以此判斷并分別處理不同的命令。若為測試命令,則將數據區的第三個字節設置為本節點PLC的類型號,其它讀寫命令由開始地址區分后轉換為相應的CAN命令。在處理讀數據的響應命令時,對于大于8個字節的命令,要分成多幀分別傳送。
三菱SC-09通信電纜采用統一的編址處理各種軟設備,因此需要明確每一個軟設備的具體設備地址,讀寫時各軟設備的地址范圍如下表所示,每一地址為一個字節,長8位,相當于8個軟設備,如讀寫時0080H實際是X0~X7的值。

表1 三菱字軟設備地址
程序f_can_2.C用來將CAN接口接收到的命令轉化為三菱SC-09的通信協議。因為三菱SC-09通信協議中每個字節的最高位為偶校驗位,其余位為數據位,而DP51+串口協議每字節8位數據位,無校驗位。
f_serial_2.C程序用來將串口接收到的SC-09的通信命令轉化為CAN命令。因接收到的每個字節都包含了偶校驗位,所以在使用每個字節的值之前,首要要去取偶校驗位,然后再根據標題碼判斷不同的處理命令。
程序f_can_3.C用來將CAN接口接收到的命令轉化為Modbus的通信協議。在DP51+接收到讀取工作區的命令0x22后,首先發送節點地址01,其后為讀取保持寄存器命令的標題碼03,標題碼之后為讀取變量的開始地址和讀取數目,把轉換完成的Modbus命令中從地址到讀取數據低位的各字節存儲在數組char ch[]中,然后計算該命令的CRC校驗。
f_serial_3.C程序用來將串口接收到控制器的應答命令轉化為CAN命令。DP51+接收到應答命令后計算CRC校驗,確認校驗無誤則轉化為CAN命令并發送回相應的節點,如果命令大于8個字節,則分成多幀分別發送。
必要時歐姆龍能主動發起傳送數據,以減少上位機監控的頻率。實現這一功能需要在歐姆龍PLC中編寫TXD命令,首先初始化DM區,DM0高字節為寫操作命令代碼,與CAN協議的命令碼相同,低字節為寫操作目標節點的地址。DM1中保存寫命令的開始地址,從DM2開始保存要寫的數值。
TXD命令的格式如圖2所示,首源字S為傳送數據第一個字的地址,本文中固定為DM0,控制字(C)的值決定了數據的輸出端口,在上位機鏈接模式中,最低兩位未使用,均設置為0。最高位設置為1,則輸出到外圍端口,設置為0,則輸出到外圍端口以外的端口。當最高位設置為0時,第二位設置為0,使用CPU單元內置的RS-232C端口,設置為1或2則分別使用串行通信板端口1或2。本文使用CPU單元內置的RS-232C端口,因此控制字C設置為#0。字節數N必須是#0000到#0061之間的BCD值(即最多有122個字節的ASCII字符)。當執行條件為ON時,TXD從首源字S開始讀出N個字節數據,將其轉化為ASCII碼,然后輸出數據到指定端口,在讀取DM區時,將先讀取高字節,后讀取低字節。

圖2 歐姆龍TXD命令
從歐姆龍PLC發送出的字符格式如下表所示,歐姆龍PLC將自動添加前綴(起始字符、節點號和標題碼EX)和后綴(校驗碼和結束符)。程序f_serial_1.C通過標題碼EX來判斷是否是歐姆龍PLC發出的TXD命令,根據正文的最高字節,將其轉化為相應的CAN通信命令(按字節寫輸出命令0x03、按字節寫工作區命令0x13),接收寫入命令節點的處理流程與上位機監控時相同,在收到寫入節點發回的正確響應命令后,歐姆龍主動發起的對其它節點寫入數據的操作結束。

表2 歐姆龍EX命令
當需要歐姆龍主動發起讀數據操作時,需要使用查詢命令0x04。兩PLC互相通信的示意圖如圖3所示。
以歐姆龍主動發起讀取三菱PLC數據的操作為例,具體通信步驟如下:
(1)在歐姆龍PLC中編寫TXD命令,首先初始化DM區,DM0高字節為命令代碼,與CAN協議的命令碼相同(04),低字節為讀取數據目標PLC的節點地址。DM1高字節設置讀取目標PLC哪個區域的數據,若讀取輸入區則置為01,讀取輸出區則設置為02,讀取工作區則設置為03。低字節設置讀取來的數據放到本機工作區的開始地址,如設置為00。DM2設置為讀取目標節點數據的開始地址,DM3設置為讀取的字節數。然后通過TXD命令將DM0到DM3的數據發送到DP51+(1)。

圖3 PLC主動讀數據通信流程
(2)DP51+(1)確認歐姆龍發送來的EX命令正文的第一個字節為0x04后,將其轉化為CAN查詢命令(0x04),并發送到目標節點。
(3)DP51+(2)接收到查詢消息幀以后,通過判斷第3個字節的值,采用相應的命令讀取三菱PLC輸入區、輸出區或者工作區的數據。
(4)三菱PLC自動響應對它的讀數據命令。
(5)DP51+(2)接收到三菱PLC對讀數據命令的響應后,以接收到CAN命令的第4個字節的值為開始地址,發出按字節寫工作區命令0x13到DP51+(1)。
(6)DP51+(1)接收到寫工作區命令0x13后,處理開始地址后轉化為歐姆龍寫IR區命令,在接收到歐姆龍PLC的正確響應后通信結束,讀取的數據保存在歐姆龍的工作區中。
三菱PLC主動發起讀寫其它節點的數據需要使用RS指令。RS指令的格式如圖4所示,雖然在一個程序中可以按需使用大量RS指令,但必須保證同一時刻只有一個RS指令被驅動。該指令使用RS-232接口來發送和接收串行數據,在RS指令接通的情況下,將M8122置位(設置發送請求),將從發送地址開始,依次將數據發送到串口,發送數據的個數由發送數據點數決定。本文不需要三菱PLC主動接收數據,因此接收數據點數設置為0。
由M8161決定發送數據的方式,當M8161設置為OFF時,16位數據被分成高8位和低8位,然后再發送;設置為ON時,高8位被忽略,只發送低8位。本文中CAN應用層協議采用按字節方式讀寫,因此使用RS指令前,將M8161設置為ON。

圖4 三菱RS指令
由三菱PLC主動發起寫其它節點的操作時,首先初始化數據寄存器,D0設置為寫操作命令代碼,與CAN協議的命令碼相同,D1設置為寫操作目標節點的地址。D2中保存寫命令的開始地址,從D3開始保存要寫的數值。然后驅動RS指令,并設置發送請求。三菱PLC將自動在數據塊的前后分別添加數據塊起始標志STX和數據塊結束標志ETX。
由三菱PLC主動發起讀取其它節點數據的操作時,首先初始化數據寄存器,D0設置為查詢命令代碼04,D1設置為讀取數據目標節點的地址。D2設置為讀取目標PLC哪個區域的數據,D3設置為讀取來的數據放到本機工作區的開始地址。D4設置為讀取目標節點數據的開始地址,D5設置為讀取的字節數。然后驅動RS指令,并設置發送請求。其余通信流程與歐姆龍主動發起讀取其它節點數據的流程相同。
用Keil軟件編寫協議轉換程序(與歐姆龍PLC連接的DP51+的CAN通信地址設置為2,另外一個與三菱PLC連接的DP51+的CAN地址設置為3,實際應用時可外接DIP開關用來選擇地址),并生成匯編文件,然后將DP51+的串口與上位機串口相連接,將模式選擇開關撥到編程模式,打開DPFlash下載軟件,型號選擇DP51(+),選擇連接的上位機串口,并選擇波特率為 9600bps[6-7]。
在歐姆龍PLC中首先將DM0-DM2分別設置為#0302、#0000、#0001,然后執行如圖5所示的命令,每1秒鐘通過TXD命令將DM0-DM2的數據發送到串口,經過DP51+轉換為對三菱PLC寫輸出區的命令,然后將DM2中的數值循環左移一位。三菱PLC的輸出指示燈依次循環點亮,由歐姆龍PLC主動發起的寫數據命令正確執行。

圖5 歐姆龍TXD通信程序
在歐姆龍PLC中首先將DM0-DM3分別設置為#0402、#0100、#0000、#0002,然后每 1 秒鐘通過TXD命令將DM0-DM3的數據發送到串口,將三菱PLC的輸入區從地址0開始的兩個字節讀到工作區IR016,然后將輸出區IR100設置為與工作區起始地址IR016的值相同。將三菱PLC的輸入點設置為ON以后,歐姆龍PLC相應的輸出點點亮,由歐姆龍主動發起的讀數據命令正確執行。
許多制造業用戶特別是大型企業,為了避免過分依賴一家系統提供商,通常會采用幾家不同廠商的控制系統[8]。PLC之間的通信格式不兼容,給企業內部的系統集成、集中管理和升級帶來了極大的困難。本文提出了一種基于CAN總線的PLC網絡通信方案,該方案通過將各廠家不同的通信協議轉化為統一的CAN網絡通信,從而實現了較好的互相連通以及統一的上位機監控能力。
[1] 甘永梅,李慶豐,劉小娟.現場總線技術及其應用[M].北京:機械工業出版社,2004.
[2] 溫克強.Modbus通訊協議在DCS與PLC通訊中的應用[J].石油化工自動化,2005(5):65-68.
[3] 李喜東,劉波濤,劉剛.Modbus RTU串行通訊協議在工業現場的應用[J].自動化技術與應用,2005,24(7):37-40.
[4] 袁飛,程恩.基于Modbus規約的智能儀表與PC機通信技術實現[J].微計算機信息,2004,20(9):56-57.
[5] 趙偉,張小牛.網絡化一測量技術與儀器發展的新趨勢[J].電測與儀表.2000,37(7):5-9.
[6] 鄭平,李英.基于Ethernet的全開放工業控制網絡[J].工業儀表與自動化裝置,2001(3):6-9.
[7] 吳欽偉.工業儀表與裝置智能化網絡化的進展[J].自動化博覽,2003(18):1-6.