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

Я пытаюсь отправить набор 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
    {
        ....
    }
}

пожалуйста, посоветуйте мне. Спасибо


person bislinux    schedule 09.04.2018    source источник


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

person Marco    schedule 10.04.2018
comment
Кроме того, без вызова вывода A B C и D в on sysvar test::myButton кадрах будут отправлены через 50 мс (когда время истекает в первый раз). Вы также можете захотеть setTimer() перед output, чтобы избежать ненужных задержек. - person Daemon Painter; 11.04.2018

Ваше требование: во-первых, установите периодический таймер на 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);
}
person EmbedClogic    schedule 09.01.2019