CANOpen报文类型
7位的節(jié)點(diǎn)號(hào)則表明CANOpen網(wǎng)絡(luò)最多可支持127個(gè)節(jié)點(diǎn)共存(0號(hào)節(jié)點(diǎn)為主站),下表給出了各報(bào)文的COB-ID范圍。
MNT命令為最高優(yōu)先級(jí)報(bào)文,由CANOpen主站發(fā)出,用以更改從節(jié)點(diǎn)的運(yùn)行狀態(tài)。
SYNC報(bào)文定期由CANOpen主站發(fā)出,所有的同步PDO根據(jù)SYNC報(bào)文發(fā)送。
EMERGENCY報(bào)文由出現(xiàn)緊急狀態(tài)的從節(jié)點(diǎn)發(fā)出,任何具備緊急事件監(jiān)控與處理能力的節(jié)點(diǎn)會(huì)接收并處理緊急報(bào)文。
TIME報(bào)文由CANOpen主站發(fā)出,用于同步所有從站的內(nèi)部時(shí)鐘。
PDO分為4對(duì)發(fā)送和接收PDO,每一個(gè)節(jié)點(diǎn)默認(rèn)擁有4對(duì)發(fā)送PDO和接收PDO,用于過(guò)程數(shù)據(jù)傳遞。
SDO分為發(fā)送SDO和接收SDO,用于讀寫(xiě)對(duì)象字典。
MT Error Control報(bào)文由從節(jié)點(diǎn)發(fā)出,用以監(jiān)視從節(jié)點(diǎn)的運(yùn)行狀態(tài)。
在def.h中用代碼表述了各種報(bào)文的功能碼
#define NMT 0x0 //網(wǎng)絡(luò)命令報(bào)文 #define SYNC 0x1 //同步報(bào)文 #define TIME_STAMP 0x2 //時(shí)間報(bào)文 #define PDO1tx 0x3 //過(guò)程數(shù)據(jù)對(duì)象1發(fā)送報(bào)文 #define PDO1rx 0x4 //過(guò)程數(shù)據(jù)對(duì)象1接收?qǐng)?bào)文 #define PDO2tx 0x5 //過(guò)程數(shù)據(jù)對(duì)象2發(fā)送報(bào)文 #define PDO2rx 0x6 //過(guò)程數(shù)據(jù)對(duì)象2接收?qǐng)?bào)文 #define PDO3tx 0x7 //過(guò)程數(shù)據(jù)對(duì)象3發(fā)送報(bào)文 #define PDO3rx 0x8 //過(guò)程數(shù)據(jù)對(duì)象3接收?qǐng)?bào)文 #define PDO4tx 0x9 //過(guò)程數(shù)據(jù)對(duì)象4發(fā)送報(bào)文 #define PDO4rx 0xA //過(guò)程數(shù)據(jù)對(duì)象4接收?qǐng)?bào)文 #define SDOtx 0xB //服務(wù)數(shù)據(jù)對(duì)象接收?qǐng)?bào)文 #define SDOrx 0xC //服務(wù)數(shù)據(jù)對(duì)象發(fā)送報(bào)文 #define NODE_GUARD 0xE //節(jié)點(diǎn)守護(hù)報(bào)文 #define LSS 0xF //層配置服務(wù)報(bào)文在移植CANOpen時(shí),CAN總線接收到報(bào)文后要調(diào)用CANOpen提供的接口canDispatch根據(jù)功能碼進(jìn)行報(bào)文處理,在states.c中定義了canDispatch函數(shù)
/* 定時(shí)事件觸發(fā)處理函數(shù) */ void canDispatch(CO_Data *d, Message *m) {/* 取出cob_id */UNS16 cob_id = UNS16_LE(m->cob_id);/* 判斷報(bào)文類(lèi)型 */switch(cob_id >> 7){/* 同步/緊急報(bào)文 */case SYNC:/* 同步報(bào)文COB-ID為0x80 */if(cob_id == 0x080){/* 當(dāng)前狀態(tài)下允許同步報(bào)文,則進(jìn)行處理 */if(d->CurrentCommunicationState.csSYNC)proceedSYNC(d);} /* 緊急報(bào)文COB-ID為0x81-0xFF */else{/* 當(dāng)前狀態(tài)下允許緊急報(bào)文,則進(jìn)行處理 */if(d->CurrentCommunicationState.csEmergency)proceedEMCY(d,m);}break;/* 時(shí)間報(bào)文 *//* case TIME_STAMP: *//* PDO報(bào)文 */case PDO1tx:case PDO1rx:case PDO2tx:case PDO2rx:case PDO3tx:case PDO3rx:case PDO4tx:case PDO4rx:/* 當(dāng)前狀態(tài)下允許PDO報(bào)文,則進(jìn)行處理 */if(d->CurrentCommunicationState.csPDO)proceedPDO(d,m);break;/* SDO報(bào)文 */case SDOtx:case SDOrx:/* 當(dāng)前狀態(tài)下允許SDO報(bào)文,則進(jìn)行處理 */if(d->CurrentCommunicationState.csSDO)proceedSDO(d,m);break;/* 心跳/節(jié)點(diǎn)守護(hù)報(bào)文 */case NODE_GUARD:/* 當(dāng)前狀態(tài)下允許心跳/節(jié)點(diǎn)守護(hù)報(bào)文,則進(jìn)行處理 */if(d->CurrentCommunicationState.csLifeGuard)proceedNODE_GUARD(d,m);break;/* 改變節(jié)點(diǎn)狀態(tài)報(bào)文 */case NMT:/* 用于主站改變從站狀態(tài),所以從站才會(huì)收到 */if(*(d->iam_a_slave)){proceedNMTstateChange(d,m);}break;#ifdef CO_ENABLE_LSS/* 層設(shè)置服務(wù)報(bào)文 */case LSS:if(!d->CurrentCommunicationState.csLSS)break;if((*(d->iam_a_slave)) && cob_id==MLSS_ADRESS){proceedLSS_Slave(d,m);}else if(!(*(d->iam_a_slave)) && cob_id==SLSS_ADRESS){proceedLSS_Master(d,m);}break; #endif} }
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的CANOpen报文类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2018生活消费趋势:越来越多95后开始
- 下一篇: 让我去健身的不是漂亮小姐姐,居然是贝叶斯