通訊程序理解_第1頁
通訊程序理解_第2頁
通訊程序理解_第3頁
通訊程序理解_第4頁
通訊程序理解_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、通訊程序理解 本程序中的通訊部分以103規(guī)約為規(guī)則,通過C語言編程實(shí)現(xiàn)控制系統(tǒng)與DSP控制板之間的通訊,并且將控制系統(tǒng)(即上位機(jī)操作)作為鏈路層主站,DSP控制板為鏈路層子站,遵照103規(guī)約,建立通訊聯(lián)系,這是一種非平衡的傳輸方式,即控制系統(tǒng)一般作為啟動(dòng)站,而DSP控制板一般作為從動(dòng)站。在通訊過程中,數(shù)據(jù)信息以幀的形式傳遞,按照幀長(zhǎng)是否可變分為固定長(zhǎng)幀和可變長(zhǎng)幀,一般情況下,復(fù)位,請(qǐng)求,響應(yīng)幀(確認(rèn)幀,忙幀,無所請(qǐng)求的數(shù)據(jù)幀等)都為固定幀長(zhǎng),在103規(guī)約中,每一個(gè)固定幀都有其特定的格式,詳情請(qǐng)參考103規(guī)約。固定幀長(zhǎng)幀的格式如下圖: 其中啟動(dòng)字符和結(jié)束字符為固定值,控制域和地址域攜帶本次上傳或

2、下傳的簡(jiǎn)單信息;傳輸順序?yàn)橄鹊秃蟾撸硗庑枰⒁獾氖?,幀與幀的傳輸之間線路空閑間隔至少為33位,而字符之間不需要線路空閑間隔;可變幀長(zhǎng)一般用來傳輸數(shù)據(jù)信息,其幀長(zhǎng)不固定,其中的控制域和地址域與固定長(zhǎng)幀的含義并無差別。但是需要注意的是,可變長(zhǎng)幀的報(bào)文頭是固定的,這對(duì)于校驗(yàn)非常重要,這是可變幀長(zhǎng)幀校驗(yàn)必不可少的校驗(yàn)對(duì)象,其之所以可變就是就是指的鏈路用戶數(shù)據(jù)。其格式如下圖所示: 應(yīng)用服務(wù)數(shù)據(jù)為可變長(zhǎng)度的信息集合,信息集合的應(yīng)用場(chǎng)合由類型標(biāo)志,命令類型等確定,應(yīng)用服務(wù)數(shù)據(jù)單元的格式如下,關(guān)于詳細(xì)內(nèi)容請(qǐng)參考103公約:地址域長(zhǎng)度為一個(gè)字節(jié),其高四位是發(fā)送方的地址,低四位為接收方的地址??刂朴蛑性谏蠈酉蛳?/p>

3、層和下層向上層的過程中所表示的含義有差別,具體參照103公約,其控制與的格式如下圖: 注:其中分為兩部分的空格中,上面的一部分表示從上層到下層傳輸時(shí)的含義,下面的一部分表示下層到上層傳輸是的含義。個(gè)人認(rèn)為FCB較難理解,這里稍加闡釋。上層向下層傳輸報(bào)文時(shí),將FCB取相反的的值,上層為下層保存一個(gè)FCB的備份,若超時(shí)未收到所期望的報(bào)文,或出現(xiàn)差錯(cuò),則上層控制系統(tǒng)不改變FCB的狀態(tài),重傳該報(bào)文,最多3次,如果3次以內(nèi)上層收不到下層的確定或響應(yīng)信息,則表示通訊故障。ASDU的類型有很多,每一種類型對(duì)應(yīng)著一種數(shù)據(jù)格式,這在103規(guī)約中有明確規(guī)定,這里只介紹下一般命令型。個(gè)人認(rèn)為一般命令型較為復(fù)雜,其余

4、較易理解,這里就不在一一解釋。一般命令型的格式如下: 序號(hào)說明1類型標(biāo)志TYP:01H2傳送原因COT(見4.1.2)3命令類型FUN(見4.1.3)4附加信息SIN其中附加信息在這里要詳加解釋,其每種命令類型對(duì)應(yīng)的含義如下表: 命令類型FUN附加信息SIN含義查詢定值<20H>27 定值區(qū)域編號(hào) 20定值區(qū)域切換<30H>27 切換后的定值區(qū)號(hào) 20請(qǐng)求啟動(dòng)記錄說明<51H>27 記錄表中的序號(hào) 20請(qǐng)求故障記錄說明<52H>27 記錄表中的序號(hào) 20其他00H無意義以下是對(duì)我們的程序的分析:1. 變量定義和結(jié)構(gòu)體構(gòu)造變量包括通訊口狀態(tài),鏈路層

5、通訊地址,校驗(yàn)信息,錯(cuò)誤碼定義,命令,功能碼,類型標(biāo)志,傳送原因等,對(duì)于結(jié)構(gòu)體,首先建立數(shù)據(jù)應(yīng)用層結(jié)構(gòu),應(yīng)用服務(wù)數(shù)據(jù)單元接收部分具體結(jié)構(gòu)如下: 一個(gè)完整的數(shù)據(jù)包由多個(gè)ASDU(應(yīng)用服務(wù)數(shù)據(jù)單元)組成,每個(gè)ASDU包含在一個(gè)數(shù)據(jù)幀中 struct inasdu_data unsigned char uAsduType; /ASDU類型標(biāo)志 unsigned char uCmdType; /命令類型 unsigned char uFrmCount; /組成一個(gè)數(shù)據(jù)包的幀總數(shù) unsigned char uFrmIndex; /數(shù)據(jù)包中的當(dāng)前幀序號(hào) unsigned char uData10255;

6、 /構(gòu)成當(dāng)前ASDU的字符數(shù)組,其中uData幀序號(hào)0作為有效數(shù)據(jù)計(jì)數(shù)器使用 unsigned char uValidFlag; /0 ASDU不可用;1 ASDU可用;應(yīng)用服務(wù)數(shù)據(jù)單元發(fā)送部分與之類似。 緊接著是鏈路層結(jié)構(gòu):串口狀態(tài)數(shù)據(jù),數(shù)據(jù)發(fā)送之前全部放置在該結(jié)構(gòu)體的數(shù)據(jù)中struct com_data unsigned char uComState; /串口狀態(tài) unsigned char uTimeOut; /通訊超時(shí)次數(shù) unsigned char uDataIndex; /數(shù)據(jù)區(qū)位置索引。接收狀態(tài)時(shí)候該值為0,程序中將其加1,表示從第一個(gè)數(shù)開始存放,存放1個(gè)就將該寄存器加1,最后放

7、入在COM.uInData0中;發(fā)送的時(shí)候該值為1,表示直接發(fā)需要傳送的數(shù)據(jù),發(fā)完一個(gè)數(shù)再加1 unsigned char uInData255; /輸入數(shù)據(jù)區(qū),其中COM.uInData0作為有效數(shù)據(jù)計(jì)數(shù)器使用 unsigned char uOutData255; /輸出數(shù)據(jù)區(qū),其中COM.uOutData0作為有效數(shù)據(jù)計(jì)數(shù)器使用 unsigned char uACDFlag; /故障時(shí)間標(biāo)志位 unsigned char uFCBFlag; /幀計(jì)數(shù)位 unsigned char uRadFlag; /廣播標(biāo)志位 unsigned char uSourceAddr; /請(qǐng)求源地址 unsi

8、gned char uDestinAddr; /目的地址;2. 分析各個(gè)重要子函數(shù):l void LPDU_Analyze();此子函數(shù)的功能是鏈路層數(shù)據(jù)分析及提取,也就是com數(shù)組中的一幀數(shù)據(jù)進(jìn)行處理判斷。首先提取這個(gè)數(shù)據(jù)幀的長(zhǎng)度,進(jìn)而判斷該數(shù)據(jù)幀是固定幀還是可變幀長(zhǎng)幀,在103規(guī)約中,固定幀的幀長(zhǎng)是5個(gè)字節(jié),所以很容易判斷是否為固定幀(因?yàn)榭勺儙L(zhǎng)的報(bào)文頭加上各種標(biāo)志就已經(jīng)7個(gè)字節(jié),所以可以排除5個(gè)字節(jié)的可變幀長(zhǎng)幀的干擾),根據(jù)判斷結(jié)果提取出對(duì)應(yīng)的控制域信息,COM.uInData2對(duì)應(yīng)的是固定幀的控制域數(shù)據(jù),而COM.uInData5對(duì)應(yīng)著可變幀長(zhǎng)幀的控制域信息,這個(gè)由103公約決定,上

9、述格式中已經(jīng)說明。緊接著判斷對(duì)應(yīng)控制域的計(jì)數(shù)有效位是否有效,至于為什么將控制域數(shù)據(jù)與0x10進(jìn)行&運(yùn)算就可以判斷是否有效?請(qǐng)參照前文所述的控制域格式。在計(jì)數(shù)有效位即FCV位有效后,(uCtlCode&0x20)!=0)用來判斷計(jì)數(shù)位的值,將聲明的FCB標(biāo)志位即uFCBFlag取與之相反的值,至于原因,前文已經(jīng)講到。在取到uFCBFlag的值以后,在判斷DSP是否將計(jì)數(shù)位變位,如果變位則表示數(shù)據(jù)傳輸成功,進(jìn)而提取功能碼,否則重傳數(shù)據(jù)。uFrmType=uCtlCode&0x0F;即提取到了功能碼;然后利用switch語句對(duì)功能碼進(jìn)行判斷;每個(gè)功能碼的數(shù)值由103公約決定,

10、在變量初始化中已經(jīng)用define語句進(jìn)行定義。Switch中的語句都較為簡(jiǎn)單,在理解上文的基礎(chǔ)上且在源程序中已經(jīng)進(jìn)行詳細(xì)解釋,在這里就不在詳加贅述。在該子程序的最后有判斷數(shù)據(jù)是否有效的程序,分別是對(duì)故障標(biāo)志位和ACD位進(jìn)行判斷,如果條件成立則進(jìn)行事件記錄。l void ASDU_Extract();這個(gè)子函數(shù)的功能是從接收的數(shù)據(jù)中提取應(yīng)用服務(wù)數(shù)據(jù)。首先要得到應(yīng)用服務(wù)數(shù)據(jù)的總長(zhǎng),至于為什么減2?是因?yàn)長(zhǎng)即總長(zhǎng)包括控制域信息和地址域信息,這個(gè)上文中的可變幀長(zhǎng)幀格格式中可以清楚地看到。緊接著得到ASDU類型標(biāo)志和命令類型。然后利用switch語句對(duì)各種類型的ASDU進(jìn)行相對(duì)應(yīng)的操作。switch語句

11、中的大部分語句容易理解,就不再解釋,但我認(rèn)為以下部分需要深刻理解: case ASDU3_SETSLIST: /用戶定值 InAsdus.uFrmCount=COM.uInData10; InAsdus.uFrmIndex=COM.uInData11; 看到這個(gè)我想很多人不明白,為什么COM數(shù)組中的第10和第11個(gè)跟別表示幀總數(shù)和當(dāng)前幀數(shù)呢?其實(shí)如果仔細(xì)看前文,這個(gè)問題已經(jīng)解決過了,在鏈路層數(shù)據(jù)的前個(gè)字節(jié)是各種鏈路規(guī)約的信息,而服務(wù)層中如果是整定值列表則第個(gè)和第個(gè)字節(jié)分別表示總幀數(shù)和當(dāng)前幀數(shù),詳見鏈路層結(jié)構(gòu)體。至此我想已經(jīng)解釋清楚這個(gè)問題了。 在switch語句執(zhí)行完之后,接著就是保存剛剛提取

12、出來的當(dāng)前幀數(shù),然后保存應(yīng)用服務(wù)數(shù)據(jù)的總長(zhǎng),緊接著利用for循環(huán),將接收到的數(shù)據(jù)提取出來。接下來就是判斷當(dāng)前幀數(shù)是否為總幀數(shù),若成立則置位ASDU有效位,否則清零該位。l void ASDU_Analyze();這個(gè)子函數(shù)的功能是分析提取出來的數(shù)據(jù)信息。首先提取應(yīng)用服務(wù)數(shù)據(jù)信息中的傳送原因和命令類型,至于為什么是數(shù)組中的第2和第3個(gè)數(shù)據(jù),上文中的應(yīng)用服務(wù)單元的格式已說明。然后就是利用switch語句對(duì)ASDU的每一種類型進(jìn)行相對(duì)應(yīng)的處理,InAsdus.uAsduType在void ASDU_Extract()中已經(jīng)提取出來。對(duì)于每個(gè)ASDU類型都有與其相對(duì)應(yīng)的數(shù)據(jù)格式,詳情請(qǐng)看103規(guī)約,這

13、里的switch語句內(nèi)的程序有幾個(gè)地方較為復(fù)雜,現(xiàn)在就來一一分析。 case ASDU1_COMMAND: uSIN=InAsdus.uData04; ASDU_01_Command_Execute(uFUN,uSIN); 如果是一般命令類型,則進(jìn)入到命令類型的詳細(xì)程序中去。uSIN得到的是附加信息,用來判斷該命令是一般命令類型中的哪一種。其對(duì)應(yīng)含義在前文中已經(jīng)講明。 case ASDU3_SETSLIST: 整定值下載命令 首先提取定值區(qū)號(hào),然后提取總幀數(shù)。在將計(jì)數(shù)變量歸零之后利用for循環(huán)提取全部定值。最后組裝整定值,為后續(xù)程序做準(zhǔn)備。 case ASDU11_CFMCMD: 定值與控制頻

14、率修改執(zhí)行 首先判斷InAsdus.uData04的值,根據(jù)值的不同進(jìn)行相對(duì)應(yīng)的操作,在這種ASDU類型下,InAsdus.uData04表示的含義在103規(guī)約中已做規(guī)定。其余部分較易理解。 注:未提到的數(shù)據(jù)類型較易理解,就不在詳加贅述。 在該子程序最后另InAsdus.uValidFlag=0,即清零標(biāo)志位。防止該數(shù)據(jù)再被利用。l char LPDU_Check();此子函數(shù)的功能是鏈路層數(shù)據(jù)的校驗(yàn)。首先利用switch語句判斷是固定幀還是可變幀長(zhǎng)幀,分別對(duì)應(yīng)必備的校驗(yàn)內(nèi)容,其校驗(yàn)內(nèi)容由103規(guī)約決定。對(duì)于可變幀長(zhǎng)幀:先檢驗(yàn)起始符是否正確,103規(guī)約中規(guī)定可變幀長(zhǎng)幀的起始符為0x68。接著判

15、斷幀的第二個(gè)字節(jié)與第三個(gè)字節(jié)是否相等,在程序中就是:if (COM.uInData2!=COM.uInData3)在可變幀長(zhǎng)幀的格式中第二個(gè)和第三個(gè)字節(jié)都是總幀長(zhǎng)的地址,所以判斷這兩個(gè)字節(jié)是否相等可起到校驗(yàn)作用。緊接著是提取用戶數(shù)據(jù)的總長(zhǎng)度,uAsduLen=COM.uInData2-2,后面的減2是因?yàn)長(zhǎng)包括一個(gè)字節(jié)的地址域數(shù)據(jù)和一個(gè)字節(jié)的控制域數(shù)據(jù)。緊接著提取目的地址和源地址,地址域數(shù)據(jù)的高4位是源地址即主站地址,低4位是目的地址即子站地址,提取之后判斷子站地址是否為DSP板的地址。緊接著校驗(yàn)校驗(yàn)和,校驗(yàn)和包括地址域,控制域數(shù)據(jù)及所有數(shù)據(jù)之和,可變幀的最后一個(gè)字節(jié)所存位校驗(yàn)和,將得到的校驗(yàn)

16、和與之相比較,相等則正確,否則數(shù)據(jù)錯(cuò)誤。最后校驗(yàn)結(jié)束支付是否正確,可變幀長(zhǎng)幀的結(jié)束字符是0x16。至此可變幀長(zhǎng)幀的校驗(yàn)已經(jīng)結(jié)束。下面開始討論固定幀的校驗(yàn),首先提取主站地址和子站地址,地址域數(shù)據(jù)的結(jié)構(gòu)與可變幀長(zhǎng)幀的結(jié)構(gòu)相同。接著判斷子站地址是否為我們的DSP控制板的地址。固定幀長(zhǎng)的校驗(yàn)和只有地址域數(shù)據(jù)和控制域數(shù)據(jù)的和,將所得的校驗(yàn)和與已經(jīng)存在的較驗(yàn)和進(jìn)行校驗(yàn),判斷數(shù)據(jù)是否有效。最后判斷固定幀的結(jié)束符是否正確,103規(guī)約中規(guī)定固定幀的結(jié)束符為0x16。在這里我想解釋一下固定幀長(zhǎng)為什么沒有校驗(yàn)起始符?其實(shí)起始符已經(jīng)利用switch語句進(jìn)行判斷,如果起始符不正確根本進(jìn)不來校驗(yàn)其他部分,而可變幀長(zhǎng)幀之所

17、以有校驗(yàn)其起始符的步驟是因?yàn)榭勺儙L(zhǎng)幀的格式規(guī)定第一個(gè)字節(jié)和第4個(gè)字節(jié)都是起始符即0x68,在switch中已經(jīng)檢驗(yàn)第一個(gè)起始符了,而固定幀長(zhǎng)幀的起始符只有1一個(gè),即第一個(gè)字節(jié),其實(shí)switch(COM.uInData1)是優(yōu)先級(jí)最高的校驗(yàn)??傊痪湓?,對(duì)于不同幀的校驗(yàn)內(nèi)容由其特殊格式?jīng)Q定。到這里我想這個(gè)子函數(shù)已經(jīng)解釋清楚了。l void Communicate();此子函數(shù)的功能是中斷中使用的通訊程序。利用switch語句判斷端口狀態(tài)并對(duì)其各個(gè)狀態(tài)進(jìn)行相對(duì)應(yīng)的得操作。當(dāng)端口狀態(tài)處于發(fā)送狀態(tài)時(shí),判斷發(fā)送緩沖寄存器是否準(zhǔn)備就緒,當(dāng)SCICTL2寄存器中的最高位即TXRDY為1時(shí),表示SCITXB

18、UF準(zhǔn)備好接收下一組發(fā)送的數(shù)據(jù)。這里需要注意的是,該模式下串口一次只能發(fā)送一個(gè)數(shù)據(jù),這樣for語句應(yīng)該就可以理解為什么是只能循環(huán)一次了。將要發(fā)送的數(shù)據(jù)送給串口緩沖區(qū),然后利用if語句進(jìn)行發(fā)送過程是否結(jié)束的判斷,如果數(shù)據(jù)發(fā)送完畢,或者發(fā)送到最后一個(gè)就結(jié)束,其判斷語句用C語言的或運(yùn)算符表示如下:if(COM.uDataIndex>=COM.uOutData0|COM.uDataIndex>=254) COM.uOutData0中存放的是一幀數(shù)據(jù)中的字節(jié)總數(shù)。如果發(fā)送完畢則將端口狀態(tài)置為等待狀態(tài),否則字節(jié)計(jì)數(shù)變量自加1。如果端口狀態(tài)為等待狀態(tài)則直接跳出switch語句。下面來討論端口狀態(tài)為接收狀態(tài)的情況,首先提取位置區(qū)索引的值,當(dāng)處于接收狀態(tài)時(shí),該值為0。緊接著判斷接收緩沖寄存器是否準(zhǔn)備就緒,SCI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論