canOpen學習十之canOpen應用實現緊急事件發送

一、簡介
所謂緊急事件就是系統出現錯誤後需要告知其他設備我出錯了,其他設備做出對應的反應。
緊急事件用到的索引是0x1001和0x1003,下面詳細介紹一下這兩個索引
對象0x1001:
在這裏插入圖片描述
在這裏插入圖片描述
對象0x1003:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
二、代碼解析
首先從機字典配置

/* index 0x1001 :   Error Register. */
 UNS8 slave_objdict_obj1001 = 0x00;	/* 18 */
 subindex slave_objdict_Index1001[] = 
  {
    { RO, uint8, sizeof (UNS8), (void*)&slave_objdict_obj1001, NULL }
  };

/* index 0x1003 :   Pre-defined Error Field. */
 UNS8 slave_objdict_highestSubIndex_obj1003 = 0; /* number of subindex - 1*/
 UNS32 slave_objdict_obj1003[] = 
 {
   0x0,	/* 1 */
   0x0,	/* 2 */
   0x0,	/* 3 */
   0x0,	/* 4 */
   0x0	/* 5 */
 };
 subindex slave_objdict_Index1003[] = 
  {
    { RW, valueRange_EMC, sizeof (UNS8), (void*)&slave_objdict_highestSubIndex_obj1003, NULL },
    { RO, uint32, sizeof (UNS32), (void*)&slave_objdict_obj1003[0], NULL },
    { RO, uint32, sizeof (UNS32), (void*)&slave_objdict_obj1003[1], NULL },
    { RO, uint32, sizeof (UNS32), (void*)&slave_objdict_obj1003[2], NULL },
    { RO, uint32, sizeof (UNS32), (void*)&slave_objdict_obj1003[3], NULL },
    { RO, uint32, sizeof (UNS32), (void*)&slave_objdict_obj1003[4], NULL }
  };

從機代碼

int main(void)
{ 
	u8 key; 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
	delay_init(168);    //初始化延時函數
	uart_init(115200);	//初始化串口波特率爲115200
	LED_Init();					//初始化LED 
	KEY_Init(); 				//按鍵初始化  
	cantimer_init(10-1,8400-1);	 
	can_init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);//CAN初始化環回模式,波特率500Kbps    
	setNodeId(&slave_objdict_Data, 0x01);
	setState(&slave_objdict_Data, Initialisation);
	setState(&slave_objdict_Data, Pre_operational);	
	while(1)
	{
		key=KEY_Scan(0);
		if(key==KEY0_PRES)//KEY0按下,發送一次數據
		{
			pdo1TransmitDate++;
		}
		else if(key==KEY1_PRES)//發送錯誤
		{	   
			EMCY_setError(&slave_objdict_Data, 0xABCD, 0x01, 0x1234);
		}	
		else if(key==KEY2_PRES)//發送錯誤
		{	   
			EMCY_errorRecovered(&slave_objdict_Data,0xABCD);
		}		
	} 

}

首先主機發送狀態改換命令,讓從機進入操作狀態。然後按下按鍵K1發送一個緊急事件,此時緊急事件就會存儲到0x1003中,當這個緊急事件發出後如果繼續發送這個緊急事件是不會發送的。按下K2鍵後復位這個錯誤,當錯誤是0的時候會發出所有錯誤復位的消息。
緊急事件發生後同時會存儲到 CO_Data這個結構體的s_errors error_data[EMCY_MAX_ERRORS];數組當中,EMCY_MAX_ERRORS是定義的最大錯誤數。
參考代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章