《CAPL脚本实现CANOE工具 Bus-Off自动恢复(含重试机制)》

目录

1.创建CAPL文件

3.编辑CAPL文件

4.CAPL文件功能描述

4.执行CAPL文件结果


1.创建CAPL文件

  • 选择"Insert Network Node"

  • 点击编辑按钮

  • ->输入CAPL文件的名称->点击打开

  • ->自动生成一个空的CAPL文件

3.编辑CAPL文件

这边的CANOE软件版本为16

/*@!Encoding:936*/ includes { } variables { const int MAX_CH = 2; // 目前只处理 CAN1、CAN2 // 两个通道的独立定时器 msTimer busOffRecoveryTimer1;//写的时候发现定时器不能用下标表示,所以只能单个定义 msTimer busOffRecoveryTimer2; //【///* 可选:复杂分析 */ long ch; long state; int recovering[MAX_CH + 1]; // 每通道防抖:recovering[1], recovering[2] int retryCount[MAX_CH + 1]; // 每通道重试:retryCount[1], retryCount[2] const int RETRY_MAX = 3;// 最大重试次数,可按需调整 const int DELAY_MS = 1000;//延时恢复的时间,这个可自己研究下要不要工具式样来修改 //// } // 活动态判断(按你 CANoe 版本调整) int isActive(long s) { // - 有的版本:0=unknown, 1=busoff, 2=errorPassive, 3=errorActive // - 老版本常见:3=Active, 5=Passive, 6=BusOff // 先用打印确认,再把“活动态”值写进这里 return (s == 3);// || (s == 3 ) ;///*旧版Active*/ } on start { int i; for (i = 1; i <= MAX_CH; i++) { recovering[i] = 0;//* 可选 * retryCount[i] = 0;//* 可选 * } } on errorFrame//只是有错误帧,还未进入BUSOFF状态 { write("ErrorFrame on CAN%ld", this.can); } // 当 CAN 通道进入 BUSOFF 状态时触发,错误次数达到255以上 /* Bus-Off 事件:记录通道,做防抖,启动定时器 */ on busOff { ch = this.can; if (ch < 1 || ch > MAX_CH) { write("⚠️ BUS-OFF on CAN%ld out of range (1..%d), ignored.", ch, MAX_CH); return; } write("⚠️ CAN%ld: BUS-OFF detected, 准备恢复...", ch); // 防抖:正在恢复时不要重复触发 if (recovering[ch]) { write("ℹ️ CAN%ld: Recovery in progress, skip re-schedule.", ch); return; } recovering[ch] = 1; //lastBusOffChannel = this.can; // 等待 xxx ms后执行复位,给物理层/线路一点缓冲时间 if (ch == 1) { setTimer(busOffRecoveryTimer1, DELAY_MS); } else { // ch == 2 setTimer(busOffRecoveryTimer2, DELAY_MS); } // xxxms后触发恢复定时器 } // 分别为两个定时器写回调(你用到几个就声明几个) on timer busOffRecoveryTimer1 { handleRecovery(1); } on timer busOffRecoveryTimer2 { handleRecovery(2); } // 通用的恢复逻辑 void handleRecovery(long ch) { if (retryCount[ch] >= RETRY_MAX) { write("❌ CAN%ld: Recovery exceeded max retries (%d). 请检查物理层/位时序/终端电阻/是否ListenOnly", ch, RETRY_MAX); recovering[ch] = 0; return; } write("🔄 CAN%ld: 尝试 bus-off recovery (retry=%d)...", ch, retryCount[ch] + 1); resetCanEx(ch); // 精准重置对应通道 // canSetChannelOutput(ch, 1); // 如你的测量配置默认关闭输出可启用这行 state = canGetChipState(ch); write("CAN%ld: chipState=%ld after reset", ch, state); if (isActive(state)) { write("✅ CAN%ld: Recovery OK, state=errorActive/Active.", ch); recovering[ch] = 0; retryCount[ch] = 0; } else { write("⚠️ CAN%ld: Still not active (state=%ld). 将再次尝试...", ch, state); retryCount[ch]++; if (ch == 1) { setTimer(busOffRecoveryTimer1, DELAY_MS); } else { setTimer(busOffRecoveryTimer2, DELAY_MS); } } } /* 可选:状态变化打印,辅助分析 */ on errorActive { write("CAN%ld: errorActive, TX=%d RX=%d,State=%ld", this.can, this.errorCountTX, this.errorCountRX); } /* 可选:状态变化打印,辅助分析 */ on errorPassive { write("CAN%ld: errorPassive, TX=%d RX=%d,State=%ld", this.can, this.errorCountTX, this.errorCountRX); }

4.CAPL文件功能描述

在 CANoe 中实现 CAN 通道 Bus-Off 自动恢复机制,支持两个通道(CAN1 和 CAN2)独立处理。

核心逻辑:

  1. 监控 Bus-Off 事件
    当 CAN 通道进入 Bus-Off 状态(错误计数达到阈值)时,脚本会记录通道并启动恢复流程。

  2. 防抖与延时恢复
    每个通道有独立的防抖标志和定时器,避免重复触发;恢复前延时一段时间(默认 1000ms),给物理层稳定。

  3. 恢复操作
    定时器触发后调用resetCanEx(ch)重置对应通道,使其重新 Bus-On。

  4. 状态检查与重试
    使用canGetChipState()检查通道是否恢复到活动状态(errorActive/Active)。

    • 如果恢复成功,清除标志和重试计数。
    • 如果失败,增加重试次数并再次延时调度,最多重试 3 次。
  5. 辅助日志
    打印错误帧、Bus-Off、恢复过程、状态变化(errorActive/errorPassive),方便调试和验证。

4.执行CAPL文件结果

观察结果:运行CAPL脚本文件,短接总线出现错误帧,恢复总线CAN消息恢复发送。

恢复过程可见下图串口的打印LOG(这个自己去执行查看)

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

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

相关文章

OP-TEE HelloWorld 文件保护实战:把一份 `helloworld.txt` 交给 Secure World 保管(EKB → PTA → CA)

&#x1f4fa; B站视频讲解&#xff08;Bilibili&#xff09;&#xff1a;https://www.bilibili.com/video/BV1k1C9BYEAB/ &#x1f4d8; 《Yocto项目实战教程》京东购买链接&#xff1a;Yocto项目实战教程 OP-TEE HelloWorld 文件保护实战&#xff1a;把一份 helloworld.txt …

web3作业

【Web第三周】『12.9-12.14』 初步了解数据库&#xff08;MySQL&#xff09;初步了解sql注入漏洞练习sql语句搭建sql靶场 初步了解数据库&#xff08;MySQL&#xff09; 一、MySQL 基础认知 1. 什么是 MySQL&#xff1f; 一款开源的关系型数据库管理系统&#xff08;RDBMS&…

基于MATLAB的SIFT特征汽车车标识别系统

摘要&#xff1a;随着智能交通与视频监控技术的快速发展&#xff0c;汽车品牌识别在车辆管理、智能安防和交通监控等领域具有重要的应用价值。然而在实际场景中&#xff0c;车标目标常受到复杂背景、尺度变化、姿态旋转以及光照条件变化等因素的影响&#xff0c;给车标的准确识…

Windows系统文件wdi.dll缺失或损坏问题 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

智能弹性伸缩算法在测试环境中的实践与验证

1 测试环境资源管理的现状与挑战 1.1 传统资源分配模式的瓶颈 软件测试环境长期以来面临资源分配两难困境&#xff1a;固定资源配置导致非测试时段资源闲置率高达60%-75%&#xff0c;而并发测试高峰时又因资源不足引发阻塞。根据Gartner调研数据&#xff0c;企业为保障测试稳…

掌握 Open Graph 协议:让你的网页在社交媒体上大放异彩

&#x1f31f; 什么是 Open Graph 协议&#xff1f; Open Graph 协议&#xff08;简称 OG 协议&#xff09;是由 Facebook 在 2010 年推出的一套技术规范。它的核心目标是允许任何网页成为一个“富对象”&#xff08;rich object&#xff09;&#xff0c;使其在社交网络&#…

微信小程序_WXML

图片&#xff1a;等比例填充&#xff08;头像&#xff09;&#xff1a;mode“aspectFill”<image src"{{userInfo ? userInfo.avatarUrl :/images/1.png}}" mode"aspectFill"></image>

Flink学习笔记:如何做容错

现在我们已经了解了 Flink 的状态如何定义和使用,那 Flink 是如何做容错的呢?今天我们一起来了解一下。现在我们已经了解了 Flink 的状态如何定义和使用,那 Flink 是如何做容错的呢?今天我们一起来了解一下。 先来…

​三天搞定企业招聘系统----|---附完整源码

一、开发背景随着经济的快速发展和市场竞争的日益激烈&#xff0c;企业对于人才的需求愈发迫切。然而&#xff0c;招聘渠道的分散、简历筛选的繁琐以及招聘周期的漫长&#xff0c;给企业招聘带来了诸多困扰。同时&#xff0c;求职者在寻找合适工作时&#xff0c;也面临着岗位信…

Windows11系统文件wer.dll丢失或损坏问题 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

多云测试的智能调度方案

1 方案概述 1.1 背景与挑战 随着企业数字化转型加速&#xff0c;多云架构已成为现代软件开发的标配环境。测试团队面临异构资源管理复杂、环境部署效率低下、成本控制精度不足三大核心挑战。传统单云测试模式在跨云兼容性验证、突发流量承载等方面显现出明显局限性。 1.2 智…

光伏发电+boost+储能+双向dcdc+并网逆变器控制参考资料 光伏发电+boost+储能+...

光伏发电&#xff0b;boost&#xff0b;储能&#xff0b;双向dcdc&#xff0b;并网逆变器控制参考资料 光伏发电&#xff0b;boost&#xff0b;储能&#xff0b;双向dcdc&#xff0b;并网逆变器控制(低压用户型电能路由器仿真模型)【含笔记&#xff0b;建模参考】 包含Boost、B…

基于风险演进的智能测试策略设计

风险演进背景下的测试新挑战 随着数字化转型加速&#xff0c;软件系统从单体架构向微服务、云原生演进&#xff0c;测试风险不再局限于代码缺陷&#xff0c;而是扩展到安全漏洞、性能瓶颈、兼容性问题及业务连续性等多维度。风险演进的本质在于其动态性&#xff1a;在开发周期…

OOP题目集 4~5 及 课堂测验总结性 Blog

一、前言 本阶段的两次题目集(题目集 4、题目集 5)围绕 “数字电路模拟程序” 展开,是一次循序渐进、逐步深入的编程实践。两次题目集均聚焦于数字电路中逻辑门的模拟实现,核心知识点涵盖面向对象编程(OOP)的核心…

Windows系统文件werui.dll缺少或损坏 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

评价页岩油是否值得开采的指标有哪些

评价页岩油是否值得开采&#xff0c;通常需要从地质资源、工程技术、经济效益和生态环境等多个维度进行综合考量。以下为业内通用且权威的评价指标体系&#xff0c;结合了国内外行业标准、经济评价规范及学术研究成果&#xff1a; 一、地质与资源潜力指标 这些指标反映页岩油“…

周日随笔 第一弹

哪来的什么感想,只是疯了之前的胡言乱语罢了。 就这样吧,没关系的,无所谓了。就是记录一下最近的感受吧。 这一周下来好像没有什么特别大的观感,只是觉得想要成为TS的感觉小了很多,也许是因为我自己在心里面安慰我…

能耗黑洞无处遁形!能源管理系统核心功能剖析【带源码】

温馨提示&#xff1a;文末有资源获取方式~能源系统|能源系统源码|企业能源系统|企业能源系统源码|能源监测系统一、Java 与能源管理系统的邂逅​能源管理系统的核心使命在于实现能源的精细化管控。它通过实时收集各类能源数据&#xff0c;如电力、燃气、水、热能等的消耗情况&a…

交换机.路由器.防火墙-技术提升【6.8】

16.2 防火墙的应用环境与连接 在每一种网络环境下防火墙的安装位置和连接方式可能都不相同。传统的做法就是将防火墙安装在内部机构网络与外部网络之间,至于内部网络之间可能还需要设置安全隔离措施,也同样可以安装防火墙。 16.2.1 防火墙连接策略 在设有网络防火墙的网…