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是一个通信协议,主要用于实现设备间的通讯。
ESD文件(Emergency Stop Device)是CANopen通讯中的一种文件格式,它用于描述紧急停止设备(ESD)的信息。
这些信息包括设备的识别、地址、配置以及与紧急停止相关的参数。
ESD文件的基本格式通常包括以下几个部分:
1. **头部信息**:包含了文件类型标识、版本号、制造商ID、设备类ID等信息。
2. **紧急停止配置**:描述了紧急停止设备的工作模式、触发条件、响应时间等参数。
3. **参数列表**:包含了设备的具体参数,如节点ID、波特率、停止寄存器等。
4. **对象字典**:定义了与设备相关的对象,包括数据对象、寄存器对象等。
5. **服务列表**:定义了设备能够提供的服务,如配置服务、监控服务等。
ESD文件通常用于配置和初始化CANopen网络中的设备,确保它们能够正确地通信和协同工作。
这种文件格式允许设备制造商和系统集成商在不同的系统和设备之间进行配置和移植,提高了系统的灵活性和可扩展性。
怎么做canopen开发我现在要做DSP2812与驱动器的通信,使用CANopen协议?应该怎么着手,没有基础。
谢谢!1.先看看协议介绍,周立功网站上有些;对CANopen有个大致了解,分析一下是否适合自己的方案应用。
2.去cia下载301协议看看3.下载个简单的协议栈代码(论坛上有),结合协议文件仔细分析,并把它移植到你的DSP上。
4.根据功能要求编写和完善自己的协议栈。
、、我可以提供F2812 CANopen源代码301 + 402联系bluestar_nj@SDO访问对象字典的问题SDO的帧格式中,先是命令字,然后是Index和Sub-index,那如果我要访问一个没有子索引的入口,例如当我要修改SYNC的COB-ID,SDO的帧格式是怎样的?刚在DS301里找到这句话:For single Object Dictionary entries such as an UNSIGNED8, BOOLEAN, INTEGER32 etc.the value for the sub-index is always zero.那是不是子索引的值为0就可以了?由于分析仪还没买回来,没试过。
没有子索引的,子索引号就是0请问远方,EDS文件是如何导入的?谢谢是不是在记事本中写好EDS文件后,将后缀txt改为eds就可以导入了?是的,按EDS文件規范編寫好文件,擴展名為EDS,然後就可以使用支持EDS文件的組態配置軟件來導入。
对象字典的值的问题对象字典中的参数是不是要赋予一个实际的值啊,这个值是用户设定还是设备已经定好的?比如第二个TPDO(索引0x1801,子索引3)的禁止时间如果在对象字典中的值是0x3FE,那在初始化第二个TPDO 时也要为0x3FE?要是想改变这个禁止时间,是不是对象字典中的值也要变?是啊那请问对象字典的参数是不是由设备厂商已经定好了,用户根据相应的参数来初始化,但也可以更改参数?谢谢如果要更改应该是通过默认的SDO对对象字典的访问来更改的,如果不更改就使用制造商默认的参数或者上次保存的参数,在系统启动的时候加载的。
ProNet伺服驱动器ESTUNCANopen使用手册修订记录日期修订版本描述作者初稿完成移振华增加第8章移振华1、第3,3,1章“PDC参数”修正PDO默认表格中的COB-ID和default值;易健2、增加第9章通讯例程”――目录一一1、概述............................................................................................................................................................................... . (5)1.1CAN主要相关文档 (5)1.2本手册使用的术语和缩语 (5)1.3CAN OPEN 概述 (6)2、接线和连接 (7)3、CANOPEN 通讯 (8)3.1CAN标识符分配表 (9)3.2服务数据对象SDO (10)3.3过程数据对象PDO (12)3.3.1PDO 参数 (14)3.4SYNC 报文 (20)3.5 E MERGENCY 报文 (21)3.6HEARTBEAT 报文 (23)3.7网络管理(NMT) (24)4、单位换算单元(FACTORGROUP) (26)4.1单位换算相关参数 (27)4.1.1positi onfactor (27)4.1.2velocityfactor (29)4.1.3accelerati onfactor (30)5、位置控制功能 (31)5.1位置控制相关参数 (33)6设备控制 (35)6.1控制状态机 (35)6.2设备控制相关参数 (36)6.2.1controlword (37)6.2.29statusword (38)6.2.3shutdown_option_code (3)9624disable_operation_option_code (40)6.2.5quick_stop_option_code (4)6.2.6halt_option_code (41)6.2.7fault_reaction_option_code (41)7、控制模式 (42)7.1控制模式相关参数 (42)7.1.1modes_of_operati on (42)7.1.2modes_of_operation_display (43)7.2回零模式(HOMINGMODE ) (44)7.2.1回零模式的控制字 (44)7.2.2回零模式的状态字 (44)723回零模式相关参数 (45)724回零方法 (47)7.3速度控制模式(PROFILE VELOCITYMODE ) (49)7.3.1速度模式的控制字 (49)7.3.2速度模式的状态字 (49)7.3.3速度控制模式相关参数 (49)7.4位置控制模式(PROFILE POSITIONMODE) (53)7.4.1位置模式的控制字 (53)7.4.2位置模式的状态字 (53)7.4.3位置控制相关参数 (54)7.4.4功能描述 (56)8、CAN通讯相关参数 (58)9、CANOPEN通讯例程 (59)9.1SDO 操作; (59)9.2PDO 配置 (59)9.3位置控制例子(P ROFILE P OSITON MODE ) (60)9.4位置插补控制(I NTERPLATE P OSITION MODE) (61)9.5速度控制(P ROFILE V ELOCITY MODE) (62)9.6回零 (6)2对象字典表 (64)1、概述1.1CAN 主要相关文档CiA DS 301 V 4.01: CiA CANopen Communication Profilefor In dustrial Systems - based on CALCiA DSP 402 V 2.0: CiA CANope n Device Profile1.2本手册使用的术语和缩语CANCiACOBEDSLMTNMTOD参数PDORORWSDO控制器局域网在自动化国际用户和制造商协会中的CAN。
CANOpen的几种操作以及数据其实3年前在21ic就准备做这篇文章了,那时,CANOpen也只是刚刚在国内推广,所以几乎没有项目用到。
现在有了实际的项目,完全确认了以前移植和测试的代码,所以列举一些CANOpen的底层操作以及数据。
当然,列举的都是一些简单的基本的CANOpen通信,不包括其他CANOpen应用协议中的内容。
1.心跳CANOpen节点会以一个固定的频率发送心跳报文。
用于告诉主机,偶还活着。
心跳报文的格式很简单,COB-ID为0x700+Node_ID,数据为一字节的状态数据:图中,ID为706,表示06号节点的心跳,状态是0x7F,表示Pre-Operational状态(节点初始化完成后,进入Pre-Operational状态)。
查看时间,每个心跳报文时间间隔大概1秒。
2.NMTNMT是管理报文,用于实现一些管理操作,比如,节点重启、进入Operational状态等等。
NMT报文格式很简单,ID为000,数据为一字节命令+一节节点号(0表示广播)。
第2号报文就是让06号节点,进入Operational状态,运行完成后,节点心跳报文中的节点状态也变为Operational状态同上,发送stop remote node命令,进入Stopped状态,当然,心跳还是有的,只是节点不干活了这个是reset node命令,用于让节点复位。
复位之后,会首先进入Initializing状态(对于于心跳报文中的0x00),初始化完成后,进入Pre-Operational状态(对应心跳报文中的0x7F)。
3.SDOSDO 主要用来访问节点的对象字典(OD),CANOpen的节点至少需要支持SDO_Server。
对象字典是CANOpen节点的数据组织形式,包含了CANOpen节点的各个参数和数据,比如,心跳报文的发送频率、系统启动次数、节点的通信参数等等等等。
可以说,SDO 是用来设置CANOpen节点的各个运行参数的。
CANopen通讯软件使用手册版权申明感谢您购买北京和利时电机技术有限公司的SE系列全数字步进驱动器(以下简称驱动器)产品。
SE系列全数字步进驱动器是以美国TI公司最新的数字处理芯片(DSP)作为核心控制芯片,采用了先进的全数字式电机控制算法,完全以软件方式实现了电流环控制,具备良好的鲁棒性和自适应能力,可配合多种规格的步进电机,实现速度、力矩和位置高精度、高响应的控制,适应于需要快速响应的精密转速控制与定位控制的应用系统,如:医疗机械、印刷机械、包装机械、造纸机械、塑料机械、纺织机械、工业机器人、自动化生产线等。
本用户手册是针对SE系列全数字步进驱动器的通信手册。
在本手册中,详细地说明了驱动器的串行通信CANopen总线通信协议和使用说明,以此来帮助用户建立上位控制器与驱动器的通信连接。
在使用SE系列驱动器的通信功能之前,请仔细阅读本用户手册,以保证正确使用。
第一章 通信功能简介 (1)第二章 CANopen协议 (2)2.1. 设置 (2)2.1.1. 设置站址 (2)2.1.2. 设置通信波特率 (2)2.2. CANopen通信规范 (3)2.3. 通信对象标识符地址分配 (3)2.4. 通信对象 (4)2.4.1. Network Management Objects(NMT) (5)2.4.2. Synchronization Object(SYNC) (5)2.4.3. Emergency Object(EMCY) (5)2.4.4. Process Data Object(PDO) (7)2.4.5. Service Data Object(SDO) (12)2.4.6. Nodeguard (15)2.4.7. Heartbeat (16)2.4.8. Bootup (17)2.5. 网络初始化和系统Bootup (18)2.5.1. 初始化流程 (18)2.5.2. NMT状态机 (19)2.5.3. 设备状态和通讯对象的联系 (21)2.5.4. 设备状态转换 (21)2.5.5. Bootup (22)第三章 CANopen 设备规范 (23)3.1 PDO映射 (23)3.1.1 RPDO映射 (23)3.1.2 TPDO映射 (23)3.2 设备控制 (24)3.2.1 状态机 (24)3.2.1.1 状态转换 (26)3.2.2 对象描述 (26)3.2.2.1 对象6040h:控制字 (27)3.2.2.2 对象6041h:状态字 (28)3.2.2.3 对象6060h:操作模式 (30)3.2.2.4 对象6061h:操作模式显示 (30)3.2.3 协议位置模式(Profile Position Mode) (30)3.2.3.1 对象607Ah:目标位置 (31)3.2.3.2 对象6081h:协议速度 (31)3.2.3.3 对象6083h:协议加速度 (31)3.2.3.4 对象6084h:协议减速度 (32)3.2.3.5 功能描述 (32)3.2.4 速度通讯模式 (34)3.2.4.1 对象60FF:给定速度 (34)3.2.4.2 对象6083h:协议加速度 (34)3.2.4.3 对象6084h:协议减速度 (35)3.2.5 周期位置模式 (35)3.2.5.1 对象607Ah:目标位置 (35)3.2.5.2 对象60C2h:周期描述 (36)3.2.6 回原点模式 (36)3.3 使用举例 (38)3.3.1 设备控制操作举例 (38)3.3.2 PDO使用举例 (39)3.3.3 SDO读写对象词典对象、驱动器内部参数对象及保存、恢复默认参数举例 .. 40 3.3.4 协议位置模式使用举例 (41)3.3.5 速度通讯模式使用举例 (43)3.3.6 回原点模式使用举例 (44)3.4 对象词典描述 (46)3.4.1 强制性对象 (46)3.4.2 任意对象 (46)3.4.3 设备协议对象 (50)3.4.4 设备商定义对象 (51)通信功能简介第一章 通信功能简介森创SE系列步进驱动器提供了与上位控制器的标准串行通信CAN总线通信硬件接口,可以实现编辑驱动器功能参数、监视运行状态和在线控制电机运转等功能,端口接线方式请参照相应产品说明书中的连线说明章节。
STM32上CAN_OPEN总线移植本文的由来:公司开发的几个产品上都要用到CAN_OPEN总线。
它们适应于DS406标准。
现在公司从来没有人做过有关这方面的事情,而本人也未接触过,但是对下列协议比较了解且已用到产品上:1 以太网及TCP/IP栈。
2 USB2.0 3.03. SSI4. modbus/TCP modbus/RTU所以想用一段时间把这个产品加上can_open总线。
开发过程及调研:为了进行这个开发,购买了下列书籍:现场总线CANOPEN设计与应用,是CiA主席写的。
项目驱动--canopen现场总线基础教程这个是周立功等编的。
这两本书,我基本上大部分是在机场等待时阅读完的,正好哪段时间出去比较多。
另外在网上下载了下列代码:Atmel公司网站上有关canopen参考资料源代码。
Microchip公司网站上的有关芯片资料和源代码C iA网站上的DS301和DS406部分ELGO公司产品样本(他们的产品支持CANOPEN)另外在百度文库中搜索了一些有关的资料,其中最有用的是虹科的CANOPEN协议介绍。
本人非常感谢虹科的这篇文档,因为它使我少花了很多时间去看哪些冗长的标准。
后来发现CANOPN最基础的部分基本上这篇文档都讲到了,而且它的篇幅是如此之短能容纳我最需要的部分,正是因为这么多的网友的无私奉献,我才能把这个协议栈写出来,所以我非常愿意将本文给大家分享。
因为本人文笔有限,不当之处还请谅解。
开发难度:目前国内真正将这个CANOPEN整明白的人还不是很多,少数几个可能在某些公司,有价值的东西基本上也没有发表,这对于推广这个总线很不利,比如我们有好些网友希望将CANOPEN用到STM32的M3单片机上,就碰到了很大的难度。
CANOPEN还是比较复杂的,但是如果我们只开发传感器部分就比较简单了。
传感器部分不一定支持所有的这些命令和协议,有时只需最低的就可以。
比如测量电压的传感器,它只有一个测量量,它就比较简单了。
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读写功能。