基于DeviceNet總線的從設(shè)備通迅適配器設(shè)計(jì)
send (Sbuffer,6);
}
}
break;
case 0x85;
{if (buffer[6]= =0x02)
Sbuffer[0]=0x85;
Sbuffer[1]=0x64;
Sbuffer[2]=0x8e;
Sbuffer[3]=0x00;
Sbuffer[4]=0x00;
send (Sbuffer,6);
}
else
{Sbuffer[0]=0x85;
Sbuffer[1]=0x64;
Sbuffer[2]=0x00;
Sbuffer[3]=0x8e;
Sbuffer[4]=0x01;
Sbuffer[5]=0x00;
send (Sbuffer,6);
}
}
break;
case 0x87;
Sbuffer[0]=0x85;
Sbuffer[1]=0x64;
Sbuffer[2]=0x00;
Sbuffer[3]=0x90;
Sbuffer[4]=0x50;
Sbuffer[5]=0x00;
send (Sbuffer,6);
break;
case 0xA0;
Sbuffer[0]=0x78;
Sbuffer[1]=0xA1;
Sbuffer[2]=0x07;
send (Sbuffer,3);
break;
case 0xA1;
Sbuffer[0]=0x78;
Sbuffer[1]=0xA1;
Sbuffer[2]=0x07;
send (Sbuffer,3);
break;
}
}
void main ()
{
config1 ();
XBYTE[0x4000]=0x22; //operation mode
While (1)
{;}
}
3 DeviceNet通訊適配器的收發(fā)中斷和時(shí)鐘中斷的設(shè)計(jì)
CAN控制器和微處理器的數(shù)據(jù)交換可以使用中斷方式和周期輪詢的方式。從響應(yīng)速度和執(zhí)行的效率來(lái)講,我們的應(yīng)用環(huán)境使用中斷的方式。因此我們必須編寫自己的收發(fā)中斷處理函數(shù),其功能是將CAN控制器緩沖區(qū)中的報(bào)文拷貝到一個(gè)臨時(shí)的全局緩沖區(qū),并將該緩沖區(qū)作為高層協(xié)議處理和底層收發(fā)處理的一個(gè)接口,這樣的設(shè)計(jì)具有良好的可擴(kuò)展性。如果將來(lái)使用其它廠家的CAN控制器,所做的修改也僅僅是改動(dòng)一些與具體硬件相應(yīng)的幾個(gè)底層函數(shù)。我們只要定義好互相通訊的接口,就可以將軟件和硬件進(jìn)行分離,在團(tuán)隊(duì)開發(fā)的環(huán)境中可以加快工作的進(jìn)度和效率。
另外,通訊協(xié)議中經(jīng)常要用到一些定時(shí)的功能,因而我們也需要在底層編寫一個(gè)定時(shí)中斷處理程序,該函數(shù)使用一個(gè)硬件定時(shí)器,以一個(gè)最小的計(jì)時(shí)單位周期性的為上層應(yīng)用提供計(jì)時(shí)狀態(tài)。
圖2 SJA1000的初始化流程
4 DeviceNet通訊適配器的報(bào)文收發(fā)程序和分段服務(wù)
這里所講的報(bào)文收發(fā)協(xié)議對(duì)不同的通訊協(xié)議有不同的定義。另外,CAN的數(shù)據(jù)長(zhǎng)度不能超過(guò)8個(gè)字節(jié),如何支持大于8個(gè)字節(jié)的報(bào)文要涉及到分段服務(wù)。分段協(xié)議信息由一個(gè)字節(jié)組成,其中高2位表示分段的類型,低6位作為分段的計(jì)數(shù)器,用來(lái)標(biāo)識(shí)每個(gè)數(shù)據(jù)包,其計(jì)算方式是:fragmentCount=(fragmentcount+1) mod 64。下面是具體的分段的類型:
因此,在程序的設(shè)計(jì)中應(yīng)當(dāng)加入對(duì)分段服務(wù)協(xié)議的支持。
對(duì)于發(fā)送報(bào)文的處理與接收的過(guò)程是一個(gè)逆向過(guò)程。需要注意的是編寫程序的時(shí)候要嚴(yán)格按照DeviceNet協(xié)議規(guī)范的定義,否則將產(chǎn)生不可預(yù)測(cè)的錯(cuò)誤,為將來(lái)的協(xié)議一致性測(cè)試和底層調(diào)試都帶來(lái)許多麻煩。
5 DeviceNet通訊適配器的主程序的設(shè)計(jì)
軟件由頭文件、初始化程序、功能子程序和主程序組成。
軟件的組成結(jié)構(gòu)提供了硬件和軟件升級(jí)的方便。軟件中將與主處理器、CAN控制器等硬件接口的部分比較獨(dú)立地設(shè)計(jì),而主程序和功能子程序主要集中于協(xié)議的完成。對(duì)將來(lái)的硬件改型和可能的協(xié)議修改都提供了較大的方便。
軟件以Franklin C51語(yǔ)言編寫,通過(guò)偉福E51L單片機(jī)開發(fā)裝置進(jìn)行調(diào)試。
軟件結(jié)構(gòu)圖如下:
5.1 軟件功能分解
軟件由頭文件、初始化程序、功能子程序和主程序組成。其功能分解如下:
頭文件:定義所有的參數(shù)、類結(jié)構(gòu)和函數(shù),定義要使用的硬件資源(如定時(shí)器和寄存器等)變量名稱;
初始化程序:完成對(duì)主處理器的內(nèi)存及硬件(如堆棧、定時(shí)器等)初試化,完成CAN控制器的初始化。
功能子程序:詳見各模塊介紹。
主程序組成:主控制流程。
5.2 軟件各模塊功能詳述
模塊按以下四個(gè)部分來(lái)介紹:頭文件,初始化程序,功能子程序,主程序
說(shuō)明:泵和閥的實(shí)現(xiàn)程序非常類似,兩者只相差一些參數(shù),故此處以泵的源程序作為例子進(jìn)行各個(gè)程序段的分析和說(shuō)明。(詳見源程序)
5.2.1 頭文件
其主要操作為:
包含(include)要使用的其它頭文件: reg51.h 51系列寄存器頭文件
absacc.h 51系列硬件資源頭文件
string.h C語(yǔ)言的字符操作頭文件
定義(define)要使用的用戶自定義數(shù)據(jù)類型;定義類(class)ID;定義連接的類型;
定義各實(shí)例(instacne)ID和定時(shí)器數(shù)量;定義全局狀態(tài)(status)字對(duì)應(yīng)位的內(nèi)容;
定義全局事件(event)字對(duì)應(yīng)位的內(nèi)容;定義DeviceNet錯(cuò)誤代碼和附加錯(cuò)誤代碼;
定義DeviceNet服務(wù)代碼;定義分段(fragment)值;定義連接狀態(tài);其它附加的定義;
類結(jié)構(gòu)定義: Identity,DeviceNet,Connection,Message Router,Assembly,Discrete Output,
Analog Input,Analog Output
5.2.2 初始化程序
其主要操作為:SJA1000初始化;定時(shí)器初始化;各結(jié)構(gòu)對(duì)象初試化;
5.2.3 功能子程序
其主要操作為:具體定義在主程序中調(diào)用的各子程序;雙口RAM中斷子程序;定時(shí)器中斷子程序;
5.2.4 主程序
當(dāng)實(shí)現(xiàn)所有的功能模塊以后,最重要的是如果構(gòu)造一個(gè)有機(jī)的主程序模塊,將這些零散的模塊組織起來(lái),進(jìn)行系統(tǒng)的初始化工作。另外還要設(shè)計(jì)一個(gè)優(yōu)化的循環(huán)體周期性的執(zhí)行以對(duì)DeviceNet網(wǎng)絡(luò)上的報(bào)文產(chǎn)生動(dòng)作。
因?yàn)槲覀儗?shí)現(xiàn)的是一個(gè)從站適配器,一般在輪詢的情況下只對(duì)主設(shè)備的請(qǐng)求報(bào)文產(chǎn)生相應(yīng)的應(yīng)答,而不會(huì)主動(dòng)發(fā)送報(bào)文,除了上電時(shí)的重復(fù)MAC ID例行檢測(cè)。如何構(gòu)造循環(huán)體是關(guān)鍵,我們這里采用了事件的方式,主循環(huán)體周期對(duì)網(wǎng)絡(luò)事件的不同可能的狀態(tài)產(chǎn)生動(dòng)作。程序中定義不同的網(wǎng)絡(luò)事件,主程序循環(huán)體對(duì)代表這些事件的標(biāo)志位不停的輪詢,當(dāng)某個(gè)標(biāo)志位因網(wǎng)絡(luò)事件的觸發(fā)而被置1的時(shí)候,主程序就進(jìn)入相應(yīng)的子程序進(jìn)行對(duì)應(yīng)事件的操作。操作完畢之后清楚標(biāo)志位,退回到主程序循環(huán)中繼續(xù)輪詢所有的事件標(biāo)志位。
其主要操作為:設(shè)置數(shù)據(jù)緩沖區(qū);定義全局變量;開時(shí)鐘;開中斷;進(jìn)行主循環(huán);
結(jié)束語(yǔ)
由本通訊適配器已于2002年3月13日在日本京都ASTEM RI通過(guò)ODVA一致性測(cè)試,其FCS已經(jīng)成功的應(yīng)用于2001年第2屆北京中國(guó)國(guó)際現(xiàn)場(chǎng)總線技術(shù)交流會(huì)暨展覽會(huì),第3屆上海國(guó)際工業(yè)博覽會(huì),吳忠儀表智能調(diào)節(jié)閥,東莞垃圾焚燒發(fā)電廠中的給水控制系統(tǒng)中。由于采用現(xiàn)場(chǎng)總線技術(shù),取得了顯著的經(jīng)濟(jì)效益。
評(píng)論