Время цикла считывания на ПЛК TwinCAT 3

#plc #twincat

Вопрос:

Есть ли способ для программы ПЛК узнать свое собственное время цикла?

В качестве обходного пути я могу просто добавить постоянную переменную или константу, чтобы указать ее вручную, но это, очевидно, подвержено ошибкам.

Ответ №1:

Чтобы добавить к ответу Якоба — вы также можете использовать GETCURTASKINDEXEX function (Infosys) вместо GETCURTASKINDEX FB. Таким образом, вам не нужно создавать его экземпляр.

 _TaskInfo[GETCURTASKINDEXEX()].CycleTime
 

Возвращает время цикла, кратное 100 нс (UDINT)

 UDINT_TO_LREAL(_TaskInfo[GETCURTASKINDEXEX()].CycleTime) / 10_000_000
 

Возвращает время цикла в секундах (LREAL)

Комментарии:

1. Неплохо. Я также не знал, что вы можете использовать _ в качестве разделителя тысяч. Если я правильно помню, я однажды попробовал это, но тогда это не сработало. Теперь я попробовал, и это действительно работает. Не уверен, что я сделал не так в прошлый раз. В любом случае, пока спасибо: D.

2. То же самое для меня, они, должно быть, добавили его однажды. Мне нравится эта функция в python, поэтому я продолжал пробовать время от времени 🙂

Ответ №2:

Для TwinCAT3 это доступно в PlcTaskSystemInfo (переменная CycleTime ). Объедините его с FB GETCURTASKINDEX, чтобы получить нужные данные.

Смотрите один пример (хотя и не время цикла, но все тот же FB) здесь, в AllTwinCAT.

Ответ №3:

Это не является прямым ответом на ваш вопрос, но может быть использовано для определения времени цикла.

Мне нравится использовать эту Time() функцию. Он возвращает значение типа данных TIME . Оно не представляет абсолютное время, но может использоваться для вычисления времени между двумя вызовами Time() . Таким образом, вы можете рассчитать время цикла.

Я использую его в функциональных блоках (FB), где время имеет решающее значение. Таким образом, FB знает, когда он был вызван в последний раз, вместо того, чтобы предполагать, что он запускается при каждом сканировании. Даже если я или другой пользователь моего FB «забывает» вызывать FB при каждом сканировании, FB все равно выдает правильные выходные данные.

Вы можете найти информацию об Time() использовании этой ссылки. Также вызывается функция LTime() , которая возвращает значение типа данных LTIME , но, похоже, Бекхофф не потрудился документировать эту функцию.

Комментарии:

1. Мне нравится аспект надежности. К сожалению, для вычисления разницы требуется не менее двух циклов. Если это проблема, этот метод можно было бы объединить с PlcTaskSystemInfo из других ответов.

2. @Mikkel вы можете напрямую перейти на страницу Infosys, щелкнув правой кнопкой мыши ссылку «Функции» и выбрав «Скопировать адрес ссылки» (или аналогичный, если вы используете браузер, отличный от Chrome).