一、簡介
所謂緊急事件就是系統出現錯誤後需要告知其他設備我出錯了,其他設備做出對應的反應。
緊急事件用到的索引是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
是定義的最大錯誤數。
參考代碼