canOpen学习三之canOpen应用实现主机通过SDO修改从机心跳帧时间

一、从机代码
主要是所有0x1017的时间为1000,默认心跳时间为1s

/* index 0x1017 :   Producer Heartbeat Time. */
UNS16 slave_objdict_obj1017 = 1000;	/* 0 */
subindex slave_objdict_Index1017[] = 
 {
   { RW, uint16, sizeof (UNS16), (void*)&slave_objdict_obj1017, NULL }
 };

一、主机代码
变量定义

int main(void)
{ 
	u8 key; 
	u16 data;
	u32 size;
	u32 abortCode;
	u8 sendData[2];
	
	
	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(&master_objdict_Data, 0x00);
	setState(&master_objdict_Data, Initialisation);
	setState(&master_objdict_Data, Operational);	
	while(1)
	{
		key=KEY_Scan(0);
		if(key==KEY0_PRES)		//K0请求节点状态
		{
			masterRequestNodeState(&master_objdict_Data,0x01);
			printf("%x\r\n",master_objdict_Data.NMTable[1]);
		}
		else if(key==KEY1_PRES)//K1启动节点
		{	   
			masterSendNMTstateChange(&master_objdict_Data,0x01,NMT_Start_Node);
		}
		else if(key==KEY2_PRES)//K2读取从机索引0x1017中的心跳值
		{	   
			readNetworkDict(&master_objdict_Data,0x01,0x1017,0,sizeof(UNS16),0);
			while(getReadResultNetworkDict(&master_objdict_Data,0x01,&data,&size,&abortCode) == SDO_UPLOAD_IN_PROGRESS)
			{
				
			}
			printf("data:%d size:%d abortCode:%d\r\n",data,size,abortCode);
		}	
		else if(key==WKUP_PRES)	//KUP修改从机心跳帧频率,置为0x07d0也就是2s
		{	   
			data=1000;
			size=2;
			sendData[0]=0xd0;
			sendData[1]=0x07;
			
			writeNetworkDict(&master_objdict_Data,0x01,0x1017,0,size,uint16,&sendData,0);
			while(getWriteResultNetworkDict(&master_objdict_Data,0x01,&abortCode) == SDO_UPLOAD_IN_PROGRESS)
			{
				
			}
			printf("data:%d size:%d abortCode:%d\r\n",data,size,abortCode);
			masterSendNMTstateChange(&master_objdict_Data,0x01,NMT_Reset_Comunication);
		}			
	} 

}		

猜你喜欢

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