其实3年前在21ic就准备做这篇文章了,那时,CANOpen也只是刚刚在国内推广,所以几乎没有项目用到。现在有了实际的项目,完全确认了以前移植和测试的代码,所以列举一些CANOpen的底层操作以及数据。当然,列举的都是一些简单的基本的CANOpen通信,不包括其他CANOpen应用协议中的内容。

1.心跳
CANOpen节点会以一个固定的频率发送心跳报文。用于告诉主机,偶还活着。。。心跳报文的格式很简单,COB-ID为0x700+Node_ID,数据为一字节的状态数据:

图中,ID为706,表示06号节点的心跳,状态是0x7F,表示Pre-Operational状态(节点初始化完成后,进入Pre-Operational状态)。查看时间,每个心跳报文时间间隔大概1秒。

2.NMT
NMT是管理报文,用于实现一些管理操作,比如,节点重启、进入Operational状态等等。NMT报文格式很简单,ID为000,数据为一字节命令+一节节点号(0表示广播)。

第2号报文就是让06号节点,进入Operational状态,运行完成后,节点心跳报文中的节点状态也变为Operational状态

同上,发送stop remote node命令,进入Stopped状态,当然,心跳还是有的,只是节点不干活了

这个是reset node命令,用于让节点复位。复位之后,会首先进入Initializing状态(对于于心跳报文中的0x00),初始化完成后,进入Pre-Operational状态(对应心跳报文中的0x7F)。

3.SDO
SDO 主要用来访问节点的对象字典(OD),CANOpen的节点至少需要支持SDO_Server。对象字典是CANOpen节点的数据组织形式,包含了 CANOpen节点的各个参数和数据,比如,心跳报文的发送频率、系统启动次数、节点的通信参数等等等等。可以说,SDO是用来设置CANOpen节点的各个运行参数的。

图中,1号报文0606: 40 17 10 00 00 00 00 00就是一个SDO_Read报文,告诉节点,要读取的OD索引和子索引,包括数据长度。然后节点会发送对应的数据(后面的那个8字节报文)。第一个字节是一些命令的设定包括参数的设定,后2个字节是OD的索引,再后面一个字节是OD的子索引,最后4个字节是数据。上图中,主机发送的是一个读取OD中 1017:00位置的数据命令,这个位置存放的是心跳频率,读取的结果是0x03EB(1000ms)。

9号报文就是SDO_Write,写OD中1017:00位置的数据,也就是修改心跳频率。收到完成应答后,心跳频率就变了(查看时间)。

4.PDO
PDO 是用来发送(TPDO)或者接收(RPDO)数据的,有几种不同的触发方式,比如:事件触发、同步触发等等。数据内容一般有CANOpen的各个应用协议规定,比如401文档中的AI(Analog Input)数据等。PDO的数据内容是通过映射的方式在定义在OD中的,一个节点可以有多个PDO通道。PDO的通信参数也可以通过SDO访问OD的方式来修改。

5.应急报文
应急报文用于返回一个节点上的错误,可以是CANOpen命令解析错误,等等。

待续。。。。。。

CANOpen的几种操作以及数据的更多相关文章

  1. iOS中几种常用的数据存储方式

    自己稍微总结了一下下,方便大家查看 1.write直接写入文件的方法 永久保存在磁盘中,可以存储的对象有NSString.NSArray.NSDictionary.NSData.NSNumber,数据 ...

  2. iOS五种本地缓存数据方式

    iOS五种本地缓存数据方式   iOS本地缓存数据方式有五种:前言 1.直接写文件方式:可以存储的对象有NSString.NSArray.NSDictionary.NSData.NSNumber,数据 ...

  3. js之操作JSON数据

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  4. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...

  5. Android提供了5种方式存储数据:

    --使用SharedPreferences存储数据: --文件存储数据: --SQLite数据库存储数据: --使用ContentProvider存储数据: --网络存储数据: 一:使用SharedP ...

  6. sql有几种删除表数据的方式

    有几种删除表数据的方式? truncate.delete和drop都可以删除数据. TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. TRUNCATE TABLE 与没有 WHE ...

  7. Android(java)学习笔记208:Android中操作JSON数据(Json和Jsonarray)

    1.Json 和 Xml       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...

  8. JS 操作一个数据值

    任何语言都有自己的操作数据的方法: Js也不例外,js有3种重要的方式来操作一个数据值. 1>复制它.例如把它赋给一个新的变量. 2>把它作为参数传递给一个函数或方法. 3>可以和其 ...

  9. MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题

    1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...

随机推荐

  1. 在vivado中自定义编辑器

    在 Tools - Options - Text Editor 中选择 Custom Editor 这里我用的gvim,在Editor文本框中输入: C:/Vim/vim80/gvim.exe --r ...

  2. 2017-2018-1 20155220 《信息安全系统设计基础》课下实践——实现mypwd

    学习pwd命令 输入pwd命令 于是man 1 pwd查看pwd详细 然后查看pwd实现需要的系统调用man -k; grep 在这发现了一个功能相同的内核函数getcwd 到这步就很简单了,先查看这 ...

  3. Kali-linux本地权限提升

    上一节介绍了窃取目标系统令牌,现在来介绍窃取令牌后如何提升在目标系统上的权限.提升本地权限可以使用户访问目标系统,并且进行其他的操作,如创建用户和组等.本节将介绍本地权限提升. 同样的实现本地权限提升 ...

  4. Velocity学习4

    Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloci ...

  5. python并发编程之守护进程、互斥锁以及生产者和消费者模型

    一.守护进程 主进程创建守护进程 守护进程其实就是'子进程' 一.守护进程内无法在开启子进程,否则会报错二.进程之间代码是相互独立的,主进程代码运行完毕,守护进程也会随机结束 守护进程简单实例: fr ...

  6. Object C学习笔记4-内存管理

    Object-C的内存管理和.NET有些不一样,.NET的内存回收机制是使用GC自动处理回收,而Object-C本质上还是C语言,所以很多时候还是需要手动去管理内存回收. 1. Object-C生成一 ...

  7. How to: Display a Non-Persistent Object's List View from the Navigation

    This example demonstrates how to display a non-persistent object's List View when a navigation item ...

  8. Linux下的消息队列

    文章链接:https://blog.csdn.net/qq_38646470/article/details/80169406

  9. vim使用技巧(插入,删除,查找,复制,粘贴,剪切)

    原文链接:http://blog.csdn.net/qq_38646470/article/details/79643000 编程人员很喜欢的编辑器:vim 先搞清楚vim的三种模式: 1.命令模式: ...

  10. mysql面试常见题目2

    Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 sName 姓名 VARCHAR(20) 否 否 是 否 否 Sex ...