薛青娜
(西安鐵路職業(yè)技術(shù)學(xué)院,西安710014)
目前,出于成本的考慮,大部分的小型PLC并沒有集成CAN通信接口,部分大型 PLC集成有CAN通訊接口,但價(jià)格較貴。隨著應(yīng)用技術(shù)的發(fā)展,經(jīng)常會出現(xiàn)一些應(yīng)用場合,在面積較大的范圍內(nèi),需要多臺PLC協(xié)同完成一個(gè)系統(tǒng)的綜合控制[1]。許多制造業(yè)用戶特別是大型企業(yè),為了避免過分依賴一家系統(tǒng)提供商,通常會采用幾家不同廠商的控制系統(tǒng)。PLC之間的通信格式不兼容,給企業(yè)內(nèi)部的系統(tǒng)集成、集中管理和升級帶來了極大的困難。因此,研究一種統(tǒng)一的通信協(xié)議,以使不同品牌的PLC可以統(tǒng)一監(jiān)控和互相自由通信具有重要的現(xiàn)實(shí)意義。
CAN總線具有多主工作方式、各站依據(jù)優(yōu)先權(quán)進(jìn)行總線訪問的機(jī)制、無破壞性的總線仲裁技術(shù)、短幀結(jié)構(gòu)不易受干擾、自動檢錯、發(fā)送期間若丟失仲裁或由于出錯而遭到破壞的幀可實(shí)現(xiàn)自動重發(fā)等性能。直接通信距離最遠(yuǎn)可達(dá)10km(傳輸速率為5kbit/s),最高通信速率可達(dá)1Mbit/s(傳輸距離為40m),非常適合用于組建PLC通信網(wǎng)絡(luò)[2]。
提出了一種基于CAN總線的PLC網(wǎng)絡(luò)方案,能夠?qū)Χ嗯_聯(lián)網(wǎng)的PLC實(shí)現(xiàn)遠(yuǎn)程配置、數(shù)據(jù)通信,并能夠在投入較低硬件成本的基礎(chǔ)上,實(shí)現(xiàn)良好的系統(tǒng)運(yùn)行性能。這個(gè)方案也充分發(fā)揮了現(xiàn)場總線CAN-bus的實(shí)時(shí)、可靠、高速、遠(yuǎn)距離、易維護(hù)等特點(diǎn)[3]。通過單片機(jī)將PLC的通訊協(xié)議轉(zhuǎn)化為CAN協(xié)議,并組成CAN總線網(wǎng)絡(luò),以實(shí)現(xiàn)各PLC之間的相互訪問,同時(shí)可使用上位機(jī)檢測各PLC的工作和通信狀況。這種方式組建的PLC網(wǎng)絡(luò),與選擇集成CAN通訊功能的PLC設(shè)備相比,具有更加靈活的系統(tǒng)擴(kuò)展能力,也能夠獲得更好的性價(jià)比[4]。
圖1 基于CAN總線的PLC網(wǎng)絡(luò)方案
在該方案中與上位機(jī)聯(lián)系的歐姆龍PLC通過轉(zhuǎn)換網(wǎng)關(guān)連接,而下位機(jī)的 PLC1,PLC2,…,PLCn則是不同公司的PLC產(chǎn)品,有歐姆龍的PLC,有三菱的SC-09,還有滿足MODBUS通信協(xié)議的控制產(chǎn)品。這里轉(zhuǎn)換網(wǎng)關(guān)的作用就是搭建不同PLC協(xié)議與CAN協(xié)議之間的橋梁,并滿足不同PLC協(xié)議之間的無縫銜接。為了開發(fā)方便起見,轉(zhuǎn)換網(wǎng)關(guān)使用周立功的DP51+開發(fā)板來進(jìn)行實(shí)現(xiàn),其中的CAN功能通過CAN控制芯片SJA1000來完成。
在CAN與多PLC協(xié)議轉(zhuǎn)換方案中,主要是通過軟件來實(shí)現(xiàn)協(xié)議之間的轉(zhuǎn)換,這里有歐姆龍通信協(xié)議、三菱SC-09、Modbus RTU。這里在DP51+的軟件中使用f_serial_1.c和f_can_1.c:實(shí)現(xiàn)歐姆龍通信協(xié)議和CAN協(xié)議的互相轉(zhuǎn)換;f_serial_2.c和f_can_2.c:實(shí)現(xiàn)三菱SC-09通信協(xié)議和CAN協(xié)議的互相轉(zhuǎn)換;f_serial_3.c和f_can_3.c:實(shí)現(xiàn)Modbus RTU通信協(xié)議和CAN協(xié)議的互相轉(zhuǎn)換。在軟件檢測到不同協(xié)議的時(shí)候,通過中斷方式來調(diào)用上述函數(shù)完成協(xié)議轉(zhuǎn)換。
在上位機(jī)中嚴(yán)格按照OMRON專用協(xié)議編寫通信程序。這樣PLC才能理解上位機(jī)發(fā)來的命令幀,而上位機(jī)才能理解PLC發(fā)回的響應(yīng)幀[5]。響應(yīng)幀在PLC的上位鏈接單元中自動生成,在PLC中無需用戶再編寫通信程序,因此可以沒有PLC的主動參與而進(jìn)行通信。PLC也有能力在必須主動參與時(shí)發(fā)起數(shù)據(jù)傳輸。當(dāng)多節(jié)點(diǎn)參與通信時(shí),必須為上位機(jī)鏈接通信設(shè)置節(jié)點(diǎn)號,用以區(qū)分不同的節(jié)點(diǎn),本文中每個(gè)DP51+上只有一個(gè)PLC,節(jié)點(diǎn)號設(shè)置為00。從上位計(jì)算機(jī)發(fā)送一個(gè)命令時(shí),必須遵循上位機(jī)連接通信協(xié)議。
程序f_can_1.C用來將CAN接口接收到的命令轉(zhuǎn)化為歐姆龍的通信協(xié)議。主函數(shù)void f_can_1()首先發(fā)送各命令共同的起始字符'@'和節(jié)點(diǎn)號"00",unsigned char m_canchar[]中保存了主程序中接收到的CAN命令,其中第一個(gè)字節(jié)為該命令的控制字符,根據(jù)該字節(jié)的值區(qū)別不同的命令并分別處理。
f_serial_1.C程序用來將串口接收到的歐姆龍響應(yīng)命令轉(zhuǎn)化為CAN命令。CAN命令幀的地址為讀取命令中包含的發(fā)送節(jié)點(diǎn)地址,命令碼為將相應(yīng)命令碼的第7位置1,unsigned char m_serialchar[]中保存了主程序中接收到的歐姆龍PLC通過串口發(fā)送的字符,其中第四和第五字節(jié)保存了命令的標(biāo)題碼,程序以此判斷并分別處理不同的命令。若為測試命令,則將數(shù)據(jù)區(qū)的第三個(gè)字節(jié)設(shè)置為本節(jié)點(diǎn)PLC的類型號,其它讀寫命令由開始地址區(qū)分后轉(zhuǎn)換為相應(yīng)的CAN命令。在處理讀數(shù)據(jù)的響應(yīng)命令時(shí),對于大于8個(gè)字節(jié)的命令,要分成多幀分別傳送。
三菱SC-09通信電纜采用統(tǒng)一的編址處理各種軟設(shè)備,因此需要明確每一個(gè)軟設(shè)備的具體設(shè)備地址,讀寫時(shí)各軟設(shè)備的地址范圍如下表所示,每一地址為一個(gè)字節(jié),長8位,相當(dāng)于8個(gè)軟設(shè)備,如讀寫時(shí)0080H實(shí)際是X0~X7的值。
表1 三菱字軟設(shè)備地址
程序f_can_2.C用來將CAN接口接收到的命令轉(zhuǎn)化為三菱SC-09的通信協(xié)議。因?yàn)槿釹C-09通信協(xié)議中每個(gè)字節(jié)的最高位為偶校驗(yàn)位,其余位為數(shù)據(jù)位,而DP51+串口協(xié)議每字節(jié)8位數(shù)據(jù)位,無校驗(yàn)位。
f_serial_2.C程序用來將串口接收到的SC-09的通信命令轉(zhuǎn)化為CAN命令。因接收到的每個(gè)字節(jié)都包含了偶校驗(yàn)位,所以在使用每個(gè)字節(jié)的值之前,首要要去取偶校驗(yàn)位,然后再根據(jù)標(biāo)題碼判斷不同的處理命令。
程序f_can_3.C用來將CAN接口接收到的命令轉(zhuǎn)化為Modbus的通信協(xié)議。在DP51+接收到讀取工作區(qū)的命令0x22后,首先發(fā)送節(jié)點(diǎn)地址01,其后為讀取保持寄存器命令的標(biāo)題碼03,標(biāo)題碼之后為讀取變量的開始地址和讀取數(shù)目,把轉(zhuǎn)換完成的Modbus命令中從地址到讀取數(shù)據(jù)低位的各字節(jié)存儲在數(shù)組char ch[]中,然后計(jì)算該命令的CRC校驗(yàn)。
f_serial_3.C程序用來將串口接收到控制器的應(yīng)答命令轉(zhuǎn)化為CAN命令。DP51+接收到應(yīng)答命令后計(jì)算CRC校驗(yàn),確認(rèn)校驗(yàn)無誤則轉(zhuǎn)化為CAN命令并發(fā)送回相應(yīng)的節(jié)點(diǎn),如果命令大于8個(gè)字節(jié),則分成多幀分別發(fā)送。
必要時(shí)歐姆龍能主動發(fā)起傳送數(shù)據(jù),以減少上位機(jī)監(jiān)控的頻率。實(shí)現(xiàn)這一功能需要在歐姆龍PLC中編寫TXD命令,首先初始化DM區(qū),DM0高字節(jié)為寫操作命令代碼,與CAN協(xié)議的命令碼相同,低字節(jié)為寫操作目標(biāo)節(jié)點(diǎn)的地址。DM1中保存寫命令的開始地址,從DM2開始保存要寫的數(shù)值。
TXD命令的格式如圖2所示,首源字S為傳送數(shù)據(jù)第一個(gè)字的地址,本文中固定為DM0,控制字(C)的值決定了數(shù)據(jù)的輸出端口,在上位機(jī)鏈接模式中,最低兩位未使用,均設(shè)置為0。最高位設(shè)置為1,則輸出到外圍端口,設(shè)置為0,則輸出到外圍端口以外的端口。當(dāng)最高位設(shè)置為0時(shí),第二位設(shè)置為0,使用CPU單元內(nèi)置的RS-232C端口,設(shè)置為1或2則分別使用串行通信板端口1或2。本文使用CPU單元內(nèi)置的RS-232C端口,因此控制字C設(shè)置為#0。字節(jié)數(shù)N必須是#0000到#0061之間的BCD值(即最多有122個(gè)字節(jié)的ASCII字符)。當(dāng)執(zhí)行條件為ON時(shí),TXD從首源字S開始讀出N個(gè)字節(jié)數(shù)據(jù),將其轉(zhuǎn)化為ASCII碼,然后輸出數(shù)據(jù)到指定端口,在讀取DM區(qū)時(shí),將先讀取高字節(jié),后讀取低字節(jié)。
圖2 歐姆龍TXD命令
從歐姆龍PLC發(fā)送出的字符格式如下表所示,歐姆龍PLC將自動添加前綴(起始字符、節(jié)點(diǎn)號和標(biāo)題碼EX)和后綴(校驗(yàn)碼和結(jié)束符)。程序f_serial_1.C通過標(biāo)題碼EX來判斷是否是歐姆龍PLC發(fā)出的TXD命令,根據(jù)正文的最高字節(jié),將其轉(zhuǎn)化為相應(yīng)的CAN通信命令(按字節(jié)寫輸出命令0x03、按字節(jié)寫工作區(qū)命令0x13),接收寫入命令節(jié)點(diǎn)的處理流程與上位機(jī)監(jiān)控時(shí)相同,在收到寫入節(jié)點(diǎn)發(fā)回的正確響應(yīng)命令后,歐姆龍主動發(fā)起的對其它節(jié)點(diǎn)寫入數(shù)據(jù)的操作結(jié)束。
表2 歐姆龍EX命令
當(dāng)需要?dú)W姆龍主動發(fā)起讀數(shù)據(jù)操作時(shí),需要使用查詢命令0x04。兩PLC互相通信的示意圖如圖3所示。
以歐姆龍主動發(fā)起讀取三菱PLC數(shù)據(jù)的操作為例,具體通信步驟如下:
(1)在歐姆龍PLC中編寫TXD命令,首先初始化DM區(qū),DM0高字節(jié)為命令代碼,與CAN協(xié)議的命令碼相同(04),低字節(jié)為讀取數(shù)據(jù)目標(biāo)PLC的節(jié)點(diǎn)地址。DM1高字節(jié)設(shè)置讀取目標(biāo)PLC哪個(gè)區(qū)域的數(shù)據(jù),若讀取輸入?yún)^(qū)則置為01,讀取輸出區(qū)則設(shè)置為02,讀取工作區(qū)則設(shè)置為03。低字節(jié)設(shè)置讀取來的數(shù)據(jù)放到本機(jī)工作區(qū)的開始地址,如設(shè)置為00。DM2設(shè)置為讀取目標(biāo)節(jié)點(diǎn)數(shù)據(jù)的開始地址,DM3設(shè)置為讀取的字節(jié)數(shù)。然后通過TXD命令將DM0到DM3的數(shù)據(jù)發(fā)送到DP51+(1)。
圖3 PLC主動讀數(shù)據(jù)通信流程
(2)DP51+(1)確認(rèn)歐姆龍發(fā)送來的EX命令正文的第一個(gè)字節(jié)為0x04后,將其轉(zhuǎn)化為CAN查詢命令(0x04),并發(fā)送到目標(biāo)節(jié)點(diǎn)。
(3)DP51+(2)接收到查詢消息幀以后,通過判斷第3個(gè)字節(jié)的值,采用相應(yīng)的命令讀取三菱PLC輸入?yún)^(qū)、輸出區(qū)或者工作區(qū)的數(shù)據(jù)。
(4)三菱PLC自動響應(yīng)對它的讀數(shù)據(jù)命令。
(5)DP51+(2)接收到三菱PLC對讀數(shù)據(jù)命令的響應(yīng)后,以接收到CAN命令的第4個(gè)字節(jié)的值為開始地址,發(fā)出按字節(jié)寫工作區(qū)命令0x13到DP51+(1)。
(6)DP51+(1)接收到寫工作區(qū)命令0x13后,處理開始地址后轉(zhuǎn)化為歐姆龍寫IR區(qū)命令,在接收到歐姆龍PLC的正確響應(yīng)后通信結(jié)束,讀取的數(shù)據(jù)保存在歐姆龍的工作區(qū)中。
三菱PLC主動發(fā)起讀寫其它節(jié)點(diǎn)的數(shù)據(jù)需要使用RS指令。RS指令的格式如圖4所示,雖然在一個(gè)程序中可以按需使用大量RS指令,但必須保證同一時(shí)刻只有一個(gè)RS指令被驅(qū)動。該指令使用RS-232接口來發(fā)送和接收串行數(shù)據(jù),在RS指令接通的情況下,將M8122置位(設(shè)置發(fā)送請求),將從發(fā)送地址開始,依次將數(shù)據(jù)發(fā)送到串口,發(fā)送數(shù)據(jù)的個(gè)數(shù)由發(fā)送數(shù)據(jù)點(diǎn)數(shù)決定。本文不需要三菱PLC主動接收數(shù)據(jù),因此接收數(shù)據(jù)點(diǎn)數(shù)設(shè)置為0。
由M8161決定發(fā)送數(shù)據(jù)的方式,當(dāng)M8161設(shè)置為OFF時(shí),16位數(shù)據(jù)被分成高8位和低8位,然后再發(fā)送;設(shè)置為ON時(shí),高8位被忽略,只發(fā)送低8位。本文中CAN應(yīng)用層協(xié)議采用按字節(jié)方式讀寫,因此使用RS指令前,將M8161設(shè)置為ON。
圖4 三菱RS指令
由三菱PLC主動發(fā)起寫其它節(jié)點(diǎn)的操作時(shí),首先初始化數(shù)據(jù)寄存器,D0設(shè)置為寫操作命令代碼,與CAN協(xié)議的命令碼相同,D1設(shè)置為寫操作目標(biāo)節(jié)點(diǎn)的地址。D2中保存寫命令的開始地址,從D3開始保存要寫的數(shù)值。然后驅(qū)動RS指令,并設(shè)置發(fā)送請求。三菱PLC將自動在數(shù)據(jù)塊的前后分別添加數(shù)據(jù)塊起始標(biāo)志STX和數(shù)據(jù)塊結(jié)束標(biāo)志ETX。
由三菱PLC主動發(fā)起讀取其它節(jié)點(diǎn)數(shù)據(jù)的操作時(shí),首先初始化數(shù)據(jù)寄存器,D0設(shè)置為查詢命令代碼04,D1設(shè)置為讀取數(shù)據(jù)目標(biāo)節(jié)點(diǎn)的地址。D2設(shè)置為讀取目標(biāo)PLC哪個(gè)區(qū)域的數(shù)據(jù),D3設(shè)置為讀取來的數(shù)據(jù)放到本機(jī)工作區(qū)的開始地址。D4設(shè)置為讀取目標(biāo)節(jié)點(diǎn)數(shù)據(jù)的開始地址,D5設(shè)置為讀取的字節(jié)數(shù)。然后驅(qū)動RS指令,并設(shè)置發(fā)送請求。其余通信流程與歐姆龍主動發(fā)起讀取其它節(jié)點(diǎn)數(shù)據(jù)的流程相同。
用Keil軟件編寫協(xié)議轉(zhuǎn)換程序(與歐姆龍PLC連接的DP51+的CAN通信地址設(shè)置為2,另外一個(gè)與三菱PLC連接的DP51+的CAN地址設(shè)置為3,實(shí)際應(yīng)用時(shí)可外接DIP開關(guān)用來選擇地址),并生成匯編文件,然后將DP51+的串口與上位機(jī)串口相連接,將模式選擇開關(guān)撥到編程模式,打開DPFlash下載軟件,型號選擇DP51(+),選擇連接的上位機(jī)串口,并選擇波特率為 9600bps[6-7]。
在歐姆龍PLC中首先將DM0-DM2分別設(shè)置為#0302、#0000、#0001,然后執(zhí)行如圖5所示的命令,每1秒鐘通過TXD命令將DM0-DM2的數(shù)據(jù)發(fā)送到串口,經(jīng)過DP51+轉(zhuǎn)換為對三菱PLC寫輸出區(qū)的命令,然后將DM2中的數(shù)值循環(huán)左移一位。三菱PLC的輸出指示燈依次循環(huán)點(diǎn)亮,由歐姆龍PLC主動發(fā)起的寫數(shù)據(jù)命令正確執(zhí)行。
圖5 歐姆龍TXD通信程序
在歐姆龍PLC中首先將DM0-DM3分別設(shè)置為#0402、#0100、#0000、#0002,然后每 1 秒鐘通過TXD命令將DM0-DM3的數(shù)據(jù)發(fā)送到串口,將三菱PLC的輸入?yún)^(qū)從地址0開始的兩個(gè)字節(jié)讀到工作區(qū)IR016,然后將輸出區(qū)IR100設(shè)置為與工作區(qū)起始地址IR016的值相同。將三菱PLC的輸入點(diǎn)設(shè)置為ON以后,歐姆龍PLC相應(yīng)的輸出點(diǎn)點(diǎn)亮,由歐姆龍主動發(fā)起的讀數(shù)據(jù)命令正確執(zhí)行。
許多制造業(yè)用戶特別是大型企業(yè),為了避免過分依賴一家系統(tǒng)提供商,通常會采用幾家不同廠商的控制系統(tǒng)[8]。PLC之間的通信格式不兼容,給企業(yè)內(nèi)部的系統(tǒng)集成、集中管理和升級帶來了極大的困難。本文提出了一種基于CAN總線的PLC網(wǎng)絡(luò)通信方案,該方案通過將各廠家不同的通信協(xié)議轉(zhuǎn)化為統(tǒng)一的CAN網(wǎng)絡(luò)通信,從而實(shí)現(xiàn)了較好的互相連通以及統(tǒng)一的上位機(jī)監(jiān)控能力。
[1] 甘永梅,李慶豐,劉小娟.現(xiàn)場總線技術(shù)及其應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2004.
[2] 溫克強(qiáng).Modbus通訊協(xié)議在DCS與PLC通訊中的應(yīng)用[J].石油化工自動化,2005(5):65-68.
[3] 李喜東,劉波濤,劉剛.Modbus RTU串行通訊協(xié)議在工業(yè)現(xiàn)場的應(yīng)用[J].自動化技術(shù)與應(yīng)用,2005,24(7):37-40.
[4] 袁飛,程恩.基于Modbus規(guī)約的智能儀表與PC機(jī)通信技術(shù)實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2004,20(9):56-57.
[5] 趙偉,張小牛.網(wǎng)絡(luò)化一測量技術(shù)與儀器發(fā)展的新趨勢[J].電測與儀表.2000,37(7):5-9.
[6] 鄭平,李英.基于Ethernet的全開放工業(yè)控制網(wǎng)絡(luò)[J].工業(yè)儀表與自動化裝置,2001(3):6-9.
[7] 吳欽偉.工業(yè)儀表與裝置智能化網(wǎng)絡(luò)化的進(jìn)展[J].自動化博覽,2003(18):1-6.