OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: whj467467274672

CANOPEN协议栈的移植以及使用

  [复制链接]

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-3-20 13:35:47 | 显示全部楼层
未来你好 发表于 2020-3-18 15:50
这个数组应该是你自己定义的吧  它什末时候被赋值的  在哪被赋值的
这个判断是不是  放在自己定义的一 ...

是我自己定义的,他在canopen通讯过程中被修改的值。
这个放在一个周期循环里就好了。
对象字典是收到报文之后处理完之后 就把值给到了变量,所以你需要做的是把你自己的变量和对象字典关联起来,你去理解一下映射就知道了。
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-3-20 14:46:53 | 显示全部楼层
whj467467274672 发表于 2020-3-20 13:35
是我自己定义的,他在canopen通讯过程中被修改的值。
这个放在一个周期循环里就好了。
对象字典是收到 ...

好的 谢谢
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2018-3-15
在线时间
54 小时
发表于 2020-3-23 16:47:15 | 显示全部楼层
楼主,我的CANOPEN已经跑起来了,用USBCAN与单片机相连,能收到很多帧数据。我知道单片机接收是在中断函数里接收报文,但是找了很久,不知道程序是在哪里不停地发送报文的,可以指导下吗
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-3-24 08:29:29 | 显示全部楼层
StayHungry123 发表于 2020-3-23 16:47
楼主,我的CANOPEN已经跑起来了,用USBCAN与单片机相连,能收到很多帧数据。我知道单片机接收是在中断函数 ...

你去看下 unsigned char canSend(CAN_PORT notused, Message *m)
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-3-25 14:34:10 | 显示全部楼层
有没有人知道  这个特定标准协议是6000-9fff   为甚麽我添加索引,中间间隔,有些是没有的呀  我用的是objdictedit.py   在添加的时候 选项从6000开始  然后下一个是6002  中间的6001不见了    有人说 这个需要自己添加   有没有知道怎末用objdictedit  随意添加6000-9fff   自己想要的任意的索引值   
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-3-26
在线时间
2 小时
发表于 2020-3-26 14:42:58 | 显示全部楼层
这个协议栈能做电机控制吗?是只能做io控制led点亮吗?
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-3-26 15:40:12 | 显示全部楼层
wha 发表于 2020-3-26 14:42
这个协议栈能做电机控制吗?是只能做io控制led点亮吗?

不能做电机控制,只能点灯
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-3-28 17:41:14 | 显示全部楼层
请问一下 为什么我每次都会收到两条报文 其中一条都是TPDO3发送的 bootup时是 心跳报文时也是、0        接收        17:35:44.855                        0x00000707        数据帧        标准帧        0x01        00        

1        接收        17:35:44.855                        0x00000387        数据帧        标准帧        0x02        00 00        

2        接收        17:35:45.106                        0x00000707        数据帧        标准帧        0x01        05        

3        接收        17:35:45.106                        0x00000387        数据帧        标准帧        0x02        00 00        



回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-3-29 09:10:07 | 显示全部楼层
SOUTHWESTJT 发表于 2020-3-28 17:41
请问一下 为什么我每次都会收到两条报文 其中一条都是TPDO3发送的 bootup时是 心跳报文时也是、0        接收        17:3 ...

你设置了心跳 设置了PDO他肯定会发送啊,如果你不想谁发 你把他的时间设置为0
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-3-30 08:43:02 | 显示全部楼层
whj467467274672 发表于 2020-3-29 09:10
你设置了心跳 设置了PDO他肯定会发送啊,如果你不想谁发 你把他的时间设置为0

看到了  谢谢
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-3-30 12:16:54 | 显示全部楼层
我想再请问一下 我想在STM32上通过SDO发送数据 是调用
UNS8 writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index,UNS8 subIndex, UNS32 count, UNS8 dataType, void *data, UNS8 useBlockMode) 这个函数吗  对于CO_Data* d, UNS8 dataType,void *data, UNS8 useBlockMode这几个还不太清楚该传些什么参数进去 求解答
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-3-30 12:43:43 | 显示全部楼层
SOUTHWESTJT 发表于 2020-3-30 12:16
我想再请问一下 我想在STM32上通过SDO发送数据 是调用
UNS8 writeNetworkDict (CO_Data* d, UNS8 nodeId,  ...

你看看这个应该就懂了

TestMasterMicroMod.zip

3.69 KB, 下载次数: 96

回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-3-30 15:29:00 | 显示全部楼层
whj467467274672 发表于 2020-3-30 12:43
你看看这个应该就懂了

谢谢 我去看看 如有不懂  还请再麻烦麻烦
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-4-1 16:39:28 | 显示全部楼层
你好 我想再问一下 我是用STM32通过CANOPEN 控制伺服电机  电机的NODEID在他自带软件中已经设置完毕 我通过STM32发送SDO控制电机
问题1: setnode函数是设置本设备的节点ID的吗  需不需要用setnote再设置一遍电机的节点Id,因为我试了一下用setNODE(&motor, 1)是错的
问题2:对于新加入的节点需不要再TestSlave.h或者TestMaster.h中新增如/* index 0x1280 :   Client SDO 1 Parameter. */的代码 Client SDO2 ,Server SDO3
问题3:setState函数是对主节点和子节点都有用吗,我需不要用它对所有子节点进行初始化,因为卡在了第一步setnode对电机id的设置,这一步也卡了
问题4:closeSDOtransfer和getReadResultNetworkDict 是一定要调用吗 特别是close 我传完一条SDO不就结束了吗 怎么还要close
问的问题有点蠢 望楼主见谅 最近资料看得太多太杂 已经晕了
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-4-2 09:10:33 | 显示全部楼层
SOUTHWESTJT 发表于 2020-4-1 16:39
你好 我想再问一下 我是用STM32通过CANOPEN 控制伺服电机  电机的NODEID在他自带软件中已经设置完毕 我通过 ...

1,是设置本机的
2,通过对象字典工具自动生成的,当然你也可以手写
3,设置状态对谁都有用,你明白NMT报文就知道了
4,我不知道,你研究明白了,可以告诉我一下。
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-4-2 11:17:20 | 显示全部楼层
whj467467274672 发表于 2020-4-2 09:10
1,是设置本机的
2,通过对象字典工具自动生成的,当然你也可以手写
3,设置状态对谁都有用,你明白NMT ...

我刚刚实验了一下 如果不调用close函数,那么每一条SDO都会自动发送三遍,所以发送每条SDO后,用getReadResultNetworkDict函数查询是否发送成功,如果成功则会返回SDO_FINISHED,然后就调用close函数,这个时候一条完整的SDO发送才算结束,我猜这是不是就是SDO实时性不高的原因之一,所以大家一般都用PDO来直接获取对象中的参数,如楼主感觉说的不对,望给予指正
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-4-7 14:15:20 | 显示全部楼层
请问楼主知道我这段readNetworkDictCallback(&TestMaster_Data,1,0x6064,0x0,0, CheckSDOReadResult,0) 为什么无法进入回调函数吗 是需要在对象字典里面再设置什么 还是怎么的 弄了很久没弄懂
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-4-7 14:28:56 | 显示全部楼层
老哥,你有没有遇到这种情况,我用主机发送读取心跳   (用串口读出来  收发是没有问题的  如图所示)      但是  我用sdo的库函数   readNetworkDictCallback (&EwtCanAnalysis_Data, 5, 0x1017, 0x00, 0x0, CheckReadSDO, 0);    读取   就会一直 sdo协议超时      请问你有没有遇到过这种情况
1.jpg
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2018-12-26
在线时间
49 小时
发表于 2020-4-8 20:45:22 | 显示全部楼层
data cannot be transferred or stored to the application because of local control  请问楼主知道这个SDO传输错误是什么情况吗
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-4-16 14:33:31 | 显示全部楼层

LZ 你有没有关于SDO和PDO具体应用的源码例程  那种参考用的 基本的文献都知道了  就是不知道源码是怎末体现的就想看看 网上都是框架源码 基本上就是实现一个节点上线 心跳上报  
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-4-16 23:12:55 | 显示全部楼层
未来你好 发表于 2020-4-16 14:33
LZ 你有没有关于SDO和PDO具体应用的源码例程  那种参考用的 基本的文献都知道了  就是不知道源码是怎末体 ...

你去看 162楼
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-4-18 14:21:39 | 显示全部楼层

好的 谢谢LZ。
LZ 本地节点查看本地的字典索引的值  是不是需要用这个函数_getODentry   
如果是的话 可以讲解一下嘛 我也去查资料了  最后的结果也能看到 但就就是不会用(我查到的结果在下面)
如果不是那我需要怎末样读取自己本地的字典索引的值

CO_Data * d,
UNS16 wIndex,------------------>想获取的对象字典
UNS8 bSubindex,--------------->想获取的子索引
void * pDestData,--------------->数据存放结构体
UNS32 * pExpectedSize,----->想要读取的字节数
UNS8 * pDataType,------------->数据类型
UNS8 checkAccess,------------>是否检查可读
UNS8 endianize)----------------->大小端

UNS32 _getODentry( CO_Data* d,
                   UNS16 wIndex,
                   UNS8 bSubindex,
                   void * pDestData,
                   UNS32 * pExpectedSize,
                   UNS8 * pDataType,
                   UNS8 checkAccess,
                   UNS8 endianize)
回复 支持 反对

使用道具 举报

5

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2013-9-11
在线时间
39 小时
发表于 2020-4-26 08:32:21 | 显示全部楼层
ding!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2017-5-18
在线时间
35 小时
发表于 2020-4-29 10:50:24 | 显示全部楼层
你好,请教下canfestival得问题,我现在心跳和PDO都可以了,可是SDO通过  writeNetworkDict()函数一直没有数据,请教下这个可能时什么原因?方便得话可以给我例程看下,万分感谢!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-9-11
在线时间
3 小时
发表于 2020-5-27 09:31:46 | 显示全部楼层
很好的东西  学习了
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-7-6
在线时间
32 小时
发表于 2020-6-9 23:12:53 | 显示全部楼层
移植了程序。有报文但是不知道怎么编写程序。让数据从Pdo输出。     求助
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2014-10-5
在线时间
24 小时
发表于 2020-6-10 22:48:55 | 显示全部楼层
雨天Al2 发表于 2018-10-17 19:56
今天又找了一天,其实问题就是出在getElapsedTime()函数这个地方,
last_time_set=TimeCNT;不应该放在这 ...

这里帮助最大,感谢!!!
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-17 16:28:57 | 显示全部楼层
本帖最后由 未来你好 于 2020-7-17 16:31 编辑

LZ  我在建立字典的时候 .C 文件 最后一句   CO_Data OD7180_Data = CANOPEN_NODE_DATA_INITIALIZER(OD7180);  
有一个警告   
warning:  #144-D: a value of type "const indextable *(*)(CO_Data *, unsigned short, unsigned int *)" cannot be used to initialize an entity of type "scanIndexOD_t"

然后  我读写我建的字典地址里面的数据   就会报错   但是同一份程序   我把字典 .c 换成 网上的例程的 .c    就不会报错了   读写字典地址里面的数据  也可以了  都可以读写成功

请问一下  这个怎末解决
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-7-17 16:41:59 | 显示全部楼层
未来你好 发表于 2020-7-17 16:28
LZ  我在建立字典的时候 .C 文件 最后一句   CO_Data OD7180_Data = CANOPEN_NODE_DATA_INITIALIZER(OD7180 ...

我记得是协议栈版本的问题,有个文件需要修改
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-18 13:20:37 | 显示全部楼层
本帖最后由 未来你好 于 2020-7-18 13:22 编辑

同一份程序   我把字典 .c 换成 网上的例程的 .c    就不会报错了   读写字典地址里面的数据 都可以读写成功    所以我的分析是应该是我的字典  ·C  设置的有问题    我对比了一下文档    大概不同之处  有3处  麻烦楼主看一下图    左边是我建立的词典   右边的是例程
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-18 13:21:58 | 显示全部楼层
这个  怎末发不上去图
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-18 13:30:31 | 显示全部楼层

/* index 0x1000 :   Device Type. */
                    UNS32 EwtCanAnalysis_obj1000 = 0x0;        /* 0 */
                    subindex EwtCanAnalysis_Index1000[] =
                     {
                       { RO, uint32, sizeof (UNS32), (void*)&EwtCanAnalysis_obj1000, NULL }
                     };
我的
----------------------------------------------------------------------------------------------------------------   (1)
例程
/* index 0x1000 :   Device Type. */
                    UNS32 EwtCanAnalysis_obj1000 = 0x0;        /* 0 */
                    subindex EwtCanAnalysis_Index1000[] =
                     {
                       { RO, uint32, sizeof (UNS32), (void*)&EwtCanAnalysis_obj1000 }
                     };


----------------------------------------------------------------------------------------------------------------


/* index 0x1017 :   Producer Heartbeat Time. */
                    UNS16 EwtCanAnalysis_obj1017 = 0xBB8;        /* 3000 */
                    subindex EwtCanAnalysis_Index1017[] =
                     {
                       { RW, uint16, sizeof (UNS16), (void*)&EwtCanAnalysis_obj1017, NULL }
                     };

----------------------------------------------------------------------------------------------------------------(2)

/* index 0x1017 :   Producer Heartbeat Time. */
                    UNS16 EwtCanAnalysis_obj1017 = 0xB88;        /* 0xB88 */
                    ODCallback_t EwtCanAnalysis_Index1017_callbacks[] =
                     {
                       NULL,
                     };

                    subindex EwtCanAnalysis_Index1017[] =
                     {
                       { RW, uint16, sizeof (UNS16), (void*)&EwtCanAnalysis_obj1017 }
                     };


----------------------------------------------------------------------------------------------------------------
                case 0x1800: i = 16;break;
                case 0x1801: i = 17;break;
                case 0x1802: i = 18;break;
                case 0x1803: i = 19;break;

----------------------------------------------------------------------------------------------------------------(3)

                case 0x1800: i = 16;*callbacks = EwtCanAnalysis_Index1800_callbacks; break;
                case 0x1801: i = 17;*callbacks = EwtCanAnalysis_Index1801_callbacks; break;
                case 0x1802: i = 18;*callbacks = EwtCanAnalysis_Index1802_callbacks; break;
                case 0x1803: i = 19;*callbacks = EwtCanAnalysis_Index1803_callbacks; break;


回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-7-18 13:48:08 | 显示全部楼层
未来你好 发表于 2020-7-18 13:30
/* index 0x1000 :   Device Type. */
                    UNS32 EwtCanAnalysis_obj1000 = 0x0;        /* 0  ...

就是有一个.h文件里面对这结构体的描述不一致导致了你的错误,建议你找一个其他版本的源码去看一下,具体是哪里我现在想不起来了
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-20 18:23:08 | 显示全部楼层
本帖最后由 未来你好 于 2020-7-28 16:40 编辑
whj467467274672 发表于 2020-7-18 13:48
就是有一个.h文件里面对这结构体的描述不一致导致了你的错误,建议你找一个其他版本的源码去看一下,具体 ...

ok 好的 谢谢 LZ  

LZ  我用从主节点去查询从节点1的字典  数据如下
601  40 00 20 00 00 00 00 00
581  4F 00 20 00 EE 00 00 00
这是我用串口监视知道   从节点1的2000 00 里面的值是EE

但是我想知道这个 从节点1的2000 00 里面的值  怎末用程序知道这个值  求解



回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-7-21 10:21:07 | 显示全部楼层
未来你好 发表于 2020-7-20 18:23
ok 好的 谢谢 LZ  

LZ  我用从节点2去查询从节点1的字典  数据如下

并不是啊,你可以用ZLG的CAN分析的上位机软件 里面内置了canopen的协议解析,每一个节点都是可以读取到的。另外我好久不玩canopen了,你可以发下你的读节点的API
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-21 13:49:07 | 显示全部楼层
本帖最后由 未来你好 于 2020-7-21 13:50 编辑
whj467467274672 发表于 2020-7-21 10:21
并不是啊,你可以用ZLG的CAN分析的上位机软件 里面内置了canopen的协议解析,每一个节点都是可以读取到的 ...

u16 To_Get_OD_date(u8 CS,u8 Cob_Id,u8 H_wIndex,u8 L_wIndex,u8 bSubindex)
{
  TMessage TxMessage;        
        u8 i=0,j;
         u8 vv[8]={0x00 ,0x00 ,0x00 ,0x00,0x00 ,0x00 ,0x00 ,0x00};
        u16 wIndex =( H_wIndex<<8 )| L_wIndex;
        u16 Temp=0;
        
        TxMessage.cob_id = 0x600+Cob_Id;  
        vv[0] = CS;
        vv[1] = L_wIndex ;
        vv[2] = H_wIndex;
        vv[3] = bSubindex;
        TxMessage.len = 8;
        TxMessage.rtr = 0;
   
        for(i=0;i<8 ;i++)
        {
                       TxMessage.data =  vv;
        }

  Can_Send_Msg(&TxMessage);
        for(i=0;i<250 ;i++)
        {
                for(j=0;j<20;j++)
                {

                }
        }
        if(Cob_Id == Rve_Date.cob_id-0x580)//节点
        {
                if(wIndex ==((Rve_Date.data[2]<<8)  | Rve_Date.data[1]))//od
                {
                        Temp = ((Rve_Date.data[5]<<8)  | Rve_Date.data[4]);
                  return Temp;
                }
        }
        else
        {
                Can_Send_Msg(&TxMessage);
                        if(Cob_Id == Rve_Date.cob_id-0x580)//节点
                        {
                                if(wIndex ==((Rve_Date.data[2]<<8)  | Rve_Date.data[1]))//od
                                {
                                        Temp = ((Rve_Date.data[5]<<8)  | Rve_Date.data[4]);        
                                        return Temp;
                                }
                        }
        }
  return 0;
}
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-7-22 09:22:37 | 显示全部楼层
未来你好 发表于 2020-7-21 13:49
u16 To_Get_OD_date(u8 CS,u8 Cob_Id,u8 H_wIndex,u8 L_wIndex,u8 bSubindex)
{
  TMessage TxMessage; ...

你整的太复杂了,你不知道协议栈有API吗
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-27 14:35:31 | 显示全部楼层
本帖最后由 未来你好 于 2020-7-28 16:33 编辑
whj467467274672 发表于 2020-7-22 09:22
你整的太复杂了,你不知道协议栈有API吗

嗯  
回复 支持 反对

使用道具 举报

6

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
482
金钱
482
注册时间
2017-10-31
在线时间
90 小时
发表于 2020-7-28 16:26:06 | 显示全部楼层
1           接收    20-07-28 16:21:03:1   标准帧      数据帧     00000601      8    2F 00 20 00 00 00 00 00
2           接收    20-07-28 16:21:03:1   标准帧      数据帧     00000581      8    60 00 20 00 00 00 00 00
3           接收    20-07-28 16:21:03:1   标准帧      数据帧     00000601      8    80 00 00 00 21 00 00 08

static void CheckSDOAndContinue(CO_Data* d, UNS8 nodeId)
{
        UNS32 abortCode;

        if(getWriteResultNetworkDict (d, nodeId, &abortCode) != SDO_FINISHED)
        {
          abortCode = abortCode;//T
        }
        /* Finalise last SDO transfer with this node */
        closeSDOtransfer(&Master_Data, nodeId, SDO_CLIENT);

}


UNS8 Config_table = 0;
void CANOpen_App_Task(void)
{
        /*向从机写数据*/
        writeNetworkDict(&Master_Data,0x01,0x2000,0x00,1,uint8,&Config_table,0);

        /*调用完writeNetworkDict函数后表明已经建立了一条SDOline如果还需要写的话,必须关闭本次的SDOline*/
        /*此函数与操作服务器对象字典的函数成对出现*/
        CheckSDOAndContinue(&Master_Data,0x01);

        Config_table=!Config_table;
}

楼主   CheckSDOAndContinue  这个CLose函数有什末用     为甚麽我注释掉了   就没有80 00 00 00 21 00 00 08   这个错误        不注释   明明是循环  发指令 结果就只发了一条
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-7-29 11:29:02 | 显示全部楼层
未来你好 发表于 2020-7-28 16:26
1           接收    20-07-28 16:21:03:1   标准帧      数据帧     00000601      8    2F 00 20 00 00 0 ...

好久没弄CANOPEN了,你参考这个例程吧。https://github.com/gbcwbz/canfes ... /examples/master402
回复 支持 反对

使用道具 举报

1

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2013-1-2
在线时间
53 小时
发表于 2020-8-24 16:49:30 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

1

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2013-1-2
在线时间
53 小时
发表于 2020-9-28 17:06:27 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

11

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
415
金钱
415
注册时间
2018-1-29
在线时间
71 小时
发表于 2020-10-13 16:04:15 | 显示全部楼层
楼主,非常感谢你这篇文章,对我们新手有很大帮助,我按照你这个在移植canopen,我花了一天时间移植完成,您看下这个结果是正确的吗,新手入门还有点懵,非常感谢
序号          传输方向  接收时间标识       帧ID        帧格式  帧类型  数据长度   数据
0                接收   15:56:24.098.0          0x00000707  数据帧  标准帧  0x01       05
1                接收   15:56:34.108.0          0x00000707  数据帧  标准帧  0x01       05
2                接收   15:56:44.097.0          0x00000707  数据帧  标准帧  0x01       05
3                接收   15:56:54.097.0          0x00000707  数据帧  标准帧  0x01       05
4                接收   15:57:04.107.0          0x00000707  数据帧  标准帧  0x01       05
5                接收   15:57:14.108.0          0x00000707  数据帧  标准帧  0x01       05
6                接收   15:57:20.541.0          0x00000707  数据帧  标准帧  0x01       00
7                接收   15:57:30.548.0          0x00000707  数据帧  标准帧  0x01       05
8                接收   15:57:40.548.0          0x00000707  数据帧  标准帧  0x01       05
9                接收   15:57:50.558.0          0x00000707  数据帧  标准帧  0x01       05
10                接收   15:58:00.548.0          0x00000707  数据帧  标准帧  0x01       05
11                接收   15:58:10.542.0          0x00000707  数据帧  标准帧  0x01       05
12                接收   15:58:20.538.0          0x00000707  数据帧  标准帧  0x01       05
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-10-15 10:49:44 | 显示全部楼层
成功了啊,已经自动发送了心跳报文了啊,当前是启动状态
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-10-15
在线时间
4 小时
发表于 2020-10-15 17:35:29 | 显示全部楼层
本帖最后由 t2230510 于 2020-10-15 17:36 编辑

现在碰到的问题是 在402子协议中,电机控制时,有好多计算是两个64位数做除法,发现执行时间很长,在定时0.1ms中断里都完成不了所有的运算。 拿这个F407做通用伺服,运算速度很吃紧啊
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-10-16 11:06:17 | 显示全部楼层
t2230510 发表于 2020-10-15 17:35
现在碰到的问题是 在402子协议中,电机控制时,有好多计算是两个64位数做除法,发现执行时间很长,在定时0. ...

通讯协议里面做计算?
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-10-15
在线时间
4 小时
发表于 2020-10-16 12:04:59 | 显示全部楼层
当然不是在协议里。举个例子吧— — OD_pr(0x6093, 0x01, ATTR_RW, Pos_Numerator), OD_pr(0x6093, 0x02, ATTR_RW, Pos_Divisor),  位置因子 Pos_Numerator和Pos_Divisor         这2个参数都是32位的,如果再和32位数AA相乘,那就变成64位数BB了,  当执行这句 CC = BB/Pos_Divisor 时,耗费的时间大概会有3us。如果我的算法里有20个这样的运算,那整个运行时间超100us定时器周期,系统就运行不了。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-10-15
在线时间
4 小时
发表于 2020-10-16 12:07:23 | 显示全部楼层
楼主,您好! 您要是没做通用伺服驱动器,帮忙问问熟悉的朋友看看怎么解决。万分感谢!您写的这个canopen移植我看了,很受用。
回复 支持 反对

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4355
金钱
4355
注册时间
2017-5-30
在线时间
577 小时
 楼主| 发表于 2020-10-16 14:42:22 | 显示全部楼层
t2230510 发表于 2020-10-16 12:04
当然不是在协议里。举个例子吧— — OD_pr(0x6093, 0x01, ATTR_RW, Pos_Numerator), OD_pr(0x6093, 0x02, A ...

不知道你的运行场景。
如果MCU性能不够 就更新更高端的MCU,如果硬件无法更换可以修改软件,最简单的办法就是想把 CANOPEN 的心跳时间变长,标准是 1ms 那么你可以改到 2ms 试试效果。

另外我确实没有调试过 伺服
回复 支持 反对

使用道具 举报

11

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
415
金钱
415
注册时间
2018-1-29
在线时间
71 小时
发表于 2020-10-19 09:01:07 | 显示全部楼层
whj467467274672 发表于 2020-10-15 10:49
成功了啊,已经自动发送了心跳报文了啊,当前是启动状态

那现在是从机的SDO模式吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 12:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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