Отправка периодических CAN-сигналов при нажатии кнопки с использованием CAPL и CANalyzer

Я пытаюсь отправить набор кадров CAN на шину CAN. Я использую CAPL для программирования и CANalyzer8.5 для моделирования, а конструктор Panel для создания кнопки. Мое требование - сначала создать кнопку с помощью дизайнера 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
    {
        ....
    }
}

пожалуйста, посоветуйте мне. благодарю вас

1 ответ

Событие on start вызывается только один раз при запуске измерения, для 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, возможно, с использованием другой кнопки или нажатием клавиши. Дополнительные примеры можно найти в разделе CAPL справки CANalyzer.

Ваше требование: во-первых, установите периодический таймер на 50 мс. при нажатии кнопки. Во-вторых, выведите сообщение о событии таймера (период 50 мс). Итак, ваш код должен быть таким:

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);
}
Другие вопросы по тегам