CANopen协议---PDO使用配置

1、CANopen知识回顾

        在上一讲中,已经对CANopen的基本结构和整体内容进行了一番梳理,本笔记主要整理了一下CANopen如何配置PDO,实现数据周期性自动上传和控制信号快速发送等操作。

CANopen协议开发梳理总结笔记教程-CSDN博客文章浏览阅读920次,点赞31次,收藏16次。CANOpen协议是一种架构在控制局域网络(Controller Area Network, CAN)上的高层通信协议,它广泛应用于工业自动化、机械工程和汽车电子等领域。CANOpen协议通过对象字典、服务数据对象(SDO)、过程数据对象(PDO)等机制,为机器人、运动控制、过程控制、楼宇自动化、交通运输等行业提供了一种标准化的通信解决方案。https://blog.csdn.net/weixin_49337111/article/details/140192162?spm=1001.2014.3001.5501

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

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

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

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

        接下来的部分,将具体讲解,如何实现上述PDO映射操作的实现。

2、NMT网络管理主机

        网络管理主机 NMT-Master(Network Management-Master),就像一个指挥官,所有节点的启动、停止都是有他进行指挥NMT 主机和 NMT 从机之间通讯的报文就称为 NMT 网络管理报文。管理报文负责层管理、网络管理和 ID 分配服务。为了协调各个节点的同步、心跳、时间、错误提示等通讯控制,CANopen 还定义了一系列特殊协议(Special protocols)报文。

NMT 管理涉及到一个 CANopen 节点从上电开始的 6 种状态,包括:

        初始化(Initializing):节点上电后对功能部件包括 CAN 控制器进行初始化;

        应用层复位(Application Reset):节点中的应用程序复位(开始),比如开关量输出、模拟量输出的初始值;

        通讯复位(Communication reset):节点中的CANopen通讯复位(开始),从这个时刻起,此节点就可以进行CANopen通讯了。

        预操作状态(Pre-operational):节点的CANopen通讯处于操作就绪状态,此时此节点不能进行PDO通信,而可以进行SDO进行参数配置和NMT网络管理的操作;

        操作状态(operational):节点收到NMT主机发来的启动命令后,CANopen通讯被激活,PDO通信启动后,按照对象字典里面规定的规则进行传输,同样SDO也可以对节点进行数据传输和参数修改;

        停止状态(Stopped):节点收到NMT主机发来的停止命令后,节点的PDO通信被停止,但SDO和NMT网络管理依然可以对节点进行操作;

        除初始状态外,NMT主机通过NMT命令可以让网络中任意一个的CANopen节点进行其他5种状态的切换。图中转换由 NMT 报文实现,且只有 NMT 主机能够发送 NMT 控制报文,消息报文格式如下所示:

为了方便讲解说明,接下来的部分,均是默认设备的节点ID为 1

3、PDO配置操作流程

在这一部分的内容中,以配置目标位置(0x607A)映射到PDO为例子进行笔记整理讲解。

①、节点预操作模式切换

        在这一步中,需要先将该节点切换到预操作模式下。操作模式的切换均是由NMT进行管理的。

        0x000 80 01

char data[8] = { 0 };
data[0] = 0x80;
data[1] = 0x01;serve_motor_send_data(0x000, data);
//如果开启了设备心跳,会有类似的返回值:000 80 01

②、使PDO无效

        使PDO无效,需要使用SDO发送数据。

//22 00 14 01 01 02 00 80char data[8] = { 0 };
data[0] = 0x22;               
//任意长度写入
data[1] = 0x1400 & 0xFF;      //通信对象:0x1400
data[2] = 0x1400 >> 8 & 0xFF;
//通信对象:0x1400
data[3] = 0x01;data[4] = (0x200 + 0x01) & 0xFF;      //0x1400的COB-ID为0x200+节点ID
data[5] = (0x200 + 0x01) >> 8 & 0xFF;
//0x1400的COB-ID为0x200+节点ID
data[6] = 0x00;
data[7] = 0x80;serve_motor_send_data(0x601, data);

③、清除PDO映射

        清除PDO映射,也需在SDO发送数据。

//22 00 16 00 00 00 00 00
char data[8] = { 0 };
data[0] = 0x22;
//任意长度写入
data[1] = 0x1600 & 0xFF;        //映射对象:0x1600
data[2] = 0x1600 >> 8 & 0xFF;   //映射对象:0x1600serve_motor_send_data(0x601, data);

④、写入PDO映射内容

        写入PDO映射内容,也需在SDO发送数据。

//22 00 16 01 20 00 FF 60
char data[8] = { 0 };
data[0] = 0x22;                    //任意长度写入
data[1] = 0x1600 & 0xFF;//映射对象:0x1600
data[2] = 0x1600 >> 8 & 0xFF;      //映射对象:0x1600
data[3] = 0x01;
data[4] = 0x20;//写入32位数据
data[5] = 0x00;//子索引
data[6] = 0x607A & 0xFF;//目标参数索引:目标地址0x607A
data[7] = 0x607A >> 8 & 0xFF;      //目标参数索引:目标地址0x607Aserve_motor_send_data(0x601, data);

⑤、写入PDO映射对象个数

        写入PDO映射对象个数,也需在SDO发送数据。

//22 00 16 00 01 00 00 00 写入1个参数
char data[8] = { 0 };
data[0] = 0x22;//任意长度写入
data[1] = 0x1600 & 0xFF;//映射对象:0x1600
data[2] = 0x1600 >> 8 & 0xFF;//映射对象:0x1600
data[3] = 0x00;
data[4] = 0x01;                 //参数个数serve_motor_send_data(0x601, data);

⑥、激活PDO

        写入PDO映射对象个数,也需在SDO发送数据。

//22 00 14 01 01 02 00 00
char data[8] = { 0 };
data[0] = 0x22;                    //任意长度写入
data[1] = 0x1400 & 0xFF;           //通信对象:0x1400
data[2] = 0x1400 >> 8 & 0xFF;//通信对象:0x1400
data[3] = 0x01;
data[4] = (0x200 + 0x01) & 0xFF;        //0x1400的COB-ID为0x200+节点ID
data[5] = (0x200 + 0x01) >> 8 & 0xFF;   //0x1400的COB-ID为0x200+节点ID
data[6] = 0x00;
data[7] = 0x00;serve_motor_send_data(0x601, data);

        在上述步骤,全部正常发送和接收返回后,既完成了一套完整的PDO配置操作,如果需要一条PDO配置多个控制操作,进行适当的修改即可!

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

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

相关文章

代码随想录-Day53

739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: …

微信视频号及直播回放下载工具

最近需要下载微信视频号中的视频,找一圈,终于找到了,,免费,没广告 软件叫做:爱享素材下载器。 是一款开源的、完全免费的工具。 第1步:下载安装包 下载地址: https://github.com/p…

年销量超1亿箱,三得利BOSS咖啡如何凭借人群战略打造极致产品力?

BOSS咖啡诞生于1992年,在可口可乐、朝日、麒麟等饮料巨头先后入局,市场竞争非常激烈的情况下,BOSS咖啡成为受国民欢迎的品牌,它是如何做到的呢? 罐装咖啡趋势崛起,各大品牌推出罐装咖啡 自1980年代起,罐装…

猫咪浮毛多怎么办?一分钟推荐性价比高的养猫空气净化器排名

作为一名猫咖店老板,我发现很多铲屎官来店里咨询,在春夏换季时会频繁打喷嚏、全身过敏红肿。这是因为猫咪在换季时会大量掉毛,家里就像下雪一样,空气中充满了猫毛。这些猫毛上附带的细菌会随浮毛被人吸入,从而引发打喷…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-2.EBS是什么?

EBS,即Elastic Block Storage,是一种云存储服务,旨在提供高性能、高弹性和高可用性的虚拟块设备存储。该服务的核心设计思想是计算与存储的解耦合(Compute-Storage Disaggregation),即计算资源(…

Windows10/11家庭版开启Hyper-V虚拟机功能详解

Hyper-V是微软的一款虚拟机软件,可以使我们在一台Windows PC上,在虚拟环境下同时运行多个互相之间完全隔离的操作系统,这就实现了在Windows环境下运行Linux以及其他OS的可能性。和第三方虚拟机软件,如VMware等相比,Hyp…

MoonBit 周报 Vol.48:默认开启诊断信息渲染、test block 不再返回 Result 类型的结果

weekly 2024-07-08 MoonBit 更新 【重大更新】修改 array slice 的语法,从 arr[start..end] 修改为类似 Python 的 arr[start:end]。这是为了避免和接下来要支持的 cascade method call x..f() 产生语法冲突。旧的语法会在近期删除。 【Wasm后端重大更新】将 fn i…

【ROS2】初级:客户端-创建一个包

目标:使用 CMake 或 Python 创建一个新包,并运行其可执行文件。 教程级别:初学者 时间:15 分钟 目录 背景 1. ROS 2 包是什么?2. 组成 ROS 2 包的是什么?3. 工作区中的包 先决条件 任务 1. 创建一个包2. 打…

腾讯发布2024大模型十大最新趋势!

近日,在2024世界人工智能大会上,腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前,这一报告正在AI产业界各大社群快速传播。 报告中,腾讯研究院试图通过10个关键性的趋势,去理解全世界范围内正…

一文清晰了解HTML——简单实例

想要仿照该页面编写HTML代码&#xff1a; 在vscode中输入&#xff01;自动生成默认模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

为什么KV Cache只需缓存K矩阵和V矩阵,无需缓存Q矩阵?

大家都知道大模型是通过语言序列预测下一个词的概率。假定{ x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x3​&#xff0c;…&#xff0c; x n − 1 x_{n-1} xn−1​}为已知序列&#xff0c;其中 x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x…

第二证券股市资讯:深夜!突然暴涨75%!

一则重磅收买引发医药圈轰动。 北京时间7月8日晚间&#xff0c;美股开盘后&#xff0c;美国生物制药公司Morphic股价一度暴升超75%。音讯面上&#xff0c;生物医药巨子礼来公司官宣&#xff0c;将以57美元/股的价格现金收买Morphic&#xff0c;较上星期五的收盘价溢价79%&…

Dungeonborne卡顿延迟怎么办?这样降低Dungeonborne延迟

Dungeonborne将第一人称的动作的即时性和经典的西幻RPG职业设计深度结合&#xff0c;带来无与伦比的游戏体验。玩家在游戏中扮演一位从神秘地牢中醒来的勇士&#xff0c;他必须面对各种未知的敌人和挑战&#xff0c;逐渐揭开自己的身世之谜。在这个充满魔法和奇迹的世界里&…

微信如何快速回复信息呢?

时业务繁忙的时候可能会出现一大堆消息需要去回复&#xff0c;很多客户也会来问重复的问题&#xff0c;有时候回复消息也需要一个及时性&#xff0c;如果回复慢了有可能客户就跑了&#xff0c;那这个时候就会体现出自动回复的优势。 只要设置好一个关键词&#xff0c;只要对方…

朗新天霁eHR GetFunc_code.asmx SQL注入致RCE漏洞复现

0x01 产品简介 朗新天霁人力资源管理系统(LongShine eHR)是一款由北京朗新天霁软件技术有限公司研发的人力资源管理系统,该产品融合了国外先进的人力资源管理理念和国内大量人力资源管理实践经验,是国内功能较为全面、性价比较高的人力资源管理系统之一,系统凭借其集成化…

【C语言】auto 关键字详解

在C语言中&#xff0c;auto关键字用于声明局部变量&#xff0c;但它的使用已经变得很少见。事实上&#xff0c;从C99标准开始&#xff0c;auto关键字的默认行为就是隐含的&#xff0c;因此在大多数情况下无需显式使用它。 基本用法 在C语言中&#xff0c;auto关键字用于指定变…

Vulnhub靶场DC-6练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. wordpress扫描2. wordlists字典爆破 0x03 漏洞查找与利用1. 漏洞查找2. CVE-2018-15877漏洞利用3. 反弹shell5. nmap提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-6.zip 介绍&#…

代码随想录打卡第十三天

代码随想录–二叉树部分 day13 二叉树第一天 文章目录 代码随想录--二叉树部分二叉树基础知识一、力扣144--二叉树的前序遍历&#xff08;递归&#xff09;二、力扣145--二叉树的后序遍历&#xff08;递归&#xff09;三、力扣94--二叉树的中序遍历&#xff08;递归&#xff0…

【密码学】哈希函数与加密算法的关系

一、哈希函数的定义 哈希函数&#xff08;Hash Function&#xff09;&#xff0c;也被称为散列函数或杂凑函数&#xff0c; 是一种将任意长度的输入数据&#xff08;通常称为“预映射”或“消息”&#xff09;转换为固定长度输出&#xff08;通常称为“哈希值”、“散列值”、“…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…