Как сделать счетчик codesys

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

Большая часть новых контроллеров ОВЕН (СПК1хх, ПЛК210, ПЛК200) программируется в среде разработки CODESYS V3.5. В статье рассмотрены новые возможности CODESYS версии V3.5 SP16 Patch 3 по сравнению с версией V3.5 SP14 Patch 3, ранее используемой в контроллерах ОВЕН.

Разработчики CODESYS регулярно выпускают сервис-паки (SP) – обновления для среды программирования. Сервис-паки расширяют функционал CODESYS и исправляют ошибки. Для поддержки нового функционала в пользовательских проектах компания ОВЕН периодически выпускает прошивки с обновлениями системы исполнения CODESYS. Актуальные версии прошивок включают систему исполнения CODESYS версии V3.5 SP16 Patch 3.

Автоматический контроль порядка выполнения в языке CFC

Язык функциональных блоков CFC является одним из наиболее часто используемых языков программирования в CODESYS. В этом языке каждый блок имеет порядковый номер, который определяет порядок его вызова в программе. В процессе разработки проекта часто приходится менять блоки местами, но при этом их номера остаются неизменными, из-за чего логика работы программы может нарушиться. Чтобы избежать подобных нарушений, пользователям приходилось после внесения изменений выполнять команду Упорядочить в соответствии с потоком данных. В новых версиях CODESYS появилась возможность включить автоматический контроль порядка выполнения блоков, что избавляет разработчика от необходимости обращать на это внимание и задавать нумерацию вручную. Информация о порядке выполнения и других особенностях языка CFC приведена в статье Язык непрерывных функциональных схем CFC. Часть 1 [АиП, 2020, №2, стр. 33-35].

Поддержка типов LDATE/LDT/LTOD

В новых версиях CODESYS появилась поддержка 64-битных типов LDATE (дата), LDT (дата и время) и LTOD (время суток). В отличие от стандартных типов DATE/DT/TOD они имеют расширенный диапазон и поддерживают точность до наносекунд (рис. 1). Для большинства контроллеров такая точность оказывается избыточной, но, например, сохранять метку времени с точностью до миллисекунд – достаточно распространенная задача. Теперь она решается с помощью типа LDT.


Рис. 1.

Улучшения в библиотеках

  • В дистрибутив CODESYS добавлена библиотека Net Base Services. Она является продвинутой версией библиотеки CAA Net Base Services и используется для реализации протоколов обмена поверх TCP/UDP с поддержкой шифрования (TLS).
  • В библиотеку CmpCrypto добавлены функции для асинхронного шифрования.
  • В библиотеку Standard64 добавлены счетчики импульсов LCTU/LCTD/LCTUD с расширенным диапазоном счета – с их помощью можно подсчитать до (264 – 1) импульсов.

Операторы __POUNAME и __POSITION

Новые системные операторы __POUNAME и __POSITION позволяют получить имя POU (включая все пространства имен) и номер строки, на которой вызывается оператор (рис. 2). Это может быть полезным при логировании ошибок программы.


Рис. 2.

Опциональные аргументы для функций и методов

Теперь если входы функций и методов имеют начальные значения – то их можно не указывать при вызове (ранее требовалось явное присвоение всех переменных входам функции/метода при вызове).

Оптимизации

В процессе разработки новой версии CODESYS были произведены существенные оптимизации по использованию ресурсов ПК:

  • уменьшено время, затрачиваемое на установку пакетов (package);
  • уменьшено время, затрачиваемое на открытие проекта;
  • среда программирования использует на ~25 % меньше оперативной памяти ПК.

Поддержка технологии Overlay в визуализации

В CODESYS V3.5 SP14 появилась preview-поддержка технологии Overlay, а начиная с версии V3.5 SP16 – полнофункциональная. Для ее активации следует установить галочку Поддержка клиентских анимаций и наложение исходных элементов в Менеджере визуализации.
Технология поддерживается только для web-визуализации. Если в проекте есть таргет-визуализация, то галочка не будет отображаться. Поддержка технологии Overlay для таргет-визуализации ожидается в следующих версиях CODESYS. Технология меняет логику отрисовки визуализации, представляя каждый элемент как отдельный объект (рис. 3). Это, например, позволяет организовать наложение элементов и переключение их между слоями. После активации галочки у каждого элемента визуализации появляются параметры Длительность анимации и Переместить на передний план. Первый параметр имеет тип INT и определяет длительность анимации в миллисекундах.


Рис. 3.

Анимация автоматически включается в случаях:

  • перемещения элемента (c помощью параметров вкладки Абсолютное перемещение);
  • открытия/закрытия диалога с помощью элемента;
  • изменения видимости элемента;
  • переключения экрана в фрейме (если параметр задан для фрейма).

Надо отметить, что обработка анимации происходит на стороне клиента и никак не связана с временем цикла задачи VISU_TASK.
Параметр Переместить на передний план имеет тип BOOL. Если он принимает значение TRUE, то элемент перерисовывается в самом верхнем слое экрана (это заметно для элементов, наложенных друг на друга). Кроме того, после активации галочки вкладка Абсолютное перемещение появляется у всех элементов визуализации – в том числе у графиков, таблиц и т. д. Также Overlay-технология позволяет отображать в визуализации анимированные изображения в формате .jpg и .svg.

Улучшения в компонентах Modbus

В новых версиях CODESYS в компонентах Modbus появилась поддержка новых функций, которые упрощают настройку обмена с другими устройствами.
В компоненте Modbus Slave Device (Serial/TCP) появилась возможность изменять значения holding-регистров из программы ПЛК. Для этого в настройках компонента необходимо установить галочку Запись. Это может потребоваться в тех случаях, когда необходимо изменять одни и те же данные как со стороны master-устройства, так и из проекта CODESYS (например, из web-визуализации в ручном режиме работы системы).
В компоненте Modbus Slave Device (Serial/TCP) можно активировать модель памяти с независимыми областями для бит (coils и discrete inputs) и регистров. Для этого в настройках компонента необходимо установить галочку Дискретные битовые области. Эта модель в памяти описана в спецификации Modbus, и ее применение, например, может быть полезно при замене контроллера с подобными настройками в рамках модернизации или ремонта системы управления.
В компоненте Modbus Slave Device (TCP) появилась поддержка шлюза Modbus TCP/Modbus RTU (для настройки шлюза используется вкладка Serial Gateway). В режиме шлюза запросы, присланные контроллеру Modbus TCP Master-устройством, будут преобразованы в запросы Modbus RTU и отправлены в выбранный на вкладке COM-порт, который не должен использоваться в других компонентах проекта. Ответы от Modbus RTU Slave-устройств будут преобразованы в Modbus TCP и отправлены обратно master-устройству.

Для всех компонентов существенно расширены параметры диагностики, отображаемые на вкладке Состояние.
Для компонентов Modbus TCP Slave и Modbus Slave COM Port доступны следующие диагностические параметры:


Рис. 4.

© Автоматизация и Производство, 2022. Все права защищены. Любое использование материалов допускается только с согласия редакции. За достоверность сведений, представленных в журнале, ответственность несут авторы статей.

1. Програмне забезпечення мікропроцесорних систем

2. Вопросы лекции

3. Редактор LАD

графический язык реализует структуры эл.
цепей
подходит для построения логических
переключателей
легко можно создавать сложные цепи управления
LD удобен для управления POU
программа представлена в виде списка цепей
каждая цепь состоит из двух частей
в левой находится условие ЛО (контакты)
в правой - структура, состоящая из логических или
арифметических операций, вызовов программ, функций
или ФБ, инструкций перехода или возврата (обмотки)
3

4. Бинарная логика…

Язык LАD (ladder diagram)
релейная схема – две верт. шины,
соединенные с помощью контактов и
обмоток
компоновка контактов в
последовательные и параллельные схемы
определяет комбинирование бинарных
сигнальных состояний датчиков
4

5. Бинарная логика…

6. Принцип работы РКС

7. Бинарная логика…

8. Бинарная логика…

в последовательных
схемах ток течет,
если все контакты
замкнуты
в параллельных
схемах ток течет,
если хотя бы один из
контактов замкнут
8

9. Бинарная логика…

10. Выходной элемент

—( ) –
выходная катушка, которая является
терминатором (завершающим элементом)
цепи и присваивает (assigns) RLO (результат
логической операции) напрямую операнду
10

11. Функции для работы с памятью…

одиночная катушка (coil) как
присваивание RLO
катушки R и S как индивидуально
программируемые операции с памятью
блочные элементы (boxes) RS и SR как
функции, работающие с памятью
коннекторы (midline outputs) как
промежуточные буферы
элементы оценки (обнаружения)
фронта импульса электрического тока
11

12. Функции для работы с памятью…

Одиночная катушка
терминатор цепи
направляет (assigns)
электрический ток
напрямую к операнду, расположенному при катушке
параллельно можно составить до 16 катушек
Катушки установки и сброса (set coil, reset coil)
становятся активными, только когда через них
протекает ток
12

13. Функции для работы с памятью…

Блочный элемент
памяти (триггер)
объединяет функции
катушек установки и
сброса в блочном
элементе функции для
работы с общим
операндом
RS (приоритет сброса)
SR (приоритет
установки)
13

14. Функции для работы с памятью…

Переключатель с
доминантой
включения:
Q1 = SR (SET1,
RESET)
означает:
Q1 = (NOT RESET
AND Q1) OR SET1
Переключатель с
доминантой
выключения:
Q1 = RS (SET,
RESET1)
означает:
Q1 = NOT RESET1
AND (Q1 OR SET)
14

15. Функции оценки фронта импульса

16. Детекторы фронтов

17. Таймеры…

позволяют программно реализовать
последовательности синхронизации, такие
как интервалы ожидания и наблюдения,
измерение интервалов или генерирование
импульсов
имеют область, зарезервированную для них в
памяти CPU
область памяти резервирует одно 16-битное слово для
каждого таймерного адреса
виды таймеров
ФБ TP - импульсный таймер (pulse timer)
ФБ TON - таймер задержки включения (on-delay timer)
ФБ TOF - таймер задержки выключения (off-delay timer)
17

18. Программирование таймеров…

операции над таймером
запуск таймера с заданием значения времени
обнуление (сброс) таймера
проверка состояния таймера (bool)
чтение значения таймера в цифровом виде
18

19. Часы реального времени RTC

Функциональный блок RTC рассчитывает
текущее время и дату, начиная от заданной
точки PDT
•при этом ПЛК должен работать постоянно
19

20. Таймер TP

21. Таймер TON

22. Таймер TOF

23. Опрос таймера…

Проверка состояния таймера
состояние таймера можно получить на
выходе Q блочного элемента таймера
состояние таймера можно с помощью NOконтакта (соответствует выходу Q) или с
помощью NC-контакта (инверсия)
результаты считывания с помощью NO-контакта
или выхода Q различаются в зависимости от типа
таймера
23

24. Последовательность операций с таймерами

Таймер будет работать правильно, если
соблюдать следующий порядок
Запуск таймера (Start)
Сброс таймера (Reset)
Считывание значения времени или
длительности
Проверка состояния таймера
24

25. Счетчики (counters) …

используют в вычислительных задачах для счета
по возрастанию (прямой счет)
по убыванию (обратный счет)
по возрастанию и убыванию
Счетчики располагаются в системной памяти CPU
Количество счетчиков определяется версией CPU
счетчик сканируется путем считывания его состояния
(нулевое или ненулевое значение счета) или текущего
значения счетчика (значения счета, count value), которое
можно получить десятичном коде
25

26. Счетчики

• CTU
Инкрементируется по переднему
фронту
• CTD
Декрементируется по переднему
фронту
• CTUD
Инкрементируется или
декрементируется по разным входам

27. Программирование счетчика…

Со счетчиками производятся следующие операции
установка счетчика, задание значения счетчика
прямой счет
обратный счет
сброс счетчика
считывание числового значения счетчика
27

28. Последовательность операций со счетчиками…

Счетчик будет работать правильно, если
соблюдать следующий порядок
Счет (прямой или обратный в любом
порядке)
Установка счетчика
Сброс счетчика
Проверка счета
Проверка состояния счетчика
28

29. Опрос счетчика…

30. CTU CTD

CTU
по каждому фронту на
входе CU (переход из
FALSE в TRUE) выход CV
увеличивается на 1
выход Q устанавливается
в TRUE, когда счетчик
достигнет значения
заданного PV
счетчик CV сбрасывается
в 0 по входу RESET =
TRUE
CTD
по каждому фронту на
входе CD (переход из
FALSE в TRUE) выход CV
уменьшается на 1
когда счетчик достигнет 0,
счет останавливается,
выход Q переключается в
TRUE
счетчик CV загружается
начальным значением,
равным PV по
входу LOAD = TRUE.
30

31. CTUD ТР

CTUD
по фронту на входе CU
счетчик увеличивается на 1
по фронту на входе CD
счетчик уменьшается на 1
(до 0)
QU устанавливается в TRUE,
когда CV больше или равен
PV
QD устанавливается в TRUE,
когда CV равен 0
ТР
пока IN равен FALSE, выход
Q = FALSE, выход ET = 0
при переходе IN в TRUE
выход Q устанавливается в
TRUE и таймер начинает
отсчет времени (в мс) на
выходе ET до достижения
длительности, заданной PT
далее счетчик не
увеличивается
Таким образом, выход Q
генерирует импульс
длительностью PT по фронту
входа IN
31

32. TON TOF

TON
пока IN равен FALSE, выход Q
= FALSE, выход ET = 0
как только IN становится
TRUE, начинается отсчет
времени (в мс) на выходе ET
до значения, равного PT
далее счетчик не
увеличивается
Q равен TRUE, когда IN равен
TRUE и ET равен PT, иначе
FALSE
Таким образом, выход Q
устанавливается с задержкой
PT от фронта входа IN
TOF
если IN равен TRUE, то выход
Q = TRUE и выход ET = 0
как только IN переходит в
FALSE, начинается отсчет
времени (в мс) на выходе ET
при достижении заданной
длительности отсчет
останавливается
выход Q равен FALSE, если IN
равен FALSE и ET равен PT,
иначе - TRUE
Таким образом, выход Q
сбрасывается с задержкой PT
от спада входа IN
32

Как и было описано, в первой статье, ПЛК осуществляет циклическое чтение входов, выполнение прикладной программы и запись выходов. Потому написание программы для ПЛК отличается от традиционного написания программы для микроконтроллеров и ПК. К программам для ПЛК предъявляются жесткие требования по надежности, одно дело зависает текстовый редактор, а другое дело программа, управляющая ядерным реактором. Другое не менее важное требование – это своевременное реагирование на событие. А что значит, во время не прореагировать на событие в промышленности? Это значит потерять контроль над технологическим процессом. Что в некоторых случаях, примером с реактором, приведет к непоправимым последствиям.

Рассмотрим отличия написания программы для ПЛК и микроконтроллера. Для примера возьмем простейшую задачку для МК - мигающий светодиод. Подозреваю, что все начинали знакомство с МК именно с этой задачи. Алгоритм будет следующим

  1. Записать в порт лог. 1.
  2. Временная задержка
  3. Записать в порт лог.0.
  4. Временная задержка
  5. Переход по метке на начало программы.

По данному алгоритму программа на ПЛК работать не будет, она содержит бесконечный цикл. А в ПЛК вся прикладная программа выполняется от начала до конца в каждом рабочем цикле, и любая программа должна отдавать управление системной программе. Поэтому при такой организации алгоритма наш ПЛК зависнет. Даже если и убрать, переход по метке на начало, программа не будет работать, так как нам хочется. Порт всегда будет в состоянии лог.0, так как физическая установка выходов производиться только после выполнения всей прикладной программы. И поэтому промежуточные состояния это всего лишь программные переменные в памяти, и на аппаратной части она ни как не отображаются.

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

С учетом выше сказанного, правильный алгоритм будет выглядеть следующим образом:
1. Проверить таймер, если время паузы вышло, то
а) инвертировать выход
б) начать новый отсчет
2. Конец программы

Реализуем данный алгоритм на практике ниже, а теперь рассмотрим основные особенности LAD (Ladder Diagram) языка.

Релейная схема представляет собой две вертикальные шины, между ними расположены горизонтальные цепи образованные контактами и обмотками реле. Пример на рисунке:

Пример программы на языке LAD

Нормально разомкнутый контакт

- нормально разомкнутый контакт

Нормально замкнутый(инверсный) контакт

- нормально замкнутый(инверсный) контакт

Обмотка реле

- обмотка реле

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

Любому контакту ставится в соответствие логическая переменная, определяющая его состояние. Если нормально замкнутый контакт замкнут, то ИСТИНА, если размокнут – Ложь, для инверсного наоборот, он замкнут когда переменная имеет значение ЛОЖЬ. Имя переменной пишется над контактом и служит его названием.

Последовательно соединенные контакты равносильны логической операции И, а параллельно-монтажное ИЛИ. Инверсный контакт равносилен операции НЕ. Параллельное соединение обмоток допускается, а последовательное нет. Обмотка реле также может быть инверсной, тогда она копирует в соответствующую логическую переменную инверсное состояние цепи.

Идея релейных схем, такова, что все цепи работают параллельно, т.е. ток во все цепи подается одновременно. Но мы знаем, что программу процессор выполняет последовательно, и мы не можем это сделать одновременно. Так и в LAD программа выполняется последовательно слева направо, сверху вниз. Но цикл процессора мал, поэтому и получается эффект параллельности.

Любая переменная в рамках одной цепи имеет одно и то же значение. Если даже реле в цепи изменит переменную, то новое значение поступит на контакты только в следующем цикле. Цепи расположенные выше получают новое значение переменной сразу, а цепи расположенные ниже – только в следующем цикле. Строгий порядок выполнения очень важен, и благодаря ним LAD- диаграмма сохраняет устойчивость при наличии обратных связей.

Хоть это и противоречит аналогии LAD с релейными схемами, порядок выполнения LAD- программы можно нарушить с помощью меток и переходов. Это ухудшает читаемость программе, и в них бывает сложно разобраться, но как говориться если очень хочется, то можно. Для этого желательно разбить программу на модули, и делать переходы между модулями.

Возможности LAD программы можно расширить, вставляя функциональные блоки. Вставлять можно все стандартные функциональные блоки, которые содержаться в МЭК. Описание для функциональных блоков можно найти в справке.

Давайте составим нашу первую программу на LAD в среде CoDeSys. CoDeSys можно скачать в интернете, достаточно воспользоваться поисковиком

После установки, выбираем создать новый проект, и CoDeSys попросит выбрать целевую платформу для ПЛК. Указание целевой платформы необходимо, чтобы среда знала, для какого типа контроллера пишется программа. Выбираем 3S CodeSyS Sp PLCWinNT V2.4 и жмем OK.

Окно настройки целевой платформы

Имя проекта оставляем по умолчанию, язык выбираем LD

Выбор языка и имя проекта

Интерфейс программы на русском языке, и интуитивно понятен. При наведении на элемент всплывает имя. Советую рассмотреть все элементы, а также пункты главного меню.

Интерфейс программы

Для добавления элемента в программу необходимо левой кнопкой мыши кликнуть в рабочее поле программы и потом ЛКМ кликнуть на элемент, который вы хотите поместить в программу. Например, нормально разомкнутый контакт, у вас должно получиться следующее.

Нормально разомкнутый контакт

Вместо вопросительных знаков пишем имя нашей переменной, например SB, и нажимаем Enter, выходит окно объявление переменной, выбираем Bool и нажимаем OК.

Окно объявления переменной

Рассмотрите, какие типы можно выбрать, а также какие классы переменных.

Давайте, реализуем программы для мигания светодиодом, а если говорить в общем, то программа для генератора одиночных импульсов

Для реализации программы используем функциональные блок таймер TP. Таймер TP – этой таймер одиночного импульса с заданной по входу PT длительностью.

Пока IN равен FALSE, выход Q = FALSE, выход ET = 0. При переходе IN в TRUE выход Q устанавливается в TRUE и таймер начинает отсчет времени на выходе ET до достижения длительности, заданной PT. Далее счетчик не увеличивается. Таким образом, выход Q генерирует импульс длительностью PT по фронту входа IN.

Временная диаграмма работы TP:

Временная диаграмма работы TP

Для вставки TP, на панели элементов выбираем:

Функциональный блок

И у нас всплывает ассистент выбора функционального блока.

Вид окна ассистента ввода

Скачайте файл проекта, и давайте рассмотрим как он работает.

Программа генератора одиночных импульсов

В начальный момент X= False , поэтому инверсный контакт X замкнут и таймер T2 запущен, выход Q= True, поэтому цепь включена. А так как обмотка в цепи инверсная, значит она копирует инверсное состояние цепи в X , и X остается False, после переполнения таймера Q = False , и инверсная обмотка переводит X в True. После этого запускается T1, после переполнения скидывает X в False и все повторяется. Переменная X является выходом генератора. Таймер T2 устанавливает паузу, а T1 длительность импульса.

Компилируем проект Проект -> Компилировать

Выход генератора можно поглядеть с помощью цифрового трассировщика, для этого переходим на вкладку Ресурсы в нижнем левом углу

Вкладка Ресурсы

Выбираем Цифровой трассировщик -> Дополнение -> Настройка трассировки, выйдет следующее окно

Окно конфигурации трассировки

Цикличность записи поставим Вручную, нажимаем на менеджер и выбираем переменные X(Bool)

Выбор переменной для трассировщика

Нажимаем Ok . Выбираем перо для нашей переменной

Выбираем в онлайн Подключение, нажимаем Старт , далее Дополнительно -> Начать трассировку, также выберите пункт Автоматическая трассировка

Цифровая трассировка проекта генератора одиночных импульсов

Рассмотрим еще один пример управление двигателем с электронной коммутацией обмоток статора
Саму программу представлять не буду, скачайте проект. А об алгоритме работы расскажу.

Все таймеры запускаются по сигналу старт. Каждый таймер отмеряет момент окончания фазы. Переменные Y1-Y3 являются выводами соответствующей фазы управления. Каждый выход включается в том случае, если таймер еще не переполнен и выключен предыдущий выход. Последняя цепь, является цепью автоматического перезапуска.

Трассировка проекта управления статорами

Прикрепленные файлы:

sulika Опубликована: 2012 г. 0 0


Вознаградить Я собрал 0 0

Помогите решить в Codesys следующую задачу:
Требуется постоянно вычислять время (реальное, в секундах---причем велична его будет изменятся), прошедшее со момента первого срабатывания датчика до второго срабатывания этого же датчика. язык реализации не важен.

Не знаю как это реализовано в Codesys, но в других средах программирования есть понятие Totalising Timer. Соотвественно, один сигнал на входе на подсчет (пока Вкл таймер считает), второй на сброс таймера.

Если бы было нужно мерить время пока датчик стоит в 1, то стандартным таймером. В данном случае вся сложность в том, нужно выделить сработки датчика, по ним сделать такой импульс, который уже легко померить.

(*1 Выделяем передние фронты (сработки) датчика триггером,
переменная bImpuls будет = TRUE между двумя сработками*)
TRIG1(CLK:= bInput1);
IF TRIG1.Q THEN
bImpuls := NOT bImpuls;
END_IF

(*2 Измеряем длительность bImpuls стандартным таймером *)
TP1(IN := bImpuls);

(*3 Постоянно во время импульса преобразуем длительность типа TIME в целое - секунды*)
IF bImpuls THEN
dwMyTime := TIME_TO_DWORD(TP1.ET)/1000;
END_IF

По таймерам подробнее см. статью 'Программируем временные сложности' тут ссылка

IP
пока ждал, набраосал свой вариант, что скажите?
VAR
rise_front: R_TRIG;
C: USINT; (*используется как счетчик срабатываний датчика*)
rise_out_1: R_TRIG;
rise_out_2: R_TRIG;
bOut_1: BOOL;
bOut_2: BOOL;
counter: TOF;
bwMy_Time: TIME; (*время между срабатываниями датчика*)
END_VAR
VAR_OUTPUT
bQ_1: BOOL;
bQ_2: BOOL;
END_VAR
VAR_INPUT
bSensor: BOOL;
END_VAR

- - - - - - - - - -
rise_front (CLK:= bSensor); (*ловим передний фронт входного сигнала с датчика*)

IF rise_front.Q AND C=0 (*ловим первый импульс *)
THEN
C:=1;
bOut_1:= TRUE; (*активируем соответсующий выход*)
rise_out_1(CLK:=bOut_1 , Q=>bQ_1 );
bOut_2:=FALSE;
ELSIF rise_front.Q AND C=1 (*ловим второй импульс*)
THEN
C:=0;
bOut_2:=TRUE; (*активируем соответсвующий выход*)
rise_out_2(CLK:=bOut_2, Q=>bQ_2 );
bOut_1:= FALSE;
END_IF;

1) TOF – будет мерить паузы, надо TON
2) Переменной bwMy_Time присваивается вход PT, т.е. входная константа, нужно ET
3) Зачем вообще нужны rise_out_1, rise_out_2, bQ_1 и bQ_2? По условию задачи их нет.
4) Выходной переменной bwMy_Time значение присваивается только в конце измерения, а не постоянно, как требовалось в условии. Если так и надо то:

rise_front (CLK:= bSensor); (*ловим передний фронт входного сигнала с датчика*)

IF rise_front.Q THEN (*ловим импульс *)
IF NOT bOut_1 THEN (*он первый*)
bOut_1:= TRUE; (*активируем выход*)
ELSE (*второй*)
bOut_1:= FALSE; (*сбрасываем выход*)

bwMy_Time:=counter.ET; (*записываем искомое время в переменную bwMy_Time только по второму срабатыванию датчика*)
END_IF
END_IF

* ';' после END_IF лишняя совсем
* в каждом цикле вызова таймера пихать в него уставку-константу 800 сек не зачем, можно задать ее 1 раз при инициализации (См. первый пример)

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

Читайте также: