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是定义的最大错误数。
参考代码

猜你喜欢

转载自blog.csdn.net/qq_15181569/article/details/106191562