news 2026/7/25 8:30:27

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《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(这个自己去执行查看)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 12:03:49

JavaWeb企业级开发---JavaScript

记录在听黑马课的时候的笔记以及课堂上练习的代码&#xff0c;文章图源于我在听课的时候所截的屏&#xff0c;所以有些不清晰&#xff0c;请见谅。下面是课程链接&#xff0c;可点击自行跳转。 【黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;…

作者头像 李华
网站建设 2026/7/24 20:38:14

微信小程序_WXML

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

作者头像 李华
网站建设 2026/7/19 17:44:48

Springboot连锁家政保洁管理系统03zmn(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;分店管理员,用户,保洁员,通知信息,独立服务,团队服务,独立服务信息,团队服务信息,独立服务订单,团队服务订单,团队派单,完成订单,独立服务取消,团队服务取消开题报告内容基于SpringBoot的连锁家政保洁管理系统开题报告一、研究背景与意义研…

作者头像 李华
网站建设 2026/7/23 4:04:29

Redis原理篇-Dict的rehash

** 不管是扩容还是收缩&#xff0c;必定会创建新的哈希表&#xff0c;导致哈希表的size和sizemask变化&#xff0c;而key的查询与sizemask有关。因此必须对哈希表中的每一个key重新计算索引&#xff0c;插入新的哈希表&#xff0c;这个过程称为rehash。过程是这样的&#xff1a…

作者头像 李华
网站建设 2026/7/22 12:07:22

计算机考研408【计算机网络】核心知识点总结

计算机网络作为考研408的重要组成部分&#xff0c;占总分约25分&#xff0c;由选择题和综合应用题构成。掌握计算机网络的基本概念、原理和方法是备考的关键 &#xff0c;尤其要理解OSI参考模型与TCP/IP模型的对应关系&#xff0c;以及各层协议的工作原理。本文将系统梳理计算机…

作者头像 李华
网站建设 2026/7/24 9:12:45

vue基于Spring Boot的公务员考试交流平台的应用和研究_729q3563

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华