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

CANoe 杂谈

这篇文章聊聊在工作中遇到的问题和分享一些好玩的函数

不允许直接int 变量 = 变量;

可以写成

int temp;

temp = x;

void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
printf("在 swap 函数内:x = %d, y = %d\n", x, y);
}

halt();暂停模拟=断点

variables { message InspectMessage gMsgInspect; message BreakPointMessage gMsgBreakPoint; message BreakPointMessage2 gMsgBreakPoint2; msTimer tSignalUpdateBreakPoint; byte gBreakPointMsgByte0 ; byte gBreakPointMsgByte1 ; byte gBreakPointMsgByte2 ; byte gBreakPointMsgByte3 ; byte gBreakPointMsgByte4 ; byte gBreakPointMsgByte5 ; byte gBreakPointMsgByte6 ; byte gBreakPointMsgByte7 ; byte gInspectMsgByte0 ; byte gInspectMsgByte1 ; byte gInspectMsgByte2 ; byte gInspectMsgByte3 ; byte gInspectMsgByte4 ; byte gInspectMsgByte5 ; byte gInspectMsgByte6 ; byte gInspectMsgByte7 ; } on message InspectMessage { gMsgInspect = this; gInspectMsgByte0 = gMsgInspect.SigInspect0; gInspectMsgByte1 = gMsgInspect.SigInspect1; gInspectMsgByte2 = gMsgInspect.SigInspect2; gInspectMsgByte3 = gMsgInspect.SigInspect3; gInspectMsgByte4 = gMsgInspect.SigInspect4; gInspectMsgByte5 = gMsgInspect.SigInspect5; gInspectMsgByte6 = gMsgInspect.SigInspect6; gInspectMsgByte7 = gMsgInspect.SigInspect7; // Inspect() function will update // the variables in the debugger window if(@sysvar::Inspect::InspectOnOff) { inspect(); } } on start { @sysvar::Inspect::InspectOnOff = 0; @sysvar::BreakPoint::TimerBreakPoint = 0; @sysvar::BreakPoint::MessageBreakPointOnOff = 0; @sysvar::BreakPoint::SignalBreakPoint = 0; setTimer(tSignalUpdateBreakPoint,2000); } on message BreakPointMessage { int CAPLError; int SigPointValue; SigPointValue = this.SigBPoint0; if(@sysvar::BreakPoint::SetError) { if(SigPointValue == 0 && @sysvar::BreakPoint::SignalBreakPoint) { halt(); } CAPLError = (1.0/this.SigBPoint0); // Diff through 0 } } on timer tSignalUpdateBreakPoint { if(@sysvar::BreakPoint::TimerBreakPoint) { @sysvar::BreakPoint::TimerBreakPoint = 0; } setTimer(this,2000); } on message BreakPointMessage2 { gMsgBreakPoint2 = this; // halt() function will halt the simulation, if the // message comes into the on message handler if(@sysvar::BreakPoint::MessageBreakPointOnOff) { @sysvar::BreakPoint::MessageBreakPointOnOff = 0; halt(); } saveMessageBytes(); } void saveMessageBytes() { gBreakPointMsgByte0 = gMsgBreakPoint2.SigBPoint0; gBreakPointMsgByte1 = gMsgBreakPoint2.SigBPoint1; gBreakPointMsgByte2 = gMsgBreakPoint2.SigBPoint2; gBreakPointMsgByte3 = gMsgBreakPoint2.SigBPoint3; gBreakPointMsgByte4 = gMsgBreakPoint2.SigBPoint4; gBreakPointMsgByte5 = gMsgBreakPoint2.SigBPoint5; gBreakPointMsgByte6 = gMsgBreakPoint2.SigBPoint6; gBreakPointMsgByte7 = gMsgBreakPoint2.SigBPoint7; }

stop():停止运行上位机

若字符串太长我们可以通过用两个“”“”,把字符串分成两行来写

// Phase 4: wait for 5min onoffsts should be 1 always if(testWaitForSignalOutsideRange(Msagonoffsts, 1, 1,5*1000*60)) { testStepFail("TRANS_TIMEOUT", "onoffsts should be 1 always for 5min," " but value: %d", $Msagonoffsts); return; }
if (IsSimulated()) // don't activate tests when running in simulated mode { WriteLineEx(wrCAPLSink, wrError , "This demo cannot run in simulated mode!"); stop(); }
linChangeSchedTable(dword tableIndex, dword slotIndex, dword onSlotIndex)

实现调度表的调度(切换的调度表,切换的调度表的报文,上一个调度表终止调度的报文)

on start { //linStopScheduler(); linChangeSchedTable(2,2); } on key 'a' { linChangeSchedTable(2,2,4); }

linRunSchedTableNTimes (1, 2, -2, -1);暂时只支持仿真模式,真实节点不确定是否可用

CAPL的函数里面定义的变量特性等同于C语言的静态变量

报错1:Start of measurement aborted:复制上位机后添加dbc出现此报错建议,重新新建一个工程环境

报错2:真实节点与仿真节点冲突会会报错

报错3:capl保存的canner报错原因:操作步骤不对

1.先生成

2.删除.can

3.重启上位机,不做任何操作

强制转义符

“%” -> “%%”

“>” 和“<”不能写在XML的引号内容内,尖括号在XML中有定义

Windows 路径中的反斜杠需用\\转义,或直接使用正斜杠/(CANoe 兼容)。setLogFileName("Logging 2","\\log\\NIO_TG1_TC1_1_{MeasurementStart}.blf");

变量类型

打印使用方法

Settimer获取信号值

只有在获取到报文的时候才会激活,所以定时器的起始位置很重要,定时周期必须小于调度周期,和报文间延时,建议10ms

StmCreate_CSV函数

testcase testcase_md(word mdtimeval) { byte i; //m1 // for(i = 1;i<=8;i++) // { // if(i >= 3) // { // $VehMd_l_LHZCU = i; // testWaitForTimeout(mdtimeval); // $VehMd_l_LHZCU = 0; // testWaitForTimeout(100); // } // // } dword stimId; //dbSignal StimSig; //Create stimulus for csv files and dbSignal stimId = StmCreate_CSV(sysvar::A,UsgMd_l_LHZCU, "stimulus.csv"); writeEx(-3,1,"st"); //Start the process of reading the stimulus from csv file StmControl_Start(stimId); testWaitForTimeout(5000); //Destroy the created stimulus StmControl_Destroy(stimId); }

第一行时间不能是0.00

timer事件在test moudle的限制

CAPL 的 on timer 事件处理函数运行在 Timer Handler 上下文中 ,这个上下文:

1. ❌ 不能发送诊断请求(Diagnostic Request)
2. ❌ 不能执行 testWaitFor... 系列函数
3. ❌ 不能直接调用某些测试库函数

只能仿真调试进行局部变量 的查看

http://www.jsqmd.com/news/1341133/

相关文章:

  • 【二叉树】LC 94.二叉树的中序遍历
  • 【机器学习】(34)—— 更大的语言模型
  • 全棉梭织面料定制指南:精梳/普梳、支数、织造怎么区分 - 晒太阳的龟
  • OWASP Top10 完整解读|Web 安全入门必备,主流漏洞原理梳理
  • 石英石台面选材痛点解析:胜徽石业全链路实践 - 生活动态圈
  • 《实用软件与高效工具》汇总(持续更新...)
  • 百度网盘macOS效率工具:快速解锁SVIP体验与下载加速完整指南
  • 云南旅游靠谱旅行社怎么选?品质跟团游避坑指南 - 深度智识库
  • AI写产品文案效率革命(92%文案岗已悄悄启用的Prompt工程模板)
  • 微信小程序数据可视化终极指南:5分钟掌握echarts-for-weixin完整教程
  • 2026年上海寻衅滋事罪刑辩律师测评,专项律师办案实务解析与选择 - 法律资讯
  • 家用车基础保养怎么做?别再为过度养护交冤枉钱 - GrowthUME
  • 终极GitHub加速解决方案:3分钟告别龟速下载的完整指南
  • 凌晨三点,我的Agent在LangGraph和CrewAI之间反复横跳:四款框架选型血泪史
  • Arithmetic/Itensity/Roofline
  • 惠州婚前婚恋指导哪家好:【谋仕心理】理清家庭权责 - 17728181569
  • 如何3步搭建企业级React工作流编辑器:完整实战指南
  • 嘉利恒兴交付交通银行和林格尔新区数据中心ECC控制中心——168万项目全记录
  • 2026高原行车故障不用慌,唐克鸿运汽修解决草原车辆各类故障 - GrowthUME
  • 中小企业低预算怎么做 GEO?用对方法,AI 主动推荐 - 生活动态圈
  • 腾讯开源UCL-MPComm通信库,零拷贝传输性能提升30%、非零拷贝最高提升5倍!
  • 2026 年如何筛选口碑好的塑胶外壳喷涂加工厂?核心要素解析 - 变量人生001
  • Windows系统下3步解锁Apple Touch Bar完整功能:DFRDisplayKm开源驱动终极指南
  • 2026 年济南严寒地区防水补漏技术创新白皮书:破解冻融渗漏难题 - 超人防水
  • 武威房屋漏水怎么办?超人防水补漏深耕全城专注解决武威各类季节性渗漏难题2026.8月新 - 超人防水
  • Nmap 网络扫描工具详解|常用命令、扫描方式与实战场景
  • AIGC应用工程师认证怎么考?从报名到拿证全流程 - 新闻快传
  • 白银房屋漏水怎么办?超人防水补漏(全国连锁)深耕全城,解决西北温差渗漏难题2026.8月新 - 超人防水
  • 2026 海南三亚餐饮个体户无成本票风险,金税四期大数据比对要点 - 全域品牌推荐
  • KubeSphere学习笔记:部署nginx