0

我正在尝试将一组 CAN 帧发送到 CAN 总线。我使用 CAPL 进行编程,使用 CANalyzer8.5 进行模拟,使用面板设计器创建按钮。我的要求是首先使用 PANEL 设计器创建一个按钮。只有在按下按钮时,它才会开始向总线发送周期性的 CAN 帧。我对如何实现它有点困惑。到目前为止,我已经设法使用 CAPL 编写了两个单独的程序。第一个程序在启动时定期发送数据。第二个代码在按下按钮时仅发送一次数据。我想合并两个代码以在按下按钮时开始定期发送。

第一个代码

/*@!Encoding:1252*/
includes
{
}

variables
{
  msTimer mytimer;
  message 0x100 A={dlc=8};
  message 0x200 B={dlc=8};
  message 0x300 C={dlc=8};
  message 0x400 D={dlc=8};
}

on start
{
  setTimer(mytimer,50);
}

on timer mytimer
{
  A.byte(0)=0x64;
  B.byte(4)=0x32;
  C.byte(6)=0x20;
  D.byte(7)=0x80;
  output(A);
  output(B);
  output(C);
  output(D);
  setTimer(mytimer,50);
}

第二代码

/*@!Encoding:1252*/
includes
{
}

variables
{

  message 0x100 A={dlc=8};
  message 0x200 B={dlc=8};
  message 0x300 C={dlc=8};
  message 0x400 D={dlc=8};
}


on sysvar test::myButton
{
  A.byte(0)=0x64;
  B.byte(4)=0x32;
  C.byte(6)=0x20;
  D.byte(7)=0x80;
  output(A);
  output(B);
  output(C);
  output(D);
}

如前所述,当我按下按钮时,它应该开始定期发送 CAN 帧。但问题是,我不能在函数内调用函数,如下所示:

on start
{
    on sysvar test::myButton
    {
        ....
    }
}

请给我建议。谢谢你

4

2 回答 2

2

on start事件仅在测量开始时调用一次,on sysvar也是一个事件,在您的情况下,当您按下某个按钮时它会被调用。

也许试试这个:

variables
{
  msTimer mytimer;
  message 0x100 A={dlc=8};
  message 0x200 B={dlc=8};
  message 0x300 C={dlc=8};
  message 0x400 D={dlc=8};
}

on start // This only gets called once at measurement start
{
  A.byte(0)=0x64;
  B.byte(4)=0x32;
  C.byte(6)=0x20;
  D.byte(7)=0x80;
}

on sysvar test::myButton  // Starts the timer when button is pressed
{
  setTimer(mytimer,50);
}

on timer mytimer
{
  output(A);
  output(B);
  output(C);
  output(D);
  setTimer(mytimer,50);
}

但是,在某些时候,您可能希望使用功能cancelTimer再次停止计时器,可能使用不同的按钮或按下一个键。有关更多示例,请查看 CANalyzer 帮助中的 CAPL 部分。

于 2018-04-10T08:03:37.357 回答
1

您的要求是 - 首先,将定期计时器设置为 50 毫秒。按下按钮。其次,在定时器事件上输出消息(50ms 周期)。所以你的代码应该是这样的 -

variables
{
  msTimer mytimer;
  message 0x100 A={dlc=8};
  message 0x200 B={dlc=8};
  message 0x300 C={dlc=8};
  message 0x400 D={dlc=8};
}

//This only gets called once at the measurement start because you want to send the same value in each period.
on start
{
  A.byte(0)=0x64;
  B.byte(4)=0x32;
  C.byte(6)=0x20;
  D.byte(7)=0x80;
}

on sysvar test::myButton  // Starts the timer when button is pressed
{
  setTimer(mytimer,50);
}

on timer mytimer
{
  output(A);
  output(B);
  output(C);
  output(D);
  setTimer(mytimer,50);
}
于 2019-01-09T07:18:40.993 回答