CANOpen网络管理报文
生活随笔
收集整理的這篇文章主要介紹了
CANOpen网络管理报文
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網絡管理報文用于監視和設置節點的運行狀態,心跳機制和壽命保護機制都基于該報文。
/* 改變節點狀態 */ 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); }/* 發送節點守護報文:請求節點上報狀態 */ UNS8 masterSendNMTnodeguard(CO_Data *d, UNS8 nodeId) {Message m;/* MNT報文(數據幀表示響應,遠程幀表示請求) */UNS16 tmp = nodeId | (NODE_GUARD << 7);/* cob-id */m.cob_id = UNS16_LE(tmp);/* 遠程幀,請求 */m.rtr = REQUEST;/* 長度 */m.len = 0;MSG_WAR(0x3503, "Send_NODE_GUARD to node : ", nodeId);/* 發送該幀 */return canSend(d->canHandle,&m); }/* 請求節點狀態 */ UNS8 masterRequestNodeState(CO_Data *d, UNS8 nodeId) {d->NMTable[nodeId] = Unknown_state;/* 如果節點號為0,則置所有節點為位置狀態 */if(nodeId == 0) {UNS8 i = 0;for(i = 0; i < NMT_MAX_NODE_ID; i++) {d->NMTable[i] = Unknown_state;}}/* 發送節點守護報文:請求節點上報狀態 */return masterSendNMTnodeguard(d, nodeId); }/* 處理狀態改變報文 */ void proceedNMTstateChange(CO_Data *d, Message *m) {/* 節點當前狀態為預運行態、運行態、停止態,才能變換新狀態 */if(d->nodeState == Pre_operational || d->nodeState == Operational || d->nodeState == Stopped) {MSG_WAR(0x3400, "NMT received. for node : ", (*m).data[1]);/* 如果主站要求自己變換節點狀態,才變更狀態 */if(((*m).data[1] == 0) || ((*m).data[1] == *d->bDeviceNodeId)){/* 判斷新狀態 */switch((*m).data[0]){/* 預運行態和停止態切換到運行態 */case NMT_Start_Node:if((d->nodeState == Pre_operational) || (d->nodeState == Stopped))setState(d, Operational);break;/* 預運行態和運行態切換到停止態 */case NMT_Stop_Node:if(d->nodeState == Pre_operational || d->nodeState == Operational)setState(d, Stopped);break;/* 運行態和停止態切換到預運行態 */case NMT_Enter_PreOperational:if(d->nodeState == Operational || d->nodeState == Stopped)setState(d, Pre_operational);break;/* 切換到初始態 */case NMT_Reset_Node:/* 節點重置時調用回調函數 */if(d->NMT_Slave_Node_Reset_Callback != NULL)d->NMT_Slave_Node_Reset_Callback(d);setState(d, Initialisation);break;/* 重啟通信 */case NMT_Reset_Comunication:{/* 獲取節點號 */UNS8 currentNodeId = getNodeId(d);/* 回調函數 */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/* 設置節點號為0xFF */*d->bDeviceNodeId = 0xFF; /* 設置節點id */setNodeId(d, currentNodeId);}/* 設置節點初始化 */setState(d, Initialisation);break;}}} }/* 從節點發送引導報文 */ 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); }
總結
以上是生活随笔為你收集整理的CANOpen网络管理报文的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 隔离式BUCK之参数计算
- 下一篇: 人工智能的前生,今世,和未来