CANopen学习笔记

1.CANopen的预定义报文ID分类

CANopen在设计时,对其定义为小网络、控制信号实时通讯

  • 报文传输采用CAN标准帧格式。即11bit的ID域,以尽量减小传输时间。
  • 网络控制报均采用数据最小字节数。比如心跳报文,只有1个字节数据。
  • 实时更新的过程数据无需接收方报文应答。即采用生产消费模型,降低总线负载。
  • 需要接收方确认的配置参数一般都时采用快速单字传输。即1个报文最多传达1个32bit的参数变量,避免了分帧引起的实时性降低。  

        以上这些定义都是为了节约时间开销,最大限度的保证实时性。同时为了减小简单网络的组态工作量,CANopen定义了强制性的缺省标识符(CAN帧ID)分配表,以减小使用者和维护者的学习时间,快速上手。

1.1 网络管理(NMT)与特殊协议(Special protocols)报文ID分类

        为了CANopen网络的稳定可靠,都需要设置一个网络管理主机NMT-Master(Network Management-Master),就像是交响乐团的指挥家,指挥所有节点的启动、停止等。

        NMT主机也被成为CANopen主站,相对应的其他CANopen节点就是NMT从机(NMT-slaves)。

        NMT主机和NMT从机之间通讯的报文就称为NMT网络管理报文。网络管理报文负责层管理、网络管理和ID分配服务。例如,初始化、配置和网络管理(其中包括节点保护)。网络管理中,同一个网络中只允许有一个主节点、一个或多个从节点,并遵循主从模式。

        另外,为了协调各个节点的同步、心跳、时间、错误提示等通讯控制,CANopen还定义了一系列特殊协议报文。

1.2 过程数据对象(PDO)和服务数据对象(SDO)的报文ID分类

        使用CANopen时,需要传递的配置信息和应用信息都是放在过程数据对象PDO(Process data object)服务数据对象SDO(Service data object)里面。

        PDO和SDO的通讯区别在于,PDO属于过程数据,即单向传输,无需接收节点回应CAN报文来确认,从通讯术语上来说是属于“生产消费”模型

        而SDO属于服务数据,有指定被接收节点的地址(Node-ID),并且需要指定的接收节点回应CAN报文来确认已经接收,如果超时没有确认,则发送节点将会重新发送原报文。这种通讯方式属于常见的“服务器客户端”的通讯模型,即我们常说的轮询式。

        强制性的缺省标识符(CAN-ID)分配表,将其划分为4bit的功能码(Function-ID)和7bit的节点号(Node-ID)。

        在CANopen中通常把CAN-ID称为COB-ID(通讯对象编号)。

  • COB-ID:Communication Object Identifier,即CANopen中对某种通讯对象的报文帧ID,即CAN报文的11bitID。代表了一种通讯含义。
  • Node-ID:节点ID号,即CANopen网络中的节点地址,CANopen规定了逻辑上最大128个节点,所有Node-ID最大为128。

        由于要区分每个CANopen节点的输入和输出,所以PDO分为TPDO(发送PDO)和RPDO(接收PDO)。TPDO和RPDO分别有4个数据对象,每种数据对象就是1条CAN报文封装

        SDO就相对而言比较简单固定,发起通讯的“问”SDO的CAN帧ID就是0x600+Node-ID,而被问的节点应“答”SDO的CAN帧ID就是0x580+Node-ID。一般在CANopen网络中,只有NMT主机能发起SDO通讯,进行节点参数配置或关键性参数传递。当然从节点也可以对其他从节点发起SDO通讯。

2.对象字典OD(Object dictionary)

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

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

        每个索引内具体的参数,最大用32bit的变量来表示

        每个CANopen设备都有一个对象字典。对于CANopen网络中的主节点来说,不需要对CANopen从节点的每个对象字典项都访问。

        CANopen对象字典中的项由一系列子协议来描述子协议为对象字典中的每个对象都描述了它的功能、名字、索引、子索引,数据类型,以及这个对象是否必须,读写属性等等,以保证不同厂商的同类型设备兼容。

        CANopen核心子协议描述时DS301。其它的协议都是不同应用行业对DS301的补充和拓展。

2.1 对象字典概述        

对象字典概述
Index range 索引范围Description 描述
0x0000Resorved 保留
0x0001-0x025FData types 数据类型
0x0260-0x0FFFReserved 保留
0x1000-0x1FFFCommunication profile area 通讯对象子协议区
0x2000-0x5FFFManufacturer-specific profile area 制造商特定子协议区
0x6000-0x9FFFStandardized profile area 标准化设备子协议区
0xA000-0xAFFFNetwork variables 网络变量
0xB000-0xBFFFSystem variables 用于路由网关的系统变量
0xC000-0xFFFFReserved 保留

        绿色的通讯对象子协议区和制造商通讯子协议区是需要关注的区域。

2.2 通讯对象子协议区(Communication profile area)

Index range 索引范围Description 描述
0x1000-0x1029General communication objects 通用通讯对象
......

        绿色的索引范围0x1000-0x1029为通用通讯对象,所有CAN节点必须具备这些索引,否则将无法加入CANopen网络

2.3 通用通讯对象(General communicator objects)

        由于通用通讯对象十分重要,NMT主站(CANopen主站)在启动时,通常都全部或者部分读取所有从站中通用通讯对象中的索引,所以所有的通用通讯对象都必须在CANopen从站中实现。

2.4 制造商特定子协议

        对象字典索引0x2000-0x5FFF为制造商特定子协议,通常是存放所应用子协议的应用数据。而通讯对象子协议区是存放这些应用数据的通信参数。

2.5 标准化设备子协议

        标准化设备子协议,为各种行业不同类型的标准设备定义对象字典中的对象。如DS401、DS402等等。

3 网络管理 NMT(Network management)与CANopen主站

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

3.1 NMT节点状态

        CANopen节点从上电开始的6种状态,包括:

  • 初始化(Initalizing):节点上电后对功能部件包括CAN控制器进行初始化;
  • 应用层复位(Application Reset):节点中的CANopen通讯复位(开始),从这个时刻起,此节点就可以进行CANopen通讯了。
  • 预操作状态(Pre-operational):节点中的CANopen通讯处于操作就绪状态,此时此节点不能进行PDO通信,而可以进行SDO进行参数配置和NMT网络管理的操作。
  • 操作状态(operational):节点收到NMT主机发来的启动命令后,CANopen通讯被激活,PDO通信启动后,按照对象字典里面规定的规则进行传输,同样SDO也可以对节点进行数据传输和参数修改。
  • 停止状态(Stopped):节点收到NMT主机发来的停止命令后,节点的PDO通信被停止,但SDO和NMT网络管理依然可以对节点进行操作。

        除了初始化状态,NMT主机通过NMT命令可以让网络中任意一个的CANopen节点进行其他5种状态的切换CANopen节点也可以程序自动完成这些状态的切换

3.2 NMT节点上线报文

        CANopen从站上线时,为了通知主站它已经加入网络,或者避免与其他从站Node-ID冲突。这个从站必须发出节点上线报文(boot-up)。

        节点上线报文的ID为0x700+Node-ID,数据为1个字节0。生产者为CANopen从站

3.3 NMT节点状态与心跳报文

        主站为了监控CANopen节点是否在线与目前的节点状态。CANopen应用中通常都要求上电的从站定时发送状态报文(心跳报文)。

        节点心跳包文与上线报文相同为0x700+Node-ID,数据为1个字节,代表节点目前的状态:

数据(1个字节)状态
0x04停止状态
0x05操作状态
0x7F预操作状态

3.4 NMT节点守护

        已经过时了,不做介绍。它与心跳报文模式不能并存。

3.5 NMT节点状态切换命令

        NMT网络管理中,最核心的就是NMT节点状态切换命令,这是NMT主站进行网络管理的命令报文。

        CANID均为0x000,具备最高的CAN优先级。数据为2个字节

第1个字节代表命令类型

  • 0x01:启动命令(让节点进入操作状态);
  • 0x02:停止命令(让节点进入停止状态);
  • 0x80:进入预操作状态(让节点进入预操作状态);
  • 0x81:复位节点应用层(让节点的应用恢复初始状态,比如列车门都恢复打开状态);
  • 0x82:复位节点通讯(让节点的CAN和CANopen通讯重新初始化,一般用于总线收到干扰,导致节点总线错误被动,或者总线关闭时。

第二个节点代表被控制的节点Node-ID。

        如果要对整个网络所有节点同时进行控制,则这个数值为0即可。

3.6 CANopen主站设备

        CANopen主站需要具备以下功能:

  • 支持PDO、SDO发送和接收;
  • 支持NMT网络管理;
  • 支持PDO通信类型并能够支持监控每一个PDO目标;
  • LSS层设置功能:从站波特率设置、从站节点编号设置;
  • 支持从站管理功能:类型与名称读取、对象字典读写;
  • 紧急报文发送功能;
  • 拓展CANopen标准指示灯功能。

4. 过程数据对象PDO(Process data object)

        PDO属于过程数据用来传输实时数据,即单向传输无需接收节点回应CAN报文来确认,从通讯术语上来说是属于“生产消费”模型PDO。

4.1 PDO的CAN-ID定义

        PDO通信比较灵活,广义上只要符合PDO范围内的所有CAN-ID(COB-ID)都可以作为节点自身的TPDO或RPDO使用,不受功能码和Node-ID的限制。分为预定义和自定义

        在PDO预定义中,人为规定了TPDO和RPDO,规定了Node-ID在PDO中的位置,规定了PDO的编号。

PDO的预定义
Object对象Specification 规范CAN-ID(COB-ID)
TPDO1发送过程数据对象1CiA3010x181-0x1FF(0x180+node-ID)
RPDO1接收过程数据对象1CiA3010x201-0x27F(0x200+node-ID)
TPDO2发送过程数据对象2CiA3010x281-0x2FF(0x280+node-ID)
RPDO2接收过程数据对象2CiA3010x301-0x37F(0x300+node-ID)
TPDO3发送过程数据对象3CiA3010x381-0x3FF(0x380+node-ID)
RPDO3接收过程数据对象3CiA3010x401-0x47F(0x400+node-ID)
TPDO4发送过程数据对象4CiA3010x481-0x4FF(0x480+node-ID)
RPDO4接收过程数据对象4CiA3010x501-0x57F(0x500+node-ID)

        发送(TPDO)和接收(RTPO)是以CANopen节点自身为参考(如果CAN主站或其他从站就相反)。TPDO和RPDO分别有4个数据对象,每种数据对象就是1条CAN报文封装

        如果某个节点需要传递的资源特别多,则有出现例如TPDO5之类的数据对象,而他们的CAN-ID定义就需要打破预定义的规则。

4.2 PDO的传输形式

        4.2.1 同步传输

                同步传输就是通过同步报文让所有节点能在同一时刻进行上传数据或者下达命令的应用指令,可以有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题。一般发送同步报文的是NMT主机。

                同步传输又可分为周期传输(循环)和非周期传输(无循环)。周期传输则是通过接收同步对象(SYNC)来实现,可以设置1-240个同步对象触发。非周期性传输是由远程帧预触发或者由设备子协议中规定的对象特定事件预触发传送。

        4.2.2 异步传输

                其触发方式有两种,第一种是由设备子协议规定的对象特定事件来触发(例如,定时传输,数据变化传输等)。第二种是通过发送与PDO的COB-ID相同的远程帧来触发PDO的发送。目前应用中的异步传输基本都采用第一种

4.3 PDO的通信参数

        PDO通信参数,定义了该设备所使用的COB-ID、传输类型、定时周期等。RPDO通讯参数位于对象字典索引的0x1400-0x15FF,TPDO通讯参数位于对象字典索引的0x1800-0x19FF。每条索引代表一个PDO的通讯参数集,其中的子索引分别指向具体的各种参数。

  • Number of entries参数条目数量:即本索引中有几条参数;
  • COB-ID:发送/接收这个PDO的帧ID;
  • 发送类型:即这个PDO发送或者接收的传输形式,通常使用循环同步和异步制造商特定事件较多;
  • Inhibit time 生产禁止约束事件(1/10ms):约束PDO发送的最小时间间隔,避免导致总线负载剧烈增加,比如数字量输入过快,导致状态改变发送的TPDO频繁发送,总线负载加大,所以需要一个约束时间来进行“滤波”,这个时间单位是0.1ms;
  • Event timer 事件定时器触发的时间(单位ms):定时器发送的PDO,它的定时时间,如果这个时间为0,则这个PDO为事件改变发送。
  • SYNC start value 同步起始值:同步传输的PDO,收到若干个同步包后,才进行发送,这个同步起始值就是同步包数量。比如设置为2,即收到2个同步包后再进行发送。

4.4 PDO的映射参数

        PDO映射参数,就是将通信参数、应用数据和具体的CAN报文中数据联系起来

5. 服务数据对象 SDO(Service data object)

        SDO主要用于CANopen主节点对从节点的参数配置。服务确认是SDO的最大特点,为每个消息都生成一个应答,确保数据传输的准确性

        通常CANopen从节点作为SDO服务器,CANopen主节点作为客户端。SDO客户端通过索引和子索引,能够访问SDO服务器上的对象字典。并且SDO也可以传输任何长度的数据(当数据长度超过4个字节就拆分成多个报文来传输。

5.1 通讯原则(communication principle)

        SDO的通讯原则非常单一,发送方(客户端)发送CAN-ID为0x600+Node-ID的报文,其中Node-ID为接收方(服务器)的节点地址,数据长度为8字节(DLC=8数据长度均为,不存在的补0)。

        接收方(服务器)成功接收后,回应CAN-ID为0x580+Node-ID的报文。这里的Node-ID依然是接收方(服务器)的节点地址,数据长度均为8字节(DLC=8数据长度均为,不存在的补0)。

5.2 快速SDO协议(Expedited SDO protocol)

        最常见最常用的SDO协议是快速SDO,所谓快速,就是1次来回就搞定。前提是读取和写入的值都不大于32bit命令中直接包含了要读写的索引、子索引、数据。可谓直接命中!

5.3 普通SDO协议(Normal SDO protocol)

        当要传输的值超过32bit时,就不能使用快速SDO传输。必须使用普通SDO进行分帧传输。在实际应用中很少用到,一般用于CANopen节点的程序固件省级,或者做网关转换MVB总线之类的数据最大可达256位的应用。

6 特殊协议(Special protocols)

         为了方便CANopen主站对从站的管理。在CANopen协议中,已经为特殊的功能预定义了COB-ID。

6.1 同步协议(Sync protocol)

        同步(SYNC),该报文对象主要实现整个网络的同步传输

        每个节点都以该同步报文作为PDO触发参数,因此该同步报文的COB-ID具有比较高的优先级以及最短的传输时间。一般选用0x80作为同步报文的CAN-ID

6.2 时间戳协议(Time-stamp protocol)

        时间戳协议采用广播方式,无需节点应答,CAN-ID为0x100,数据长度为6,数据为当前时刻与1984年1月1日0时的时间差。

6.3 紧急报文协议

        设备内部发生错误,触发该对象,发送设备内部错误代码,提示NMT主站。其CAN-ID存储在0x1014的索引中,数据包含8个字节。

        

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

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

相关文章

STM32应用开发教程进阶--Wi-Fi通信(ESP8266模块:STA、AP、STA+AP)

实现目标 1、熟悉Wi-F、ESP8266模块 2、掌握ESP8266模块共3种工作模式:STA、AP、STAAP的配置 3、具体实现目标:(1)AT固件烧录;(2)ESP8266模块STA、AP、STAAP的配置 一、Wi-Fi概述 1、Wi-Fi定…

【JavaScript】使用 AbortController 对象中断 fetch 的文本流传输

AbortController 正如我们所知道的,fetch 返回一个 promise。JavaScript 通常并没有“中止” promise 的概念。那么我们怎样才能取消一个正在执行的 fetch 呢?例如,如果用户在我们网站上的操作表明不再需要某个执行中的 fetch。 为此有一个…

【kettle006】kettle访问华为openGauss高斯数据库并处理数据至execl文件

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下华为openGauss高斯数据库相关知识体系 3.欢迎批评指正,跪谢…

Spring Boot应用部署 - JAR包Docker部署

JAR包Docker部署 要使用Docker部署Spring Boot应用,需要创建一个Dockerfile来定义如何构建Docker镜像,并且可能还需要在Maven构建脚本中集成Docker插件以简化构建过程。以下是详细的步骤: 1. 创建Dockerfile 在Spring Boot项目的根目录下创…

【实时数仓架构】方法论(未完)

笔者不是专业的实时数仓架构,这是笔者从其他人经验和网上资料整理而来,仅供参考。写此文章意义,加深对实时数仓理解。 实时数仓背景和场景 一、实时数仓架构技术演进 1.1、四种架构演进 1)离线大数据架构 一种批处理离线数据分…

胡写乱写哈哈哈

message.from() 获取消息的发送者名称 const bot new Wechaty() .on(message, async message > { //这条消息是谁发送的const contact message.from()//这条消息的文本内容const text message.text()//这条消息是哪个群聊中发送的const room message.room()if (room) {/…

电脑开机后卡在开机LOGO画面如何排查处理

当电脑开机后长时间停滞在开机LOGO画面,无法继续进入操作系统,这一现象常令用户困扰不已。本文将深入探讨导致此类问题的多种可能原因,并提供相应的解决方法,帮助你有效地诊断和排除故障。 硬件故障或接触不良 1. 硬盘问题:硬盘是系统启动的关键组件,其故障或数据线接触…

css如何去掉重叠部分的边框,CSS中nth-child不生效

css如何去掉重叠部分的边框 div使用负的margin&#xff0c;margin-right:-1px&#xff1b;table表格设置边框后的重叠&#xff0c;border-collapse: collapse CSS中nth-child不生效 <body><ul><li><a><span class"item"></span&…

CentOS 删除文件提示 Operation not permitted 的解决方法

1、阿里云服务器提示存在挖矿行为&#xff0c;路径在 /etc/zzh&#xff0c;我们做下删除动作&#xff0c;发现不能删除 [rootMSH etc]# rm -f zzh# 提示 rm: cannot remove ‘zzh’: Operation not permitted2、解决方法&#xff1a; (1)、查看文件权限 [rootMSH etc]# lsat…

xml,json和protobuffer

数据组织格式 xmljsonprotobuffer小结 xml 是以成对的方式,来表示"键值对"的信息,同时标签支持嵌套,可以构成更复杂的树形结构数据. 请求: <request> // 开始标签<username>zhangsan</username> // 表示的是键值对 key:username value: zhangsan&l…

Django项目之电商购物商城 -- 校验用户输入密码是否合法

Django项目之电商购物商城 – 校验用户输入密码是否合法 需要开发文档和前端资料的可私聊 一. 创建用户逻辑操作 1. 创建用户app – users python manage.py startapp users2.注册app users.apps.UsersConfig,3. 创建视图 from django.shortcuts import render from djan…

如何在小程序中添加图片和视频

在微信小程序中添加图片和视频可以通过特定的组件和属性来实现。 对于添加图片&#xff0c;你可以使用<image>组件。 <view> <image src"图片链接" style"width: 375rpx; height: 375rpx;"></image> </view> 这里&…

原生IP和住宅IP有什么区别?

原生IP和住宅IP在多个方面存在显著的区别。 从定义和来源来看&#xff0c;原生IP是指未经NAT&#xff08;网络地址转换&#xff09;处理的真实、公网可路由的IP地址&#xff0c;它直接从互联网服务提供商&#xff08;ISP&#xff09;获得&#xff0c;而不是通过代理服务器或VP…

Django初步了解

目录 一、什么是Django 二、Django的设计模式 三、涉及的英文缩写及其含义 四、安装&#xff08;官方教程&#xff09; 一、什么是Django Django是一个Python Web框架&#xff0c;可以快速开发网站&#xff0c;提供一站式的解决方案&#xff0c;包括缓存、数据库ORM、后台…

Postgresql从小白到高手 十:Linux服务器配置详解

Postgresql从小白到高手 第十章 Linux服务器配置详解 文章目录 Postgresql从小白到高手Postgresql Linux 服务器配置conf常用配置conf配置类别1. 连接相关配置2. 资源管理相关配置3. 日志和错误报告相关配置4. 安全性相关配置5 内存和查询优化6、复制和备份配置注意事项 Postg…

大象机器人开源协作机械臂myCobot 630 全面升级!

1. 开篇概述 在快速发展的机器人技术领域中&#xff0c;Elephant Robotics的myCobot 600已经证明了其在教育、科研和轻工业领域的显著适用性。作为一款具备六自由度的机械臂&#xff0c;myCobot 600以其600mm的工作半径和2kg的末端负载能力&#xff0c;满足了多样化的操作需求。…

中间件解析漏洞

1 、 apache 解析漏洞 漏洞环境搭建 下载 vulhub git clone https://github.com/vulhub/vulhub.git 进入对应漏洞目录、 cd vulhub/httpd/apache_parsing_vulnerability apt-get docker-compose 启动漏洞环境 docker-compose up -d 注&#xff1a;启动容器时&#xf…

leetcode2389--感染二叉树需要的总时间

1. 题意 给定一个节点&#xff0c;每秒该节点会感染相邻的节点&#xff0c;受感染的节点下一秒也会感染周围节点&#xff1b; 求使得所有节点感染的时间 2. 题解 2.1 dfs建图bfs搜索层次 我们将目标节点找到&#xff0c;并从该节点出发找到以该节点形成的树的深度即可。 …

【spring mvc】配置请求到视图名称转换器

最近在开发项目中遇到springmvc在进行视图渲染时&#xff0c;pc端和移动端不是同一个页面的情况&#xff0c;需要将不同的设备类型解析到不同的视图进行渲染。 一、配置方式 这里我写了一个RequestToViewNameTranslatorImpl类实现了RequestToViewNameTranslator接口&#xff…

用数据检验函数正确性,matlab2C

数据存取格式 filename1 g.txt; fid1 fopen(filename1,w); for i 1 : length(g)for j1:size(g,2)if(j1)fprintf(fid1,{%.16f,,g(i,j)); elseif(j>1&&j<151)fprintf(fid1,%.16f,,g(i,j)); elsefprintf(fid1,%.16f},\n,g(i,j));endend%fprintf(fid1,\n…