一、简介
所谓紧急事件就是系统出现错误后需要告知其他设备我出错了,其他设备做出对应的反应。
紧急事件用到的索引是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
是定义的最大错误数。
参考代码