Входные данные могут считываться с входов контроллера, на котором работает табличная программа, или поступать по внутренней связи от вспомогательных контроллеров первичной обработки сигналов, а также быть полученными удаленно от других контроллеров. Вне зависимости от источника данных входные переменные можно разделить на два основных типа: битовые и аналоговые. Битовые переменные могут принимать только два значения: ноль и единица. Аналоговые переменные необходимы для описания аналоговых сигналов и, по сути, являются числами с плавающей десятичной точкой. Чтобы не перегружать таблицу активными ячейками и улучшить восприятие информации о состоянии управляющей программы, над входными переменными производятся арифметические и логические операции. Битовые операции над входными переменными позволяют уменьшить количество активных ячеек, присваивая последним не значения входных переменных, а сигналы состояний, получаемые в результате логических операций над несколькими входными переменными. С помощью операций с аналоговыми переменными производятся необходимые вычисления для установки аналоговых значений на выходах контроллера или принятия управляющих решений. Так как мы имеем два типа переменных, то результат операций также будет либо битовым, либо аналоговым. Результат арифметической операции двух аналоговых переменных будет аналоговым. А результат сравнения этих же аналоговых переменных будет битовым. Битовый результат сравнения аналоговых переменных может поступать на вход таймера и после срабатывания таймера изменять состояние активных ячеек. Также битовый результат может участвовать в других битовых операциях. Аналоговый результат может только переписаться на выход без изменения. Входные операции могут иметь от одного до трех операндов.
Для операций присвоения, инверсии и синхронизации требуется один операнд (рис. 36). Битовые входные переменные при необходимости могут быть инвертированы и уже в таком виде использоваться в качестве аргумента.
Рис. 36. Операции с одним операндом:
A – обозначение аналогового типа, b – обозначение битового типа
Операциям присвоения и инверсии требуется одна строка (рис. 37), операциям синхронизации – две (рис. 38). На первой строке для операции синхронизации формируется сигнал, передний или задний фронт которого необходимо обнаружить. На строке ниже записывается операция синхронизации и вычисляется результат. Примеры операций синхронизации показаны на рис. 38. Результат текущего пересчета таблицы обозначим как b1a, а как b0 – результат предыдущего. Если предыдущее значение операнда было ноль, а текущее значение – единица, то программа пересчета таблицы фиксирует переход из ноля в единицу – передний фронт. Если был переход из единицы в ноль, то это задний фронт. При обнаружении фронта сигнала результату операции синхронизации будет присвоена единица, которая продержится всего один цикл пересчета таблицы, после чего результат операции синхронизации вернется в ноль. В течение одного цикла единица на выходе операции синхронизации может запустить таймер, сбросить или установить значение в триггерной ячейке, изменить результат логического И по столбцу.
Рис. 37. Однострочные битовые операции:
а) присвоение; б) инверсия
Рис. 38. Пример обнаружения фронта сигнала:
а) переднего фронта; б) заднего фронта
Аналоговая операция присвоения устанавливает результат, равный входному значению переменной (рис. 39).
Рис. 39. Аналоговая операция присвоения
Битовым логическим операциям, операциям сравнения аналоговых переменных и арифметическим операциям требуется два операнда, один из которых находится в предыдущей строке, а другой – в строке выше предыдущей. Всего для этих операций требуется три строки.
Представленный в таблице на рис. 40 базовый набор операций может быть дополнен другими математическими операциями. Написание тестовых программ для различного оборудования показало, что для большинства применений достаточно использования базового набора. При необходимости сложных расчетов значений от датчиков лучше применить дополнительные контроллеры первичной обработки сигналов – для того, чтобы не усложнять логику управляющей программы.
Рис. 40. Операции с двумя операндами:
A – обозначение аналогового типа, b – обозначение битового типа
Ход выполнения операции с двумя битовыми операндами можно рассмотреть на примере логического И. На рис. 41 представлен ход выполнения такой операции. Так как программа пересчета таблицы проходит по строкам сверху вниз, то сначала будет вычислен первый операнд, b1a. Его значение будет зависеть от состояния переменной b1 и от необходимости ее инвертировать. Если переменную b1 необходимо инвертировать, то b1a получит инвертированное значение b1, а если такой необходимости нет, то b1a станет равной b1. Аналогичное действие будет проведено с переменной b2. После этого результату b3 будет присвоено значение логического И b1a и b2a.
Рис. 41. Выполнение операции «логическое И» программой пересчета таблицы:
а) шаг 1 – первому операнду присваивается прямое или инверсное значение; б) шаг 2 – второму операнду присваивается прямое или инверсное значение; в) шаг 3 – вычисляется результат логической операции
Арифметические операции с аналоговым результатом можно рассмотреть на примере сложения (рис. 42). Аналогично производятся операции вычитания, умножения и деления.
Рис. 42. Операция сложения двух аналоговых переменных
Операции сравнения используют аналоговые операнды и имеют битовый результат, который может далее использоваться в любых битовых операциях. На рис. 43 показана операция «больше» для двух аналоговых переменных. Справа от результата записана эта же операция на текстовом языке программирования.
Рис. 43. Пример операции «больше»
Операции выбора используют три операнда, два из которых – входные переменные, а третий определяет, значение какой переменной появится на выходе (рис. 44). По сути, это аналоговый или битовый мультиплексоры.
Рис. 44. Операции выбора с тремя операндами
На рис. 45 показана операция выбора одного из двух битовых значений SELB, в которой все три операнда и результат битовые.
Рис. 45. Пример битового мультиплексора
Для выбора одного из двух аналоговых значений используется операция SEL, в которой первые два операнда и результат аналоговые, а битовый операнд определяет, какое из входных аналоговых значений будет присвоено результату (рис. 46).
Рис. 46. Пример аналогового мультиплексора
Так как программа пересчета таблицы обрабатывает строки сверху вниз, то с помощью указателя вычисленный результат по строке может быть присвоен любому операнду в строках ниже. Указатель – это номер строки, результат которой может быть использован в битовых и аналоговых операциях других строк. На рис. 47 приведены операции с указателем. Номер одной строки, находящейся выше, результат операции которой уже посчитан, обозначен как «p».
Рис. 47. Операции с указателем
Тип получаемого операнда будет зависеть от типа результата, на который указывает указатель. Если указатель равен номеру строки с аналоговым результатом, то будет подставлено аналоговое значение. Если результат строки, на которую ссылается указатель, битовый, то будет подставлено битовое значение. Пример использования указателя для аналогового или битового значений показан на рис. 48, где A1 – аналоговый результат входной операции в строке с номером, равным p, а b1 – битовый результат входной операции в строке с номером, равным p.
Рис. 48. Пример использования указателя
Использовать указатели следует осторожно, чтобы не усложнить понимание алгоритма табличной программы. Не стоит получать с помощью указателя результат строки со значением входной переменной. Лучше получить то же значение, указав адрес входной переменной. Использовать указатель нужно для сигналов состояний, получаемых в результате нескольких операций над входными переменными. Такой подход позволит уменьшить количество строк и упростит понимание алгоритма табличной программы.
В разделе 2 рассматривалось поэтапное написание программы управления шлагбаумом. В основном это делалось для того, чтобы показать возможности табличного программирования. В этом разделе будут рассмотрены небольшие части программ, выполняющих задачи, наиболее часто встречающиеся при программировании оборудования. По сути, это программные блоки, из которых собирается общая программа управления устройством.
Табличная программа пересчитывается последовательно сверху вниз, строка за строкой, при этом в программе отсутствуют ветвления или переходы. Такое решение облегчает понимание логики работы программы, снижает вероятность возникновения ошибок. Это не новый подход. В графических языках программирования, например в языке релейных схем LD, применяется тот же принцип последовательного прохода по строкам. Применяемые в LD функции больше похожи на наборы строк, которые при необходимости последовательно исполняются для сокращения общего кода, чем на функции или подпрограммы в объектно ориентированных языках программирования. Добавление атрибутов объектно ориентированных языков в графические языки программирования контроллеров, с одной стороны, повышает гибкость графических языков и увеличивает их функциональность, но с другой стороны, усложняет алгоритм, делая его непрозрачным. Методы, применяемые в объектно ориентированных языках, прекрасно работают в них, так как они создавались с учетом особенностей этих языков. Для графических языков необходимо разрабатывать такие методы программирования, которые наилучшим образом будут подходить к решению задач, для которых эти языки разрабатываются. Значит, необходимо определить класс задач, которые будут решать программы, написанные на графических языках.
Так как основная задача, выполняемая контроллерами, – это управление различными объектами в режиме реального времени, то лучше использовать параллельные процессы обработки входных данных и организовать между процессами обмен сигналами состояний, а не возлагать все на одну программу, пусть даже исполняемую на мощном вычислительном устройстве. Низкая стоимость контроллеров позволяет получать информацию о процессе в параметрах, которые контролируются, а не в их электрических эквивалентах. Например, температуру от датчиков лучше контролировать в градусах Цельсия, а не в целочисленных значениях с АЦП. Так же и положение механизма можно получать в миллиметрах или градусах, а не в количестве импульсов энкодера. Программы преобразования величин, не принимающие решений по управлению объектом, могут выполняться отдельными микропроцессорами. Они просто преобразуют одни величины в другие – и могут делать это параллельно и независимо как друг от друга, так и от главного контроллера. Полученные конвертированные параметры присваиваются входным переменным и в дальнейшем используются в табличной программе.
Если вычислительной мощности контроллера достаточно, то можно назначить некоторые аналоговые входы как входы для подключения датчиков определенного типа. Тогда аналоговые значения, получаемые с этих входов, будут автоматически преобразовываться в необходимый формат. Также можно ввести дополнительные входные операции преобразования значений, получаемых с АЦП, в необходимый вид. Последнее решение более гибкое, так как позволяет использовать любой аналоговый вход для подключения датчиков.
При необходимости частого выполнения внутри табличной программы какой-либо дополнительной функции можно добавить в программу пересчета таблицы дополнительную операцию, которая реализует алгоритм функции. В нескольких строках выше новой операции могут находиться аргументы функции. Аналогично построена операция SEL, у которой два аналоговых операнда и один битовый находятся выше строки с результатом. Однако табличную программу не стоит перегружать редко использующимися функциями без особой необходимости. Нужно следить за тем, чтобы не разрушить простоту и понятность алгоритма табличной программы.
Рассмотрим небольшую механическую систему, состоящую из подвижного элемента, движение которого не должно выходить за установленные пределы. Для ограничения движения будем использовать сигнал «разрешение», который, перейдя в состоянии ноль, запретит движение. Введем в таблицу переменные «ограничение слева» и «ограничение справа», которые будут описывать состояния концевых выключателей. Обычно концевые выключатели имеют нормально замкнутый контакт и при срабатывании разрывают электрическую цепь. Это сделано для того, чтобы остановить работу механизма в случае отсутствия контакта в соединениях или при повреждении кабеля от концевого выключателя. Так как в нормальном состоянии цепь конечного выключателя должна быть замкнута, то любое повреждение, разрывающее цепь будет аналогично срабатыванию концевого выключателя и ограничит движение механизма. Рассмотрим пример табличной программы, использующей концевые выключатели. На рис. 49 показано состояние программы, когда концевые выключатели не сработали, их цепи замкнуты, следовательно, ограничений для движения нет.
Рис. 49. Пример использования концевых выключателей – разрешено движение в обоих направлениях
На рис. 50 показана ситуация, когда сработал правый концевой выключатель и запретил движение вправо. Часто концевые выключатели устанавливают совместно с аварийными концевыми выключателями, при срабатывании которых прекращается любое движение. Если обычные концевые выключатели задают диапазон, в котором механизм может двигаться, то аварийные концевые выключатели ограничивают передвижение в предельно возможных положениях.
Рис. 50. Пример использования концевых выключателей – запрещено движение вправо
Добавим в табличную программу аварийные концевые выключатели. Ситуация, когда ни концевые выключатели, ни аварийные выключатели не ограничивают движение, показана на рис. 51.
Рис. 51. Пример использования аварийных концевых выключателей – разрешено движение в обоих направлениях
На рис. 52 показана аварийная ситуация, когда сработавшие справа концевой и аварийный выключатели запретили движение в обоих направлениях. Причем правый концевой выключатель запретил движение вправо, а правый аварийный выключатель запретил любое движение.
Рис. 52. Пример использования аварийных концевых выключателей – аварийная ситуация
Многие процессы и механизмы требуют для своего функционирования значительных затрат электроэнергии. Обычно питание оборудования разделяют на силовое и контрольное. Первое снабжает электричеством исполнительные механизмы и технологические процессы. Второе питает различные датчики и приборы управления, также такое питание называют цепью управления. Еще можно выделить питание осветительных приборов, подогрев, питание связного оборудования и других вспомогательных систем. Программируемые контроллеры успешно применяются во всех перечисленных системах, но мы рассмотрим применение контроллеров для управления исполнительными механизмами и процессами.
Так как подача силового питания приводит в действие исполнительные устройства, работа которых сама по себе может быть небезопасной, то для эксплуатации этих устройств необходима простая и надежная система отключения. Во время работы могут возникать нештатные ситуации, при которых вероятен переход исполнительных механизмов и систем в состояния, не предусмотренные их конструкцией. Поэтому управление включением и отключением силового питания – наиболее важная часть системы безопасности.
Использование главного контактора, подающего силовое питание, – хорошее, испытанное временем решение. Напряжение на катушку главного контактора подается через цепь последовательно включенных аварийных кнопок, при нажатии на одну из которых отключается катушка главного контактора и снимается силовое питание. Конечно, есть ситуации, когда внезапное отключение главного контактора может привести к тяжелым последствиям. Например, в последовательной цепи конвейеров отключение одного из них приведет к заваливанию остановившегося конвейера грузом, перемещаемым предыдущим конвейером. Даже если при аварии одновременно будут отключены все конвейеры, то из-за разности скоростей торможения последовательно стоящих конвейеров может произойти заваливание конвейера грузом с предыдущего. Можно привести и другие примеры негативного влияния резкого отключения силового питания. Причем такое отключение может произойти не только от нажатия аварийной кнопки, а, например, из-за аварии на подстанции или в передающих электросетях. Поэтому вопрос безопасного останова механизма или процесса при отключении силового питания должен рассматриваться на стадии их проектирования. И здесь в первую очередь необходимо позаботиться о безопасности людей, а не о возможных экономических потерях.
Управление силовым питанием при помощи контроллера – удобное решение, когда оборудование эксплуатируется в штатном режиме и не предполагается резкой остановки оборудования. Но в любом случае должна быть предусмотрена возможность отключения силового питания независимо от работоспособности контроллера. Наиболее простым и безопасным способом подачи силового питания будет такой, при котором контроллер остается только наблюдателем за процессом включения. В цепи включения главного контактора помимо кнопок включения, выключения, аварийных кнопок и датчиков должен быть нормально открытый контакт реле готовности контроллера. Если программа контроллера полностью загрузилась и контроллер может управлять оборудованием в штатном режиме, программа активирует реле готовности контроллера и становится возможным включение главного контактора. То есть при неработающем контроллере главный контактор не включится. Если необходимо программное управление различными электрическими устройствами, то силовое питание после главного контактора подается на так называемые линейные контакторы, питающие отдельные устройства. При таком способе можно из программы управлять силовым питанием отдельных частей оборудования, не вторгаясь в цепи безопасности.
На рис. 53 показана программа, выдающая разрешение на включение главного контактора и разрешение на включение питающихся от него систем. Перед подачей питания на исполнительные устройства необходимо убедиться, что ручки управления установлены в безопасное положение и подача питания не приведет к серьезным последствиям. Если ручки управления выключены, то импульс, сформированный по переднему фронту сигнала «цепь управ. 220 В включена», устанавливает в единицу ячейку «RS» в первом столбце и, следовательно, выходную переменную с адресом 11. Данная переменная разрешает включение силового питания и может быть сброшена либо сигналом аварии, либо отключением питания цепи управления. Защита от подачи питания при включенных ручках управления предусмотрена для того, чтобы в момент включения не произошел случайный, непредсказуемый пуск оборудования.
Рис. 53. Программа, выдающая разрешение на подачу силового питания, на момент включения
На рис. 53 показано состояние программы в момент появления на входе контроллера сигнала «цепь управ. 220 В включена». Таймер задержки включения TON в строке 2 только что установил текущее значение времени. Данная задержка нужна для того, чтобы все датчики и приборы в цепи управления успели войти в работу до начала управления оборудованием. В зависимости от применяемых приборов время задержки может быть изменено. Так как главный контактор еще не включен и таймер в строке 2 не установил на своем выходе единицу, то разрешение управления системами отсутствует.
На рис. 54 показано состояние этой же программы при включенном силовом питании. Выходной сигнал «разрешение управления системами» формируется двумя активными ячейками в строках 2 и 10. Состояние активной ячейки в строке 2 будет равным единице через 2 секунды после включения цепи управления. Состояние ячейки в строке 10 станет равным единице после включения главного контактора.
Рис. 54. Программа, выдающая разрешение на подачу силового питания, во включенном состоянии.
Если во время работы по какой-то причине пропадает напряжение 220 вольт в цепи управления, то дальнейшая эксплуатация оборудования должна быть прекращена. Состояния различных датчиков, концевых и аварийных выключателей при отсутствии напряжения управления не будут отражать текущие состояния исполнительных механизмов и систем. В таком случае при отключении цепи управления должен отключаться главный контактор и сниматься разрешение управлять системами.
На рис. 55 показано состояние табличной программы при пропадании напряжения 220 вольт в цепи управления.
Рис. 55. Программа, выдающая разрешение на подачу силового питания, при пропадании напряжения в цепи управления
Данный вариант слежения за силовым питанием показан для примера. На практике алгоритм программы, управляющей питанием, будет зависеть от применяемых схемных решений и может сильно отличаться от приведенного выше. Но независимо от применяемых решений необходимо предусмотреть, чтобы подача силового питания происходила только при наличии сигнала разрешения от контроллера. Такой сигнал должен гарантировать, что программа полностью загружена и находится в состоянии работы.