除了定时器,真的没法在Simulation Node 类型的CAPL节点中实现延时了吗?
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了除了定时器,真的没法在Simulation Node 类型的CAPL节点中实现延时了吗?相关的知识,希望对你有一定的参考价值。
📘前言
- 🍅 如下图,我们想在
Simulation Node
类型的CAPL
中 运用等待函数,而在Test Node
类型的CAPL中可以使用的TestWaitForTimeout
函数但是却不允许在Simulation
类型中使用,我想着能不能有什么方法去解决这个问题,先说结果,尝试了一些非常规方法,结果并不理想。 - 🍅 演示软硬件环境
Win10 x64
;CANoe 11 SP2 x64
目录
📙 常规做法,定时器
1️⃣ 依惯例,先创建一个仿真工程,创建一Network Node节点,名为 delay
2️⃣ 定时器做法的简单脚本
- getLocalTime() 是获取系统时间保存在字节数组中,tm[0]获取的是秒
variables
long tm[9];//存储时间数组
msTimer timerTest;
on timer timerTest
getLocalTime(tm);
writeLineEx(1,1,"end set time:%d ms",tm[0]);
setSignal(EngineSpeed,2);
on key 'a'
getLocalTime(tm);
writeLineEx(1,1,"start set time:%d ms",tm[0]);
setSignal(EngineSpeed,1);
setTimer(timerTest,5000);
- 实际测试下输出是没问题的。
📙 封装个C语言中Sleep()函数
1️⃣ C语言sleep函数的用法示例
2️⃣ 把Sleep函数封装成DLL,
- 如果熟悉CANoe DLL步骤的话,代码很简单
- CANoe如何封装DLL,点击查看
- 延时单位是毫秒(ms)
3️⃣ CAPL调用DLL脚本演示
- delay 前设置信号,发送报文,打印信息 ;delay 后再次设置信号,发送报文,打印信息
/*@!Encoding:936*/
includes
#pragma library("capldll.dll")
variables
long i;
long tm[9];//存储时间数组
message can1.8 msg1 = dlc = 1,byte(0) = 1;
message can1.9 msg2 = dlc = 1,byte(0) = 2;
msTimer timerTest;
on key 'k'
writeLineEx(1,1,"key %c was pressed.",this);
getLocalTime(tm);
writeLineEx(1,1,"start set tim:%d",tm[0]);
setSignal(EngineSpeed,1);
output(msg1); // 发送第一个报文 8
dll_delay(3000);//等待3s
getLocalTime(tm);// 发送第二个报文 9
writeLineEx(1,1,"end set tim:%d",tm[0]);
setSignal(EngineSpeed,2);
output(msg2);
4️⃣ 测试结果分析,这种方法的缺陷何在?
Trace中消失的3秒?
实际测试流程中,程序在执行delay函数时,CANoe的整个进程感觉都停止了,暂时用CANoe被挂起来解释这种现象。
Graphics 中为什么跳过了setSignal(EngineSpeed,1)
-
这个graphics 的现象和 直接执行下面代码效果一样,
-
个人猜测:当执行到 setSignal(EngineSpeed,1);时,CANoe运行环境正准备设置信号,程序就执行到了delay函数,然后CANoe的进程被挂起,等delay执行关闭,CANoe进程恢复,还没来得及设置EngineSpeed 为1,就执行了 setSignal(EngineSpeed,2),最终信号被设置成2,所以要没有1的现象
// 因为setSignal需要时间,而代码执行很快 ,看不到设置成1的行为
setSignal(EngineSpeed,1);
setSignal(EngineSpeed,2);
Write 窗口 delay前后信息被同时打印出来
- 这里贴图看不出,实际上 start set tim:41 和 end set tim:44 是 delay函数执行完毕后,同时被打印出来的。
📙 直接写个while循环,等时间到了跳出来可以吗?
- 假如有个大聪明,这样写,可以吗?答案是否定的,CANoe直接就会挂掉,你很快就可以去打开任务管理器了。
- 在以前电脑还是单核的时候,不加等待的while()CPU很快会飙高到100%。
on key 'n'
float t0,t1;
t0 = timeNow();
do
t1 = timeNow();
while((t1-t0)/100.0 < 10);//unit:10ms
End |
🌎总结
- 在simulation node的CAPL 里面想实现延时,目前CAP的常规做法就是用定时器,
- 如果用封装的delay()函数,虽然实现了等待,但是不是多线程进程,会导致CANoe工程被挂起,在等待的时间里,会丢失Trace等信息。
- 除了定时器 ,有没有可能从理论上就不可实现这种想法呢?欢迎有想法的小伙伴提出宝贵建议,我会一一尝试的。
🍅 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩 有微信的小伙伴可以关注下浪哥车载诊断,一个行业内小小圈子,群里有
网盘资料
,源码
,还有各路大神
闲时交流交流技术,聊聊工作机会啥的。
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
以上是关于除了定时器,真的没法在Simulation Node 类型的CAPL节点中实现延时了吗?的主要内容,如果未能解决你的问题,请参考以下文章
solidworks的simulation的result没有了