CANopen移植文档
- 格式:docx
- 大小:424.79 KB
- 文档页数:3
【转】(笔记)CanOpen协议【CanFestival】移植方法如果还有其他报错,那有可能是因为不同源码版本、不同平台、不同人遇到的错误也会不相同,这里的过程只能做一定的参考,不一定完全相同,解决这些错误需要有一定的调试功底,需要根据编译出错提示来进行修改对应地方,一般都是有些函数没声明或者某个头文件没有包含或者包含了一些不必要的头文件而该文件不存在或者是一些变量类型不符合需定义之类的,如果能够摆平所有的编译出错,那么移植就算成功了,如果你被编译出错摆平了,那么游戏就结束,没得玩了。
步骤七:解决了所有的编译错误后,接下来实现刚才定义的3个空函数:函数void setTimer(TIMEVAL value)主要被源码用来定时的,时间到了就需要调用一下函数TimeDispatch(),函数TIMEVAL getElapsedTime(void)主要被源码用来查询距离下一个定时触发还有多少时间,函数unsigned char canSend(CAN_PORT notused, Message *m)主要被源码用来发一个CAN包的,需要调用驱动来将一个CAN包发出去。
我们在stm32_canfestival.c文件里定义几个变量如下:unsigned int TimeCNT=0;//时间计数unsigned int NextTime=0;//下一次触发时间计数unsigned int TIMER_MAX_COUNT=70000;//最大时间计数static TIMEVAL last_time_set = TIMEVAL_MAX;//上一次的时间计数setTimer和getElapsedTime函数实现如下://Set the next alarm // void setTimer(TIMEVAL value) { NextTime=(TimeCNT+value)%TIMER_MAX_COUNT; } // Get the elapsed time since the last occured alarm // TIMEVAL getElapsedTime(void) { int ret=0; ret = TimeCNT> last_time_set ? TimeCNT - last_time_set : TimeCNT + TIMER_MAX_COUNT - last_time_set; last_time_set = TimeCNT; return ret; } 另外还要开一个1毫秒的定时器,每1毫秒调用一下下面这个函数。
IXL-II CANOpen通信协议及使用说明(2019-12 V1.0)同毅自动化技术有限公司目录一、通信方式选择以及配置 (4)二、CANopen通信简介 (6)三、总线管理NMT报文 (9)四、心跳报文与节点保护 (10)4.1 Heartbeat心跳报文 (10)4.2 节点保护功能 (10)4.3 通信中断自动停机保护功能 (11)五、制造商设备标志报文 (12)六、CANopen设备控制和模式控制 (13)6.1 控制字 Controlword(0x6040) (16)6.2 状态字 Statusword(0x6041) (18)6.3 模式控制 Modes_of_operation (0x6060) (20)6.4 错误代码 Error_code (0x603F) (20)七、SDO通信 (23)7.1 SDO读操作 (23)7.2 SDO写操作 (23)八、PDO通信 (25)8.1 PDO通信方式 (25)8.2 PDO参数映射 (26)8.3 驱动器默认PDO映射 (27)8.4 转矩模式使用默认PDO映射参数 (29)8.5 速度模式使用默认PDO映射参数 (31)8.6 位置模式使用默认PDO映射参数 (33)九、回零模式(Home) (37)十、位置控制模式(Profiled Position) (45)十一、位置插补模式(Interpolated Position) (46)十二、循环同步位置模式(CSP) (48)十三、循环同步速度模式(CSV) (49)十四、循环同步力矩模式(CST) (50)十五、速度控制模式(Profiled Velocity) (51)十六、力矩控制模式(Profiled Torque ) (52)十七、用Cockpit动态配置PDO映射参数 (53)附录一:CANOPEN设备对象字典 (55)版本修改记录一、通信方式选择以及配置CANopen 波特率设置驱动器支持10kbps ~1Mbps 范围内波特率,对于CANopen 的波特率是通过Modbus 协议接口利用Cockpit 调试软件设置can_Para_CHANGED.BAUDRATE 参数来改变驱动器CANopen 通信波特率,设置完成后选择CANopen 通讯方式并重启完成设置。
EPEC控制器CANOPEN使用说明本CANOPEN采用的标准的CAN数据格式,11位的ID,有效数据长8个字节,8个字节。
CAN ID,DLC,D0,D1,D2,D3,D4,D5,D6,D7我们将这样一组CANOPEN数据叫做一路PDO。
利用CANOPEN组成的网络是一个主从网络,将控制器节点号最小的控制器设置为MASTER,其他的设置为SLA VE,因为控制器的节点号越小,其优先级越高。
如果一个控制器不虚拟节点往总线上发送数据,那么初始化结束后,本控制器往总线上发送4路TPDO:(CANOPEN_START_INIT 、CANOPEN_END_INIT)第一路PDO数据的ID为0X180+控制器的节点号第二路PDO数据的ID为0X280+控制器的节点号第三路PDO数据的ID为0X380+控制器的节点号第四路PDO数据的ID为0X480+控制器的节点号如果是再虚拟一个节点号发送数据,则发送的4路TPDO为:(CANOPEN_ADD_TRANSMIT_NODE_ID)第一路PDO数据的ID为0X180+虚拟控制器的节点号第二路PDO数据的ID为0X280+虚拟控制器的节点号第三路PDO数据的ID为0X380+虚拟控制器的节点号第四路PDO数据的ID为0X480+虚拟控制器的节点号如果是再虚拟一个节点号发送莫一路数据,则发送的PDO为:(CANOPEN_ADD_TRANSMIT_PDO)如果是虚拟第一路PDO数据的ID为0X180+虚拟控制器的节点号如果是虚拟第二路PDO数据的ID为0X280+虚拟控制器的节点号如果是虚拟第三路PDO数据的ID为0X380+虚拟控制器的节点号如果是虚拟第四路PDO数据的ID为0X480+虚拟控制器的节点号假设现在有三个控制器通过CANOPEN总线相连:控制器4 控制器7 控制器104号控制器CANOPEN初始化程序为:4号控制器发送4路PDO数据,发送的数据分别为第1路PDO,ID为0X184,发送%QW200~%QW203地址里的数据第2路PDO,ID为0X284,发送%QW204~%QW207地址里的数据第3路PDO,ID为0X384,发送%QW208~%QW211地址里的数据第4路PDO,ID为0X484,发送%QW212~%QW215地址里的数据4号控制器接收7号控制器发送的4路PDO数据和10号控制器发送的4路PDO数据%IW200~%IW203地址保存7号控制器发送的第1路PDO(ID=0X187)%IW204~%IW207地址保存7号控制器发送的第2路PDO(ID=0X287)%IW208~%IW211地址保存7号控制器发送的第3路PDO(ID=0X387)%IW212~%IW215地址保存7号控制器发送的第4路PDO(ID=0X487)%IW216~%IW219地址保存10号控制器发送的第1路PDO(ID=0X18A)%IW220~%IW223地址保存10号控制器发送的第2路PDO(ID=0X28A)%IW224~%IW227地址保存10号控制器发送的第3路PDO(ID=0X38A)%IW228~%IW231地址保存10号控制器发送的第4路PDO(ID=0X48A)7号控制器CANOPEN初始化程序为:7号控制器发送4路PDO数据,发送的数据分别为第1路PDO,ID为0X187,发送%QW200~%QW203地址里的数据第2路PDO,ID为0X287,发送%QW204~%QW207地址里的数据第3路PDO,ID为0X387,发送%QW208~%QW211地址里的数据第4路PDO,ID为0X487,发送%QW212~%QW215地址里的数据7号控制器接收4号控制器发送的4路PDO数据和10号控制器发送的4路PDO数据%IW200~%IW203地址保存4号控制器发送的第1路PDO(ID=0X184)%IW204~%IW207地址保存4号控制器发送的第2路PDO(ID=0X284)%IW208~%IW211地址保存4号控制器发送的第3路PDO(ID=0X384)%IW212~%IW215地址保存4号控制器发送的第4路PDO(ID=0X484)%IW216~%IW219地址保存10号控制器发送的第1路PDO(ID=0X18A)%IW220~%IW223地址保存10号控制器发送的第2路PDO(ID=0X28A)%IW224~%IW227地址保存10号控制器发送的第3路PDO(ID=0X38A)%IW228~%IW231地址保存10号控制器发送的第4路PDO(ID=0X48A)10号控制器CANOPEN初始化程序为:10号控制器发送4路PDO数据,发送的数据分别为第1路PDO,ID为0X18A,发送%QW200~%QW203地址里的数据第2路PDO,ID为0X28A,发送%QW204~%QW207地址里的数据第3路PDO,ID为0X38A,发送%QW208~%QW211地址里的数据第4路PDO,ID为0X48A,发送%QW212~%QW215地址里的数据10号控制器接收4号控制器发送的4路PDO数据和7号控制器发送的4路PDO数据%IW200~%IW203地址保存4号控制器发送的第1路PDO(ID=0X184)%IW204~%IW207地址保存4号控制器发送的第2路PDO(ID=0X284)%IW208~%IW211地址保存4号控制器发送的第3路PDO(ID=0X384)%IW212~%IW215地址保存4号控制器发送的第4路PDO(ID=0X484)%IW216~%IW219地址保存7号控制器发送的第1路PDO(ID=0X187)%IW220~%IW223地址保存7号控制器发送的第2路PDO(ID=0X287)%IW224~%IW227地址保存7号控制器发送的第3路PDO(ID=0X387)%IW228~%IW231地址保存7号控制器发送的第4路PDO(ID=0X487)如果数据没有改变,则控制器每隔300毫秒发送一次数据,如果数据改变了,则控制器会马上将改变的数据发送到总线上。
一、CAN—BUS介绍1.CAN的基本概念、特点CAN 是Controller Area Network的缩写(以下称为CAN),是ISO*1国际标准化的串行通信协议。
CAN 协议如表3 所示涵盖了ISO 规定的OSI 基本参照模型中的传输层、数据链路层及物理层.CAN 协议中关于ISO/OSI 基本参照模型中的传输层、数据链路层及物理层,具体有哪些定义如图所示。
ISO/OSI 基本参照模型【注】*1 OSI:Open Systems Interconnection (开放式系统间互联)CAN的特点CAN 协议具有以下特点。
(1) 多主控制在总线空闲时,所有的单元都可开始发送消息(多主控制)。
最先访问总线的单元可获得发送权。
(2) 消息的发送在CAN 协议中,所有的消息都以固定的格式发送。
总线空闲时,所有与总线相连的单元都可以开始发送新消息。
两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为ID)决定优先级。
ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。
两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。
仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
(3) 系统的柔软性与总线相连的单元没有类似于“地址"的信息。
因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
(4)通信速度根据整个网络的规模,可设定适合的通信速度。
在同一网络中,所有单元必须设定成统一的通信速度。
即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信.不同网络间则可以有不同的通信速度。
(5) 远程数据请求可通过发送“遥控帧" 请求其他单元发送数据.(6) 错误检测功能·错误通知功能·错误恢复功能所有的单元都可以检测错误(错误检测功能)。
应用范例:通过DVPCOPM-SL(CANOPEN主站)控制C2000变频器¢控制要求当X0=ON 时,启动变频器,使其以40Hz 的频率正方向运转;当X1=ON 时,变频器停止输出,并设置目标频率为0Hz。
¢DVPCOPM-SL和C2000变频器硬件连接示意图产品名称产品说明DVPCOPM-SL 台达CANOPEN主站模块VFD-C 台达C2000变频器EMC-COP01 C2000变频器CANOPEN通讯卡TAP-CB01 标准CANOPEN总线主干线电缆TAP-CB03 标准CANOPEN总线分支线电缆TAP-CN03 CANOPEN总线电缆分接盒¢C2000 变频器参数设置参数设置值说明00-20 6 频率指令来源由CANOPEN通讯卡控制。
00-21 3 运转指令来源由CANOPEN通讯卡控制09-36 2 C2000变频器CANOPEN地址。
09-37 0 C2000变频器CANOPEN通讯速率选择。
0:1Mbps1: 500Kbps2: 250Kbps3: 125Kbps4: 100 Kbps5: 50Kbps09-30 0 变频器通讯解码方式选择。
0:20XX区域的地址有效。
1: 60XX区域的地址有效。
09-40 0 CANOPEN解码方式选择。
0:由C2000自己定义。
1:CANOPEN标准DS402规范。
09-45 0 C2000主从站模式选择。
0:C2000做CANOPEN从站。
1:C2000做CANOPEN主站。
¢此范例中按照下表分别对DVPCOPM-SL 主站模块、C2000变频器进行设置模块名称节点地址通讯速率DVPCOPM-SL 主站模块01 1M bpsC2000变频器02 1M bps备注:DVPCOPM-SL通讯速率、节点地址及接线可参考DVPCOPM-SL手册。
¢使用CANopenBuilder网络配置工具配置CANOPEN网络Ø EDS文件的添加EDS文件为文字档,用以描述设备的参数信息。
目录第一章概述------------------------------------------------3第二章PC10卡--------------------------------------------4第三章E3000-CANopen接口---------------------------73.1 CANopen信息框---------------------------------73.2 对象字典描述---------------------------------------73.3 制造商特定参数详细说明------------------------103.4 状态机操作------------------------------------------153.5 默认PDO配置--------------------------------------183.6CANopen通讯使用的相关配置参数---------20 第四章电子数据文档—EDS文件----------------------23 第五章故障描述和处理-----------------------------------24第一章概述CANopen 是基于串行总线控制器局域网(CAN)的网络系统。
CANopen 通讯行规(CiA DS-301)支持直接访问装置参数及时间关键型进程数据通讯。
CANopen 装置行规(CiA DS-402)定义了基本装置功能性的标准,而这些基本装置提供了附加供应商特定装置的多种特点。
CANopen通过以组织好的,如果必要可用确定好的方式允许节点间等对等数据交换来产生CAN的最大效能。
通过对网络启动与错误管理提供标准机理,CANopen 特定网络管理功能将方案设计、实施和诊断进行了简单化。
CANopen既支持双循环通讯也支持事件驱动型通讯,从而使将总线负载降到最低,但仍保持极短的反应时间。
1、CANopen介绍 (1)2、通信对象 (1)3、CANopen预定义连接集 (3)4、编码器 (5)4.1 编码器说明 (5)4.2 接线说明 (5)5、Object directory(对象字典) (7)5.1 Detailed description of the communication parameters(通讯子协议区域) (7)5.1.1 Object 1000h: Device type(设备类型) (7)5.1.2 Object 1001h: Error register(错误寄存器) (7)5.1.3 Object 1003h: Predefined error field(预定义错误区域) (7)5.1.4 Object 1005h: COB-ID for SYNC(SYNC标志符) (8)5.1.5 Object 1008h: Manufacturer device name(制造商设备名) (8)5.1.6 Object 1009h: Hardware version(硬件版本) (8)5.1.7 Object 100Ah: Software version(软件版本) (8)5.1.8 Object 100Ch und 100Dh: Guard Time and life time factor(节点保护参数) (8)5.1.9 Object 1010h: Save parameters(保存参数) (9)5.1.10 Object 1011h: restore default parameters(恢复默认参数值) (9)5.1.11 Object 1014h: COB-ID emergency messages(EMCY标志符) (9)5.1.12 Object 1017h: Producer Heartbeat Time(Heartbeat报文周期) (10)5.1.13 Object 1018h: Identity Object(设备ID) (10)5.1.14 Object 1800h: 1.transmit PDO parameter (TXPDO1 异步) (10)5.1.15 Object 1801h: 2.transmit PDO parameter (TXPDO2 同步) (10)5.2 Detailed Description of the Manufacturer(制造商特定子协议区域) (11)5.2.1 Object 2000h: Mode(工作模式) (11)5.2.2 Object 2001h: LocalAddress(编码器通讯地址) (12)5.2.3 Object 2002h: Max_LoopValue(循环测量时的最大值) (12)5.2.4 Object 2003h: Min_BackForthValue(往复测量时的最小值) (12)5.2.5 Object 2004h: Max_BackForthValue(往复测量时的最大值) (12)5.3 Detailed Description of the General Encoder Parameters(标准的设备子协议区域) (13)5.3.1 Object 6000h: Operating parameters(操作参数) (13)5.3.2 Object 6003h: Preset value(外部置位的设定值) (13)5.3.3 Object 6004h: Value of position(编码器当前位置值) (14)5.2.6 Object 6200h: Cyclic timer(发送测量值间隔时间) (14)5.3.4 Object 6500h: Operating status(操作状态) (14)5.3.5 Object 6501h: SingleTurn resolution(每圈对应的测量值) (14)5.3.6 Object 650Bh: Serial number(出厂序号) (14)6、RS232通讯参数 (15)7、Layer-Setting-Service (LSS) (16)附:CANopen报文分析 (18)1、CANopen介绍从OSI网络模型的角度来看同,现场总线网络一般只实现了第1层(物理层)、第2层(数据链路层)、第7层(应用层)。
CANopen中Timer.h和can.h与库头文件中的重名了,需要修改CANopen中的文件名,而且CANopen源文件中引用该头文件的地方也需要修改过来,改名加一个CANopen前缀。
driverlib.lib文件可能需要更新,之前遇到没有CANbitset()函数吧!更新一下就可以了。
要用ICDI设置断点调试,需要对工程进行设置,之前是自己新建的工程,默认是选择左边的Use Simulator,至少调试时提示不能写某地址吧!选择右边的后就可以调试了,得记住!Keil里全局查找Message时,在.h文件中没有找到,其实是由Message的定义的吗,估计没有包含进入工程吧!我们只是包含了h文件的目录,并没有将其加入工程;这个真需要注意!可以将头文件添加进工程需要实现的函数setTimer()getElapsedTime()UNS8canSend(CAN_PORT notused,Message*m)注意,之前原形弄错了,致使浪费了一点调试时间,程序不能发送心跳报文,当然还有定时器中断以及CAN接收中断处理,row_number和last_timer_raw都是16位无符号整型,last_timer_raw=-1;row_number=0;if(row_number==(TIMER_HANDLE)last_timer_raw+1)last_timer_raw++;这里必须要进行强制类型转换,否则右边为65536,经过测试确认的。
编译错误:1.SDO中发现SDO_BLOCK_SIZE常量未定义,在SDO.c中增加定义#define SDO_BLOCK_SIZE102.CO_Data结构体中用到了未定义的ObjDict_obj100C,故在对象字典中增加定义3.Link错误:比如未实现void setTimer(TIMEVAL value);TIMEVAL getElapsedTime(void);等等。
CANopen中Timer.h和can.h与库头文件中的重名了,需要修改CANopen中的文件名,而且CANopen源文件中引用该头文件的地方也需要修改过来,改名加一个CANopen前缀。
driverlib.lib文件可能需要更新,之前遇到没有CANbitset()函数吧!更新一下就可以了。
要用ICDI设置断点调试,需要对工程进行设置,之前是自己新建的工程,默认是选择左边的Use Simulator,至少调试时提示不能写某地址吧!选择右边的后就可以调试了,得记住!
Keil里全局查找Message时,在.h文件中没有找到,其实是由Message的定义的吗,估计没有包含进入工程吧!我们只是包含了h文件的目录,并没有将其加入工程;这个真需要注意!可以将头文件添加进工程
需要实现的函数
setTimer()
getElapsedTime()
UNS8 canSend(CAN_PORT notused, Message *m)注意,之前原形弄错了,致使浪费了一点调试时间,程序不能发送心跳报文,
当然还有定时器中断以及CAN接收中断处理,
row_number和last_timer_raw都是16位无符号整型,last_timer_raw = -1;row_number=0;if (row_number == (TIMER_HANDLE)last_timer_raw + 1) last_timer_raw++;
这里必须要进行强制类型转换,否则右边为65536,经过测试确认的。
编译错误:
1.SDO中发现SDO_BLOCK_SIZE常量未定义,在SDO.c中增加定义#define SDO_BLOCK_SIZE
10
2.CO_Data结构体中用到了未定义的ObjDict_obj100C,故在对象字典中增加定义
3.Link错误:比如未实现void setTimer(TIMEVAL value);TIMEVAL getElapsedTime(void);等
等。
这个是因为没有实现上述函数,其实实现这几个函数是移植的关键:
在
SDO测试结果截图,读取对象字典对象索引0x1017的第1个数据,
23 00 18 01 01 02 00 00//改写索引0x1800子索引0x01即TPDO1对应的帧ID为0x00000201 40 00 18 01 00 00 00 00//读取索引0x1800子索引0x01即TPDO1对应的帧ID
下图测试结果显示正确实现了SDO读写功能。