CANOpen网络管理报文
生活随笔
收集整理的這篇文章主要介紹了
CANOpen网络管理报文
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
網(wǎng)絡(luò)管理報(bào)文用于監(jiān)視和設(shè)置節(jié)點(diǎn)的運(yùn)行狀態(tài),心跳機(jī)制和壽命保護(hù)機(jī)制都基于該報(bào)文。
/* 改變節(jié)點(diǎn)狀態(tài) */ UNS8 masterSendNMTstateChange(CO_Data *d, UNS8 Node_ID, UNS8 cs) {Message m;MSG_WAR(0x3501, "Send_NMT cs : ", cs);MSG_WAR(0x3502, " to node : ", Node_ID);m.cob_id = 0x0000;m.rtr = NOT_A_REQUEST;m.len = 2;m.data[0] = cs;m.data[1] = Node_ID;return canSend(d->canHandle,&m); }/* 發(fā)送節(jié)點(diǎn)守護(hù)報(bào)文:請(qǐng)求節(jié)點(diǎn)上報(bào)狀態(tài) */ UNS8 masterSendNMTnodeguard(CO_Data *d, UNS8 nodeId) {Message m;/* MNT報(bào)文(數(shù)據(jù)幀表示響應(yīng),遠(yuǎn)程幀表示請(qǐng)求) */UNS16 tmp = nodeId | (NODE_GUARD << 7);/* cob-id */m.cob_id = UNS16_LE(tmp);/* 遠(yuǎn)程幀,請(qǐng)求 */m.rtr = REQUEST;/* 長(zhǎng)度 */m.len = 0;MSG_WAR(0x3503, "Send_NODE_GUARD to node : ", nodeId);/* 發(fā)送該幀 */return canSend(d->canHandle,&m); }/* 請(qǐng)求節(jié)點(diǎn)狀態(tài) */ UNS8 masterRequestNodeState(CO_Data *d, UNS8 nodeId) {d->NMTable[nodeId] = Unknown_state;/* 如果節(jié)點(diǎn)號(hào)為0,則置所有節(jié)點(diǎn)為位置狀態(tài) */if(nodeId == 0) {UNS8 i = 0;for(i = 0; i < NMT_MAX_NODE_ID; i++) {d->NMTable[i] = Unknown_state;}}/* 發(fā)送節(jié)點(diǎn)守護(hù)報(bào)文:請(qǐng)求節(jié)點(diǎn)上報(bào)狀態(tài) */return masterSendNMTnodeguard(d, nodeId); }/* 處理狀態(tài)改變報(bào)文 */ void proceedNMTstateChange(CO_Data *d, Message *m) {/* 節(jié)點(diǎn)當(dāng)前狀態(tài)為預(yù)運(yùn)行態(tài)、運(yùn)行態(tài)、停止態(tài),才能變換新?tīng)顟B(tài) */if(d->nodeState == Pre_operational || d->nodeState == Operational || d->nodeState == Stopped) {MSG_WAR(0x3400, "NMT received. for node : ", (*m).data[1]);/* 如果主站要求自己變換節(jié)點(diǎn)狀態(tài),才變更狀態(tài) */if(((*m).data[1] == 0) || ((*m).data[1] == *d->bDeviceNodeId)){/* 判斷新?tīng)顟B(tài) */switch((*m).data[0]){/* 預(yù)運(yùn)行態(tài)和停止態(tài)切換到運(yùn)行態(tài) */case NMT_Start_Node:if((d->nodeState == Pre_operational) || (d->nodeState == Stopped))setState(d, Operational);break;/* 預(yù)運(yùn)行態(tài)和運(yùn)行態(tài)切換到停止態(tài) */case NMT_Stop_Node:if(d->nodeState == Pre_operational || d->nodeState == Operational)setState(d, Stopped);break;/* 運(yùn)行態(tài)和停止態(tài)切換到預(yù)運(yùn)行態(tài) */case NMT_Enter_PreOperational:if(d->nodeState == Operational || d->nodeState == Stopped)setState(d, Pre_operational);break;/* 切換到初始態(tài) */case NMT_Reset_Node:/* 節(jié)點(diǎn)重置時(shí)調(diào)用回調(diào)函數(shù) */if(d->NMT_Slave_Node_Reset_Callback != NULL)d->NMT_Slave_Node_Reset_Callback(d);setState(d, Initialisation);break;/* 重啟通信 */case NMT_Reset_Comunication:{/* 獲取節(jié)點(diǎn)號(hào) */UNS8 currentNodeId = getNodeId(d);/* 回調(diào)函數(shù) */if(d->NMT_Slave_Communications_Reset_Callback != NULL)d->NMT_Slave_Communications_Reset_Callback(d); #ifdef CO_ENABLE_LSSif(currentNodeId!=d->lss_transfer.nodeID)currentNodeId = d->lss_transfer.nodeID; #endif/* 設(shè)置節(jié)點(diǎn)號(hào)為0xFF */*d->bDeviceNodeId = 0xFF; /* 設(shè)置節(jié)點(diǎn)id */setNodeId(d, currentNodeId);}/* 設(shè)置節(jié)點(diǎn)初始化 */setState(d, Initialisation);break;}}} }/* 從節(jié)點(diǎn)發(fā)送引導(dǎo)報(bào)文 */ UNS8 slaveSendBootUp(CO_Data* d) {Message m;#ifdef CO_ENABLE_LSSif(*d->bDeviceNodeId == 0xFF)return 0; #endifMSG_WAR(0x3407, "Send a Boot-Up msg ", 0);{UNS16 tmp = NODE_GUARD << 7 | *d->bDeviceNodeId; m.cob_id = UNS16_LE(tmp);}m.rtr = NOT_A_REQUEST;m.len = 1;m.data[0] = 0x00;return canSend(d->canHandle,&m); }
總結(jié)
以上是生活随笔為你收集整理的CANOpen网络管理报文的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 隔离式BUCK之参数计算
- 下一篇: 人工智能的前生,今世,和未来