除了定时器,真的没法在Simulation Node 类型的CAPL节点中实现延时了吗?

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了除了定时器,真的没法在Simulation Node 类型的CAPL节点中实现延时了吗?相关的知识,希望对你有一定的参考价值。


📘前言

  • 🍅 如下图,我们想在Simulation Node 类型的CAPL中 运用等待函数,而在Test Node 类型的CAPL中可以使用的 TestWaitForTimeout函数但是却不允许在Simulation 类型中使用,我想着能不能有什么方法去解决这个问题,先说结果,尝试了一些非常规方法,结果并不理想。
  • 🍅 演示软硬件环境 Win10 x64CANoe 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,


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节点中实现延时了吗?的主要内容,如果未能解决你的问题,请参考以下文章

刷脸打卡真的太方便了

51nod——1548 欧姆诺姆和糖果

solidworks的simulation的result没有了

APE转FLAC愁啊<FOOBAR2000>怎么没法用 都是无法打开还是新版的 真的不会用 谁教教啊 100重赏

模拟:simulation,与 仿真:simulation

模拟:simulation,与 仿真:simulation