CANopen for Python 使用教程(二)
系列文章目录
前言
CANopen 标准的 Python 实现。该项目的目的是在一个简单的 Pythonic 接口中支持 CiA 301 标准中最常见的部分。它主要针对测试和自动化任务,而不是符合标准的主实施。
该库支持 Python 3.6 及以上版本。
一、特点
该库主要用作主库。
- NMT 主站
- SDO 客户端
- PDO 生产者/消费者
- SYNC 生产者
- EMCY 消费者
- 时间生产者
- LSS 主站
- 来自 EDS 的对象字典
- 402 配置文件支持
还不完全支持创建从节点。
- SDO 服务器
- PDO 生产者/消费者
- NMT 从节点
- EMCY 生产者
- 来自 EDS 的对象字典
二、安装
使用 pip 从 PyPI 安装:
pip install canopen
从 GitHub 上的最新主站安装:
pip install https://github.com/christiansandberg/canopen/archive/master.zip
如果您希望在使用过程中更改代码,请克隆它,然后在开发模式下安装:
git clone https://github.com/christiansandberg/canopen.git
cd canopen
pip install -e .
单元测试可使用 pytest 框架运行:
pip install pytest
pytest -v
三、文档
文档可在阅读文档中找到:
http://canopen.readthedocs.io/en/latest/
也可使用 Sphinx 从本地克隆生成:
python setup.py build_sphinx
四、硬件支持
该库通过 python-can 软件包支持多种硬件和驱动程序。请参阅支持的设备列表。
还可将此库与自定义后端集成。
五、快速启动
下面是一些快速操作示例:
可以通过三种形式访问 PDO:
第 1 种:node.tpdo[n] 或 node.rpdo[n] 。
第 2 种: node.pdo.tx[n] 或 node.pdo.rx[n]
第 3 次: 节点.pdo[0x1A00] 或节点.pdo[0x1600]
n 是 PDO 索引(通常为 1 至 4)。第二种访问方式用于向后兼容。
import canopen# Start with creating a network representing one CAN bus
network = canopen.Network()# Add some nodes with corresponding Object Dictionaries
node = canopen.RemoteNode(6, '/path/to/object_dictionary.eds')
network.add_node(node)# Connect to the CAN bus
# Arguments are passed to python-can's can.Bus() constructor
# (see https://python-can.readthedocs.io/en/latest/bus.html).
network.connect()
# network.connect(bustype='socketcan', channel='can0')
# network.connect(bustype='kvaser', channel=0, bitrate=250000)
# network.connect(bustype='pcan', channel='PCAN_USBBUS1', bitrate=250000)
# network.connect(bustype='ixxat', channel=0, bitrate=250000)
# network.connect(bustype='vector', app_name='CANalyzer', channel=0, bitrate=250000)
# network.connect(bustype='nican', channel='CAN0', bitrate=250000)# Read a variable using SDO
device_name = node.sdo['Manufacturer device name'].raw
vendor_id = node.sdo[0x1018][1].raw# Write a variable using SDO
node.sdo['Producer heartbeat time'].raw = 1000# Read PDO configuration from node
node.tpdo.read()
node.rpdo.read()
# Re-map TPDO[1]
node.tpdo[1].clear()
node.tpdo[1].add_variable('Statusword')
node.tpdo[1].add_variable('Velocity actual value')
node.tpdo[1].add_variable('Some group', 'Some subindex')
node.tpdo[1].trans_type = 254
node.tpdo[1].event_timer = 10
node.tpdo[1].enabled = True
# Save new PDO configuration to node
node.tpdo[1].save()# Transmit SYNC every 100 ms
network.sync.start(0.1)# Change state to operational (NMT start)
node.nmt.state = 'OPERATIONAL'# Read a value from TPDO[1]
node.tpdo[1].wait_for_reception()
speed = node.tpdo[1]['Velocity actual value'].phys
val = node.tpdo['Some group.Some subindex'].raw# Disconnect from CAN bus
network.sync.stop()
network.disconnect()
# 导入canopen库以实现与CANopen设备的通信
import canopen# 初始化一个CAN网络,代表一条CAN总线
# 创建一个网络实例,用于管理CAN总线上的节点与通信
network = canopen.Network()# 向网络中添加一个节点,节点ID为6,并指定对象字典(Object Dictionary)的路径
# 该对象字典包含了设备的数据结构和通信参数
node = canopen.RemoteNode(6, '/path/to/object_dictionary.eds')
# 将新创建的节点添加到网络中
network.add_node(node)# 连接到CAN总线
# 连接参数将传递给python-can库中的can.Bus构造器
# 更多关于连接参数的信息请参考python-can文档:https://python-can.readthedocs.io/en/latest/bus.html
network.connect()
# 根据实际使用的CAN接口和配置选择合适的连接方式,例如:
# network.connect(bustype='socketcan', channel='can0')
# network.connect(bustype='kvaser', channel=0, bitrate=250000)
# ...其他连接示例省略...# 通过SDO读取变量
# 读取设备制造商名称和供应商ID
device_name = node.sdo['Manufacturer device name'].raw
vendor_id = node.sdo[0x1018][1].raw# 使用SDO写入变量
# 设置生产者心跳时间
node.sdo['Producer heartbeat time'].raw = 1000# 读取PDO配置
# 分别读取TPDO和RPDO的当前配置
node.tpdo.read()
node.rpdo.read()# 重新映射TPDO[1]
# 清除现有映射
node.tpdo[1].clear()
# 添加新的变量到TPDO[1]
node.tpdo[1].add_variable('Statusword')
node.tpdo[1].add_variable('Velocity actual value')
# 支持通过组名和子索引映射变量
node.tpdo[1].add_variable('Some group', 'Some subindex')
# 设置传输类型、事件定时器并启用该PDO
node.tpdo[1].trans_type = 254
node.tpdo[1].event_timer = 10
node.tpdo[1].enabled = True
# 保存新的PDO配置至节点,以便重启后仍生效
node.tpdo[1].save()# 设置每100毫秒发送一次SYNC报文
network.sync.start(0.1)# 改变节点状态为运行中(NMT启动命令)
node.nmt.state = 'OPERATIONAL'# 从TPDO[1]接收数据并读取值
# 等待TPDO[1]的接收完成
node.tpdo[1].wait_for_reception()
# 获取实际速度的物理值
speed = node.tpdo[1]['Velocity actual value'].phys
# 通过组名和子索引读取原始值
val = node.tpdo['Some group.Some subindex'].raw# 断开与CAN总线的连接
# 停止发送SYNC报文
network.sync.stop()
# 断开网络连接
network.disconnect()
六、调试
如果需要更详细地了解发生了什么,可以提高日志记录级别:
import logging
logging.basicConfig(level=logging.DEBUG)相关文章:
CANopen for Python 使用教程(二)
系列文章目录 前言 CANopen 标准的 Python 实现。该项目的目的是在一个简单的 Pythonic 接口中支持 CiA 301 标准中最常见的部分。它主要针对测试和自动化任务,而不是符合标准的主实施。 该库支持 Python 3.6 及以上版本。 一、特点 该库主要用作主库。 NMT 主站…...
前方碰撞缓解系统技术规范(简化版)
前方碰撞缓解系统技术规范(简化版) 1 系统概述2 工作时序3 预警目标4 功能条件5 HMI开关6 显示需求7 相关子功能8 TTC标定参考9 指标需求1 系统概述 前方碰撞缓解系统包含LW潜在危险报警、FCW前方碰撞预警和AEB自动紧急制动三个部分。 LW潜在危险报警:根据本车与前车保持的…...
数据赋能(117)——体系:数据收集——实施过程、应用特点
实施过程 数据收集过程是一个系统化、有序的步骤集合,旨在确保能够准确、高效地获取所需数据。以下是数据收集过程的基本步骤: 明确数据需求:这是数据收集的第一步,需要明确需要收集哪些类型的数据,这些数据将如何支…...
【吃包子game】
如果您想要编写一个简单的“吃包子”游戏代码,可以使用Python语言来实现。下面是一个简单的例子,该游戏会随机生成一定数量的包子,玩家每次可以吃掉一个包子,直到包子被吃光为止。 import random def eat_dumplings():# 随机生成…...
图片转Base64
在Python中, 可以使用内置的base64模块以及图像处理库(如PIL, 也称为Pillow)来将图片转换为Base64编码的字符串. 以下是一个简单的示例, 说明如何实现这一过程:首先, 需要安装Pillow库(如果尚未安装), 可以使用pip来安装: pip install pillow然后, 可以使用以下Python代码将图片…...
STM32项目分享:智能家居语音系统
目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB打板焊接图: 五、程序设计 六、实验效果 七、包含内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.com…...
iOS 18 为 iPhone 15 机型引入了更多充电限制选项
iOS 18 为 iPhone 15 机型引入了更多充电限制选项 所有四款iPhone 15型号都具备一项设置,可以限制设备充电至80%以内,这样能够缩短电池完全充电所需的时间,并有可能延长iPhone电池的使用寿命。随着iOS 18的推出,Apple进一步加入了…...
Linux文本三剑客 awk 和 grep
awk 前言 AWK是一种优良的文本处理工具。它不仅是 Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。 Linux中最常用的文本处理工具有grep,sed,awk。行内将之称为文本三剑客,就功能量和效率来看,awk是当之无愧的文本三…...
Python NumPy 库详解
大家好,在当今数据驱动的世界中,处理大规模数据、进行复杂数值计算是科学研究、工程设计以及数据分析的关键任务之一。在Python生态系统中,NumPy(Numerical Python)库是一款备受推崇的工具,它为我们提供了高…...
React state 执行时机
设置 state 只会为下一次渲染变更 state 的值 一个 state 变量的值永远不会在一次渲染的内部发生变化 React 会使 state 的值始终"固定"在一次渲染的各个事件处理函数内部 React 会等到事件处理函数中的所有代码都运行完毕再处理 state 更新 在一个函数中࿰…...
Spring基于注解开发
目录 一. Bean基本注解开发 二. Bean依赖注入注解开发 三. 非自定义Bean注解开发 四. Spring配置类的开发 五. Spring配置其他注解 5.1 Primary 5.2 Profile 六. Spring注入的解析原理 七. Spring注解方式整合第三方框架 一. Bean基本注解开发 Spring除了xml配置文件…...
深度探索:智能家居背后的科技力量与伦理思考
目录 科技力量:创新驱动下的智慧生活引擎 1. 人工智能与机器学习 2. 物联网技术 3. 大数据分析 4. 5G与边缘计算 伦理与隐私:智能家居的双刃剑 1. 隐私侵犯风险 2. 数据安全挑战 3. 算法偏见与决策透明度 应对策略:构建安全、负责任的智能…...
鸿蒙开发:通过startAbilityByType拉起垂类应用
通过startAbilityByType拉起垂类应用 使用场景 开发者可通过特定的业务类型如导航、金融等,调用startAbilityByType接口拉起对应的垂域面板,该面板将展示目标方接入的垂域应用,由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用…...
docker 更换镜像源
打开对应的配置文件 vi /etc/docker/daemon.json 输入文件内容入下 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8…...
Springboot(若依)国际化配置接口访问后返回????????
最近使用若依的框架进行二次开发,配置了国际化,application.yml配置英文时没问题,但配置中文basename: i18n/messages_zh_CN,访问接口就直接返回的???,如图: 于是检查了I18nConfig文件,没配错…...
java1
在继承中,创建子类对象,访问成员方法的规则: 创建的对象是谁,就优先用谁,没有再向上找 注意:无论是成员变量还是成员方法, 如果没有都是向上找父类,不会向下找子类 继承的特点&#…...
pytest中一个场景测试的demo
注意点1: allure.severity 是一个装饰器,用于设置测试用例的严重性级别。 allure.severity_level.CRITICAL 是Allure提供的严重性级别之一,表示这个测试用例极为重要。allure.severity_level.BLOCKER:阻塞级别的问题,…...
windows下安装IntelliJIDEA
windows下安装IntelliJIDEA 步骤1:下载IntelliJ IDEA 打开浏览器并访问IntelliJ IDEA下载页面. https://www.jetbrains.com/idea/download/选择合适的版本: Ultimate:付费版本,包含更多功能,适合专业开发。Community…...
string经典题目(C++)
文章目录 前言一、最长回文子串1.题目解析2.算法原理3.代码编写 二、字符串相乘1.题目解析2.算法原理3.代码编写 总结 前言 一、最长回文子串 1.题目解析 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s “babad” 输出&am…...
三篇卫星切换的论文
目录 一、Energy-Aware Satellite Handover based on Deep Reinforcement Learning 1、题目翻译 2、来源 3、内容 二、A Reliable Handover Strategy with Second Satellite Selection in LEO Satellite Networks 1、题目翻译 2、来源 3、内容 三、User Grouping-Based…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
