自動(dòng)攤鋪機通信模塊的設計
#include
unsigned int a;
interrupt(0x2B) void S0RINT(void)//接收中斷服務(wù)子程序
{
a=S0RBUF;//將接收數據保存
}
void putchar(unsigned char tdata)//串行發(fā)送程序
{
while(!S0TBIR){;}//等待發(fā)送緩沖區清空
S0TBIR=0;//復位發(fā)送緩沖區中斷請求標志
S0TBUF=tdata;//裝載發(fā)送緩沖寄存器
}
void ASC_vInit(void)//串行通信初始化
{
S0CON=0x8011;//定義控制寄存器:SOR=1;SOREM=1;串行方式1
S0BG=0x0040;//定義波特率9 600Bd
S0RIC=0x0062;//定義接收中斷控制寄存器
S0TBIC=0x0080;//定義發(fā)送緩沖控制寄存器
P3 |=0x0400;//定義P3.10引腳為輸出鎖存(TXD0)
DP3 |=0x0400;//定義P3.10方向控制(TXD0為輸出)
Dp3 =0xF7FF;//定義P3.11方向控制(RXD0為輸入)
IEN=1;//開(kāi)中斷
}
void main(void)
{
………………;
ASC_vInit();//串口初始化
putchar(‘…..’);//串行發(fā)送
………………;
}
(1)遵循CAN V2.0B規定(符號標準和擴展功能)。
(2)最大CAN通信速率為1MB/S。
(3)完全的CAN裝置:
l15個(gè)信息體,帶有自己的識別器和狀態(tài)控制位;
l每個(gè)信息體可以定義為發(fā)送或接收。
(4)通過(guò)在片內部XBUS(16位獨立方式)與主CPU相連(C166-內核)。
(5)接收濾波器用可編程屏蔽寄存器:
l全域屏蔽輸入信息體(全CAN功能);
l信息體15有附加屏蔽(基本CAN功能);
l靈活的中斷事件控制;
l帶有兩個(gè)接收緩沖器;
l用自己的全域屏蔽寄存器進(jìn)行接接收濾波。
6.2CAN總線(xiàn)通信軟件設計
自動(dòng)攤鋪機系統CAN總線(xiàn)通信軟件設計的任務(wù)是:在選定通信規程CAN2.0B以后,規定各計算機傳送數據的格式和約定;協(xié)調各計算機之間的通信;統一考慮通信中的可靠性措施。
6.2.1 數據發(fā)送模式
由于要傳送數據的重要程度、傳送周期不同,在本系統的通信中采用兩種不同的數據發(fā)送模式:
(1)發(fā)送模式0:即發(fā)送一次,不檢測接收是否正確,發(fā)送結束返回。接收方接收到此類(lèi)數據包后,不必發(fā)送應答信息包。該數據包的特點(diǎn)是:按照一定周期定時(shí)發(fā)送,用于主操作面板上的狀態(tài)顯示,所以偶爾的傳送失敗不會(huì )影響系統的正常運行與操作。
(2)發(fā)送模式1:即一定要將數據包正確發(fā)送給接收方。采用重發(fā)機制,等待接收方應答,若沒(méi)有接收到應答則重發(fā)。5次發(fā)送均失敗,則返回FALSE,由發(fā)送方做出相應的處理動(dòng)作,如報警、停機等;成功則返回TRUE。該數據包的特點(diǎn)是:由相應事件觸發(fā)發(fā)送,如果傳送失敗,將影響系統的正常運行。
6.2.2 數據發(fā)送模式
對于自動(dòng)攤鋪機系統來(lái)說(shuō),其CAN網(wǎng)絡(luò )中節點(diǎn)數量較少,而每種數據包只需要一部分節點(diǎn)來(lái)接收,因此在通信設計中利用數據幀標識符來(lái)實(shí)現定址組播。為避免接收不必要的數據包,對接收節點(diǎn)按位編址,每個(gè)節點(diǎn)對應驗收濾波中的一位。若一個(gè)報文標識符高8位中對應位為1,則接收;否則忽略。因此只要在發(fā)送節點(diǎn)根據數據包內容設置合適的報文標識符,數據包即可被相關(guān)節點(diǎn)正確接收,而被無(wú)關(guān)節點(diǎn)忽略。
6.2.3 校驗
在CAN結構的MAC層中已經(jīng)實(shí)現了循環(huán)冗余碼〔CRC〕校驗。但自動(dòng)攤鋪機工作環(huán)境惡劣,工作條件復雜,為了系統通信的可靠性,在控制程序級的通信中也進(jìn)行校驗。為減輕系統負擔及降低程序復雜性,控制程序級的校驗采用了比較簡(jiǎn)單的求和取模校驗方式,每個(gè)數據幀的最后一個(gè)數據字節作為校驗和,其值是之前所有數據字節求和后對256取模的值。各節點(diǎn)的接收接口中以相同方法計算校驗和,若校驗正確則將數據包壓入接收隊列,否則拋棄該包。
6.2.4 數據包格式及內容
其中:L取值為2―8:采用CAN2.0B標準,使用29位標識符。
ID28―ID21:確定此幀的接收節點(diǎn),每位代表1個(gè)節點(diǎn),可以廣播。
ID20―IDl7:此幀的順序號,每發(fā)一個(gè)幀增1,用于區分不同數據幀與重發(fā)數據幀。
IDl6:應答標志位:為1表示此幀需要應答,為0表示此幀不需應答。
IDl5―IDl3:指定此幀的發(fā)送節點(diǎn),0―3分別代表左交互機、右交互機、車(chē)體行駛測控機和找平輸分料測控機。
ID12―ID0:無(wú)意義。
6.3CAN總線(xiàn)通信編程
CAN總線(xiàn)通信編程是一個(gè)比較煩瑣的事情,主要是涉及諸多的CAN寄存器,但只要掌握其規律和技術(shù)關(guān)鍵,就會(huì )變得容易起來(lái)。下面是CAN總線(xiàn)通信編程的實(shí)現步驟:
(1)CAN模量初始化;
(2)定義每一個(gè)信息體;
(3)裝載信息體數據(僅針對發(fā)送信息體);
(4)接收信息體接收數據;
(5)發(fā)送一個(gè)信息體;
(6)檢查一個(gè)信息體;
(7)檢查是否關(guān)閉CAN總線(xiàn)。
為便于進(jìn)行模塊化編程,將CAN通信功能封裝成一個(gè)個(gè)子程序,并且生成一個(gè)專(zhuān)用的程序庫,供不同的程序員調用,這樣就提高了編程效率,并易于功能擴展。下面給出其中的兩個(gè)子程序。
下面為發(fā)送一個(gè)信息體的CAN通信程序:
#include
#include
void send_mo_16x(unsigned char a)//發(fā)送信息體“a”(1..14)
{
if((a15)(a))*msgctrl_ptr_16x[a]=0xefff;//置位TXRQ
}
下面為檢查是否關(guān)閉CAN總線(xiàn)的CAN通信程序:
#include
unsigned char check_busoff_16x(void)//檢查總線(xiàn)是否關(guān)閉,并在必要時(shí)恢復
{
unsigned char busoff_var=0;
if(SR0x80)//如果BOFF=1
{
busoff_var=1;
CR=CR0xfe;//恢復關(guān)閉的總線(xiàn)(清零INIT)
}
}
7.結論
由于攤鋪機的功能繁多,運作復雜,工作環(huán)境十分惡劣,因此控制系統的工作可靠性問(wèn)題就是自動(dòng)攤鋪機設計的關(guān)鍵。在本系統中,利用RS232C實(shí)現了主交互機與移動(dòng)電話(huà)之間的串行通信;采用帶CAN總線(xiàn)的單片機完成不同模塊各自的功能,又通過(guò)CAN總線(xiàn)傳送數據或命令,實(shí)現了功能分散又集中監視,危險分散。因此,很適合于自動(dòng)攤鋪機中分布式控制系統的實(shí)現?,F場(chǎng)實(shí)驗結果表明:該通信模塊具有良好的可靠性、穩定性和安全性。
評論