当前位置: 首页 > news >正文

CANOpen EMCY紧急报文介绍

什么是CANOpen紧急报文

CANOpen中的Emcy紧急报文用于当设备出现故障或警告时,向其它节点报告故障或警告使用的。如设备某个设备出现过压或过流时,就可以发送紧急报文。

紧急报文的格式

在这里插入图片描述
错误代码:是0x1003索引预定义错误字段的内容,是16bit详细的错误代码
错误寄存器:是0x1001索引当前错误状态的内容,是8bit,每个bit代表一个含义,粗略的表示设备故障方向。

CANFestival 如何发送紧急报文,

当节点出现故障时,调用UNS8 EMCY_setError(CO_Data* d, UNS16 errCode, UNS8 errRegMask, UNS16 addInfo)函数发送紧急报文。

/*! Sets a new error with code errCode. Also sets corresponding bits in Error register (1001h)**                                                                                                 **  ** @param d** @param errCode Code of the error                                                                                        ** @param errRegister Bits of Error register (1001h) to be set.** @return 1 if error, 0 if successful*/
UNS8 EMCY_setError(CO_Data* d, UNS16 errCode, UNS8 errRegMask, UNS16 addInfo)
{UNS8 index;UNS8 errRegister_tmp;for (index = 0; index < EMCY_MAX_ERRORS; ++index){if (d->error_data[index].errCode == errCode)		/* error already registered */{if (d->error_data[index].active){MSG_WAR(0x3052, "EMCY message already sent", 0);return 0;//错误已注册已发送直接返回} else d->error_data[index].active = 1;		/*已注册但还未发送 将active置1*/ /* set as active error */break;}}if (index == EMCY_MAX_ERRORS)	/*进了这个if表示错误代码还没注册*/	/* if errCode not already registered */for (index = 0; index < EMCY_MAX_ERRORS; ++index) if (d->error_data[index].active == 0) break;	/* find first inactive error */if (index == EMCY_MAX_ERRORS)		/* error_data full */{MSG_ERR(0x3053, "error_data full", 0);return 1;}d->error_data[index].errCode = errCode;d->error_data[index].errRegMask = errRegMask;d->error_data[index].active = 1;/* set the new state in the error state machine */d->error_state = Error_occurred;//将对象字典中的错误状态标记为错误发生/* set Error Register (1001h) */for (index = 0, errRegister_tmp = 0; index < EMCY_MAX_ERRORS; ++index)if (d->error_data[index].active == 1) errRegister_tmp |= d->error_data[index].errRegMask;*d->error_register = errRegister_tmp;//修改了索引0x1001的内容/* set Pre-defined Error Field (1003h) */for (index = d->error_history_size - 1; index > 0; --index)//for循环的将0x1003索引的错误代码向后滑动一个*(d->error_first_element + index) = *(d->error_first_element + index - 1);*(d->error_first_element) = errCode | ((UNS32)addInfo << 16);//将新的错误代码设置到最前边的索引if(*d->error_number < d->error_history_size) ++(*d->error_number);//错误个数自增/* send EMCY message */if (d->CurrentCommunicationState.csEmergency)//如果当前通信状态下emcy紧急报文服务是支持的则发送return sendEMCY(d, errCode, *d->error_register, NULL, 0);else return 1;
}

使用该函数时一定要注意,同一个错误代码,只发送一次。因为源码中判断错误代码已经注册到0x1003索引的,并且已经发送的则不再发送。到了这里可能有人有疑问了,假设这样一种情况:设备在运行过程中,某一时候设备过压,发送了紧急报文,然后故障解除,在之后的一段时间再次出现设备过压,这岂不是就无法再次发送紧急报文了吗?别急,这就说到了下边要介绍的内容,如何解除故障。

CANFestival 如何解除故障

当设备某个故障解除的时候,用户调用void EMCY_errorRecovered(CO_Data* d, UNS16 errCode)函数解除这个故障状态。

/*! Deletes error errCode. Also clears corresponding bits in Error register (1001h)**                                                                                                 **  ** @param d** @param errCode Code of the error                                                                                        ** @param errRegister Bits of Error register (1001h) to be set.** @return 1 if error, 0 if successful*/
void EMCY_errorRecovered(CO_Data* d, UNS16 errCode)
{UNS8 index;UNS8 errRegister_tmp;UNS8 anyActiveError = 0;for (index = 0; index < EMCY_MAX_ERRORS; ++index)if (d->error_data[index].errCode == errCode) break;		/* find the position of the error */if ((index != EMCY_MAX_ERRORS) && (d->error_data[index].active == 1)){d->error_data[index].active = 0;//上边的for循环找到故障代码的位置 这里将其active标记为0表示该故障已解除/* set Error Register (1001h) and check error state machine */for (index = 0, errRegister_tmp = 0; index < EMCY_MAX_ERRORS; ++index)if (d->error_data[index].active == 1){anyActiveError = 1;//标记还有其它故障errRegister_tmp |= d->error_data[index].errRegMask;}if(anyActiveError == 0)//判断有没有其他故障{d->error_state = Error_free;/* send a EMCY message with code "Error Reset or No Error" */if (d->CurrentCommunicationState.csEmergency)sendEMCY(d, 0x0000, 0x00, NULL, 0);//如果所有的故障都解除了就发送一个8字节全0的紧急报文}*d->error_register = errRegister_tmp;}elseMSG_WAR(0x3054, "recovered error was not active", 0);
}

解除的核心就是将active 字段设置为0。解除以后如果再次发生同样的故障就可以调用EMCY_errorRecovered函数继续发送紧急报文了

CANFestival处理接收到的紧急报文

当CANFestival协议栈收到紧急报文就会调用void proceedEMCY(CO_Data* d, Message* m)函数去处理接收到的紧急报文。

/*! This function is responsible to process an EMCY canopen-message.****** @param d** @param m The CAN-message which has to be analysed.****/
void proceedEMCY(CO_Data* d, Message* m)
{UNS8 nodeID;UNS16 errCode;UNS8 errReg;MSG_WAR(0x3055, "EMCY received. Proceed. ", 0);/* Test if the size of the EMCY is ok */if ( m->len != 8) {MSG_ERR(0x1056, "Error size EMCY. CobId  : ", m->cob_id);return;}/* post the received EMCY */nodeID = m->cob_id & 0x7F;errCode = m->Data[0] | ((UNS16)m->Data[1] << 8);errReg = m->Data[2];(*d->post_emcy)(d, nodeID, errCode, errReg);//调用回调函数,具体的动作留给用户实现
}

当处理完紧急报文会执行回调函数,具体要做什么处理由用户决定。

CANFestival紧急报文回调函数实现

void _post_emcy(CO_Data* d, UNS8 nodeID, UNS16 errCode, UNS8 errReg)
{printf("%s\r\n",__FUNCTION__);//收到emcy 紧急报文会执行这个回调函数
}

紧急报文概念不抽象,源码实现也较少,理解起来还算轻松,紧急报文就介绍到这里。

相关文章:

CANOpen EMCY紧急报文介绍

什么是CANOpen紧急报文 CANOpen中的Emcy紧急报文用于当设备出现故障或警告时&#xff0c;向其它节点报告故障或警告使用的。如设备某个设备出现过压或过流时&#xff0c;就可以发送紧急报文。 紧急报文的格式 错误代码&#xff1a;是0x1003索引预定义错误字段的内容&#xff…...

JAVA项目

目录 一、前言 二、技术介绍 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导&#xff0c;获取源码后台 一、前言 在数字化音乐时代&#xff0c;个性化推荐已成为提升用户体验、促进音乐消费的重要手段。为此&#xff0…...

️ LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备(下篇)

引言&#xff1a;种下一棵树最好的时间是十年前,其次是现在 书接上回&#xff1a;将对话式人工智能引入您的本地设备成为可能CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140865426 目的&#xff1a;在这个大模型横行的时候&#xff0c;我们常用电脑如何开展大模型的工作…...

Kafka实战(Scala操作)

Kafka基础讲解部分 Kafka基础讲解部分 Kafka实战&#xff08;Scala操作&#xff09; 1、引入依赖 版本&#xff1a; <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.report…...

Android Framework 之WMS详解

1.WMS说的就是 WindowManagerService&#xff1a;负责为Activity对应的窗口分配Surface&#xff0c;管理Surface的显示顺序以及位置尺寸&#xff0c;控制窗口动画 。 它是Android系统中为各个客户端即每个app来提供这样的服务的一个类。 在Android系统中在systemServer 进程和各…...

opencv-图像仿射变换

仿射变换设计图像位置角度的变化&#xff0c;是深度学习预处理中常用的功能。仿射变换就是对图像的平移缩放旋转翻转操作的组合 如下图&#xff0c;对图中点1,2,3与图二中三个点一一映射&#xff0c;仍然形成三角形&#xff0c;但形状已经发生改变&#xff0c;通过这两组三点求…...

算法的基本概念

一、算法的基本概念思维导图 二、什么是算法&#xff1a; 1.我们知道数据结构就是将我门现实的世界中的问题数据化&#xff0c;存入计算机中&#xff0c;并实现对数据结构的一些基本操作。 2.算法就是如何处理这些存入计算机中的信息&#xff0c;以求高效的解决实际问题。 3…...

124. Go Template应用实例:用代码生成代码

文章目录 生成器模式生成器代码生成 本文用生成器模式作为例子&#xff0c;来演示如何用代码生成代码。 生成器模式 熟悉 Java 开发的同学都知道&#xff0c;lombok 有一个著名的注解 Builder &#xff0c;只要加在类上面&#xff0c;就可以自动生成 Builder 模式的代码。如下…...

【AI实践】阿里云方言文本转语音TTS

最近要做一些普通话和方言demo 找一个免费工具 免费在线文字转语音工具 | edge-tts 在线体验 (bingal.com) 还有一些方言在阿里云上找了下&#xff0c;基于官方demo改了一下 阿里云语音合成接口说明_智能语音交互(ISI)-阿里云帮助中心 (aliyun.com) 如何下载安装、使用语音…...

java 之 各类日期格式转换

一、前言 大家在开发过程中必不可少得和日期打交道&#xff0c;对接别的系统时&#xff0c;时间日期格式不一致&#xff0c;每次都要转换! 从 Java1 到 Java8 将近 20 年&#xff0c;再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时…...

Nvidia黄仁勋对话Meta扎克伯格:AI和下一代计算平台的未来 | SIGGRAPH 2024对谈回顾

在今年的SIGGRAPH图形大会上&#xff0c;Nvidia创始人兼CEO黄仁勋与Meta创始人马克扎克伯格进行了一场长达60分钟的对谈。这场对话不仅讨论了AI的未来发展和Meta的开源哲学&#xff0c;还发布了不少新产品&#xff0c;并深入探讨了下一代计算平台的可能性。 引言 人工智能的发…...

【JAVA设计模式】适配器模式——类适配器模式详解与案例分析

前言 在软件设计中&#xff0c;适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在使不兼容的接口能够协同工作。它通过引入一个适配器类&#xff0c;帮助两个接口之间进行适配&#xff0c;使得它们能够互相操作。本文将详细介绍适配器模…...

【Vue】全局组件和局部组件

一、全局组件 定义&#xff1a; 全局组件是在整个Vue应用中都可以使用的组件。它们被注册在Vue的根实例上&#xff0c;因此可以在任何子组件的模板中被引用&#xff0c;而无需在每个组件中重复注册。 注册方式&#xff1a; 全局组件通过Vue.component方法进行注册。这个方法接…...

react引入高德地图并初始化卫星地图

react引入高德地图并初始化卫星地图 1.安装依赖 yarn add react-amap amap/amap-jsapi-loader2.初始化地图 import AMapLoader from "amap/amap-jsapi-loader"; import { FC, useEffect, useRef, useState } from "react";const HomeRight () > {con…...

2024最简七步完成 将本地项目提交到github仓库方法

2024最简七步完成 将本地项目提交到github仓库方法 文章目录 2024最简七步完成 将本地项目提交到github仓库方法一、前言二、具体步骤1、github仓库创建2、将远程仓库拉取并合并&#xff08;1&#xff09;初始化本地仓库&#xff08;2&#xff09;本地仓库与Github仓库关联&…...

前端WebSocket入门,看这篇就够啦!!

在HTML5 的早期开发过程中&#xff0c;由于意识到现有的 HTTP 协议在实时通信方面的不足&#xff0c;开发者开始探索能够在 Web 环境下实现双向实时通信的新的通信协议&#xff0c;提出了 WebSocket 协议的概念。 一、什么是 WebSocket&#xff1f; WebSocket 是一种在单个 T…...

漏洞复现-F6-11泛微-E-Cology-SQL

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://www.wwlib.cn/index.php/artread/artid/15575.html 0x01 产品简介 泛微协同管理应用平台e-cology是一套企业级大型协同管理平台 0x02 漏洞概述 该漏洞是由于泛微e-cology未对用户的输入进行有效的过滤&#xff0…...

Turbo Boost 禁用

最近在做OAI NR的时候关闭CPU 睿频的时候出了一些问题&#xff0c;这里我把我找到的资料记录一下&#xff1a; 禁用 Turbo Boost 的过程可能会因不同的 BIOS/UEFI 和操作系统设置而有所不同。以下是一些可能的原因及解决方法&#xff1a; 可能的原因 BIOS/UEFI 设置问题: 你的…...

假期BUUCTF小练习3

文章目录 [极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5[HCTF 2018]admin第一种方法 直接登录第二种方法 flack session伪造第三种方法Unicode欺骗 [MRCTF2020]你传你&#x1f40e;呢[护网杯 2018]easy_tornadoSSTI注入 [ZJCTF 2019]NiZhuanSiWei [极客大挑战 2019]BuyFlag 一…...

【ubuntu系统】在虚拟机内安装Ubuntu

Ubuntu系统装机 描述新装机后的常规配置&#xff0c; 虚拟机使用vbox terminal 打不开 CTRL ALT F3 进入命令行模式&#xff08;需要返回桌面时CTRL ALT F1&#xff09;root用户登入cd /etc/default vi locale LANG“en_US” 改成 LANG“en_US.UTF-8”保存修改后&…...

Xinference-v1.17.1保姆级:CentOS7离线环境部署,无外网依赖完整安装流程

Xinference-v1.17.1保姆级&#xff1a;CentOS7离线环境部署&#xff0c;无外网依赖完整安装流程 本文详细记录了在CentOS7离线环境中部署Xinference-v1.17.1的完整流程&#xff0c;无需外网依赖&#xff0c;适合企业内网环境使用。 1. 环境准备与前置检查 在开始安装之前&…...

深入理解栈溢出:我是如何通过CSAPP的AttackLab实验重新认识缓冲区安全的

深入理解栈溢出&#xff1a;从AttackLab实验看现代系统安全防御博弈 当我在深夜的实验室里第一次看到Segmentation fault提示时&#xff0c;并没有意识到这行简单的错误信息背后隐藏着怎样的安全危机。作为计算机系统安全领域最经典的漏洞类型&#xff0c;栈溢出攻击在过去三十…...

轻松破解游戏资源加密难题:RPG Maker Decrypter使用指南

轻松破解游戏资源加密难题&#xff1a;RPG Maker Decrypter使用指南 【免费下载链接】RPGMakerDecrypter Tool for extracting RPG Maker XP, VX and VX Ace encrypted archives. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDecrypter 直面游戏资源解密痛点 …...

react二次封装

先在src下创建一个utils文件一次封装下载npm install axios在utils文件创建个request.jsimport axios from axios;// 创建axios实例 const instance axios.create({timeout: 10000,headers: {Content-Type: application/json},baseURL: https://zzgoodqc.cn/ });// 请求拦截器…...

ARM A53上跑通1080P实时EIS防抖?手把手教你优化特征点与透视变换(附代码思路)

ARM A53实战&#xff1a;1080P实时EIS防抖的7个关键优化策略 当行车记录仪的镜头在颠簸路面剧烈晃动&#xff0c;或是运动相机在冲浪时被海浪拍打&#xff0c;画面稳定性的价值就凸显出来。传统光学防抖受限于物理结构&#xff0c;而电子防抖(EIS)通过算法补偿成为嵌入式设备的…...

GPIO输入模式深度解析:STM32按键检测中IDR寄存器的使用技巧与常见问题

STM32 GPIO输入模式实战&#xff1a;从IDR寄存器到工业级按键检测方案 在嵌入式开发中&#xff0c;GPIO输入模式是实现人机交互的基础功能之一。对于STM32开发者而言&#xff0c;深入理解IDR寄存器的工作原理和按键检测的实现技巧&#xff0c;往往决定着产品交互的可靠性和响应…...

Flux.1-Dev深海幻境风格探索:卷积神经网络特征可视化艺术再创作

Flux.1-Dev深海幻境风格探索&#xff1a;卷积神经网络特征可视化艺术再创作 最近在玩一个特别有意思的跨界项目&#xff0c;把两个看似不搭界的东西——深度学习的“大脑”和AI艺术生成——给揉到了一起。我们都知道&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在识别…...

清华大学学位论文LaTeX模板:thuthesis完整使用指南

清华大学学位论文LaTeX模板&#xff1a;thuthesis完整使用指南 【免费下载链接】thuthesis LaTeX Thesis Template for Tsinghua University 项目地址: https://gitcode.com/gh_mirrors/th/thuthesis 清华大学thuthesis LaTeX模板是专为清华学子设计的学位论文写作工具&…...

SketchUp STL插件技术指南:从原理到实践的三维工作流构建

SketchUp STL插件技术指南&#xff1a;从原理到实践的三维工作流构建 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 技术原理…...

3分钟轻松搞定!BetterNCM Installer一键安装插件管理器完全指南

3分钟轻松搞定&#xff01;BetterNCM Installer一键安装插件管理器完全指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装的复杂步骤而烦恼吗&#xff1f;B…...