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

下載本文檔

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

文檔簡(jiǎn)介

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

2、驗(yàn)和(CS)結(jié)束字符(16H)其中啟動(dòng)字符和結(jié)束字符為固定值,控制域和地址域攜帶本次上傳 或下傳的簡(jiǎn)單信息;傳輸順序?yàn)橄鹊秃蟾?,另外需要注意的是,幀與 幀的傳輸之間線路空閑間隔至少為 33位,而字符之間不需要線路空 閑間隔;可變幀長(zhǎng)一般用來(lái)傳輸數(shù)據(jù)信息,其幀長(zhǎng)不固定,其中的控 制域和地址域與固定長(zhǎng)幀的含義并無(wú)差別。但是需要注意的是,可變 長(zhǎng)幀的報(bào)文頭是固定的,這對(duì)于校驗(yàn)非常重要,這是可變幀長(zhǎng)幀校驗(yàn) 必不可少的校驗(yàn)對(duì)象,其之所以可變就是就是指的鏈路用戶數(shù)據(jù)。 其 格式如下圖所示:?jiǎn)?dòng)字符(68Ht固定長(zhǎng)度的 報(bào)文頭LL (重復(fù))啟動(dòng)字符(68H控制域(C)+L個(gè)八 位位組地址域(A)鏈路用戶數(shù)據(jù)

3、(可變長(zhǎng)度)幀校驗(yàn)和(CS)結(jié)束字符(16H)應(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ā)送方的地址,低四位為接收方的地址。控制域中在上層向下層和下層向上層的過(guò)程中所表示的含義有差別,具體參照103公約,其控制與的格式如下圖:D7DeD5D4D3 D2 D1 D0控制系統(tǒng)-保護(hù)設(shè)備1幀計(jì)數(shù)位幀計(jì)數(shù)有23222120(或間隔單兀)PRM啟FCB效位FCV備用動(dòng)報(bào)文保護(hù)設(shè)備f控制系統(tǒng)位c要求訪問(wèn)數(shù)據(jù)流控下卄臺(tái)匕砒(或間隔單兀)0位 ACD制位DFC功冃匕碼注:其中分為

4、兩部分的空格中,上面的一部分表示從上層到下層傳輸 時(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ù)雜,其余較易理解,這里就不在一一解釋。一般命令型的格式 如下:序號(hào)說(shuō)明1類型標(biāo)志TYP: 0

5、1H2傳送原因COT (見(jiàn)4.1.2)3命令類型FUN (見(jiàn)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)記錄說(shuō)明<51H>27記錄表中的序號(hào)20請(qǐng)求故障記錄說(shuō)明<52H>27記錄表中的序號(hào)2°其他00H無(wú)意義以下是對(duì)我們的程序的分析: 1. 變量定義和結(jié)構(gòu)體構(gòu)造 變量包括通訊口狀態(tài),鏈路層通訊地址,校驗(yàn)信息,錯(cuò)誤碼 定義,命令,功能碼,類型標(biāo)志,傳送原因等,對(duì)于結(jié)構(gòu)體,

6、 首先建立數(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_dataunsigned char uAsduType;/ASDU類型標(biāo)志unsigned char uCmdType;/命令類型unsigned char uFrmCount;/組成一個(gè)數(shù)據(jù)包的幀總數(shù)unsigned char uFrmIndex;/數(shù)據(jù)包中的當(dāng)前幀序號(hào)unsignedchar uData10255;/構(gòu)成當(dāng)前ASDU的字符數(shù)組,其中 uData 幀序號(hào) 0 作為有效數(shù)據(jù)計(jì)數(shù)器使用unsigne

7、dchar uValidFlag; /0ASDU不可用;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ù)開(kāi)始存放,存放 1 個(gè)就 將該寄存器加 1,最后放入在 COM.uInData0 中;發(fā)送的時(shí)候該值為 1,表示直接發(fā)需要傳

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

9、;2. 分析各個(gè)重要子函數(shù):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 公約決定,上述格式中已

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

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

12、后利用switch語(yǔ)句對(duì)各種類型的ASDU進(jìn)行相對(duì)應(yīng)的操作。switch語(yǔ)句中的大部分語(yǔ)句容易 理解,就不再解釋,但我認(rèn)為以下部分需要深刻理解: case ASDU3_SETSLIST: / 用戶定值InAsdus.uFrmCount=COM.uInData10;InAsdus.uFrmIndex=COM.uInData11;看到這個(gè)我想很多人不明白,為什么 COh數(shù)組中的第10和第11 個(gè)跟別表示幀總數(shù)和當(dāng)前幀數(shù)呢?其實(shí)如果仔細(xì)看前文, 這個(gè)問(wèn)題已經(jīng)解決過(guò)了,在鏈路層數(shù)據(jù)的前6個(gè)字節(jié)是各種鏈 路規(guī)約的信息,而服務(wù)層中如果是整定值列表則第4個(gè)和第5 個(gè)字節(jié)分別表示總幀數(shù)和當(dāng)前幀數(shù), 詳見(jiàn)鏈路層

13、結(jié)構(gòu)體。 至此 我想已經(jīng)解釋清楚這個(gè)問(wèn)題了。在 switch 語(yǔ)句執(zhí)行完之后,接著就是保存剛剛提取出來(lái)的當(dāng) 前幀數(shù),然后保存應(yīng)用服務(wù)數(shù)據(jù)的總長(zhǎng), 緊接著利用 for 循環(huán), 將接收到的數(shù)據(jù)提取出來(lái)。 接下來(lái)就是判斷當(dāng)前幀數(shù)是否為總 幀數(shù),若成立則置位 ASDU 有效位,否則清零該位。void ASDU_Analyze();這個(gè)子函數(shù)的功能是分析提取出來(lái)的 數(shù)據(jù)信息。首先提取應(yīng)用服務(wù)數(shù)據(jù)信息中的傳送原因和命令 類型,至于為什么是數(shù)組中的第 2和第 3 個(gè)數(shù)據(jù),上文中的 應(yīng)用服務(wù)單元的格式已說(shuō)明。然后就是利用 switch 語(yǔ)句對(duì) ASDU 的每一種類型進(jìn)行相對(duì)應(yīng)的處理, InAsdus.uAsd

14、uType 在void ASDU_Extract()中已經(jīng)提取出來(lái)。對(duì)于每個(gè) ASDU類 型都有與其相對(duì)應(yīng)的數(shù)據(jù)格式,詳情請(qǐng)看 103 規(guī)約,這里的 switch 語(yǔ)句內(nèi)的程序有幾個(gè)地方較為復(fù)雜,現(xiàn)在就來(lái)一一分 析。case ASDU1_COMMAND:uSIN=InAsdus.uData04; ASDU_01_Command_Execute(uFUN,uSIN); 如果是一般命令類型,則進(jìn)入到命令類型的詳細(xì)程序中去。 uSIN 得到的是附加信息,用來(lái)判斷該命令是一般命令類型 中的哪一種。其對(duì)應(yīng)含義在前文中已經(jīng)講明。case ASDU3_SETSLIST: 整定值下載命令 首先提取定值區(qū)號(hào),

15、然后提取總幀數(shù)。 在將計(jì)數(shù)變量歸零之 后利用 for 循環(huán)提取全部定值。 最后組裝整定值, 為后續(xù)程 序做準(zhǔn)備。case ASDU11_CFMCMD: 定值與控制頻率修改執(zhí)行 首先判斷 InAsdus.uData04 的值,根據(jù)值的不同進(jìn)行相 對(duì)應(yīng)的操作,在這種 ASDU類型下,In Asdus.uData04 表示的含義在 103 規(guī)約中已做規(guī)定。其余部分較易理解。 注:未提到的數(shù)據(jù)類型較易理解,就不在詳加贅述。在該子程序最后另 InAsdus.uValidFlag=0 ,即清零標(biāo)志位。 防止該數(shù)據(jù)再被利用。char LPDU_Check(); 此子函數(shù)的功能是鏈路層數(shù)據(jù)的校驗(yàn)。 首先利用

16、switch 語(yǔ)句判斷是固定幀還是可變幀長(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。接著判斷幀的第二個(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)?L 包括一個(gè)字節(jié)的地址域數(shù)據(jù)和一個(gè)字節(jié)的 控制域數(shù)據(jù)。緊接著提取目的地

17、址和源地址,地址域數(shù)據(jù)的 高 4 位是源地址即主站地址, 低 4 位是目的地址即子站地址, 提取之后判斷子站地址是否為 DSP板的地址。緊接著校驗(yàn)校 驗(yàn)和,校驗(yàn)和包括地址域,控制域數(shù)據(jù)及所有數(shù)據(jù)之和,可 變幀的最后一個(gè)字節(jié)所存位校驗(yàn)和,將得到的校驗(yàn)和與之相 比較,相等則正確,否則數(shù)據(jù)錯(cuò)誤。最后校驗(yàn)結(jié)束支付是否 正確,可變幀長(zhǎng)幀的結(jié)束字符是 0x16。至此可變幀長(zhǎng)幀的校 驗(yàn)已經(jīng)結(jié)束。下面開(kāi)始討論固定幀的校驗(yàn),首先提取主站地 址和子站地址, 地址域數(shù)據(jù)的結(jié)構(gòu)與可變幀長(zhǎng)幀的結(jié)構(gòu)相同。 接著判斷子站地址是否為我們的 DSP空制板的地址。固定幀 長(zhǎng)的校驗(yàn)和只有地址域數(shù)據(jù)和控制域數(shù)據(jù)的和,將所得的校 驗(yàn)和

18、與已經(jīng)存在的較驗(yàn)和進(jìn)行校驗(yàn),判斷數(shù)據(jù)是否有效。最 后判斷固定幀的結(jié)束符是否正確, 103 規(guī)約中規(guī)定固定幀的結(jié)束符為0x16。在這里我想解釋一下固定幀長(zhǎng)為什么沒(méi)有校驗(yàn)起始符?其實(shí)起始符已經(jīng)利用 switch 語(yǔ)句進(jìn)行判斷, 如果 起始符不正確根本進(jìn)不來(lái)校驗(yàn)其他部分,而可變幀長(zhǎng)幀之所 以有校驗(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)解釋清楚了。 void Communicate() ;此子函數(shù)的功能是中斷中使用的通訊 程序。利用 switch 語(yǔ)句判斷端口狀態(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í),表示SCITXBU準(zhǔn)備好接收下一組發(fā)送的數(shù)據(jù)。這里需要注意的是,該模式下串口一次只能發(fā)送一個(gè)數(shù)據(jù),這樣 for 語(yǔ)句應(yīng)該就可以理解為什

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論