Найти тему
Ты же инженер АСУ ТП

Codesys: оператор case

Оглавление

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

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

Постоянно, чуть не в каждой программе использую case. Это упрощает программу, всё становится наглядным и прозрачным, а что ещё важно, легко налаживать, так как ты знаешь в каком месте произошел косяк и почему.

Оператор CASE в Codesys — структура

CASE — это конструкция для группировки нескольких условий, объединенных
зависимостью от значения одной переменной.

CASE <Var1> OF
<value1>:<instruction1>
<value2>:<instruction2>
<value3, value4, value5>:<instruction3>
<value6..value10>:<instruction4>
{ELSE
<ELSE-instruction>}
END_CASE;

  • Переменная условия должна быть из группы типов ANY_NUM или перечислением.
  • То, что в фигурных скобках, {} не обязательно.
  • Условие может быть одно ,<Value1>.
  • Условий может быть несколько<Value1,Value2> , перечисленных через запятую.
  • Условие может определять промежуток от … до

Рассмотрим пример, как это выглядит:

CASE Motor OF
1: sSost := "Forward";
2: sSost := "Reverse";
3: sSost := "Stop";
ELSE
sSost := "Alarm";
END_CASE

Моя конкретная реализация

Все что было выше, это всё теория. Сейчас я напишу, как я применяю данную систему. Применял в автоматизации теплового пункта.

Я стараюсь делать код очень простым, чтобы потом можно было разобраться в своей собственной программе во время наладки и найти свои же косяки.

Вот как я делаю:

CASE State_ACT OF

1: (*Запуск 1-ого компонента взвешивания*)
pusk_VES_uzel:=TRUE;
stop_VES_uzel:=FALSE;
2: (*Производим учет тары, выравниваем в 0*)
uchet1:=1;
uchet_vesa:=1;
END_CASE

Стараюсь подписывать каждый шаг в комментарии. Подписываю в Codesys Case после каждого шага. В программе не использую стандартные функции и функциональные блоки из библиотек. Пишу так, чисто перекидываю переменные из одного состояния в другое. Так мне удобно контролировать ситуацию вплоть до мелочей.

Можно вместо числовых индексов делать перечислениями. Допустим создаем структуру данных:

TYPE
enumMotor : (FWD := 1, REV := 2, STOP := 3);
END_TYPE

То CASE может выглядеть более интуитивно:

VAR
Motor : enumMotor;
END_VAR

CASE Motor OF
FWD: sMotor := "Вперед";
REV: sMotor := "Назад";
STOP:sMotor := "Стоп";
ELSE
sMotor := "Авария";
END_CASE

В принципе по этому оператору я написал всё что хотел, если есть вопросы, пишите в комментах.