搜索
bottom↓
回复: 9

关于CANOPEN通讯PDO传输映射数据发生改变产生PDO的疑问。。

[复制链接]

出0入0汤圆

发表于 2017-11-16 19:20:40 | 显示全部楼层 |阅读模式
本帖最后由 XUEPENGBIN 于 2017-11-17 09:59 编辑

如题:
最近在调试CANOPEN 移植的是论坛里的代码。
代码是这个帖子里的。
https://www.amobbs.com/thread-5578363-1-1.html
现在想用映射数据发生变化触发PDO传输。

/* index 0x1801 :   Transmit PDO 2 Parameter. 传输 PDO 2 参数 */
                    UNS8  highestSubIndex_obj1801     = 5;        /* number of subindex - 1*/
                    UNS32 obj1801_COB_ID_used_by_PDO  = 0x281;        /* 400 */
                    UNS8  obj1801_Transmission_Type   = 0xFE;    /* 255 */
                    UNS16 obj1801_Inhibit_Time        = 0;   /* 0 */
                    UNS8  obj1801_Compatibility_Entry = 0;            /* 0 */
                    UNS16 obj1801_Event_Timer         = 0;   /* 0 */
                    ODCallback_t Index1801_callbacks[] =
                     {
                       NULL,
                       NULL,
                       NULL,
                       NULL,
                       NULL,
                       NULL,
                     };
                    subindex Index1801[] =
                     {
                       { RO, uint8,  sizeof (UNS8),  (void*)&highestSubIndex_obj1801 },
                       { RW, uint32, sizeof (UNS32), (void*)&obj1801_COB_ID_used_by_PDO },
                       { RW, uint8,  sizeof (UNS8),  (void*)&obj1801_Transmission_Type },
                       { RW, uint16, sizeof (UNS16), (void*)&obj1801_Inhibit_Time },
                       { RW, uint8,  sizeof (UNS8),  (void*)&obj1801_Compatibility_Entry },
                       { RW, uint16, sizeof (UNS16), (void*)&obj1801_Event_Timer },
                     };

发现数据怎么变化都无法启动PDO传输。
用定时器
  /* index 0x1801 :   Transmit PDO 2 Parameter. 传输 PDO 2 参数 */
                    UNS8  highestSubIndex_obj1801     = 5;        /* number of subindex - 1*/
                    UNS32 obj1801_COB_ID_used_by_PDO  = 0x281;        /* 400 */
                    UNS8  obj1801_Transmission_Type   = 0xFF;    /* 255 */
                    UNS16 obj1801_Inhibit_Time        = 0;   /* 0 */
                    UNS8  obj1801_Compatibility_Entry = 0;            /* 0 */
                    UNS16 obj1801_Event_Timer         = 5000;   /* 0 */
                    ODCallback_t Index1801_callbacks[] =
                     {
                       NULL,
                       NULL,
                       NULL,
                       NULL,
                       NULL,
                       NULL,
                     };
                    subindex Index1801[] =
                     {
                       { RO, uint8,  sizeof (UNS8),  (void*)&highestSubIndex_obj1801 },
                       { RW, uint32, sizeof (UNS32), (void*)&obj1801_COB_ID_used_by_PDO },
                       { RW, uint8,  sizeof (UNS8),  (void*)&obj1801_Transmission_Type },
                       { RW, uint16, sizeof (UNS16), (void*)&obj1801_Inhibit_Time },
                       { RW, uint8,  sizeof (UNS8),  (void*)&obj1801_Compatibility_Entry },
                       { RW, uint16, sizeof (UNS16), (void*)&obj1801_Event_Timer },
                     };

是可以的。。有做过这个功能的大侠,求指导。。。

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2017-11-17 09:53:48 | 显示全部楼层
经过一天的摸索和查找。现在问题解决了

出0入0汤圆

 楼主| 发表于 2017-11-17 09:55:00 | 显示全部楼层
//数据改变定时发送服务函数
void PDOEventTimerChange (CO_Data * d, UNS32 pdoNum)
{
  sendOnePDOevent (d, (UNS8) pdoNum);
}       

//定时发送PDO 服务函数
void PDOEventTimerAlarm (CO_Data * d, UNS32 pdoNum)
{
  d->PDO_status[pdoNum].last_message.cob_id = 0;
  sendOnePDOevent (d, (UNS8) pdoNum);
}

出0入0汤圆

 楼主| 发表于 2017-11-17 09:58:11 | 显示全部楼层
调用 sendOnePDOevent (d, (UNS8) pdoNum); 函数之前。执行 d->PDO_status[pdoNum].last_message.cob_id = 0; 就是实时发送数据。 不执行这条指令就是数据有改变时候才发送。

出0入0汤圆

发表于 2017-11-17 10:11:03 | 显示全部楼层
canopen久闻大名,一直不知道用到哪里啊?

出0入0汤圆

发表于 2017-11-17 10:14:38 | 显示全部楼层
shiva_shiva 发表于 2017-11-17 10:11
canopen久闻大名,一直不知道用到哪里啊?

运动控制,传感器网络

出0入0汤圆

 楼主| 发表于 2017-11-17 10:21:20 | 显示全部楼层
shiva_shiva 发表于 2017-11-17 10:11
canopen久闻大名,一直不知道用到哪里啊?

CANOPEN   NMT  为了主机和从机组网。
                 SDO  为了配置参数 和设置 PDO参数
                 PDO  实时向总线上发送数据 或者从总线上获取数据。 具体规格 和 SDO配置的参数有关。
                         PDO 发送规则有 : 数据改变 发送
                                                     定时发送
                                                     收到SYNC信号发送/收到SYNC 设置个数触发发送。
CANOPEN 有四个发送PDO 和四个接收PDO
              每个PDO8个字节
               所以上行下行的数据各是32个字节。
              一般用于实时数据传输。如IO量 模拟量 。。。。。。。

出0入0汤圆

发表于 2017-11-20 11:27:18 | 显示全部楼层
发送方式应该和Transmission_Type也有关系吧

出0入0汤圆

 楼主| 发表于 2017-11-20 11:41:46 | 显示全部楼层
Baldwin 发表于 2017-11-20 11:27
发送方式应该和Transmission_Type也有关系吧

是的。经过摸索发现 传输类型设置为254以后 把守护时间设置为想要的时间就饿可以了。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-24 08:01

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

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