搜索
bottom↓
回复: 133

【开源】CANFESTIVAL协议栈下的CANopen主站

  [复制链接]

出0入0汤圆

发表于 2015-5-24 14:23:58 | 显示全部楼层 |阅读模式
本帖最后由 zhenglingo 于 2015-5-24 16:26 编辑

       这个工程是CANFESTIVAL开源协议栈移植到STM32F4中的CANopen主站,在公司里做总线式控制器通信部分,主要实现DS301和DS402标准,利用周末的时间搭建出来的基本通信框架,给正在学习CANopen的朋友做一个参考,其实网络上也有很多移植到各个平台下的,前期我也看了很多,但是到运用的时候才发现还有很多东西需要自己去理解,运用和移植完全是两码事,如果你的产品中用不到CANopen,理解下它的通信模型还是很不错的,比如生产者-消费者,客户端-服务端,主-从等通信模型在CANFESTIVAL都已经实现了。CANopen其实资料也非常多,推介周立功翻译的 《现场总线CANopen设计与应用》看一遍,基本上就明白CANopen的思想了,至于CANFESTIVAL多看看官方的例程也能明白通信对象的使用方法。 移植和概念是第一步,第二步是产品的应用,说说我在这方面的体会,之前我也没有接触过CANOpen,只用过CAN做一般的通信,CAN协议其实比较完善了,有自动重传,总线仲裁,错误检测等,但是这只是物理层的优势,没有一个好的应用层,还是发挥不了它的优势,CANopen就是针对CAN之上的应用层。之前我们的控制器是脉冲式的,考虑到节约成本决定尝试用总线式通信控制伺服电机,小弟也刚接触这个行业,公司里主从CANopen都需要做,现在从站通信基本上已经完成,已经能够让伺服电机转起来,我们是使用402里的插补模式,其他模式是否需要同步我暂时没了解过。总线式的运动控制器优点很多,如果伺服选择插补模式,用CAN做物理层还是比较欠缺的,用CAN做物理层,同步周期1MS最多可以实现3个轴联动,以1Mbit/S速率计算发送一个BYTE需要8us,正常运行时,主站发送一帧PDO数据一般由:2BYTE ID+1BYTE 长度+ 4BYTE插补值+2BYTE控制字+2BYTE CRC = 11BYTE,我们以同步周期1MS来算,主站发送一帧PDO数据就占用88US,加上从站需要处理这帧数据,处理完后返回一帧编码器的值+状态字时间和发送PDO一样,这样就需要将近200多us的时间(包括从站处理主站PDO的时间),一个轴就需要200多us,所以能做到3轴已经很不错了,况且如果整个同步周期都是数据,如果任意时刻出现干扰整个系统就非常危险,这在运动控制器里是不允许的,当然如果你的运动控制不做闭环的,只发位置下去,1MS做多轴应该是可以的,但这样谁还敢用?CAN做物理层高速还是不合适,只能用在精度不高的场合中,高速还是需要用以太网。
    代码已经实现了主站PDO,SDO,插补值映射,读取从站编码器值,目前是两轴,简单更改下就可以改成4轴,我希望大家可以多多交流CANopen在产品设计中的经验和遇到的问题,如果代码中有运用不对或者分析有不对的地方欢迎拍砖!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-5-24 15:57:21 | 显示全部楼层
CANFESTIVAL协议栈

出0入0汤圆

发表于 2015-5-24 16:10:40 | 显示全部楼层
大致看了下。。。。有个问题想请教,裸奔CANFESTIVAL,TimeDispatch()和canDispatch()不用互斥处理么??

出0入0汤圆

 楼主| 发表于 2015-5-24 16:21:38 | 显示全部楼层
天马行空 发表于 2015-5-24 16:10
大致看了下。。。。有个问题想请教,裸奔CANFESTIVAL,TimeDispatch()和canDispatch()不用互斥处理么?? ...

CAN中断优先级比定时器的高,并且两个调度都是在中断里进行的,不会出现打断抢占的问题。

出0入0汤圆

发表于 2015-5-24 16:36:14 | 显示全部楼层
这个好, 谢谢楼主

出0入42汤圆

发表于 2015-5-24 16:42:57 | 显示全部楼层
这个应该很有技术含量,先标记

出0入0汤圆

发表于 2015-5-24 16:59:14 | 显示全部楼层
这个一直没有研究过!!

出0入0汤圆

发表于 2015-5-24 17:40:57 | 显示全部楼层
can中的对象字典不好理解。

出0入0汤圆

发表于 2015-5-24 17:43:59 | 显示全部楼层
请问楼主 。PDO  SDO 的数据接收在哪里实现的 ?

出0入0汤圆

 楼主| 发表于 2015-5-24 17:54:34 | 显示全部楼层
franki 发表于 2015-5-24 17:43
请问楼主 。PDO  SDO 的数据接收在哪里实现的 ?

这两个TimeDispatch()和canDispatch()时间调度和can数据调度,好好看看就能明白。

出0入0汤圆

发表于 2015-5-24 18:59:47 | 显示全部楼层
留个记号,将来学习。

出0入0汤圆

发表于 2015-5-24 21:06:43 | 显示全部楼层
zhenglingo 发表于 2015-5-24 17:54
这两个TimeDispatch()和canDispatch()时间调度和can数据调度,好好看看就能明白。 ...

正如你之前,我现在也是拿CAN当串口用,目的当然是为了它那超高的速率,一般跑500K的速度;
感谢资料,准备学习;
不过话说回来,现在工业上,etherCAT是一个趋势,CAN的话,我打算有空就折腾,就和PROFIBUS一样;
时下玩工业,通信部分,我觉得首先要搞定这个etherCAT;

出0入0汤圆

发表于 2015-5-24 21:22:22 来自手机 | 显示全部楼层
etherCAT好像很难搞定

出0入0汤圆

 楼主| 发表于 2015-5-24 21:31:18 | 显示全部楼层
kinsno 发表于 2015-5-24 21:06
正如你之前,我现在也是拿CAN当串口用,目的当然是为了它那超高的速率,一般跑500K的速度;
感谢资料,准 ...

etherCAT是用在高速运动控制上的,我们公司也有人在做,CAN用在低端的运动控制还是可以的比如最常见的搬运机械手对时间要求和速度等都不是很高,还是要看运用,CANopen协议属于应用层,按照CIA的设想它可以运行在不同的物理层上,但是不知道意义大不大。我用CANopen关键还是汲取它的思想,很多通信模型值得借鉴,还有就是对象字典的思想,相比MODBUS地址来说,CANopen明确定义了各个地址的含义,更加具有行业人员二次开发。

出0入16汤圆

发表于 2015-5-24 21:49:15 来自手机 | 显示全部楼层
正好最近在弄canopen,标记一下

出0入0汤圆

发表于 2015-5-24 22:23:31 | 显示全部楼层
很好的资料  !

出0入0汤圆

发表于 2015-5-24 22:29:58 | 显示全部楼层
"主站发送一帧PDO数据就占用88US,加上从站需要处理这帧数据,处理完后返回一帧编码器的值+状态字时间和发送PDO一样,这样就需要将近200多us的时间(包括从站处理主站PDO的时间)"
实际上主从站的PDO配置好以后,各自的PDO会根据触发事件(如编码器值改变)自动发送的,PDO属于消费者-生产者模型,是不需要确认的,从站的PDO发送并不受主站的影响。所以,从站并不需要接受到主站的PDO处理以后再返回编码器PDO。

出0入0汤圆

 楼主| 发表于 2015-5-24 22:49:48 | 显示全部楼层
lostid 发表于 2015-5-24 22:29
"主站发送一帧PDO数据就占用88US,加上从站需要处理这帧数据,处理完后返回一帧编码器的值+状态字时间和发 ...

看来你在这方面运用的很熟练,正如你所说,数值变化产生一个PDO事件,我现在的PDO主站使用的是1个SYNC产生一个事件方式,从站是每次接收SYNC就产生PDO事件,这种模式下从站每次接收到主站的PDO数据会将数据写进到相应的对象字典中,同时从站也将此次编码器的值与上一次作比较相同则不发送,不同则发送,这些只要在CANFESTIVAL配置好模式就可以了。但是如果运用在运动控制器里,每1MS就要发送一次插补值,一条线用很多个点来逼近,插补值肯定会变化了,在伺服控制里面,检测PDO数据是否变化并没有很大意义,如果用在I/O上意义很大,省了不少带宽。你觉得呢?

出0入0汤圆

发表于 2015-5-24 22:59:50 | 显示全部楼层
zhenglingo 发表于 2015-5-24 21:31
etherCAT是用在高速运动控制上的,我们公司也有人在做,CAN用在低端的运动控制还是可以的比如最常见的搬 ...

在工业上,我觉得CANOPEN和MB还差的不是一丁半点,现在有多少人,连MB都搞不利索,更别提CANOPEN;虽然它方便二次开发;
没办法,国内工业行业就这德性,龙蛇混杂;
不过MB不管是从哪个角度上看和CAN确实没办法比,可惜就是国内基础弱;

出0入0汤圆

发表于 2015-5-24 23:07:16 | 显示全部楼层
,实际上我的意思是CAN控制器处理同步PDO是不会占用总线时间的,因为控制器要接受到下一个同步信号才会处理前面收的的同步PDO,发送同步PDO和处理同步PDO时间是重叠的。

出0入0汤圆

 楼主| 发表于 2015-5-24 23:35:09 | 显示全部楼层
lostid 发表于 2015-5-24 23:07
,实际上我的意思是CAN控制器处理同步PDO是不会占用总线时间的,因为控制器要接受到下一个同步信号 ...

每错是这个意思,那你觉得如果同步周期为1MS,可以做到多轴同步联动吗?可能我的分析有错误,我通过示波器来分析CAN帧,两个轴时,1MS同步周期内总线上的数据占据了400多US了,这样就算4轴,总线上数据传输就需要将近1MS了。

出0入0汤圆

 楼主| 发表于 2015-5-24 23:37:10 | 显示全部楼层
kinsno 发表于 2015-5-24 22:59
在工业上,我觉得CANOPEN和MB还差的不是一丁半点,现在有多少人,连MB都搞不利索,更别提CANOPEN;虽然它 ...

出0入0汤圆

发表于 2015-5-25 08:31:20 | 显示全部楼层
本帖最后由 枫叶情缘 于 2015-5-25 08:33 编辑

楼主你好,我想请教两个问题:
1.关于canfestival的时钟机制,它的进timer中断不清counter计数器的做法我看了两天都没看明白,与常用的将定时中断作为最小时间公因数的做法不太一致。比如TimeDispatch这个函数中的overrun 、total_sleep_time、real_total_sleep_time这几个变量一直猜不透它是什么意思。
2.我的理解就是在正常使用的时候基本都是PDO通讯,而您这边的做法是同步方式,主站每发一个SYNC从站就回复一个PDO,那两个从站如何做到先发A从站,再发B从站呢?中间先后顺序和间隔时间怎么定呢?

出0入0汤圆

发表于 2015-5-25 10:21:43 | 显示全部楼层

出0入0汤圆

发表于 2015-5-25 11:06:43 | 显示全部楼层
准备学习下, thanks

出0入0汤圆

发表于 2015-5-25 13:42:02 | 显示全部楼层
谢楼主

出0入0汤圆

 楼主| 发表于 2015-5-25 22:37:11 | 显示全部楼层
枫叶情缘 发表于 2015-5-25 08:31
楼主你好,我想请教两个问题:
1.关于canfestival的时钟机制,它的进timer中断不清counter计数器的做法我看 ...

1.overrun:积累的误差,作者的原意应该是在执行TimeDispatch时被其他高优先级的中断抢占而没有及时更新定时器的值,这是为了减小误差而设计的,total_sleep_time:需要定时的时间,real_total_sleep_time:误差加上定时的时间,主要是为了防止输入的定时时间超过定时最大值(STM32的定时器一般都是16bit的最大值为0xffff)
2.从站先后顺序你可以设置ID,CAN报文发送数据到总线上会根据ID来仲裁谁先发,具体你看看CAN协议里仲裁机制。间隔时间是指什么?

出0入0汤圆

发表于 2015-5-25 22:39:04 | 显示全部楼层
lostid 发表于 2015-5-24 23:07
,实际上我的意思是CAN控制器处理同步PDO是不会占用总线时间的,因为控制器要接受到下一个同步信号 ...

大侠,我想请教下,这句“CAN控制器处理同步PDO是不占总线时间的...”这句话怎么理解。
比如主站发送一个SYNC,同时从站1发送信号给主站,主站又发送一个SYNC,从站2发送信号给主站,同时主站开始处理从站1发送过来的消息么?

出0入0汤圆

发表于 2015-5-25 22:49:53 | 显示全部楼层
zhenglingo 发表于 2015-5-25 22:37
1.overrun:积累的误差,作者的原意应该是在执行TimeDispatch时被其他高优先级的中断抢占而没有及时更新 ...

首先谢谢回复!还想请教下:
对于同步我的理解是:主站发送一个SYNC,从站1收到后回复一个PDO,但是主站2不回复;主站再发送一个SYNC,从站2收到后回复一个PDO,从站1不回复,是这么理解么?

出0入0汤圆

 楼主| 发表于 2015-5-25 22:58:25 | 显示全部楼层
枫叶情缘 发表于 2015-5-25 22:49
首先谢谢回复!还想请教下:
对于同步我的理解是:主站发送一个SYNC,从站1收到后回复一个PDO,但是主站2 ...

你的理解有误,首先同步信号是广播的形式发送,主站发送SYNC所有从站都接收到,从站一旦接收到SYNC然后根据设备商自己定义的插补时间就可以对主站发下来的位置进行插补了,从站接收到主站的SYNC后将返回编码器的值(如果编码器的值有变化则发送给主站,如果无变化则不发送)。

出0入0汤圆

发表于 2015-5-26 08:31:12 | 显示全部楼层
zhenglingo 发表于 2015-5-25 22:58
你的理解有误,首先同步信号是广播的形式发送,主站发送SYNC所有从站都接收到,从站一旦接收到SYNC然后根 ...

谢谢您的回复!还想请教一下。
假如说主站是带运动控制模块的PLC,从站是2个伺服驱动器。我以前用发脉冲的方式的做法是PLC在每个插补周期内计算出每个伺服的脉冲再下发给各个伺服。
看您这边的做法是主站发送一个SYNC后从站自己进行插补计算,那主站下发给从站的位置是是什么时候下发的?还有从站接收到SYNC要返回有变化的编码器的值给主站,这个与前面说到从站接收到SYNC后进行插补计算同时进行么?

出0入4汤圆

发表于 2015-5-26 09:42:53 | 显示全部楼层
先下来看看,看来lz是深入研究了代码的人,我之前也移植过,发现源码的RPDO是没实现的,RPDO我的理解是接收的PDO的通讯参数字典里面设置接收到多少同步帧之后刷新RPDO的映射对象字典的内容,源码里面的RPDO是只要有接收PDO就刷新对象字典内容,RPDO通讯参数设置没用。请问LZ发现这个问题没有,欢迎加我私聊。
另外请教关于canopen的同步机制,因为can物理链路层本身有抖动,每个伺服的时钟频率也是不同的,所以难免有接收到同步报文的时间不同,那么怎么能保证在插补模式下每台伺服都同步运动呢,因为每台伺服处理同步帧后插补我认为就是位置再细分。如果都不是同时处理同步帧,我想在多轴联动的控制过程,可能开始还行,但是运行久了就是时钟偏差导致位置偏差,这些都是CANFESTIVAL未能解决的。整套源码做做IO从站还行。

出0入4汤圆

发表于 2015-5-26 10:00:36 | 显示全部楼层
枫叶情缘 发表于 2015-5-26 08:31
谢谢您的回复!还想请教一下。
假如说主站是带运动控制模块的PLC,从站是2个伺服驱动器。我以前用发脉冲 ...

我来回复你的问题吧:如下图:
另外附上科尔摩根伺服的canopen通讯文档,里面写关于伺服canopen部分还是不错的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2015-5-26 10:37:36 | 显示全部楼层
LZ试过4个以上的TPDO通讯没有?可否成功?另外对象字典是canopen的核心,LZ移植的后主站的对象字典关于402部分,轴二的控制字索引应该+0x0800。不应该是控制字的子索引。可以参阅Cia的dsp402规范。当然这个也无妨控制过程。另外没有dsp402状态机,也没有402的规定的PP,PV,PT,IP,CSP,CSV,CST控制的框架,只能做主站的dsp301部分的测试。

出0入0汤圆

发表于 2015-5-26 11:03:47 来自手机 | 显示全部楼层
支持开源

出0入0汤圆

 楼主| 发表于 2015-5-26 14:13:56 | 显示全部楼层
MoMo_avr 发表于 2015-5-26 09:42
先下来看看,看来lz是深入研究了代码的人,我之前也移植过,发现源码的RPDO是没实现的,RPDO我的理解是接收 ...

,这个RPDO确实是这样,接收到主站的TPDO就刷新对象字典的内容,如果要做完善需要自己添加内容,可以约定所有从站接收到主站TPDO后的T个时间后在多轴联动,这样能减小误差.

出0入0汤圆

 楼主| 发表于 2015-5-26 14:25:12 | 显示全部楼层
MoMo_avr 发表于 2015-5-26 10:37
LZ试过4个以上的TPDO通讯没有?可否成功?另外对象字典是canopen的核心,LZ移植的后主站的对象字典关于402 ...

今天上午刚刚试过4轴,动是可以的,但是抖动的很厉害,目前没找到原因. 你说的轴二控制字的索引我在402一直没找到关于这个的说明,看6040没有描述有其他索引,只有一个一个描述,不像60c1插补值一样为各个轴提供了一个索引,我为此费了很大功夫最后只好将第二轴的控制字加在6040索引里面去了,人为给它扩展,请问这方面哪里有说明?
你说的402状态机和其他模式控制涉及公司其他同事的设计不便开源,提供一个通信的框架以便抛砖引玉,大家一起交流.

出0入0汤圆

发表于 2015-5-27 15:13:11 | 显示全部楼层
MoMo_avr 发表于 2015-5-26 10:00
我来回复你的问题吧:如下图:
另外附上科尔摩根伺服的canopen通讯文档,里面写关于伺服canopen部分还是 ...

谢谢指点。
我理解这张图意思是control发送一个SYNC给drive,2个drive收到后返回位置状态消息给control,这个视为同步事件,那后面那个setpoint1/2,control是依据什么来下发的呢?

出0入4汤圆

发表于 2015-5-27 15:32:47 | 显示全部楼层
枫叶情缘 发表于 2015-5-27 15:13
谢谢指点。
我理解这张图意思是control发送一个SYNC给drive,2个drive收到后返回位置状态消息给control, ...

1轴和2轴的位置值是控制器规划出来的,发给伺服的位置指令。所以控制器设计的好不好全在位置规划的功底上。执行的好不好功底在伺服上。

出0入0汤圆

发表于 2015-5-27 16:32:26 | 显示全部楼层
MoMo_avr 发表于 2015-5-27 15:32
1轴和2轴的位置值是控制器规划出来的,发给伺服的位置指令。所以控制器设计的好不好全在位置规划的功底上 ...

好的,谢谢指点~~

出0入0汤圆

发表于 2015-5-27 17:03:55 来自手机 | 显示全部楼层
好东西,多谢分享

出0入0汤圆

 楼主| 发表于 2015-5-27 17:21:34 | 显示全部楼层
MoMo_avr 发表于 2015-5-27 15:32
1轴和2轴的位置值是控制器规划出来的,发给伺服的位置指令。所以控制器设计的好不好全在位置规划的功底上 ...

钓出一个高手来了!

出0入0汤圆

 楼主| 发表于 2015-5-28 17:55:36 | 显示全部楼层
经过这段时间的调试,现在2MS同步,4个轴不抖动了!

出0入0汤圆

发表于 2015-5-28 19:39:15 来自手机 | 显示全部楼层
不错,主站

出0入0汤圆

发表于 2015-5-28 19:58:56 | 显示全部楼层
电机运动控制这一块用的比较多。

出0入0汤圆

发表于 2015-5-28 19:59:17 | 显示全部楼层
本帖最后由 yanhaijian2005 于 2015-5-28 20:11 编辑

我们下半年准备用CANOPEN驱动台达的伺服电机驱动器,谢谢楼主,我对CANOPEN的精髓理解还不够,希望楼主的程序对我有帮助。

出0入0汤圆

发表于 2015-5-28 23:35:46 | 显示全部楼层
谢谢了,收藏!

出100入101汤圆

发表于 2015-5-29 07:27:59 | 显示全部楼层
这个一般用在什么产品上?

出0入0汤圆

 楼主| 发表于 2015-5-29 08:32:05 | 显示全部楼层
fengyunyu 发表于 2015-5-29 07:27
这个一般用在什么产品上?

太多了,电机控制,医疗,电梯,人机界面,传感器等等,可以看看CIA的运用子协议,对相关的行业运用有专门的说明.http://www.can-cia.org/index.php?id=specifications&no_cache=1

出0入0汤圆

发表于 2015-7-28 15:47:17 | 显示全部楼层
楼主你好,感谢分享,最近开始研究canopen,好些不明白,咨询你一下,协议栈中时间调度时,定时时间到后(*row->callback)(row->d, row->id)这个回调函数执行的是什么?

出0入0汤圆

 楼主| 发表于 2015-7-28 17:41:39 | 显示全部楼层
瀚海幻云 发表于 2015-7-28 15:47
楼主你好,感谢分享,最近开始研究canopen,好些不明白,咨询你一下,协议栈中时间调度时,定时时间到后(*r ...

    看懂代码是第一步,多看几遍就能懂了。 CANFestival的定时功能服务于多个闹钟,回调函数根据你的定时闹钟类型来决定具体的功能代码。

出0入0汤圆

发表于 2015-7-29 17:03:29 | 显示全部楼层
zhenglingo 发表于 2015-7-28 17:41
看懂代码是第一步,多看几遍就能懂了。 CANFestival的定时功能服务于多个闹钟,回调函数根据你的定时 ...

谢谢楼主的回答,功能代码是要自己添加吗,没明白回调的流程,假如说,这里回调的是第一个下表0的闹钟,那么我再去哪里执行相应的功能代码,那部分功能在什么地方声明的呢?

出0入0汤圆

发表于 2015-7-29 20:21:12 | 显示全部楼层
现场总线CANopen设计与应用 这本书有电子版么

出5入42汤圆

发表于 2015-7-29 21:33:52 | 显示全部楼层
CANFESTIVAL协议栈 马一个

出0入0汤圆

发表于 2015-8-26 21:45:17 | 显示全部楼层
CANFESTIVAL是否支持SDO块传输?

出0入0汤圆

 楼主| 发表于 2015-8-27 09:38:06 | 显示全部楼层
fang45 发表于 2015-8-26 21:45
CANFESTIVAL是否支持SDO块传输?

文档有说明!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-8-27 23:52:45 | 显示全部楼层

谢谢!看来只支持加速传输和分段传输,不支持分块传输

出0入0汤圆

发表于 2015-9-29 14:17:03 | 显示全部楼层
为什么我用AVR的程序移植报这个函数出错,有没有用AVR的程序移植的:
CO_Data ObjDict_Data = CANOPEN_NODE_DATA_INITIALIZER(ObjDict);
这个函数报这个错误

出0入0汤圆

 楼主| 发表于 2015-10-6 11:07:02 | 显示全部楼层
wzd5230 发表于 2015-9-29 14:17
为什么我用AVR的程序移植报这个函数出错,有没有用AVR的程序移植的:
CO_Data ObjDict_Data = CANOPEN_NODE ...

说明你的对象字典有问题。移植你可以借鉴官方提供的例程,然后将CAN,Timer底层部分替换就OK了。

出0入0汤圆

发表于 2015-10-10 09:20:31 | 显示全部楼层
不错,支持,

出0入0汤圆

发表于 2015-10-12 09:41:45 | 显示全部楼层
这个主站在stm32运行怎么样?

出0入0汤圆

发表于 2015-10-16 14:32:47 | 显示全部楼层
MARK,CANFESTIVAL协议栈,谢谢楼主

出0入0汤圆

发表于 2015-10-17 23:27:21 | 显示全部楼层
CAN 主站,标记

出0入0汤圆

发表于 2015-11-10 16:03:42 | 显示全部楼层
楼主这个部分
  1. /* index 0x1A00 :   Transmit PDO 1 Mapping. */
  2.                     UNS8 ObjDict_highestSubIndex_obj1A00 = 3; /* number of subindex - 1*/
  3.                     UNS32 ObjDict_obj1A00[] =
  4.                     {
  5.                       0x60400110,
  6.                       0x60c10220,  
  7.                     };
  8.                     subindex ObjDict_Index1A00[] =
  9.                      {
  10.                        { RW, uint8, sizeof (UNS8), (void*)&ObjDict_highestSubIndex_obj1A00 },
  11.                        { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1A00[0] },
  12.                                                                                          { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1A00[1] },
  13.                                                                                          { RW, uint32, sizeof (UNS32), (void*)&ObjDict_obj1A00[2] },
  14.                      };
复制代码

为什么ObjDict_obj1A00这个数组只有两个元素,下面却用了三个呢?

出0入0汤圆

 楼主| 发表于 2015-11-10 17:26:34 | 显示全部楼层
996512682 发表于 2015-11-10 16:03
楼主这个部分
为什么ObjDict_obj1A00这个数组只有两个元素,下面却用了三个呢? ...

当时调试伺服时,分别使用两个16BIT低高组成一个32BIT插补值发送到伺服,之后这个直接改成了32BIT的位置值,这样ObjDict_obj1A00就只需要两个映射,第三个需要删除。

出0入0汤圆

发表于 2015-11-11 08:27:27 | 显示全部楼层
用过这个做个主站,其它都没啥问题就是个对象字典搞得稀里糊涂

出0入0汤圆

发表于 2015-11-11 17:18:03 | 显示全部楼层
对象字典是不是需要自己生成?根据自己需要,用python

出0入0汤圆

发表于 2015-11-18 21:05:15 | 显示全部楼层
大侠看了好久没看明白,能请教下为什么要设这么一个时间表吗
  1. /*  ---------  The timer table --------- */
  2. s_timer_entry timers[MAX_NB_TIMER] = {{TIMER_FREE, NULL, NULL, 0, 0, 0},};
复制代码

出0入0汤圆

发表于 2015-12-15 17:38:05 | 显示全部楼层
请问一下,假设我有两个canopen设备,一个输入设备,一个输出设备,当我输入设备接收到信号后自动控制输出设备。请问通过canopen协议能不能实现这个功能的呢?

出0入0汤圆

发表于 2015-12-15 19:14:31 | 显示全部楼层
非常好,,,,,,

出0入0汤圆

发表于 2015-12-20 16:58:19 | 显示全部楼层
kinsno 发表于 2015-5-24 21:06
正如你之前,我现在也是拿CAN当串口用,目的当然是为了它那超高的速率,一般跑500K的速度;
感谢资料,准 ...

你好。在搞工业以太网?

出0入0汤圆

发表于 2015-12-22 14:10:44 | 显示全部楼层
刚刚开始搞运动控制的CAN通信部分,很好的学习参考,多谢!

出0入0汤圆

发表于 2015-12-22 14:55:05 | 显示全部楼层
收藏一下

出0入0汤圆

 楼主| 发表于 2015-12-22 16:05:10 | 显示全部楼层
heisewangluo 发表于 2015-12-15 17:38
请问一下,假设我有两个canopen设备,一个输入设备,一个输出设备,当我输入设备接收到信号后自动控制输出 ...

    你可以将输入设备当作主站,输出设备当作从站,主从之间使用PDO事件触发方式,当主主站接收到信号作为事件触发TPDO发送到从站,从站接收到主站的PDO控制输出。

出0入0汤圆

发表于 2015-12-25 17:16:13 | 显示全部楼层
zhenglingo 发表于 2015-12-22 16:05
你可以将输入设备当作主站,输出设备当作从站,主从之间使用PDO事件触发方式,当主主站接收到信号作 ...

不太理解为什么输出做从站,不可以一个从站作为PDO生产者,然后一个或多个从站作为PDO消费者吗?
还有些疑问,主站是不是必须的呢?有没有价格合适的主站推荐个

出0入0汤圆

 楼主| 发表于 2015-12-25 17:56:03 | 显示全部楼层
heisewangluo 发表于 2015-12-25 17:16
不太理解为什么输出做从站,不可以一个从站作为PDO生产者,然后一个或多个从站作为PDO消费者吗?
还有些 ...

当然可以一对多,但是前提是你的设备需要CANopen通信需要支持。 CANopen通信中没有主站就没有管理器,这应该要看具体运用,CANopen主站你可以看看施耐德M238,台达DVP-10MC,倍福EL6751等。

出0入0汤圆

发表于 2015-12-26 14:11:30 | 显示全部楼层
zhenglingo 发表于 2015-12-25 17:56
当然可以一对多,但是前提是你的设备需要CANopen通信需要支持。 CANopen通信中没有主站就没有管理器,这 ...

在某宝搜索了一下,都不便宜。这个canopen成本挺高的。。

出0入10汤圆

发表于 2015-12-27 14:17:47 | 显示全部楼层
楼主研究的很精通了吧,佩服,刚刚开始学习,多多指教!
看了几天代码,大概的流程和套路懂了一些,但是还是没把主站给完起来!
请教个如下问题:
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;
}
这个函数中的:CallbackList[bSubindex] = Callback;这个回调赋值,没看懂,请问CallbackList[bSubindex] 最终是在哪儿回调处理的呢?
像返回:        ODCallback_t ObjDict_Index1005_callbacks[] =
                     {
                       NULL,
                     };
这样的一个callback,有何用途?
谢谢!

出0入10汤圆

发表于 2015-12-27 15:00:46 | 显示全部楼层
                    ODCallback_t MasterMap1_callbacks[] =                       {                        NULL,                      }; 定义的这个回调数组有啥意图呢

出0入0汤圆

 楼主| 发表于 2015-12-28 18:17:47 | 显示全部楼层
chuanyang 发表于 2015-12-27 14:17
楼主研究的很精通了吧,佩服,刚刚开始学习,多多指教!
看了几天代码,大概的流程和套路懂了一些,但是还 ...

  这是基本的C语言实现问题了。个人理解,这种回调函数一般会在主站配置从站对象字典时使用到,对象字典值改变后通过回调函数的方法,调用初始化时设置的函数入口地址,重新初始化与之相关的引用。为了兼容不同的对象,使用函数指针更加灵活。举个例子比如说从站心跳产生者对象字典1017,主站通过SDO发送从站心跳时间后,从站接收到SDO首先更新对象字典1017的值,然后通过调用回调函数重新设置心跳时间闹钟,这样主站可以动态改变从站的心跳时间。

出0入0汤圆

发表于 2015-12-31 14:33:50 | 显示全部楼层
请问我想用canSend函数在main函数里发一个帧出去然后用调试工具监听,为什么监听不到呢?小白不是很懂。

出0入0汤圆

发表于 2016-1-6 17:05:48 | 显示全部楼层
研究canopen 好几天了  ,从到到尾把整个帖子看完,才略懂了些

出0入0汤圆

发表于 2016-1-23 19:56:18 | 显示全部楼层
多谢分享了

出0入0汤圆

发表于 2016-1-23 20:36:52 | 显示全部楼层
谢谢分享!!!

出0入0汤圆

发表于 2016-2-23 09:25:52 | 显示全部楼层
谢楼主分享

出0入0汤圆

发表于 2016-2-23 14:12:48 | 显示全部楼层
打扰一下楼主 ,代码没有看明白。请问从站编码器值 的PDO映射用的是那个pdo ?  编码器值用的那个变量 ?

出0入0汤圆

 楼主| 发表于 2016-2-23 19:01:08 | 显示全部楼层
qs6361036 发表于 2016-2-23 14:12
打扰一下楼主 ,代码没有看明白。请问从站编码器值 的PDO映射用的是那个pdo ?  编码器值用的那个变量 ? ...

主站分别用PDO1,2来接收从站1,2的编码器值,编码器变量在对象字典里ObjDict.c文件中。

出0入0汤圆

 楼主| 发表于 2016-2-23 19:08:43 | 显示全部楼层
现在看这份Demo,因为DS301是设备协议,所以TPDO,RPDO是针对从站来定义的,主站的TPDO,RPDO需要根据从站来对应,这份Demo刚好相反,如此从站就要根据主站PDOID来设置,虽然不影响通信,但还是应该根据标准协议来。

出0入0汤圆

发表于 2016-2-23 21:12:57 | 显示全部楼层
zhenglingo 发表于 2016-2-23 19:01
主站分别用PDO1,2来接收从站1,2的编码器值,编码器变量在对象字典里ObjDict.c文件中。 ...

但是在你的程序里面 ,对收到的数据, PDO1,2 都没有处理呢 ?  在这里是不是要处理收到的编码器的值 。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-2-23 22:05:54 | 显示全部楼层
qs6361036 发表于 2016-2-23 21:12
但是在你的程序里面 ,对收到的数据, PDO1,2 都没有处理呢 ?  在这里是不是要处理收到的编码器的值 。
...

   有处理的,你还是多看看代码,作者用了很多回调函数。

出0入0汤圆

发表于 2016-6-16 20:02:09 | 显示全部楼层
借个地方在此请教下楼主,调试canopen的这个协议需要用到的can分析仪器,要选用的类型是不是只要能够分析出字节数据的就可以了,还是需要带DS402或者DS301的协议的(我也是用在控制伺服电机上的)?刚刚接触这个东西,以前只做过can的通讯的东西。多谢。

出0入0汤圆

发表于 2016-6-24 15:14:40 | 显示全部楼层
先做个记号,有时间研究研究

出0入0汤圆

 楼主| 发表于 2016-6-24 17:57:38 | 显示全部楼层
精工小匠 发表于 2016-6-16 20:02
借个地方在此请教下楼主,调试canopen的这个协议需要用到的can分析仪器,要选用的类型是不是只要能够分析出 ...

我没用过CAN分析仪,我用逻辑分析仪简单粗暴。

出0入0汤圆

发表于 2016-6-30 15:13:01 | 显示全部楼层
楼主有个问题一直没想明白:说PDO通讯打破了原来数据问答式的理念,我理解两边都定义好了的话,可以直接传输数据不用再像SDO加上数据位置了,但如没有应答的话数据在传送过程中出错了怎么办?

出0入0汤圆

发表于 2016-7-25 12:32:21 | 显示全部楼层
楼主,您timercfg.h下面的MS_TO_TIMEVAL(ms) ((ms)/1000) 这个定义对吗?

出0入0汤圆

 楼主| 发表于 2016-7-26 08:27:21 | 显示全部楼层
gpfrank 发表于 2016-7-25 12:32
楼主,您timercfg.h下面的MS_TO_TIMEVAL(ms) ((ms)/1000) 这个定义对吗?

如果按照规范来这是要*1000的,当初没有按照规范来我在ms使用的地方都手动*1000,可以改下然后每个使用ms的地方直接以ms为单位。

出0入0汤圆

发表于 2016-7-26 23:12:12 | 显示全部楼层
zhenglingo 发表于 2016-7-26 08:27
如果按照规范来这是要*1000的,当初没有按照规范来我在ms使用的地方都手动*1000,可以改下然后每个使用ms ...

非常感谢。还有一个问题和您确认
这里我按照*1000修改了。
但是因为是从站,所以TIM4配置的时候就启动了。
用SDO修改了heartbeat后,第一个Heartbeat肯定是不准的(小很多) 而后就正确了。
但是例如设置500ms,但是一般都是495ms,不知道为什么。
你的这个TIMER驱动是我测试下来最稳定的,其他的当开始运行是,心跳等时间都浮动及其的大。
不过也没太看懂您的驱动,我还在继续理解中。

谢谢您的回复。

出0入0汤圆

发表于 2016-8-20 21:08:07 | 显示全部楼层
楼主,请问一下主机的RPDO1通讯参数设置通讯类型为0x01,主机收到同步报文后,主机的RPDO1不发送数据,这应该怎么解决呢?

出0入0汤圆

发表于 2016-8-21 14:49:09 | 显示全部楼层
楼主,请问一下canfestival主站怎么发送TPDO数据?
对象字典我配置完成后,用从站发送TPDO数据是正常的,但是用主站发不出PDO数据。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-18 13:46

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

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