摘 要: 為了將單片機(jī)加入到SIEMENS S7-200系列PLC的PPI(點(diǎn)對(duì)點(diǎn)協(xié)議)通信網(wǎng)絡(luò)中,,就需要分析PPI通信協(xié)議格式。本文利用CommMonitor6.0(串口監(jiān)視精靈)工具,,監(jiān)控PLC與PLC之間的通信,,通過(guò)總結(jié)分析出其數(shù)據(jù)格式,然后編寫相應(yīng)的單片機(jī)C51程序,,使PLC能夠使用NetR/NetW(網(wǎng)絡(luò)讀寫命令)與單片機(jī)進(jìn)行數(shù)據(jù)交換,。
關(guān)鍵詞: PLC;單片機(jī),;PPI,;NetR;NetW
在工業(yè)控制領(lǐng)域,,可編程邏輯控制器PLC(Programmable Logic Controller)以其可靠性高,、抗干擾能力強(qiáng),通用性強(qiáng),、靈活性好,、功能齊全、編程簡(jiǎn)單,、使用方便以及安裝簡(jiǎn)便等特點(diǎn)而得到了廣泛的應(yīng)用?,F(xiàn)代工業(yè)控制系統(tǒng)大都向著分散化、網(wǎng)絡(luò)化和智能化方向發(fā)展,,如何實(shí)現(xiàn)現(xiàn)場(chǎng)分散的控制設(shè)備的網(wǎng)絡(luò)通信十分重要,。
西門子公司的S7-200系列PLC支持PPI、MPI,、Profibus和自由口通信等多種通信方式,。采用MPI協(xié)議需要相應(yīng)的CP卡或MPI卡支持,如CP5511通信卡,;若采用Profibus協(xié)議,,則需要Profibus-DP模塊EM277;若采用自由口方式,,則在PLC中需要編寫通信程序,,占用PLC有限的程序存儲(chǔ)空間,同時(shí)也難以保證在惡劣復(fù)雜環(huán)境下通信數(shù)據(jù)的正確可靠性,;若采用PPI協(xié)議,,只需在整個(gè)通信網(wǎng)絡(luò)中選定1個(gè)PLC作為通信主站點(diǎn),其他PLC都作為從站點(diǎn),,主站PLC通過(guò)NetR/NetW指令周期性地與從站PLC進(jìn)行數(shù)據(jù)交換,,這種通信方式非常簡(jiǎn)單可靠,得到了廣泛的應(yīng)用,。
在實(shí)際應(yīng)用中通常又需要PLC能夠與其他設(shè)備通信,,本文以單片機(jī)串口通信為例,詳細(xì)地分析了NetR/NetW指令的通信流程與數(shù)據(jù)格式,,并設(shè)計(jì)出了單片機(jī)串口通信協(xié)議,,使PLC能夠使用NetR/NetW指令與單片機(jī)通信。
1 S7-200系列PLC網(wǎng)絡(luò)讀寫指令分析
1.1 PPI協(xié)議簡(jiǎn)介
PPI是西門子公司專門為S7-200系列PLC開發(fā)的通信協(xié)議,,內(nèi)置于S7-200 CPU中,。PPI物理上基于RS485接口,通過(guò)屏蔽雙絞線就可以實(shí)現(xiàn)PPI通信,,是一種主-從通信協(xié)議,。主站設(shè)備發(fā)送要求到從站設(shè)備,從站設(shè)備響應(yīng),,從站本身不能主動(dòng)發(fā)出信息,。為了進(jìn)行PPI通信,S7-200系列PLC專門配備了網(wǎng)絡(luò)讀指令及網(wǎng)絡(luò)寫指令,,使用STEP 7-Micro WIN中的NetR/NetW Wizard可以很方便地配置網(wǎng)絡(luò)通信,。使用該向?qū)Э梢跃庉嬜疃?4條網(wǎng)絡(luò)讀寫指令,每條網(wǎng)絡(luò)讀寫指令最多能夠讀或者寫16 B的數(shù)據(jù),。其核心是使用順序控制指令,,這樣在任一時(shí)刻只有一條NetR/NetW指令有效。在主程序中必須用SM0.0指令來(lái)調(diào)用該向?qū)傻淖映绦?,以保證它的正常運(yùn)行,。該子程序有3個(gè)參數(shù):
?。?)Timeout(超時(shí))。0為不計(jì)時(shí),;1-36767為設(shè)置以秒為單位的超時(shí)延時(shí)時(shí)間,。如果通信有問(wèn)題的時(shí)間超出此延時(shí)時(shí)間,則會(huì)報(bào)告錯(cuò)誤,。
?。?)Cycle(周期)。所有網(wǎng)絡(luò)讀/寫操作每完成一次切換狀態(tài),。
?。?)Error(錯(cuò)誤)。0為無(wú)錯(cuò)誤,;1為出錯(cuò),,通過(guò)檢查NetR/NetW指令緩沖區(qū)狀態(tài)字節(jié),可以獲取錯(cuò)誤代碼,。
1.2 PPI協(xié)議數(shù)據(jù)幀分析
利用CommMonitor6.0工具監(jiān)控單主站PLC之間的通信,,可以獲得4種不同的數(shù)據(jù)幀。
?。?)令牌幀:SD1,,DA SA;
?。?)無(wú)數(shù)據(jù)字段的固定長(zhǎng)度的請(qǐng)求幀或應(yīng)答幀:SD2,,DA SA FC FCS ED;
?。?)有可變數(shù)據(jù)字段的請(qǐng)求或應(yīng)答幀:SD3,,LE LER SD3 DA SA FC DU FCS ED;
?。?)短應(yīng)答幀:SC,。
SD1~SD3為開始定界符,以區(qū)別不同類型的幀格式,,SD1=0xDC,,SD2=0x10,SD3=0x68,;LE=LER,,表示從DA至DU的數(shù)據(jù)長(zhǎng)度;DA為目的地址,,指示接收該幀的站,;SA為源地址,指示發(fā)送該幀的站,;FC為幀控制字節(jié),,包含用于該幀服務(wù)和優(yōu)先權(quán)等的詳細(xì)說(shuō)明,;DU為數(shù)據(jù)字段,包含有效的數(shù)據(jù)信息,;FCS為幀校驗(yàn)字節(jié),,表示從DA到DU之間的校驗(yàn)和的256余數(shù);ED為幀結(jié)束定界符(0x16),;SC為單一字符(0xE5),用于從站的確認(rèn),。
當(dāng)系統(tǒng)主站PLC上電運(yùn)行后,,在一定時(shí)間(即用戶所設(shè)定的Timeout時(shí)間內(nèi))會(huì)進(jìn)行通信網(wǎng)絡(luò)初始化,首先生成令牌并初始化令牌環(huán),,由于是單主站系統(tǒng),,該主站將會(huì)一直持有該令牌。接著主站就會(huì)不斷地搜索它管轄范圍的從站,,通常從用戶所配置的第一條NetR/NetW指令的從站地址開始,,搜索范圍也由用戶設(shè)定(一般為0~31)。主站首先發(fā)送請(qǐng)求幀10 DA SA FC FCS ED (FC功能碼為49H,,表示有回答要求的從站狀態(tài)查詢),,從站正確接收到后將發(fā)送響應(yīng)幀10 SA DA FC FCS ED (FC功能碼為00H,表示應(yīng)答肯定),。接著主站繼續(xù)搜索下一個(gè)從站,,一定時(shí)間內(nèi)如果沒有從站響應(yīng),則將繼續(xù)進(jìn)行下一個(gè)網(wǎng)絡(luò)地址搜索,。主站PLC一直重復(fù)循環(huán)此過(guò)程,,并將從站狀態(tài)信息記錄下來(lái),直到Timeout時(shí)間到,,主站才開始真正執(zhí)行由用戶所配置NetR/NetW操作,。
1.3 NetR指令分析
由NetR/NetW指令向?qū)?/strong>創(chuàng)建的指令,最多只能讀取16 B的信息,,而且指令是順序執(zhí)行的,,完成一條讀指令需要兩次數(shù)據(jù)收發(fā)。在測(cè)試過(guò)程中,,設(shè)定主站PLC地址為01,,從站PLC地址為02,主站從PLC從站的VB100~VB115存儲(chǔ)區(qū)讀取16 B的通信過(guò)程如下:
返回的有用數(shù)據(jù)為第25~第40字節(jié)的共16 B,,第41字節(jié)為第4~第40字節(jié)的數(shù)據(jù)的校驗(yàn)和,,而且第11、12字節(jié)的數(shù)據(jù)必須與主站讀命令的第11,、12字節(jié)保持一致,。
這樣經(jīng)過(guò)兩次收發(fā)數(shù)據(jù),,才能正確完成一次數(shù)據(jù)的讀操作。
1.4 NetW指令分析
?。?)首先主站PLC發(fā)出寫命令,,數(shù)據(jù)格式為:68 2F 2F 68 02 01 6C 32 01 00 00 02 02 00 0E 00 14 05 01 12 0A 10 02 00 10 00 01 84 00 03 20 00 04 00 80 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 30 16。其中,,第6,、11、12字節(jié)數(shù)據(jù)規(guī)則與NetR命令一致,,第51字節(jié)數(shù)據(jù)為校驗(yàn)和,,第35~50字節(jié)的數(shù)據(jù)為真正的要寫入從站的有用數(shù)據(jù)。
?。?)從站PLC正確接收后,,則作出響應(yīng),返回E5,。
?。?)主站接收到此響應(yīng)后,則發(fā)出確認(rèn)寫命令10 02 01 5C 5F 16,,第3字節(jié)數(shù)據(jù)規(guī)則與NetR命令一致,。
(4) 從站接收到確認(rèn)寫命令后,,返回確認(rèn)命令 68 12 12 68 01 02 08 32 03 00 00 02 02 00 02 00 01 00 00 05 01 FF 4C 16,。第11、12字節(jié)數(shù)據(jù)與主站寫命令應(yīng)保持一致,,這樣收發(fā)兩次數(shù)據(jù),,才能完成一次數(shù)據(jù)的寫操作。
2 單片機(jī)串口通信協(xié)議設(shè)計(jì)
2.1 串口通信方式選擇
PPI協(xié)議物理上采用RS485標(biāo)準(zhǔn),,每個(gè)字符擴(kuò)展成11 bit,,采用NRZ(不歸零)編碼。首先是1 bit開始位,,它總是二進(jìn)制“0”,,接著是8 bit信息位,之后是1 bit奇偶校驗(yàn)位(PPI協(xié)議規(guī)定為偶檢驗(yàn)),,最后是1 bit停止位,,它總是二進(jìn)制“1”。
因此,,應(yīng)將單片機(jī)串口通信設(shè)置為工作方式3:9 bit UART通信模式,,8 bit數(shù)據(jù)位與1 bit奇偶檢驗(yàn)位,奇偶校驗(yàn)方式使用偶校驗(yàn);定時(shí)器1用作波特率發(fā)生器,,選擇工作方式2,,8 bit自動(dòng)重裝模式,在這里使用9 600 b/s波特率,,由式(1),、(2)計(jì)算可得,TL1=0xFD,。
baudrate=2SMOD×T1溢出率/32(1)
T1溢出率=fosc/(12×(256-TL1))(2)
串口通信初始化程序:
TMOD|=0x20,;
//定時(shí)器1選擇方式2,8 bit自動(dòng)重裝模式
TH1=0xFD,;
TL1=0xFD,;
PCON &=0x7F; //SMOD=0,,波特率不加倍
SCON=0xD0,; //串口通信選擇方式3,,9 bit UART模式,,8 bit數(shù)據(jù)位,1 bit校驗(yàn)位
TR1=1,;
2.2 接收信息起始條件和結(jié)束條件選擇
在串口通信過(guò)程中,,單片機(jī)有可能從一個(gè)字符的中間開始接收字符,從而導(dǎo)致校驗(yàn)錯(cuò)誤和接收信息功能終止,,為避免出現(xiàn)此類問(wèn)題,,就需要在接收開始前,對(duì)信息的起始和結(jié)束條件進(jìn)行定義,。
由于PLC會(huì)發(fā)送3種不同類型的數(shù)據(jù)幀,,并且單片機(jī)需要及時(shí)做出正確的響應(yīng),因此,,單片機(jī)在接收到不同的數(shù)據(jù)幀時(shí)應(yīng)作出不同的響應(yīng),。單片機(jī)采用中斷的方式接收數(shù)據(jù),而由于在PPI協(xié)議中,,并沒有固定的起始字符,,經(jīng)過(guò)分析,采用斷點(diǎn)檢測(cè)的方法來(lái)作為接收起始條件,。斷點(diǎn)是指在小于一個(gè)完整字符傳輸時(shí)間的一段時(shí)間內(nèi),,接收數(shù)據(jù)一直為0,只有在斷點(diǎn)之后接收到的字符才會(huì)存入到信息緩沖區(qū),,任何在斷點(diǎn)之前接收到的字符都被忽略,。一個(gè)完整字符傳輸時(shí)間定義為傳輸起始位、數(shù)據(jù)位、校驗(yàn)位和停止位的時(shí)間總和,。在本系統(tǒng)中,,通信波特率為9 600 b/s,因此傳輸一個(gè)完整的字符(11 bit)時(shí)間為t=11/9 600,,即為1.145 83 ms,,為了方便,斷點(diǎn)檢測(cè)時(shí)間可以設(shè)定為2 ms,。
信息結(jié)束采用字符間隔定時(shí)器的方式來(lái)判斷一條信息的結(jié)束,。字符間隔時(shí)間是指從一個(gè)字符的結(jié)尾(停止位)到下一個(gè)字符的結(jié)尾(停止位)之間的時(shí)間。在數(shù)據(jù)傳輸過(guò)程中,,如果兩個(gè)字符之間的時(shí)間間隔超過(guò)了所設(shè)定的時(shí)間,,則表示這條信息接收完成。由于定時(shí)器總是包含接收一個(gè)完整字符的時(shí)間,,因此該時(shí)間值應(yīng)設(shè)置為大于在指定波特率下傳輸一個(gè)字符的時(shí)間(在此為1.145 83 ms),,在這里設(shè)置為2 ms。單片機(jī)在每接收到一個(gè)字符后,,都要重啟字符間隔定時(shí)器,,如果超時(shí),則表示信息接收完成,。
由于單片機(jī)硬件資源有限,,只提供2個(gè)定時(shí)器,定時(shí)器1用作波特率發(fā)生器,,斷點(diǎn)檢測(cè)和字符間隔定時(shí)器的時(shí)間都為2 ms,,因此可以共用定時(shí)器0。為了計(jì)算方便,,定時(shí)器0選擇工作方式1(16 bit定時(shí)器),,初值為TH0=0xFF,TL0=0xFD,。
2.3數(shù)據(jù)字符檢驗(yàn)程序
接收校驗(yàn)程序如下:
ACC=SBUF,;
if(RB8==P)
{
rxd_buf[rxd_count]=ACC; //暫存到接收緩沖區(qū)
rxd_count++,;
}
else //接收校驗(yàn)錯(cuò),,則需要重新開始接收
{
rxd_en=0; //停止接收標(biāo)志
rxd_count=0,;
return,;
}
發(fā)送校驗(yàn)程序如下:
ACC=txd_buf[txd_count];
TB8=P,;
SBUF=txd_buf[txd_count],;
單片機(jī)在接收到一條完整的信息后,,首先會(huì)進(jìn)行數(shù)據(jù)幀分析,通過(guò)比較,,判斷主站PLC發(fā)送的數(shù)據(jù)幀類型,,并對(duì)判斷正確的請(qǐng)求幀給予正確的響應(yīng),返回給PLC正確的數(shù)據(jù)格式,。使用Keil開發(fā)工具編寫C51程序代碼,,采用結(jié)構(gòu)化程序設(shè)計(jì)思想,程序流程圖如圖1所示,。
3 結(jié)果驗(yàn)證
最后通過(guò)通信測(cè)試驗(yàn)證,,PLC主站能夠使用NetR/NetW指令很方便地讀取單片機(jī)的數(shù)據(jù)或向單片機(jī)寫入給定的數(shù)據(jù)。而且在具有多個(gè)PLC從站的PPI網(wǎng)絡(luò)中,,通過(guò)設(shè)定不同從站地址,,將多個(gè)單片機(jī)接入到該網(wǎng)絡(luò)中,作為主站的PLC也能夠正常地訪問(wèn)各個(gè)從站PLC與單片機(jī)從站,,它們之間的通信穩(wěn)定可靠,,且互不影響,這也為以后在PPI網(wǎng)絡(luò)中擴(kuò)展其他智能設(shè)備提供了可行性,。
參考文獻(xiàn)
[1] 張揚(yáng),,蔡春偉,孫明建.S7-200 PLC原理與應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:機(jī)械工業(yè)出版社,,2007.
[2] 孫鶴旭,,梁濤,,云利軍.Profibus現(xiàn)場(chǎng)總線控制系統(tǒng)的設(shè)計(jì)與開發(fā)[M].北京:國(guó)防工業(yè)出版社,,2007.
[3] 馬忠梅,籍順心,,張凱,,等.單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2005.
[4] 廖常初.PLC編程及應(yīng)用[M].北京:機(jī)械工業(yè)出版社,,2008.