CANopen协议开发梳理总结笔记教程

news2024/9/23 1:38:04

0、提醒

        CANOpen使用时,需要清楚什么是大端和小端,这对于CANOpen数据发送及解析时,有很大的帮助。且学习开发CANOpen时,需要具备一定的CAN基础。

1、CANOpen协议介绍

①、什么是CANOpen协议

        CANOpen协议是一种架构在控制局域网络(Controller Area Network, CAN)上的高层通信协议,它广泛应用于工业自动化、机械工程和汽车电子等领域。CANOpen协议通过对象字典、服务数据对象(SDO)、过程数据对象(PDO)等机制,为机器人、运动控制、过程控制、楼宇自动化、交通运输等行业提供了一种标准化的通信解决方案。

        CANOpen协议的标准由非营利组织CiA(CAN in Automation)进行起草、审核及维护工作。

        CANOpen协议本身是一个单一的标准,它定义了设备间的通信协议和接口规范。

        CANOpen协议支持从10kbps到1Mbps的波特率,具体包括10k、20k、50k、125k、250k、500k、800k和1Mbps。

        简单来说,CANOpen协议是一个基于CAN协议的的一个应用层协议。

②、CANOpen协议的特性

        开放性:CANOpen是一个公开的标准,任何公司都可以使用它来开发产品,无需支付许可费用。

        网络管理:CANOpen协议定义了网络管理功能,如节点自诊断、网络监控等,使得网络维护更加方便。

        对象字典:CANOpen使用对象字典来描述设备的功能和状态,使得设备之间的通信更加标准化。

        服务:CANOpen定义了一系列的服务,如NMT(Network Management)、TPDO(Time-Triggered Protocol Data Object)、RPDO(Real-Time Protocol Data Object)等,以满足不同的应用需求。

        PDO(Process Data Object):PDO是CANOpen中用于快速传输过程数据的数据对象,可以实时地传输控制和状态信息。

        SDO(Service Data Object):SDO用于访问设备的对象字典,可以读取或写入设备的状态和配置信息。

        紧急消息:CANOpen还定义了紧急消息,用于在发生严重故障时立即通知网络中的其他设备。

        心跳消息:心跳消息用于监测网络中设备的运行状态,如果一段时间内没有收到某个设备的心跳消息,网络管理系统会认为该设备已经离线。

        CANOpen常用缩写

③、CANOpen协议应用场景

        在CANOpen协议中,对于不同类型的CANopen 设备和应用场景分别有不同的子协议,如CiA301、CiA401、CiA402、CiA421、CiA423、CiA424、CiA426、CiA430、CiA433等众多子协议构成了CANopen协议。

2、CANOpen字典

        CANOpen字典(Object Dictionary, OD)是CANopen协议的核心组成部分,它是一个有序的对象组,用于描述CANopen节点的所有参数,包括通讯数据的存放位置。

        CANOpen字典的结构由索引和子索引组成:

        索引:每个对象采用一个16位的索引值来寻址,范围在0x0000到0xFFFF之间。

        子索引:在某些索引下,为了访问数据结构中的单个元素,定义了一个8位的子索引,范围是0x00到0xFF之间。

        CANOpen的SDO模式下的数据传输时,也是按如下格式进行发送和接收。其中字典中的部分索引可能没有子索引。

3、CANOpen通信

        CANOpen通信有两种模式,分别是SDO通信、和PDO通信,如下图所示为CANOpen通信的设备模型图。

①、SDO通信

        SDO 全称为服务数据对象,其通过对象索引和子索引与CANOpen字典建立联系,通过SDO可以读取对象数据,在允许的情况下,也可以修改写入对象数据。

        SDO 传输方式遵循客户端—服务器模式(CS),即一应一答方式。由 CAN 总线网络中的 SDO 客户端发起,SDO 服务器作出应答。

        SDO 传输报文由COB-ID数据段组成,数据段采用小端模式,即低位在前,高位在后排列。所有的 SDO 报文数据段都必须是 8 个字节。

        SDO发送数据的COB-ID都是0x600+节点ID

        SDO接收数据的COB-ID都是0x580+节点ID

SDO读数据报文格式

SDO写数据报文格式

②、PDO通信

        PDO 全称为 过程数据对象, 其用来传输实时的数据,是 CANopen 中最主要的数据传输方式。通过SDO配置PDO后,可以实现设备端的数据周期性自动上传到服务器,也可以实现控制发送的数据小于8字节,由于PDO发送的数据无返回,因此可以极大的提升数据传输速度。

        按照接收与发送的不同,PDO又分为TPDO和RPDO,其中RPDO用于服务器给设备端发送控制数据TPDO为设备端周期性上传数据到服务器

        PDO 的传输遵循的是生产者消费者模型,即 CAN 总线网络中生产者产生的 TPDO 可根据COB-ID 由网络上一个或者多个消费者 RPDO 接收。每个PDO由通信参数和映射参数共同决定最终传输的方式及内容。

        如下是所使用的电机控制器中实现 PDO 的传输的4 个 RPDO 和4 个 TPDO。注意,不同控制器的PDO数量可能不一致,需要根据实际产品进行手册参考。

        PDO使用时,需要进行映射配置操作,如下所示为PDO映射操作的流程图。

        因PDO映射内容较多,因此将在下一篇博客中详细介绍PDO映射操作。

3、CANOpen应用

①、设置CiA402模式

        发送:601 2B 02 20 01 00 00 00 00 (设置为 CiA402 模式)

//2B 02 20 01 00 00 00 00   (CiA402 模式)
#define WRITE_2_BYTE        0x2B
#define WRITE_60_CTRL_PARAM 0x2002
#define CTRL_MODE_SELECT    0x01
#define CIA402_MODE         0x00

//将数据按规定填充到CAN的8字节数据区
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_PARAM & 0xFF;
data[2] = WRITE_60_CTRL_PARAM >> 8 & 0xFF;
data[3] = CTRL_MODE_SELECT;
data[4] = CIA402_MODE;

serve_motor_send_data(0x601, data);
//成功会返回数据:60 02 20 01 00 00 00 00 

②、循环同步位置模式

        发送:601 2F 60 60 00 08 00 00 00 (循环同步位置模式)

//2F 60 60 00 08 00 00 00 (循环同步位置模式)
#define WRITE_1_BYTE         0x2F   
#define WRITE_60_RUN_MODE    0x6060
#define CYCLIC_SYNC_POS_MODE 0x08

//将数据按规定填充到CAN的8字节数据区
char data[8] = {0};   
data[0] = WRITE_1_BYTE;
data[1] = WRITE_60_RUN_MODE & 0xFF;
data[2] = WRITE_60_RUN_MODE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = CYCLIC_SYNC_POS_MODE;

serve_motor_send_data(0x601, data);
//成功会返回数据: 60 60 60 00 00 00 00 00 

③、电机准备

        发送: 601 2B 40 60 00 06 00 00 00 (设置 6040h为 0x6, 使电机准备)

//2B 40 60 00 06 00 00 00
#define WRITE_2_BYTE           0x2B
#define WRITE_60_CTRL_STATE    0x6040
#define MOTOR_READY            0x06

//将数据按规定填充到CAN的8字节数据区
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_STATE & 0xFF;
data[2] = WRITE_60_CTRL_STATE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = MOTOR_READY;

servo_motor_send_data(0x601, data);
//正常会返回数据:60 40 60 00 00 00 00 00 

③、电机锁轴使能

        发送: 601 2B 40 60 00 0F 00 00 00 (设置 6040h为 0xF, 使电机使能)

//2B 40 60 00 0F 00 00 00
#define WRITE_2_BYTE          0x2B
#define WRITE_60_CTRL_STATE   0x6040 
#define MOTOR_ENABLE          0x7F

 //将数据按规定填充到CAN的8字节数据区
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_STATE & 0xFF;
data[2] = WRITE_60_CTRL_STATE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = MOTOR_ENABLE;

servo_motor_send_data(0x601, data);
//正常会返回数据:60 40 60 00 00 00 00 00 

④、电机松轴失能

        发送: 601 2B 40 60 00 07 00 00 00 (设置 6040h为 0x7, 使电机失能)

//2B 40 60 00 07 00 00 00
#define WRITE_2_BYTE           0x2B
#define WRITE_60_CTRL_STATE    0x6040    
#define MOTOR_DISABLE          0x07

//将数据按规定填充到CAN的8字节数据区
char data[8] = { 0 };
data[0] = WRITE_2_BYTE;
data[1] = WRITE_60_CTRL_STATE & 0xFF;
data[2] = WRITE_60_CTRL_STATE >> 8 & 0xFF;
data[3] = 0x00;
data[4] = MOTOR_DISABLE;

servo_motor_send_data(0x601, data);
//正常会返回数据:60 40 60 00 00 00 00 00 

⑤、设置电机目标位置

        发送: 601 23 7A 60 00 10 27 00 00 (设置目标位置 607Ah为 10000)

//目标位置    :   23 7A 60 00 10 27 00 00 (设置 607Ah为 10000)
#define WRITE_4_BYTE         0x23   
#define WRITE_60_POSITION    0x607A

int pos = 90;//90度
int pos_pulse = (int)(pos * 10000.0 / 360);//数值单位转换(角度值数据转换为脉冲)
char data[8] = { 0 };

//将数据按规定填充到CAN的8字节数据区
data[0] = WRITE_4_BYTE;
data[1] = WRITE_60_POSITION & 0xFF;
data[2] = WRITE_60_POSITION >> 8 & 0xFF;
data[3] = 0x00;
data[4] = pos_pulse & 0xFF;
data[5] = pos_pulse >> 8 & 0xFF;
data[6] = pos_pulse >> 16 & 0xFF;
data[7] = pos_pulse >> 24 & 0xFF;

servo_motor_send_data(0x601, data);
//正常会返回到数据
//例如:60 7A 60 00 00 00 00 00 

⑥、读取电机实际位置

        发送:601 40 63 60 00 00 00 00 00

#define READ_60_CMD      0x40
#define READ_60_POSITION 0x6063

//将数据按规定填充到CAN的8字节数据区
char data[8] = { 0 };
data[0] = READ_60_CMD;
data[1] = READ_60_POSITION & 0xFF;
data[2] = READ_60_POSITION >> 8 & 0xFF;

servo_motor_send_data(0x601, data);
//正常会返回到读取到的位置数据
//例如:43 63 60 00 F1 2D C0 01 

⑦、读取电机实际速度

        发送:601 40 6C 60 00 00 00 00 00

//40 6C 60 00 00 00 00 00
#define READ_60_CMD    0x40
#define READ_60_SPEED  0x606C

//将数据按规定填充到CAN的8字节数据区
char data[8] = { 0 };
data[0] = READ_60_CMD;
data[1] = READ_60_SPEED & 0xFF;
data[2] = READ_60_SPEED >> 8 & 0xFF;

servo_motor_send_data(0x601, data);
//正常会返回到读取到的速度数据
//例如:43 6C 60 00 7C F6 FF FF 

⑧、读取电机实际电流

        发送:601 40 78 60 00 00 00 00 00

//40 78 60 00 00 00 00 00
#define READ_60_CMD 0x40
#define READ_60_CURRENT 0x6078

//将数据按规定填充到CAN的8字节数据区
char data[8] = { 0 };
data[0] = READ_60_CMD;
data[1] = READ_60_CURRENT & 0xFF;
data[2] = READ_60_CURRENT >> 8 & 0xFF;

servo_motor_send_data(0x601, data);
//正常会返回到读取到的电流数据
//例如:4B 78 60 00 FC FF 00 00 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1901481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS——队列集

一、队列集 一个队列只允许任务间传递的消息为 同一种数据类型 ,如果需要在任务间 传递不同数据类型的消息 时,那么就可以使用队列集 作用:用于对多个队列或信号量进行“监听”(接收或获取),其中 不管哪一…

Java线上接口耗时分析神器 Arthas

介绍 程序员的日常,总是离不开“调优”和“排查”。尤其当线上环境出现问题,性能瓶颈把人逼疯。这时候,你就需要一款像 Arthas 这样的神器来救场。 什么是 Arthas? 简单来说,Arthas 是阿里巴巴开源的 Java 诊断工具…

SwinUnet详解

文章目录 摘要一. 编码端模块1. PatchEmbed2. SwinTransformerBlock2.1. Window_partition2.2. WindowAttention2.3. Window_reverse2.4. MLP 3. PatchMerging 二. 解码端模块三. 完整流程图 摘要 swinunet基本结构: swinunet采用编码器-解码器结构: 编…

python读取csv出错怎么解决

Python用pandas的read_csv函数读取csv文件。 首先,导入pandas包后,直接用read_csv函数读取报错OSError,如下: 解决方案是加上参数:enginepython。 运行之后没有报错,正在我欣喜之余,输出一下d…

vulnhub靶场之Jarbas

1 信息收集 1.1 主机发现 arp-scan -l 发现主机IP地址为:192.168.1.16 1.2 端口发现 nmap -sS -sV -A -T5 -p- 192.168.1.16 存在端口22,80,3306,8080 1.3 目录扫描 dirsearch -u 192.168.1.16 2 端口访问 2.1 80端口 2.2…

软件设计之Java入门视频(12)

软件设计之Java入门视频(12) 视频教程来自B站尚硅谷: 尚硅谷Java入门视频教程,宋红康java基础视频 相关文件资料(百度网盘) 提取密码:8op3 idea 下载可以关注 软件管家 公众号 学习内容: 该视频共分为1-7…

【OnlyOffice】桌面应用编辑器,插件开发大赛,等你来挑战

OnlyOffice,桌面应用编辑器,最近版本已从8.0升级到了8.1 从PDF、Word、Excel、PPT等全面进行了升级。随着AI应用持续的火热,OnlyOffice也在不断推出AI相关插件。 因此,在此给大家推荐一下OnlyOffice本次的插件开发大赛。 详细信息…

[激光原理与应用-98]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 2 - 什么是激光器焊接? 常见的激光焊接技术详解

目录 一、什么是激光焊接 1.1 概述 1.2 激光焊接的优点 二、激光焊接的应用 2.1 哪些场合必须使用激光焊接 1. 汽车制造业 2. 航空航天领域 3. 电子行业:消费类电子3C 4. 医疗器械制造 5. 新能源锂电池行业 6. 其他领域 三、激光焊接的分类 3.1 按焊接…

指针回顾.

指针的主要作用:提供一种间接访问数据的方法 1.地址:区分不同内存空间的编号 2.指针:指针就是地址,地址就是指针 3.指针变量:存放指针的变量称为指针变量,简称为指针 1.指针的定义 int *p NULL; int *q NULL; char *p NULL; double *p NUL…

多功能工具网站

江下科技在线应用-免费PDF转换成Word-word转pdf-无需下载安装 (onlinedo.cn)https://www.onlinedo.cn/

AI对于高考和IT行业的深远影响

目录 AI对IT行业的冲击及深远影响1. 工作自动化2. 新的就业机会3. 行业融合4. 技术升级和创新5. 数据的重要性 IT行业的冬天要持续多久?大学的软件开发类专业是否还值得报考?其他问题IT行业是否都是加班严重?35岁后就业困难是否普遍现象&…

大数据中的常见数据问题:独断脏

想象你刚刚入职一家声称正在进行"数字化转型"的大型企业,担任大数据开发工程师。在入职的第一周,你满怀热情,迫不及待地想要大展拳脚,用你的技能来推动公司的数据驱动决策。 目录 大数据中的常见数据问题1. 独 - 数据孤岛2. 断 - 数据价值链断层3. 缺 - 标准、治理…

C++初学者指南-4.诊断---地址检测器

C初学者指南-4.诊断—地址检测器 幻灯片 地址检测器(ASan) 适用编译器g,clang检测内存错误 内存泄露访问已经释放的内存访问不正确的堆栈区域 用额外的指令检测代码 运行时间增加约70%内存使用量大约增加了3倍 示例:检测空指针 使用地址…

【全图文教程】如何安装MySQL

一、官网下载MySQL 打开MySQL官方下载页:https://dev.mysql.com/downloads/installer/ 二、安装MySQL 点击下载下来的安装包,进入安装界面。 选择Custom(自定义安装), 因为有些应用我们可能用不到。 选择要安装的服务, 并…

跨越语言的界限:Vue I18n 国际化指南

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 国际化简介 vue-i18n 安装和配置 创建语言包 基本使用 切换语言 动态翻…

在 PostgreSQL 中,如何处理大规模的文本数据以提高查询性能?

文章目录 一、引言二、理解 PostgreSQL 中的文本数据类型三、数据建模策略四、索引选择与优化五、查询优化技巧六、示例场景与性能对比七、分区表八、数据压缩九、定期维护十、总结 在 PostgreSQL 中处理大规模文本数据以提高查询性能 一、引言 在当今的数据驱动的世界中&…

在Ubuntu 22.04 LTS 上安装 MySQL两种方式:在线方式和离线方式

Ubuntu安装MySQL 介绍: Ubuntu 是一款基于Linux操作系统的免费开源发行版,广受欢迎。它以稳定性、安全性和用户友好性而闻名,适用于桌面和服务器环境。Ubuntu提供了大量的软件包和应用程序,拥有庞大的社区支持和活跃的开发者社区…

Chair Footrest Protective Cover

Chair Footrest Protective Cover 万能通用型椅子脚垫保护套凳子耐磨硅胶加厚垫桌椅脚垫防滑静音套

如何使用HippoRAG增强LLM的记忆

大型语言模型(LLM)已经证明是一种非常宝贵的思考工具。经过大量文本、代码和其他媒体数据集的训练,它们能够创作出接近人类水平的文章、翻译语言、生成图像,还能以信息丰富的方式回答人们提出的问题,甚至可以编写不同类…

JSP WEB开发(一) JSP语言基础

目录 JSP JSP简介: JSP页面 JSP运行原理 JSP脚本元素 JAVA程序片 局部变量 全局变量和方法的声明 全局变量 方法的声明 程序片执行特点 synchronized关键字 表达式 JSP指令标记 page指令 include指令 JSP动作标记 JSP动作元素include和include指令的…