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