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