CANopen教程全解

合集下载

第三方CANOPEN配置方法

第三方CANOPEN配置方法

第三方硬件配置方法
一、
进入Hardware Catalog Manager配置硬件;
二、配置第三方产品;
三、添加EDS文件;
先在第三方产品上点击“add device”,添加EDS文件,找到EDS文件并命名,第三方产品的第四个“yhb”即为添加好的产品,然后右击会出现“add fuction”,添加IODDT,右击取消全选,并选择2401:01、2401:02及6401:01、6401:02,添加就可以了,最后再编译下,如果没有错误硬件配置就好了。

四、UnityPro软件配置;
双击配置中CANOPEN,就会出现CANOPEN子站画面,3和4号地址是两台变频器,然后再双击总线上3号和4号下面的一个圈,添加第三方设备,如图
选择第三方产品“yhb”,这样第三方的子站就添加成功了。

然后双击这个子站的块,进入PDO文件的添加,如下图
注意左下角的“功能”要选择一下,默认的DEFAULT可能没选择,需要更改下。

把这四个变量分别添加到PDO中。

传输(%I)中插入IW,接收(%Q)插入QW即可,然后需要设置下传输(%I)的传输类型,修改为如图。

而接收(%Q)仍然为异步方式。

六、程序已经编好,这里不再阐述,主站配置
配置好输入输出自述和第一个%mw的索引及传输速度就可以,这样配置就OK了。

(完整word版)CANOPEN协议详解

(完整word版)CANOPEN协议详解

一、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) 错误检测功能·错误通知功能·错误恢复功能所有的单元都可以检测错误(错误检测功能)。

CANopen轻松入门

CANopen轻松入门

广州致远电子股份有限公司入门教程 CANopen 轻松入门类别内容 关键词CANopen DS301 摘 要 用于初次接触CANopen 的用户,主要以CANopen DS301为主要教授方向修订历史目录1. 前言 (1)2. CANopen在ISO层级中的位置 (2)3. CANopen协议诞生和发展 (3)4. CANopen的预定义报文ID分类 (5)4.1网络管理(NMT)与特殊协议(Special protocols)报文ID分类 (5)4.2过程数据对象(PDO)和服务数据对象(SDO)的报文ID分类 (7)5. 对象字典OD(Object dictionary) (9)5.1对象字典概述 (10)5.2通讯对象子协议区(Communication profile area) (10)5.3通用通讯对象(General communication objects) (10)5.4制造商特定子协议(Manufacturer-specific Profile) (11)5.5标准化设备子协议(Standardized profile area) (12)5.6对象字典和EDS文件实例 (12)6. 网络管理NMT(Network management) 与CANopen主站 (16)6.1NMT节点状态 (16)6.2NMT节点上线报文 (17)6.3NMT节点状态与心跳报文 (18)6.4NMT节点守护 (18)6.5NMT节点状态切换命令 (19)6.6CANopen主站设备 (20)7. 过程数据对象PDO(Process data object) (22)7.1PDO的CAN-ID定义 (22)7.2PDO的传输形式 (23)7.3PDO的通信参数 (24)7.4PDO的映射参数 (24)8. 服务数据对象SDO(Service data object) (26)8.1通讯原则(communication principle) (26)8.2快速SDO协议(Expedited SDO protocol) (27)8.3普通SDO协议(Normal SDO protocol) (27)9. 特殊协议(Special protocols) (30)9.1同步协议(Sync protocol) (30)9.2时间戳协议(Time-stamp protocol) (31)9.3紧急报文协议(Emergency protocol) (33)10. 免责声明 (35)1. 前言本教程适用于CIA CANopen协议DS301又名CIA301标准。

CANopen教程全解 共36页

CANopen教程全解 共36页
①事件触发模式(一个对象特定事件出现而触发) ②时间触发模式(如:一规定时间内无事件发生) ③远程请求触发(接受到任何其他设备发出的一个远程
请求)
(2)SDO服务数据对象
功能:主要用于主节点对从节点的参数配置。 用来在设备之间传输大的低优先级数据,典型 的是来配置CANopen网络上的设备。
通讯方式:客户机/服务器 它用于访问对象字典的入口。对CANopen对象
表示命令会被广播至所有从节点 任何NMT从设备在上电时都必须主动报告自己上电信
息,便于NMT主设备进行管理。
(4)特殊功能对象
①同步对象 ②紧急对象 ③时间标记对象
①同步对象
功能:由同步生产者向网络进行周期性 的广播,该对象提供基本的网络时钟
通信方式:生产者/消费者模式
②紧急对象
CANopen网络通信和管理是通过不同的通信对象来完 成的。
CANopen协议定义了四种通信对象,分别为过程数据 对象PDO(Process Data Object)、服务数据对象 SDO(Service Data Object)、网络管理对象 NMT(NetWork Management Object)、预定义报文或 者特殊功能对象。
二、通信方式
根据通信对象功能,通信关系可分为以下3类: 主/从关系可以对应NMT SYNC 节点保护等 一
对多,一唯一,可以有应答,也可以没有。 客户机/服务器可以对应SDO 一对一,带应答。 生产者/消费者可以对应PDO Heartbeat等,一
对多,一不唯一,没有应答。
二、通信方式
对于开发主节点和从节点设备来说有着较大的区别, 主节点主要负责整个网络的管理并且能加载所有节点
的EDS(Electronic Data Sheet)文件,例如主节点可

F1与Kinco伺服CANopen异步通讯使用说明

F1与Kinco伺服CANopen异步通讯使用说明

F1与KINCO伺服CANopen使用说明准备工作:●准备好PC与PLC通讯的标准以太网线。

●焊好PLC与伺服间的CANopen通讯电缆,通讯电缆务必使用屏蔽双绞线,2-7脚双绞在一起。

首末一定要加120Ω的终端电阻,F1端自带终端电阻可以不焊。

以下做法供参考:●用KincoServo上位机软件配置好伺服参数:(1)去掉伺服驱动器数字输入口功能,否则通讯无法控制伺服控制字、工作模式等对象。

(2)设置好伺服ID号。

整个CANopen网络里面不允许有重复的ID,点击“驱动器/控制面板/F005”查看/修改驱动器ID。

部分系列驱动器ID采用外部拨码开关设置,请注意查看手册说明。

(3)设置好伺服CANopen通讯波特率。

点击“驱动器/ECAN/其他”菜单,设置伺服驱动器CANopen通讯波特率,如下图所示。

完成准备工作我们就可以开始PLC编程工作了。

CANopen通讯要点:通讯电缆是否正确,终端电阻是否正确,站号是否正确,波特率是否正确,PDO配置是否正确,PDO传输类型是否正确。

1.打开软件新建工程,选择F1,点击OK。

2.根据自己的喜好选择PLC主程序的编程语言,然后点击OK。

3.开始进行CANopen通讯配置前,我们先需要添加伺服从站的EDS文件到Codesys里面来。

点击主菜单栏里的“Extras/add configuration file”选项。

找Kinco伺服的EDS文件,选中文件点击OK。

4.添加CANopen从站,设置通讯参数。

(1)F1有两路CANopen主站,选中其中一个口右键添加伺服从站。

(2)从站添加成功后,设置主站通讯参数。

下图中PLC主站波特率500K,波特率最高可设成1M,主从站波特率要一样;主站Node_ID可以设成0,不能和伺服从站ID重复。

(3)设置伺服从站的通讯参数。

下图中伺服从站的Node_ID设为1,从站Node_ID设置范围1-127,伺服驱动器ID要和这里设置的值一样为1;多个从站时ID要设置的都不一样。

CAN-open程序解读

CAN-open程序解读

刘怡师兄CANopen协议从节点实现程序简单说明作者邱家齐CAN从节点初始化:(从节点决定了其扮演的角色,也决定了其初始化,主从节点是不同的)void CAN0_Init (void)功能:11位ID,设置速率500K,接收发送对应的ID/message object/数据长度发送与接收的配置只有3个寄存器不同CAN0IF1MC/ CAN0IF1A2/ CAN0IF1CR接收SYNC设置11-bit identifier: 0x0080 (低11位00010000000)接收NMT 0x0000接收RPDO1 0x0200+ NodeId=0x0202(此从节点NodeId=0x02一个从节点可有多个RPDO)接收rSDO 0x0600 + NodeId=0x0602接收NODE GUARD 0x0702发送EMCY message 0x0082发送TPDO1 0x0182发送tSDO 0x0582 (从节点需要tSDO发送应答)发送NODE Status 0x0702CAN发送函数canSend(Message * m)m中包括了cob_id/datas[],根据cob_id找到对应的message object,配置好CAN0IF2CM/ CAN0IF2CR就好了数字可编程电位器输出函数OutPut(U8 VC)100 tap 数字可编程电位器DPP,UD/INC/CS控制信号根据VC与Pre_VC(前一次输出)的差值,控制UD,INC使输出VC设置从节点初始态setState(&ObjDict_Data, Initialisation)从节点状态改变主要是由主节点(上位机)发NMT报文,从节点收到NMT报文,则调用proceedNMTstateChange(d,m)进行状态转换从节点之后进入while()大循环,用到switch case,根据从节点当前状态nodeState,做相应处理,不断查询nodeState其中_initialisation()和_preOperational()为空函数,因为我们在前面已经做好了初始化工作关键是主节点控制从节点使其进入Operational后,调用AD()采样函数,如果工作电压电流超过阈值(2000V/500mA),调用canSend(&m)发送报警给主节点(上位机),调用OutPut(0),然后关电源,如果输出正常,根据控制命令(自动or手动)与当前状态(自动or手动)进行相应处理,调用OutPut(Write_Analogue_Output_8_Bit[0])输出主节点(上位机)设定的值,很明显Write_Outputs_8_Bit[]与Write_Analogue_Output_8_Bit[]是主节点发给从节点的指令与数据(主节点可以通过tSDO与tPDO),从节点可以通过tPDO将AD采样数据Read_Analogue_Input_16_Bit[]实时传输给主节点(只能是tPDO)再来看看CAN中断服务函数INTERRUPT (CAN0_ISR, INTERRUPT_CAN0)接收到报文m(包括datas[]/cob_id/ len/ rtr),然后调用canDispatch( &ObjDict_Data, &m)处理接收报文,下面分析canDispatch()函数canDispatch()根据cob_id的功能码进行跳转,有4个分支proceedSYNC(d):SYNC同步报文是主节点发的,SYNC主要服务于tPDO(tPDO有6种传输模式,其中3种需要SYNC信号)如果从节点处于operational状态(此态允许tPDO),则在proceedSYNC(d)里调用A_sendPDOevent(d, 1 /*isSyncEvent*/ )该函数一次处理所有tPDO(因为return是在while之后),首先从OD中取出tPDO传输类型n(0—255(241—251保留)),第一个if 0 <n<241 且++d->PDO_status[pdoNum].transmit_type_parameter==n则Reset count of SYNC,调用buildPDO (d, pdoNum, &pdo),然后把pdo存起来d->PDO_status[pdoNum].last_message = pdo,并调用canSend (&pdo)这里其实有对SYNC进行计数,收到n个SYNC报文,才发送tPDO第二个else if n== TRANS_RTR_SYNC调用buildPDO (d, pdoNum, &d->PDO_status[pdoNum].last_message)如果建立成功,则将其d->PDO_status[pdoNum].transmit_type_parameter设置为PDO_RTR_SYNC_READY,这样从节点接收到主节点发的PDO请求后,调用proceedPDO(d,m)就会发送tPDO,如果建立没有成功,则状态设置~PDO_RTR_SYNC_READY第三个else if n==0 ||(( n==254 ||255)&&(n!= PDO_INHIBITED))调用buildPDO (d, pdoNum, &pdo),如果new and old PDO相同,处理下一个tPDO,如果不相同,如果EventTimerDuration与InhibitTimerDuration不为零,则等待时间到,然后调用canSend (&pdo)第四个elsetPDO与SYNC无关,处理下一个tPDOproceedPDO(d,m)该函数处理接收rPDO首先判断m报文是否是请求报文(远程帧)如果不是请求报文(数据帧),在从节点的接收rPDO中查找,如果其pwCobId与m报文的cob_id相同,就找到了numPdo,也可以得到pMappingCount,(下图中为2)从子索引1开始,得到Size=8,调用CopyBits ()将m->datas[]写入tmp[],然后调用setODentry() 将tmp[]中数据写入对应对象的子索引中,然后处理子索引2……如果是请求报文(远程帧),在从节点的发送tPDO中查找,如果其pwCobId与m报文的cob_id 相同,就找到了numPdo,然后得到其传输类型pTransmissionType第一个if pTransmissionType ==TRANS_RTR,则buildPDO (d, numPdo, &pdo),然后canSend (&pdo)第二个else if pTransmissionType == TRANS_RTR_SYNC,则判断d->PDO_status[numPdo]. transmit_type_parameter是否PDO_RTR_SYNC_READY,如果ready,调用canSend (&d->PDO_status[numPdo].last_message)如果没有ready,发送current data(即buildPDO (d, numPdo, &pdo),canSend (&pdo))第三个else if 传输类型TRANS_EVENT_PROFILE|| TRANS_EVENT_SPECIFIC,则调用PDOEventTimerAlarm (d, numPdo) (还需要仔细阅读)第四个else 返回0xFF该函数首先判断本节点是SDO_SERVER还是SDO_CLIENT,本例中为从节点,故为SDO_SERVER,(程序中考虑了多个SDO的情况,但是通常只有1个rSDO和1个tSDO,主从节点都如此)查找方法与上面提到的方法类似,找到后判断m报文数据长度是否为8,不为8则认为出错,然后程序根据m->datas[0]的高3位(高3位决定SDO传送类型(见协议))进行跳转,采用的是switch casecase 1:启动域下载(站在主节点的角度,是主节点请求写从节点的对象字典)从m中提取index与subIndex,然后调用getSDOlineOnUse()查看是否SDO transfert已经开始过了(即不是SDO_RESET),如果没有,那很好,调用getSDOfreeLine(d, whoami, &line)找1个空闲线程,然后initSDOline(d, line, nodeId, index, subIndex, SDO_DOWNLOAD_IN_PROGRESS),如果SDO加速传送(最多传送4字节)调用SDOtoLine()将m中数据写入d->transfers[line]中(写入线程中),然后调用SDOlineToObjdict(d, line)将数据写入对象字典中index和subIndex对应的对象中,之后释放该线程如果SDO分段传送如果指明了数据长度(长度对应上图中4字节计数器),调用setSDOlineRestBytes(d, nodeId, nbBytes)然后从节点调用sendSDO(d, whoami, sdo)给出SDO应答case 0:启动域分段下载(分段下载的第一帧已经在case 1中处理了)从节点是SDO_SERVER,调用err = getSDOlineOnUse( d, nodeId, whoami, &line ),因为case 0中SDO分段传送调用过initSDOline(d, line, nodeId, index, subIndex, SDO_DOWNLOAD_IN_PROGRESS),状态变为SDO_DOWNLOAD_IN_PROGRESS了,所以err=0,从transfers[line]中取出index和subindex,之后进行toggle测试,m中数据第1字节是命令字节,包括此帧数据长度,调用SDOtoLine(d, line, nbBytes, (*m).datas + 1)将数据写入线程中,然后为SDO应答做好准备,调用sendSDO(d, whoami, sdo)给出应答,如果是最后的segment,调用SDOlineToObjdict(d, line),将数据写入对象字典中index和subIndex对应的对象中,释放该线程,如果不是最后的segment,返回case 2:启动域上传(主节点读从节点对象字典请求)从节点从m中提取index和subindex,调用getSDOlineOnUse()查看是否SDO transfert已经开始过了(即不是SDO_RESET),如果No line on use那很好,找一个空闲的线程line,然后initSDOline(d, line, nodeId, index, subIndex, SDO_UPLOAD_IN_PROGRESS),objdictToSDOline(d, line),getSDOlineRestBytes(),如果要传送的nbBytes > 4,则进行分段传送,准备应答sdo,sdo数据的后4个字节代表nbBytes,然后调用sendSDO(d, whoami, sdo)给出应答,如果nbBytes<= 4,就不用分段传送了,是加速传送,对于加速传送,这里还要调用lineToSDO(d, line, nbBytes, sdo.body.datas + 4),将line 中数据存入sdo.body.datas[]中,sdo数据的后4个字节就是主节点需要的数据,调用sendSDO(d, whoami, sdo)应答,之后释放该SDO线程case 3:域分段上传首先调用getSDOlineOnUse( d, nodeId, whoami, &line )判断SDO传送是否已经开始过(即是否收到启动域上传报文且传送模式为分段传送(nbBytes > 4)),如果是,则从d->transfers[line]提取index和sub index,(case 2中初始化过的),进行Toggle test,调用getSDOlineRestBytes(d, line, &nbBytes)得到还需传送的nbBytes,如果nbBytes > 7,则不是最后的segment,先调用lineToSDO(d, line, 7, sdo.body.datas + 1),然后调用sendSDO(d, whoami, sdo)作为应答如果nbBytes <= 7,则是最后的segment,调用lineToSDO(d, line, nbBytes, sdo.body.datas + 1),然后调用sendSDO(d, whoami, sdo)作为应答,之后调用resetSDOline(d, line)释放该线程case 4:域传送终止故从最后4字节提取终止原因得到abortCode,调用getSDOlineOnUse( d, nodeId, whoami, &line )查找那个线程line被要求终止,然后释放该线程line,default:未定义传送模式,return 0xFFproceedNMTstateChange(d,m)如果d->nodeState目前处于Pre_operational or Operational or Stopped则if( ( (*m).datas[1] == 0 ) || ( (*m).datas[1] == *d->bDeviceNodeId ) ) 判断该NMT报文是否是发给自己的(从节点),如果datas[1]==0,该NMT是发给所以从节点的,如果datas[1] == *d->bDeviceNodeId,当然是发给自己的m报文中第0字节datas[0]是主节点发的状态转换命令,用switch case进行跳转调用setState(d,newstate)设置从节点状态为newstate主要函数列表U8 canSend(Message * m)void OutPut(U8 VC)INTERRUPT (CAN0_ISR, INTERRUPT_CAN0)void canDispatch(CO_Data* d, Message *m)UNS8 proceedSYNC(CO_Data* d)proceedPDO (CO_Data * d, Message * m)UNS8 proceedSDO (CO_Data* d, Message *m)void proceedNMTstateChange(CO_Data* d, Message *m)UNS8 setState(CO_Data* d, e_nodeState newState)PDO相关U8 proceedPDO (CO_Data * d, Message * m)U8 A_sendPDOevent (CO_Data * d, U8 isSyncEvent) 由proceedSYNC(CO_Data* d)调用U8 buildPDO (CO_Data * d, U8 numPdo, Message * pdo)U32 _getODentry(CO_Data* d, U16 wIndex,U8 bSubindex,void * pDestData, U32 * pExpectedSize,U8 * pDataType,U8 checkAccess,U8 endianize)U32 _setODentry( CO_Data* d,U16 wIndex,U8 bSubindex, void * pSourceData,U32 * pExpectedSize,U8 checkAccess,U8 endianize)TIMER_HANDLE DelAlarm(TIMER_HANDLE handle)Void PDOEventTimerAlarm (CO_Data * d, U32 pdoNum)TIMER_HANDLE SetAlarm(CO_Data* d, UNS32 id, TimerCallback_t callback, TIMEVAL value, TIMEVAL period)SDO相关UNS8 proceedSDO (CO_Data* d, Message *m)UNS8 getSDOlineOnUse (CO_Data* d, UNS8 nodeId, UNS8 whoami, UNS8 *line)UNS8 getSDOfreeLine ( CO_Data* d, UNS8 whoami, UNS8 *line )UNS8 initSDOline (CO_Data* d, UNS8 line, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 state)UNS8 SDOtoLine (CO_Data* d, UNS8 line, UNS32 nbBytes, UNS8* datas)UNS8 lineToSDO (CO_Data* d, UNS8 line, UNS32 nbBytes, UNS8* datas)UNS32 objdictToSDOline (CO_Data* d, UNS8 line)UNS32 SDOlineToObjdict (CO_Data* d, UNS8 line)UNS8 sendSDO (CO_Data* d, UNS8 whoami, s_SDO sdo)。

EPEC控制器CANOPEN使用说明

EPEC控制器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毫秒发送一次数据,如果数据改变了,则控制器会马上将改变的数据发送到总线上。

canopen华茂教程

canopen华茂教程

华茂技术部CANopen实现1.简介从OSI网络模型的角度来看,现场总线网络一般只实现了物理层、数据链路层和应用层,CAN现场总线仅仅定义了物理层和数据链路层,实际设计中,这两层完全有硬件来实现。

但是CAN没有规定应用层协议,无法定义CAN报文中11/29位标示符和8字节数据的使用。

因此需要一个开放的、标准化的高层协议,使得协议支持各种CAN厂商设备。

CANopen是基于CAN的一个应用广泛的应用层协议,它提供了网络管理服务和报文传送协议,在保证网络节点互用性的同时允许节点的功能随意扩展。

下面这张图可以简要的描述CAN标准和CANopen协议之间的关系:CAN和CANopen在OSI网络模型中的位置2.CANopen通讯CANopen的核心概念是设备对象字典(OD:Object Dictionary),在其它现场总线(Profibus,Interbus-S)系统中也使用这种设备描述形式。

下面先介绍对象字典(OD:Object Dictionary),然后再介绍CANopen通讯机制。

2.1对象字典OD对象字典包含了描述一个设备和它的网络行为的所有参数。

对象字典是一个有序的对象组,每个对象采用一个16位的索引值来寻址,为了允许访问数据结构中的单个元素,还定义了一个8位的子索引,下图为对象字典的索引表:CANopen协议定义的通用对象字典结构表在表中可以看出,索引值从0x0000至0xFFFF,其中0x0000-0x0FFF区域和0x2000-0x5FFF区域是定义好的区域,不能用来开发,可以用来建立设备对象字典的区域为通讯子协议区域和标准的设备子协议区域,例如用于描述运动控制的设备子协议DS402中定义了索引项0x6072为max_torque, 索引项0x6073为max_current, 索引项0x60F8为max_slippage,等等。

CANopen网络中每个节点都有一个对象字典,用来描述当前节点的设备信息、网络行为和参数,在主从网络结构中,主站通过从站的对象字典来查询修改从站的参数或者对从站的网络行为进行指示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档