中企动力做网站怎么样,常州网站建设推广公司,重庆巫山网站设计公司,程序外包一般多少钱目录
1.创建CAPL文件
3.编辑CAPL文件
4.CAPL文件功能描述
4.执行CAPL文件结果 1.创建CAPL文件 选择Insert Network Node 点击编辑按钮 -输入CAPL文件的名称-点击打开 -自动生成一个空的CAPL文件 3.编辑CAPL文件
这边的CANOE软件版本为16
/*!En…目录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) { // - 有的版本0unknown, 1busoff, 2errorPassive, 3errorActive // - 老版本常见3Active, 5Passive, 6BusOff // 先用打印确认再把“活动态”值写进这里 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, stateerrorActive/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独立处理。核心逻辑监控 Bus-Off 事件当 CAN 通道进入 Bus-Off 状态错误计数达到阈值时脚本会记录通道并启动恢复流程。防抖与延时恢复每个通道有独立的防抖标志和定时器避免重复触发恢复前延时一段时间默认 1000ms给物理层稳定。恢复操作定时器触发后调用resetCanEx(ch)重置对应通道使其重新 Bus-On。状态检查与重试使用canGetChipState()检查通道是否恢复到活动状态errorActive/Active。如果恢复成功清除标志和重试计数。如果失败增加重试次数并再次延时调度最多重试 3 次。辅助日志打印错误帧、Bus-Off、恢复过程、状态变化errorActive/errorPassive方便调试和验证。4.执行CAPL文件结果观察结果运行CAPL脚本文件短接总线出现错误帧恢复总线CAN消息恢复发送。恢复过程可见下图串口的打印LOG这个自己去执行查看