canOpen学习八之canOpen应用实现主从机PDO定时同步数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canOpen学习八之canOpen应用实现主从机PDO定时同步数据相关的知识,希望对你有一定的参考价值。


从机字典文件

/* index 0x1800 :   Transmit PDO 1 Parameter. */
UNS8 slave_objdict_highestSubIndex_obj1800 = 6; /* number of subindex - 1*/
UNS32 slave_objdict_obj1800_COB_ID_used_by_PDO = 0x180; /* 384 */
UNS8 slave_objdict_obj1800_Transmission_Type = 0xFF; /* 1 */
UNS16 slave_objdict_obj1800_Inhibit_Time = 0; /* 0 */
UNS8 slave_objdict_obj1800_Compatibility_Entry = 0x0; /* 0 */
UNS16 slave_objdict_obj1800_Event_Timer = 2000; /* 0 */
UNS8 slave_objdict_obj1800_SYNC_start_value = 0x0; /* 5 */
subindex slave_objdict_Index1800[] =

RO, uint8, sizeof (UNS8), (void*)&slave_objdict_highestSubIndex_obj1800, NULL ,
RW, uint32, sizeof (UNS32), (void*)&slave_objdict_obj1800_COB_ID_used_by_PDO, NULL ,
RW, uint8, sizeof (UNS8), (void*)&slave_objdict_obj1800_Transmission_Type, NULL ,
RW, uint16, sizeof (UNS16), (void*)&slave_objdict_obj1800_Inhibit_Time, NULL ,
RW, uint8, sizeof (UNS8), (void*)&slave_objdict_obj1800_Compatibility_Entry, NULL ,
RW, uint16, sizeof (UNS16), (void*)&slave_objdict_obj1800_Event_Timer, NULL ,
RW, uint8, sizeof (UNS8), (void*)&slave_objdict_obj1800_SYNC_start_value, NULL
;

主要设置为​​slave_objdict_obj1800_Transmission_Type​​​和​​slave_objdict_obj1800_Event_Timer​​​将​​slave_objdict_obj1800_Event_Timer​​​设置为2000就是2秒同步一次。
主机主程序

int main(void)

u8 key;
Message msg;

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)

masterSendNMTstateChange(&master_objdict_Data,0x01,NMT_Start_Node);

else if(key==KEY1_PRES)

sendPDOrequest(&master_objdict_Data,0x1400);

else if(key==KEY2_PRES)

msg.cob_id = (UNS16)0x80;
msg.len = (UNS8)0x00;
msg.rtr = (UNS8)0;
canSend(&master_objdict_Data.canHandle,&msg );

else if(key==WKUP_PRES)





按下K0启动从机点1后从几点每隔两秒就会同步一次数据。


以上是关于canOpen学习八之canOpen应用实现主从机PDO定时同步数据的主要内容,如果未能解决你的问题,请参考以下文章

canOpen学习九之canOpen应用实现主机自动发送同步帧

CANopen的相关学习

如何快速实现CANopen网络的组建与配置

CANopen学习

怎么用代码实现canopen的301规范

canopen总线是啥?