Недавно был у меня спор с одним товарищем (монтажником) по поводу программируемых реле, их отличий от ПЛК и т.п. В общем-то закончилось всё предсказуемо, во-первых, тем, что нет строго определения "программируемого реле", поскольку понятие "контроллер" слишком широкое и включает в себя и программируемые реле тоже. Во-вторых, надо выбирать оборудование в зависимости от решаемой задачи. Нет смысла переплачивать тысячи долларов за какой-нибудь дорогой ПЛК, если можно купить дешевле, долларов за 500, равно как и нет смысла покупать программируемое реле за 10 000 рублей то, что не позволит быстро и эффективно решить задачу, которую можно решить с помощью ПЛК за 20 000 рублей.
В этой статье я хочу рассказать о некоторых нюансах при программировании наноконтроллера (программируемого реле) Siemens LOGO! Сравнивать его я буду с микроконтроллером Siemens S7-200, который стоит вдвое дороже, но при этом имеет гораздо больше функций. Контроллер S7-200 был снят с производства в Германии в конце 2012 года и формально заменён на линейку S7-1200. Однако, сравнивать LOGO! с S7-1200 не имеет смысла, поэтому сравним всё же с S7-200, к тому же в Китае их по прежнему производят, и своей актуальности они не потеряли. Я здесь не буду описывать что-то невероятное для LOGO!, например, сложные математические операции, которые запросто можно осуществить на S7-200. Остановимся на булевой алгебре, т.е. на том, что можно осуществить на языках LAD и FBD, представленных в обоих рассматриваемых контроллерах. Я не использую язык FBD с некоторых пор, поэтому примеры будут только на LAD и, дополнительно, на STL (STL или обобщённое название IL - Instruction List - аналог языка Ассемблера, только для ПЛК), который есть в S7-200.
Адреса я буду писать в формате для S7-200, а в фигурных скобках после них - те же адреса для программы для LOGO!.
Многократное присвоение
Главная проблема LOGO! - невозможность многократного присвоения значения одному и тому же элементу в разных частях программы.
Например, у нас имеется три дискретных входа: I0.1 {I1}, I0.2 {I2}, I0.3 {I3}, по которым срабатывает авария. И есть вход I0.7 {I7} для подтверждения аварии. Бит аварии храним в V0.1 {SF001}.
Напишем программу на Step-7/MicroWIN на языке STL (IL) для S7-200:
Переведём эту программу на LAD для того же S7-200:
А теперь попытаемся изобразить нечто подобное на LOGO!
На первый взгляд проблем нет. Но мы видим явные отличия от программы для S7-200. Заключаются они в том, что у нас нет возможности создать несколько блоков с названием SF001 и для каждого из них производить операции присвоения (S) и сброса (R). Вот для S7-200 мы как раз могли сделать их все вместе, получив программу вида:
LD I0.1
O I0.2
O I0.3
S V0.1, 1
LD I0.7
R V0.1, 1
Она работала бы как мой пример для LOGO!, но нам этого как раз не нужно, нам, наоборот, нужно присваивать значения одному и тому же элементу в разных частях программы. На LOGO! мы этого сделать так просто не можем (т.е. теоретически можем, но такую программу будет невозможно нормально просматривать и редактировать), поэтому придётся изворачиваться. Для начала создадим переменные, которые будут отвечать установку бит SF001. Для I1, I2 и I3 это будут биты SF002, SF003 и SF004 соответственно.
Теперь, по идее, нужно по битам SF002, SF003 и SF004 установить бит SF001. Но и тут есть нюанс, а заключается он в том, что поскольку установленный бит SF001 сбрасывает любой из битов его устанавливающих, то LOGO! не даст вам создать такую программу.
Чисто теоретически, такое ограничение - бред, ибо мы имеем дело лишь с пародией на настоящюю релейную схему. На самом деле у нас тут самая обычная программа, которая в машинном коде никаких "блоков" не содержит. Т.е. программа выполняется сверху вниз слева направо, и все ограничения на "рекурсию" искусственны. Но сделать мы ничего с этим не можем, кроме как дополнительно усложнять программу:
Задействовав промежуточный бит M1, мы решили задачу.
Чтобы понять, насколько больше стало бы кода, напишим программу в таком виде на STL для S7-200:
Знаете, что такое "китайский код"? Это вот он самый.
Таймеры
Казалось бы, уж таймеры в программируемом реле должны быть коронной фишкой. Ну, например, есть не самый удобный способ установки бита и его сброса по таймеру в ПЛК S7-200:
Пришлось написать 8 строк кода и задействовать два таймера для простейшей, казалось бы вещи: по одному и тому же биту I0.1 устанавливать с задержкой в 1 секунду бит M0.1, по нему же с такой же задержкой сбрасывать тот же бит.
Попробуем воспользоваться стандартной функцией On-/Off-Delay...
...и получаем совсем не то, что хотели. Т.е. первоначально бит устанавливается с задержкой 1 секунда. Но впоследствии, если сигнал I1 пропадает (меньше, чем установленная на выключение 1 секунда), а затем снова появляется, то T001 всё равно сбросится в 0 на некоторое время, которое будет проходить между тем, как таймер на выключение досчитает, а таймер на включение ещё нет. Зачем нужен такой элемент как On-/Off-Delay - мне не понятно.
Попробуем другой способ, задействуем On-Delay (T002) и Off-Delay (T001):
Опять ничего не вышло. Дело в том, что T002 и T001 не должны быть одновременно включены, согласно нашей логике, а именно так оно и получается, поскольку Off-Delay не включается при выключении входа (с паузой), как нам надо, а просто включается вместе с включение входа, а при его выключении с паузой выключается.
Такой способ тоже ничего не даст:
В итоге, прекращаем заниматься ерундой и реализуем по аналогии с S7-200:
Короче говоря, никаких преимуществ перед S7-200 мы не увидели, а нашли лишь пару ненужных функций.
Итог: если вам надо реализовать управление контроллера безопасности (Safety Controller), управление системой загазованности или простейшей насосной станцией, то программируемое реле вполне можно использовать. Но достаточно, казалось бы, небольшого усложнения задачи, и потребуется уже нормальный ПЛК. Я бы не рекомендовал рисковать. Лучше купить китайский S7-200, чем долго и упорно мучиться с LOGO! (которые, кстати, уже несколько лет в Германии тоже не делают, а делают всё в том же Китае).
В этой статье я хочу рассказать о некоторых нюансах при программировании наноконтроллера (программируемого реле) Siemens LOGO! Сравнивать его я буду с микроконтроллером Siemens S7-200, который стоит вдвое дороже, но при этом имеет гораздо больше функций. Контроллер S7-200 был снят с производства в Германии в конце 2012 года и формально заменён на линейку S7-1200. Однако, сравнивать LOGO! с S7-1200 не имеет смысла, поэтому сравним всё же с S7-200, к тому же в Китае их по прежнему производят, и своей актуальности они не потеряли. Я здесь не буду описывать что-то невероятное для LOGO!, например, сложные математические операции, которые запросто можно осуществить на S7-200. Остановимся на булевой алгебре, т.е. на том, что можно осуществить на языках LAD и FBD, представленных в обоих рассматриваемых контроллерах. Я не использую язык FBD с некоторых пор, поэтому примеры будут только на LAD и, дополнительно, на STL (STL или обобщённое название IL - Instruction List - аналог языка Ассемблера, только для ПЛК), который есть в S7-200.
Адреса я буду писать в формате для S7-200, а в фигурных скобках после них - те же адреса для программы для LOGO!.
Многократное присвоение
Главная проблема LOGO! - невозможность многократного присвоения значения одному и тому же элементу в разных частях программы.
Например, у нас имеется три дискретных входа: I0.1 {I1}, I0.2 {I2}, I0.3 {I3}, по которым срабатывает авария. И есть вход I0.7 {I7} для подтверждения аварии. Бит аварии храним в V0.1 {SF001}.
Напишем программу на Step-7/MicroWIN на языке STL (IL) для S7-200:
Переведём эту программу на LAD для того же S7-200:
А теперь попытаемся изобразить нечто подобное на LOGO!
На первый взгляд проблем нет. Но мы видим явные отличия от программы для S7-200. Заключаются они в том, что у нас нет возможности создать несколько блоков с названием SF001 и для каждого из них производить операции присвоения (S) и сброса (R). Вот для S7-200 мы как раз могли сделать их все вместе, получив программу вида:
LD I0.1
O I0.2
O I0.3
S V0.1, 1
LD I0.7
R V0.1, 1
Она работала бы как мой пример для LOGO!, но нам этого как раз не нужно, нам, наоборот, нужно присваивать значения одному и тому же элементу в разных частях программы. На LOGO! мы этого сделать так просто не можем (т.е. теоретически можем, но такую программу будет невозможно нормально просматривать и редактировать), поэтому придётся изворачиваться. Для начала создадим переменные, которые будут отвечать установку бит SF001. Для I1, I2 и I3 это будут биты SF002, SF003 и SF004 соответственно.
Теперь, по идее, нужно по битам SF002, SF003 и SF004 установить бит SF001. Но и тут есть нюанс, а заключается он в том, что поскольку установленный бит SF001 сбрасывает любой из битов его устанавливающих, то LOGO! не даст вам создать такую программу.
Чисто теоретически, такое ограничение - бред, ибо мы имеем дело лишь с пародией на настоящюю релейную схему. На самом деле у нас тут самая обычная программа, которая в машинном коде никаких "блоков" не содержит. Т.е. программа выполняется сверху вниз слева направо, и все ограничения на "рекурсию" искусственны. Но сделать мы ничего с этим не можем, кроме как дополнительно усложнять программу:
Задействовав промежуточный бит M1, мы решили задачу.
Чтобы понять, насколько больше стало бы кода, напишим программу в таком виде на STL для S7-200:
Знаете, что такое "китайский код"? Это вот он самый.
Таймеры
Казалось бы, уж таймеры в программируемом реле должны быть коронной фишкой. Ну, например, есть не самый удобный способ установки бита и его сброса по таймеру в ПЛК S7-200:
Пришлось написать 8 строк кода и задействовать два таймера для простейшей, казалось бы вещи: по одному и тому же биту I0.1 устанавливать с задержкой в 1 секунду бит M0.1, по нему же с такой же задержкой сбрасывать тот же бит.
Попробуем воспользоваться стандартной функцией On-/Off-Delay...
...и получаем совсем не то, что хотели. Т.е. первоначально бит устанавливается с задержкой 1 секунда. Но впоследствии, если сигнал I1 пропадает (меньше, чем установленная на выключение 1 секунда), а затем снова появляется, то T001 всё равно сбросится в 0 на некоторое время, которое будет проходить между тем, как таймер на выключение досчитает, а таймер на включение ещё нет. Зачем нужен такой элемент как On-/Off-Delay - мне не понятно.
Попробуем другой способ, задействуем On-Delay (T002) и Off-Delay (T001):
Опять ничего не вышло. Дело в том, что T002 и T001 не должны быть одновременно включены, согласно нашей логике, а именно так оно и получается, поскольку Off-Delay не включается при выключении входа (с паузой), как нам надо, а просто включается вместе с включение входа, а при его выключении с паузой выключается.
Такой способ тоже ничего не даст:
В итоге, прекращаем заниматься ерундой и реализуем по аналогии с S7-200:
Короче говоря, никаких преимуществ перед S7-200 мы не увидели, а нашли лишь пару ненужных функций.
Итог: если вам надо реализовать управление контроллера безопасности (Safety Controller), управление системой загазованности или простейшей насосной станцией, то программируемое реле вполне можно использовать. Но достаточно, казалось бы, небольшого усложнения задачи, и потребуется уже нормальный ПЛК. Я бы не рекомендовал рисковать. Лучше купить китайский S7-200, чем долго и упорно мучиться с LOGO! (которые, кстати, уже несколько лет в Германии тоже не делают, а делают всё в том же Китае).