搜索
bottom↓
回复: 17

基于stm32的canfestival主机canopen协议栈移植PDO处理方式

[复制链接]

出0入10汤圆

发表于 2015-12-27 09:36:47 | 显示全部楼层 |阅读模式

proceedNODE_GUARD()包括内容如下:
TestMaster_post_SlaveBootup();//的回调
ConfigureSlaveNode();-->配置当前bootup的节点;(包括配置当前slave的通讯参数的SDO成功与否状态,依次按照init_step++,
直到masterSendNMTstateChange (d, nodeId, NMT_Start_Node)—>开启Slave;
setState(d, Operational);配置当前主机为Operational
注意:主机CAN接收控制必须在从机之前上电,接收Slave的bootup报文或,如果后上电的话,需发送NMT报文,主机才会执行proceedNODE_GUARD();
canfestival基本可以实现master对Slave的配置等操作;
在slave被设置为Start后,slave会按照设定的周期行发送同步心跳报文,具体通过proceedSYNC()的  (*d->post_TPDO)(d);回调TestMaster_post_TPDO(CO_Data* d);来实现TPDO和OD内容进行交互;

有朋友移植并测试主机代码的,可以批判拍砖,大家一起交流学习,共同进步!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入10汤圆

 楼主| 发表于 2015-12-27 09:40:42 | 显示全部楼层
追问:
UNS32 RegisterSetODentryCallBack(CO_Data* d, UNS16 wIndex, UNS8 bSubindex, ODCallback_t Callback)
{
UNS32 errorCode;
ODCallback_t *CallbackList;
const indextable *odentry;

  odentry = scanIndexOD (d, wIndex, &errorCode, &CallbackList);
  if(errorCode == OD_SUCCESSFUL  &&  CallbackList  &&  bSubindex < odentry->bSubCount)
    CallbackList[bSubindex] = Callback;
  return errorCode;
}

在获取OD内容,CallbackList[bSubindex] = Callback;这个操作没搞明白,回调处理是怎么个执行的呢???

出0入0汤圆

发表于 2015-12-27 14:21:33 | 显示全部楼层
回调要先按照规定的参数格式,写一个函数,然后把这个函数的指针给callback

出0入0汤圆

发表于 2015-12-27 14:29:06 | 显示全部楼层
void InitCommunicationCallBack(void){
        //************************Communication and nodeid ***************************
        RegisterSetODentryCallBack(&mbed_slave_Data,0x21b0,0x00,&Save21b0_call_back);
        RegisterSetODentryCallBack(&mbed_slave_Data,0x2100,0x00,&Save2100_call_back);
        //RegisterSetODentryCallBack(&mbed_slave_Data,0x1010,0x01,&SaveAllParameters_call_back);
        RegisterSetODentryCallBack(&mbed_slave_Data,0x1010,0x02,&SaveCommunicationParameters_call_back);
        RegisterSetODentryCallBack(&mbed_slave_Data,0x1010,0x04,&SaveManufacturerParameters_call_back);

        RegisterSetODentryCallBack(&mbed_slave_Data,0x1011,0x02,&RestoreCommunicationParameters_call_back);
        RegisterSetODentryCallBack(&mbed_slave_Data,0x1011,0x04,&RestoreManufacturerParameters_call_back);
        RegisterSetODentryCallBack(&mbed_slave_Data,0x1013,0x00,&HighResolutionTimeStamp_call_back);
        //****************************************************************************
}



UNS32 SaveManufacturerParameters_call_back(CO_Data* d, const indextable * unsused_indextable,
                UNS8 unsused_bSubindex){
#if 1
        unsigned char type;
        UNS32 varsize = 4;
        UNS32 save_manufacturer_para;
        type = 0x07;
        getODentry(d, 0x1010, 0x04, &save_manufacturer_para, &varsize, &type, RW);

        //'save'
        if(save_manufacturer_para == 0x65766173){

                saveManufacturerParameters_flag = 1;
        }

#endif
        return 0;
}

出0入10汤圆

 楼主| 发表于 2015-12-27 14:49:47 | 显示全部楼层
maxwelllls 发表于 2015-12-27 14:21
回调要先按照规定的参数格式,写一个函数,然后把这个函数的指针给callback ...

                    ODCallback_t MasterMap1_callbacks[] =
                     {
                       NULL,
                     };

UNS32 OnMasterMap1Update(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
{
        eprintf("OnMasterMap1Update:%d\n", MasterMap1);
        return 0;
}

RegisterSetODentryCallBack(&TestMaster_Data, 0x2000, 0, &OnMasterMap1Update);

UNS32 RegisterSetODentryCallBack(CO_Data* d, UNS16 wIndex, UNS8 bSubindex, ODCallback_t Callback)
{
UNS32 errorCode;
ODCallback_t *CallbackList;
const indextable *odentry;

  odentry = scanIndexOD (d, wIndex, &errorCode, &CallbackList);
  if(errorCode == OD_SUCCESSFUL  &&  CallbackList  &&  bSubindex < odentry->bSubCount)
    CallbackList[bSubindex] = Callback;
  return errorCode;
}

const indextable * TestMaster_scanIndexOD (UNS16 wIndex, UNS32 * errorCode, ODCallback_t **callbacks)
{
        int i;
        *callbacks = NULL;
        switch(wIndex){
                case 0x2000: i = 19;*callbacks = MasterMap1_callbacks; break;

                default:
                        *errorCode = OD_NO_SUCH_OBJECT;
                        return NULL;
        }
        *errorCode = OD_SUCCESSFUL;
        return &TestMaster_objdict;
}
我把整个完整的操作过程列出来
MasterMap1_callbacks[]  和 OnMasterMap1Update() 它的关系能这么理解,CallbackList[bSubindex] = Callback;这句话的含义么?
MasterMap1_callbacks需要自定义一些参数,按照OnMasterMap1Update的格式定义,就可以传递参数到OnMasterMap1Update,去实现一些功能...

出0入0汤圆

发表于 2015-12-27 16:30:15 | 显示全部楼层
吧callback的指针赋值给 一个对象,当这个对象通过SDO写入的时候,就会触发调用这个callback。

出0入0汤圆

发表于 2015-12-27 16:46:33 | 显示全部楼层
楼主是用来控制伺服的嘛 ?

出0入10汤圆

 楼主| 发表于 2015-12-27 17:55:13 | 显示全部楼层
franki 发表于 2015-12-27 16:46
楼主是用来控制伺服的嘛 ?

是,最近项目有用到,所以就去学学了

出110入0汤圆

发表于 2015-12-27 20:26:27 | 显示全部楼层
项目用到,已经再看协议了

出0入0汤圆

发表于 2015-12-28 09:44:20 | 显示全部楼层
楼主是深蓝吧?

出0入10汤圆

 楼主| 发表于 2015-12-28 12:44:25 | 显示全部楼层
xld826 发表于 2015-12-28 09:44
楼主是深蓝吧?

呵呵,请问你是?

出0入0汤圆

发表于 2015-12-28 20:08:02 来自手机 | 显示全部楼层
maxwelllls 发表于 2015-12-27 16:30
吧callback的指针赋值给 一个对象,当这个对象通过SDO写入的时候,就会触发调用这个callback。 ...

高手!这个协议栈就是添加对象字典很麻烦,有有没有工具啊!

出0入0汤圆

发表于 2015-12-28 21:15:46 | 显示全部楼层
lingdianhao 发表于 2015-12-28 20:08
高手!这个协议栈就是添加对象字典很麻烦,有有没有工具啊!

协议栈目录下面有个objectediter的python程序,可以直接编辑od表并自动生成H和C文件

出0入0汤圆

发表于 2016-1-7 09:10:17 | 显示全部楼层
初学者移植CANopen 不知道要注意些什么

出0入10汤圆

 楼主| 发表于 2016-1-7 21:44:20 | 显示全部楼层
maxwelllls 发表于 2015-12-28 21:15
协议栈目录下面有个objectediter的python程序,可以直接编辑od表并自动生成H和C文件 ...

经过半个月的折腾,主机管理功能等SDO、PDO功能终于可以稳定实现了,发现还是手动添加比较顺手,出现问题也比较查找问题...这个开源的项目还是可以的,只是bug有点多,修改下就好了,稳定与否还是要长时间测试吧

出0入0汤圆

发表于 2016-1-7 22:02:37 | 显示全部楼层
chuanyang 发表于 2016-1-7 21:44
经过半个月的折腾,主机管理功能等SDO、PDO功能终于可以稳定实现了,发现还是手动添加比较顺手,出现问题 ...

那是你没享受过用工具生成带来的方面。

出0入0汤圆

发表于 2016-1-30 14:33:55 | 显示全部楼层
按照规定的参数格式,写一个函数,然后把这个函数的指针给callba

出0入0汤圆

发表于 2022-1-7 11:28:06 | 显示全部楼层
正在学习中
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 03:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表