張立眾
(陜西理工大學(xué) 電氣工程學(xué)院, 陜西 漢中 723000)
?
基于Linux平臺串行通信協(xié)議DF1的C語言程序設(shè)計
張立眾
(陜西理工大學(xué) 電氣工程學(xué)院, 陜西 漢中 723000)
為了實(shí)現(xiàn)對AB可編程控制器的監(jiān)控組態(tài)提供更加經(jīng)濟(jì)和簡便的途徑,在Linux平臺下完成了串行通信協(xié)議DF1的開發(fā)。采用C語言編程和模塊化程序設(shè)計,給出了協(xié)議開發(fā)的一般方法和基本流程。運(yùn)行結(jié)果表明能夠?qū)崿F(xiàn)Linux下PC機(jī)與AB公司多數(shù)可編程控制器的通信。
Linux平臺; 串行通信; DF1協(xié)議; C語言程序
DF1協(xié)議是AB公司可編程控制器系統(tǒng)廣泛支持的數(shù)據(jù)鏈路層通信協(xié)議,各系列可編程控制器及裝有RSLinx通信軟件的計算機(jī)均支持DF1協(xié)議[1]。它的物理層建立在RS232和RS485等電氣標(biāo)準(zhǔn)之上,針對不同的設(shè)備建立不同的應(yīng)用層命令。綜合物理層、數(shù)據(jù)鏈路層和應(yīng)用層后能夠完成基于DF1協(xié)議的通信。目前使用的監(jiān)控組態(tài)較為復(fù)雜,DF1協(xié)議的相關(guān)研究在國內(nèi)尚屬空白。為了實(shí)現(xiàn)對AB可編程控制器的監(jiān)控組態(tài)提供經(jīng)濟(jì)和簡便的途徑,本文在Linux平臺下完成了DF1協(xié)議的開發(fā),可與AB公司多數(shù)可編程控制器通信。本次設(shè)計給出了模塊化編程的協(xié)議開發(fā)步驟和Linux下DF1協(xié)議開發(fā)的完整源代碼,由于Linux操作系統(tǒng)具有優(yōu)越的可移植性,可以方便地把本程序移植到嵌入式系統(tǒng)中,使開發(fā)具有DF1協(xié)議接口的節(jié)點(diǎn)變得更快捷??蓱?yīng)用于實(shí)際設(shè)備的DF1協(xié)議接口的開發(fā),對其他協(xié)議的開發(fā)也有一定的參考價值。
1.1DF1協(xié)議簡介
DF1協(xié)議最大的特點(diǎn)是聯(lián)合了ANSI x3.28規(guī)范中的D1(數(shù)據(jù)透明性)和F1(雙向同時傳輸兼內(nèi)部響應(yīng))。數(shù)據(jù)透明性是指報文格式簡單和數(shù)據(jù)的可讀性,雙向同時傳輸兼內(nèi)部響應(yīng)是指在物理層的RXD和TXD上數(shù)據(jù)是同時傳輸?shù)亩煌谄渌麉f(xié)議里RXD和TXD是交替進(jìn)行的,當(dāng)然這主要是對全雙工而言。
DF1鏈路層協(xié)議完成如下任務(wù):
(1)從一個鏈路向另一個鏈路傳送報文,它不涉及到報文的內(nèi)容、功能和最終目的,如DF1全雙工協(xié)議所實(shí)現(xiàn)的就是在命令或應(yīng)答的結(jié)尾加上BCC或CRC校驗(yàn)碼,設(shè)備接收到命令或應(yīng)答后就進(jìn)行校驗(yàn),如果校驗(yàn)通過就返回ACK,否則返回NAK(注:在應(yīng)用層將涉及到報文的內(nèi)容、功能和最終目的);
(2)通過錯誤標(biāo)識代碼來標(biāo)識錯誤。
DF1協(xié)議主要分為兩類:DF1半雙工協(xié)議(主從通信)和DF1全雙工協(xié)議(點(diǎn)對點(diǎn)通信)。DF1半雙工主/從協(xié)議提供一種多支路單主/多從網(wǎng)絡(luò),主機(jī)通過定時輪詢從機(jī)啟動通信[2]。半雙工協(xié)議是一種支持一主多從通信方式的協(xié)議,允許2到255個節(jié)點(diǎn)通過Modems同時連接到單一鏈路上。如果只有一個從站,從站可以直接與主站相連。當(dāng)然還有其他實(shí)現(xiàn)DF1半雙工協(xié)議的途徑,例如通過1761-NET-AIC模塊組成RS485網(wǎng)絡(luò)實(shí)現(xiàn)DF1半雙工通信。
RS485是美國電氣工業(yè)聯(lián)合會(EIA)制定的利用平衡雙絞線做傳輸線的多點(diǎn)通信標(biāo)準(zhǔn)[3],采用半雙工通信方式,信號在同一時刻只能從一方流向另一方,不能雙向交流[4],接口是常見的串行通信接口之一。這里采用RS485出于以下考慮:RS232采用點(diǎn)對點(diǎn)連接,通信距離短,且采用電平傳輸模式,通信極易受到干擾;與之相比,RS485總線傳輸距離遠(yuǎn),采用差分信號傳輸,具有抗干擾能力強(qiáng)和多站點(diǎn)通信能力等優(yōu)點(diǎn)[5]。RS485收發(fā)器采用平衡發(fā)送和差分接收,共模輸出電壓在-7~+12 V之間,具有抑制共模干擾的能力[6]。RS485總線型結(jié)構(gòu)是一種用于設(shè)備聯(lián)網(wǎng)的經(jīng)濟(jì)而又傳統(tǒng)的工業(yè)總線方式,采用點(diǎn)對點(diǎn)、點(diǎn)對多點(diǎn)和廣播式通信方式。最突出之處就是結(jié)構(gòu)簡單,現(xiàn)場施工方便,省時省力,也節(jié)省線材,而且運(yùn)行狀態(tài)穩(wěn)定,故障率較低[7-9]。RS485串行接口克服了RS232傳輸距離近、傳輸速率慢等缺點(diǎn),最高傳輸速率可達(dá)到10 Mbps[10],傳輸距離可以達(dá)到120 m[11]。
本文的DF1半雙工協(xié)議就是通過RS485網(wǎng)絡(luò)實(shí)現(xiàn)的,整個RS485總線上只能有1個主設(shè)備,其余為從設(shè)備,總線可連接多達(dá)32個設(shè)備[12]。
1.2DF1協(xié)議的控制字符
DF1全雙工協(xié)議是點(diǎn)對點(diǎn)的通信協(xié)議,主要特點(diǎn)有:(1)在點(diǎn)對點(diǎn)鏈路中允許同時收發(fā)數(shù)據(jù);(2)在多支路鏈路中的交互模塊具有數(shù)據(jù)仲裁功能;(3)高性能的協(xié)議實(shí)現(xiàn)程序應(yīng)該盡可能的從傳輸媒介上獲得大的數(shù)據(jù)流量。當(dāng)通過AB通信模塊連接交互模塊時,通信模塊自動完成仲裁功能。如果系統(tǒng)對實(shí)時性要求不高則采用半雙工通信模式,反之則選用全雙工通信方式。
DF1協(xié)議采用的是異步通信方式,數(shù)據(jù)是一幀一幀地發(fā)送。DF1協(xié)議的控制字符是ASCII碼控制字符,通常由7位組成,需要在前面添加一位構(gòu)成8位數(shù)據(jù)。DF1協(xié)議就是通過組合一些控制字符,構(gòu)成特殊的控制信號和數(shù)據(jù)信號的。組成控制信號和數(shù)據(jù)信號的控制字符必須連續(xù)發(fā)送,中間不要有其他字符??刂菩盘柺枪潭ú蛔兊慕M合,而數(shù)據(jù)信號的內(nèi)容是可變的。全雙工傳送信號與半雙工傳送信號相比DLE NAK在這里沒有reset作用,DLE ENQ也不是輪詢報文開始標(biāo)識,而是要求對方重新發(fā)送的標(biāo)識。其他標(biāo)識含義同上。
半雙工傳送信號比全雙工傳送信號多出了DLE SOH(10 01)、DLE EOT(10 04)、STN等標(biāo)識。DF1全雙工主要是通過兩個主程序:發(fā)送主程序(TRANSMITTER)和接收(RECEIVER)主程序來實(shí)現(xiàn)發(fā)和收同時進(jìn)行,這就體現(xiàn)了DF1的雙向同時傳輸?shù)奶攸c(diǎn)。關(guān)于DF1全雙工的實(shí)現(xiàn)流程比較簡單,基本是一收一發(fā),發(fā)完報文后通過收到的反饋情況,來判斷是否正確執(zhí)行,若沒有則重發(fā),或顯示錯誤等操作。
1.3DF1協(xié)議的報文幀格式
1.3.1報文幀格式及其具體含義
半雙工協(xié)議使用了下面的3種報文幀格式:
(1)輪詢幀
(2)主報文幀
(3)從報文幀
全雙工協(xié)議一般只使用半雙工協(xié)議的第3種報文幀格式:從報文幀。對具體的應(yīng)用層展開如下:
上面既有命令的格式又有應(yīng)答的格式,數(shù)據(jù)是按從左向右的順序在鏈路上傳播的。
DF1協(xié)議分為物理層、數(shù)據(jù)鏈路層、應(yīng)用層。數(shù)據(jù)發(fā)送時,來自用戶應(yīng)用程序的數(shù)據(jù)傳送給應(yīng)用層,經(jīng)過應(yīng)用層數(shù)據(jù)封裝之后傳送給數(shù)據(jù)鏈路層,再經(jīng)過數(shù)據(jù)鏈路層封裝之后交給物理層傳輸。數(shù)據(jù)接收的過程與此相反[13]。
1.3.2CRC校驗(yàn)
重要說明:DF1的CRC校驗(yàn)雖然采用了CRC-16標(biāo)準(zhǔn),但它與常用的CRC-16略有不同,就是在開始時,CRC寄存器的初值為0x0000H,而不是0xFFFFH。
CRC半雙工校驗(yàn):如下報文
10 01 20 10 0208 09 06 00 10 10 04 0310 03 853ASTN DLE STXAPPDATA(DLEDLE)DLE ETX CRC
校驗(yàn)內(nèi)容=STN+STX+APP DATA+ETX=20020809060010040303,
對上面的校驗(yàn)內(nèi)容進(jìn)行上述CRC-16的校驗(yàn)過程將得到校驗(yàn)碼:853A。
CRC全雙工校驗(yàn):
10 0208 09 06 00 10 10 04 0310 03 9D30DLE STXAPP DATA(DLE DLE)DLE EXT CRC
校驗(yàn)內(nèi)容=APP DATA+ETX=0809060010040303,
對上面的校驗(yàn)內(nèi)容進(jìn)行上述CRC-16的校驗(yàn)過程將得到校驗(yàn)碼:9D30。
圖1 系統(tǒng)硬件實(shí)驗(yàn)平臺
DF1協(xié)議的開發(fā)借助羅克韋爾三層網(wǎng)絡(luò)實(shí)驗(yàn)平臺,在Linux下的PC機(jī)中進(jìn)行,和嵌入式系統(tǒng)相比PC機(jī)有著更多的開發(fā)和調(diào)試工具。半雙工硬件實(shí)驗(yàn)平臺的搭建如圖1所示。
首先完成Linux下串口編程的初始化:在Linux下所有設(shè)備是作為文件處理的,串口文件位于/dev目錄下。串口一為/dev/ttyS0,串口二為/dev/ttyS1。打開、關(guān)閉、讀寫串口都是通過使用標(biāo)準(zhǔn)的文件函數(shù)來操作。在使用串口之前必須先通過設(shè)置termios結(jié)構(gòu)體的各成員變量實(shí)現(xiàn)串口的設(shè)置,這里需要設(shè)置波特率、數(shù)據(jù)位、停止位、校驗(yàn)位。軟件開發(fā)工具使用GNU,它是Linux下的文本編輯軟件Vi和C語言編譯軟件Gcc。全部程序在Red Hat Linux 8.0中調(diào)試通過。PC機(jī)有完善的操作系統(tǒng)并提供應(yīng)用程序接口(API),開發(fā)好的應(yīng)用程序可以直接在操作系統(tǒng)上運(yùn)行。本次軟件開發(fā)采用模塊化程序設(shè)計,系統(tǒng)的軟件設(shè)計結(jié)構(gòu)如圖2所示。
圖2 系統(tǒng)的軟件設(shè)計結(jié)構(gòu)圖
(1)首先連接好計算機(jī)和Micrologix1000的DF1網(wǎng)絡(luò)。串口發(fā)送10 02 01 00 0F 00 08 52 A2 0A 07 89 00 00 10 03 8D 4D,PLC返回10 06 10 02 00 01 4F 00 08 52D0 07 E8 03 00 00 00 00 00 0010 03 5F E2。數(shù)據(jù)中“D0 07”表示N7:0為2000,“E8 03”表示N7:1為1000。
(2)顯示write B3:0。串口發(fā)送10 02 01 00 0F 00 08 54 AA 04 03 85 00 00 03 00 01 00 10 03 DB B2,PLC返回10 06 10 02 00 01 4F 00 08 54 10 03 AB 1C 10 05 10 05 10 05 10 05。
程序運(yùn)行結(jié)果如圖3和圖4所示。
圖3 讀取流程圖
圖4 寫入流程圖
本文通過對AB公司串行通信協(xié)議DF1的深入研究,解讀其數(shù)據(jù)鏈路層協(xié)議和應(yīng)用層通信命令,最終實(shí)現(xiàn)了DF1協(xié)議,從而可與AB公司大部分可編程控制器通信。DF1協(xié)議與其他類似串口協(xié)議相比功能較完備,通用性較強(qiáng),DF1協(xié)議支持全雙工高速通信模式,這是其他類似串口協(xié)議如Modbus協(xié)議所不支持的功能。除此之外DF1協(xié)議還提供了很強(qiáng)的錯誤診斷和處理功能,從而充分保證了數(shù)據(jù)傳輸?shù)臏?zhǔn)確性和完備性,完全能滿足工業(yè)復(fù)雜環(huán)境的需求。
[1]陳惠珊.DF1協(xié)議在無線通信控制系統(tǒng)的實(shí)現(xiàn)[J].工業(yè)控制計算機(jī),2007,20(7):27-29.
[2]劉鵬,孫偉,曹文.基于DF1協(xié)議的通訊在鋁廠煙氣凈化監(jiān)控系統(tǒng)中的應(yīng)用實(shí)踐[J].中國有色冶金,2006(5):39-42.
[3]郭政慧,張治斌.煤礦RS485監(jiān)控線路復(fù)用技術(shù)[J].煤礦安全,2010(2):58-60.
[4]馮梅,孫良勤,鄭民.基于RS485通訊的TD特型固化爐溫度數(shù)據(jù)系統(tǒng)[J].化工自動化及儀表,2011,38(5):608-620.
[5]王曉麗.基于RS485現(xiàn)場總線的乳化液濃度在線檢測[J].煤礦機(jī)械,2011,32(11):218-220.
[6]閆成華,周余,都思丹.基于嵌入式Linux的RS485通信協(xié)議[J].計算機(jī)工程,2008,34(11):278-280.
[7]耿立中,王鵬,馬聘,等.RS485高速數(shù)據(jù)傳輸協(xié)議的設(shè)計與實(shí)現(xiàn)[J].清華大學(xué)學(xué)報:自然科學(xué)版,2008,48(8):1311-1314.
[8]周有利.RS485總線的使用和解決方案探討[J].電腦知識與技術(shù),2009,5(5):1242-1243.
[9]弋沛琦,鞠建波,范敬澤,等.RS-485總線通信可靠性的分析與研究[J].海軍航空工程學(xué)院學(xué)報,2009,24(6):692-694.
[10]郭偉偉,馬捷中,翟正軍,等.DSP與PC機(jī)之間的數(shù)據(jù)通信研究[J].微處理機(jī),2008(29):155-157.
[11]張有清,楊文煥,王世杰,等.基于LabVIEW串行通信的變頻調(diào)速監(jiān)控系統(tǒng)[J].電機(jī)與控制應(yīng)用,2010,37(7):50-53.
[12]陳品富,劉以軍,宋春暉,等.采用自適應(yīng)召喚策略提高RS485總線上的數(shù)據(jù)傳輸效率[J].電力系統(tǒng)保護(hù)與控制,2011,39(14):133-137.
[13]何風(fēng)行,顧德英.Linux下PC機(jī)和羅克韋爾PLC的通訊[J].儀器儀表學(xué)報,2005,26(增刊8):445-449.
[責(zé)任編輯:謝 平]
Linux-based serial communication protocol DF1 of C language programming
ZHANG Li-zhong
(School of Electrical Engineering, Shaanxi Sci-Tech University, Hanzhong 723000, China)
In order to provide a more economical and convenient way to monitor and control the AB programmable controller, the development of serial communication protocol DF1 in Linux platform is completed. Using C language programming and modular programming, the general method and basic procedure of protocol development are given. The running results show that the communication between PC and AB can be realized by Linux.
Linux platform;serial communication;DF1 protocol;C language programming
1673-2944(2016)04-0017-06
2015-03-30
2015-10-15
張立眾(1969—),男,遼寧省鞍山市人,陜西理工大學(xué)講師,碩士,主要研究方向?yàn)橹悄芸刂葡到y(tǒng)、現(xiàn)場總線和工業(yè)以太網(wǎng)。
TP273
A