首页 > 其他分享 >嵌入式浅谈之CANopen

嵌入式浅谈之CANopen

时间:2024-06-10 19:58:25浏览次数:24  
标签:协议 浅谈 CANopen 嵌入式 索引 节点 SDO ID

在工业控制和汽车领域,CAN是一种流行的现场总线,到处都可以看到它的身影。而CAN协议本身只定义了物理层和链路层,对应用层没有规定。各家都可以自定义自己的应用层协议内容,但是这样一来各家协议就不能兼容,大家各自搞一套,似乎是有点重复造轮子的意思,而且协议稳定需要较长的验证,这样一来开发周期和开发质量就很依赖协议开发者的水平,项目进度和项目质量往往难以得到保证。这时候,一套通用的可以为各家所用的协议就非常有意义了,而CANopen就是这样的角色,所有也就应运而生了。

下面,笔者为大家简要介绍一下CANopen,希望能对各位看官有一点帮助。

CANopen发展概况

CANopen行业应用

什么是CANopen

CANopen是一种架构在控制局域网路(Controller Area Network, CAN)上的高层通信协协议,包括通信子协议及设备子协议,常在嵌入式系统中使用,也是工业控制常用到的一种现场总线。

由于 CANopen 协议的创始人团队也是 CAN-bus 的创始人团队,此协议充分发挥了CAN-bus 所具备的所有优势,特别是 CiA 组织的主席蔡豪格( Holger Zeltwanger) 先生对于 CANopen 协议坚持开放、免费、非盈利的原则。时至今日已经成为全世界最为流行的 CAN 应用层协议

CAN( Controller Area Network)现场总线仅仅定义了第 1 层(物理层,见 ISO11898-2 标准)、第 2 层(数据链路层,见ISO11898-1 标准)没有规定应用层;而在实际设计中,前两层完全由硬件实现,设计人员无需再为此开发相关软件( Software)或固件( Firmware),只要了解如何调用相关的接口和寄存器,即可完成对 CAN 的控制。

基本每个行业的 CAN 应用,都需要一个高层协议来定义 CAN 报文中的 11/29位标识符、 8 字节数据的使用。但在 CAN 总线的工业自动化应用中, 由于设备的互通互联的需求越来越多,所以需要一个开放的、标准化的高层协议:这个协议支持各种 CAN 厂商设备的互用性、互换性,能够实现在 CAN 网络中提供标准的、统一的系统通讯模式,提供设备功能描述方式,执行网络管理功能。 其中包括: 应用层(Application layer):为网络中每一个有效设备都能够提供一组有用的服务与协议。 通讯描述(Communication profile):提供配置设备、通讯数据的含义,定义数据通讯方式。 设备描述(Device proflile):为设备(类)增加符合规范的行为。

CANopen优势

稳定性:CAN物理层、链路层的优势

实时性:实时更新的过程数据无需接收方应答

小网络:网络控制报文均采用数据最小字节数

标准帧:11bit的ID域,以尽量减少传输时间

单字传输:需要接收方确认的配置参数一般都是采用快速单字传输

CANopen协议简介

CANopen 对象字典( OD: Object Dictionary)       是 CANopen 协议最为核心的概念。所谓的对象字典就是一个有序的对象组,描述了对应 CANopen 节点的所有参数,包括通讯数据的存放位置也列入其索引,这个表变成可以传递形式就叫做 EDS 文件(电子数据文档Electronic Data Sheet)。

对象字典,就像体检表,具备这个人每个功能的参数,便于用人单位(主站)进行合理分配工作。

对象字典索引区域定义,其中标绿色底纹的通讯对象子协议区和制造商特定子协议区是用户需要关注的区域。

每个对象采用一个 16 位的索引值来寻址,这个索引值通常被称为索引,其范围在 0x0000到 0xFFFF 之间。为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个 8 位的索引值,这个索引值通常被称为子索引,其范围是 0x00 到 0xFF 之间。

每个 CANopen 设备都有一个对象字典,使用电子数据文档( EDS 文件)来记录这些参数,而不需要把这些参数记录在纸上。     CANopen 对象字典中的项由一系列子协议来描述。子协议为对象字典中的每个对象都描述了它的功能、名字、索引、子索引、数据类型,以及这个对象是否必需、读写属性等等,这样可保证不同厂商的同类型设备兼容。

EDS文件:

OD文件:

网路管理NMT

CANopen 网络为了稳定可靠可控,都需要设置一个网络管理主机,所有节点的启动、停止都是有他进行指挥。

   NMT 主机一般是 CANopen 网络中具备监控的 PLC 或者 PC(当然也可以是一般的功能节点), 所以也成为 CANopen 主站。相对应的其他 CANopen 节点就是 NMT 从机(NMT-slaves)。

每个 CANopen 从节点的 CANopen 协议栈中,必须具备 NMT 管理的相应码,这是节点具备 CANopen 协议的最基本的要素。

过程数据对象PDO

COB-ID:

对于 PDO 和 SDO 的报文 ID 分配, 为了减少网络的组态工作量, CANopen 预定义了强制性的缺省标识符( CAN-ID)分配表,该分配表是基于 11 位 CAN-ID 的标准帧格式。     将其划分为 4 位的功能码(Function-ID) 和 7 位的节点号( Node-ID)。

PDO:

PDO 属于过程数据用来传输实时数据,即单向传输,无需接收节点回应CAN 报文来确认。     从通讯术语上来说是属于“生产消费”模型 PDO,就像食品销售柜台, 生产者摆出“食品”,但只有“需要”的消费者才会来买,没有指向性。

SDO客户端:发送方(客户端) 发送 CAN-ID 为 600h+Node-ID 的报文,其中 Node-ID 为接收方(服务器) 的节点地址, 数据长度均为 8 字节

SDO服务器:接收方(服务器) 成功接收后, 回应 CAN-ID 为 580h+Node-ID 的报文。 这里的 Node-ID依然是接收方(服务器) 的节点地址, 数据长度均为 8 字节

通过快速 SDO, 可以直接对 CANopen 节点的对象字典中的值进行读取和修改, 所以在做参数配置之外,也经常作为关键性数据传输之用。比如 CANopen 控制机器人的电机转动角度时,就使用 SDO 来传输,保证可靠到达,通常在实时性要求高,可靠性要求高的场合使用。

普通SDO:

当需要传输的值超过 32 位时,就不能使用快速 SDO 传输。必须使用普通 SDO 进行分帧传输,在应用中较少用到。

特殊协议

canfestival---开源的CANopen协议栈

好了,各位看官,今天的分享就到这里。

精彩内容,下周继续。

标签:协议,浅谈,CANopen,嵌入式,索引,节点,SDO,ID
From: https://blog.csdn.net/2401_84369443/article/details/139580529

相关文章

  • 嵌入式浅谈之“梯形”加减速MCU算法实现
    书接上回,上章我们讲到原理,本章我们来聊聊实现。在笔者的实际项目经历中,梯形加减速运用的比较广泛,主要以其优秀的加减速能力、对算法实现资源的需求较小、实现难度适中而被广泛应用。下面就简单介绍一下基于MCU的算法实现过程,以STM32为例。采用“梯形”加减速算法,在运动过......
  • 嵌入式Linux系统编程 — 3.5 utime、utimes、futimens、utimensat函数修改文件时间属
    目录1文件的时间属性简介2utime()函数2.1 utime()函数简介2.2示例程序3 utimes()函数3.1 utimes()函数简介3.2示例程序 4  futimens()函数4.1 futimens()函数简介4.2示例程序5 utimensat()函数5.1 utimensat()函数简介5.2 示例程序1文件的时间......
  • 【转载】ARM嵌入式系统为什么要做内存对齐
    做嵌入式系统软件开发,经常在代码中看到各种各样的对齐,很多时候我们都是知其然不知其所以然,知道要做好各种对齐,但是不明白为什么要对齐,不对齐会有哪些后果,这篇文章大概总结了内存对齐的理由。CPU体系结构和MMU的要求目前有一些RISC指令集的CPU不支持非对齐的内存变量访问操作,比......
  • 浅谈2024年全国中学生生物学联赛
    坐标gd谈谈联赛流水账day-n吃了蛋糕感谢家乐哥、圆领姐、刘sir和黄豆前来捧场,不过忘记叫盛哥来了教练把已经退役的人拉回来考试?然后在教学楼大发雷霆这几天身体一直不太好,先是发烧,退烧了之后就开始感冒+腹泻,十分难受。保济丸狂闷随便看了点比解day0感冒好得差不多,疯狂......
  • 嵌入式Linux中驱动程序的基本框架
    在“嵌入式Linux中内核模块的基本框架”一文中,已经构建好了内核模块的基本框架结构,现在在该框架的基础上进一步扩展,就可以形成Linux下的字符型设备驱动基本框架,下面就详细进行讨论。在Linux系统中,设备驱动共分为三种类型,即字符型、块型和网络型。字符型设备以字节为最小操作单位,......
  • 【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化
    目录一、嵌入式系统简介二、C++在嵌入式系统中的优势三、机器学习在嵌入式系统中的挑战四、C++实现机器学习模型的基本步骤五、实例分析:使用C++在嵌入式系统中实现手写数字识别1.数据准备2.模型训练与压缩3.模型部署六、优化与分析1.模型优化模型量化模型剪枝......
  • 作为嵌入式/软件开发工程师你需要知道的东西
    大型软件开发的基本素养中国科学技术大学软件开发规范软件开发规范(试行版)(ustc.edu.cn) 清华软件工程样张标题(tup.com.cn)软件工程这个概念,并将其定义为“为了经济地获得可靠的和能在实际机器上高效运行的软件,而建立和使用的健全的工程规则”(1)将系统化的、严格约......
  • 嵌入式Linux系统编程 — 3.1 Linux系统中的文件类型
    目录1Linux系统中的文件类型简介2普通文件2.1什么是普通文件2.2普通文件分类3 目录文件4 字符设备文件和块设备文件4.1什么是设备文件4.2查看设备文件的方法:5 符号链接文件(link)5.1什么是符号链接文件5.2如何查看和创建符号链接文件6 管道文件7 套接......
  • 嵌入式Linux系统编程 — 1.5 文件描述符详解
    目录1文件描述符简介1.1文件描述符特点1.2标准文件描述符1.3文件描述符的生命周期2 fcntl()函数2.1fcntl()函数简介2.2复制文件描述符(F_DUPFD)2.3获取/设置文件状态标志(F_GETFL/F_SETFL)1文件描述符简介文件描述符(FileDescriptor)是Linux和UNIX系统编......
  • RT-Thread和Infineon主持的嵌入式网络应用开发沙龙
    主题会议由RT-Thread&&Infineon共同主持,PSoc62开发板现场演示从0到1搭建智能数据网关RT-Thread介绍rt-thread社区负责人郭占鑫郭工介绍RT-Thread英飞凌合作伙伴介绍英飞凌产品负责人介绍英飞凌的产品动态、分享未来的一些嵌入式技术发展方向以及应用案例技术分享(钩子函......