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

Схема тестового стенда.



Как и в прошлом уроке, проект будем создавать на двух языках FBD и LAD. Только теперь это будет делаться параллельно.

Создаём новый проект.

Для языка LAD

  • Первый путь — перетаскиваем на схему аналоговый вход A0 из дерева установленного оборудования
  • Второй путь — перетаскиваем блок «Аналоговый вход контроллера» из библиотеки элементов, после чего сделав на новом блоке двойной клик, привязываем его к нулевому аналоговому входу платы


Для языка FBD создаём новый аналоговый вход, дважды кликнув на пункте «Добавить вход» дерева тэгов или нажав соответствующую кнопку



В открывшемся окне свойств входа ввести имя входа, выбрать аналоговый тип и номер контакта 0



После чего перетащить новый вход из дерева тэгов в область схемы.

Блоки аналогового входа в FLProg на своём выходе выдают величину пропорциональную напряжению на привязанном к ним реальном входе платы. При 0В на входе платы, на выходе блока будет значение 0, а при 5V на входе платы, на выходе блока будет значение 1023.


Затем создаём аналоговый выход.

Для языка LAD перетаскиваем блок «Аналоговый выход контроллера» из библиотеки блоков, и в редакторе свойств, блока (двойной клик на блоке) привязываем его к выходу платы D3



В языке FBD для создания аналогового выхода необходимо дважды кликнуть на пункте «Добавить выход» дерева тэгов или нажать соответствующую кнопку.



В открывшемся окне свойств выхода заполняем имя выхода, выбираем тип ШИМ, и номер выхода D3



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

Вообще-то у плат Arduino настоящих аналоговых выходов нет (не считая Arduino Duo, но пока эти платы программой FLProg не поддерживаются). Аналоговые выходы платы работают в режиме ШИМ

Широтно-импульсная модуляция
Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте. Для примера можно в качестве нагрузки использовать светодиод.

Частота, это количество периодов за одну секунду. Скважность — отношение длительности импульса к длительности периода. Можно изменять и то и другое, но для управления светодиодами достаточно управлять скважностью. На картинке выше мы видим ШИМ сигнал со скважностью 50 %, так как длительность импульса (ширина импульса) ровно половина от периода. Соответственно светодиод будет ровно половину времени во включенном состоянии и половину в выключенном. Частота ШИМ очень большая и глаз не заметит мерцания светодиода из-за инерционности нашего зрения, поэтому нам будет казаться, что светодиод светится на половину яркости. Если мы изменим скважность на 75%, то яркость светодиода будет на 3 четверти от полной, а график будет выглядеть так:

Получается, что мы можем регулировать яркость светодиода от 0 до 100 %. А теперь поговорим о таком параметре ШИМ, как разрешение. Разрешение — это количество градаций (шагов) регулировки скважности. В платах Arduino разрешение составляет 256 шагов.

В программе FLProg блок аналогового выхода управляет скважностью ШИМ привязанного к нему выхода. При подаче на вход бока значения 0 на выходе паты скважность будет составлять 0%, а при подаче значения 255 – 100%.
Исходя из того что пределы сигнала на выходе блока аналогового входа контроллера составляет 0 — 1023 а пределы допустимого сигнала на входе блока аналогового выхода контроллера составляют 0 – 255 встает вопрос о необходимости приведения их к одним значениям. В этом поможет блок масштабирования.
В языке LAD он находится в папке «Аналоговые блоки» библиотеки элементов.



В языке FBD тот же блок находится в папке «Специальные блоки» библиотеки элементов.



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



Расчет в блоке производится по следующей формуле
Q = (I – I_min)*(Q_max – Q_min)/(I_max – I_min)+Q_min
Где:
  • Q – значение на выходе блока
  • I – значение на входе блока
  • I_max – верхний предел входного значения
  • I_min – нижний предел входного значения
  • Q_max – верхний предел выходного значения
  • Q_min – нижний предел выходного значения

В результате показанной на скриншоте настройки блока при изменении значения на входе блока от 0 до 1023 значение на выходе будет пропорционально изменяться от 0 до 255, что и требуется. Теперь необходимо соединить все блоки в соответствии со схемой.

LAD


FBD


Первая плата практически готова. Назовём её «Управление яркостью» и создадим новую, сразу назвав её «Индикатор уровня»
Во второй плате нам так же нужно значение с входа контроллера. В принципе можно ещё раз вытащить вход блока на вторую плату, и использовать его. Но это приведёт к тому, что в процессе выполнения программы в контроллере будет повторно считываться значение с входа. А процедура считывания аналогового сигнала с входа достаточно ресурсоёмкая и длительная. Поэтому мы используем в случае LAD аналоговый соединитель, а в случае FBD – переменную.
В FLProg переменные и аналоговые соединители можно представить как клеммные соединения на плате. С помощью них платы обмениваются значениями и соединятся между собой.

В проекте на языке LAD перетащим блок «Вход аналогового соединителя» на ПЕРВУЮ плату проекта.



Ему автоматически присвоится имя АС1. После чего соединим его вход с выходом блока аналогового входа.



А на вторую плату перетащим блок «Выход аналогового соединителя».



Сделаем на нём двойной клик и в редакторе блока привяжем его к соединителю AC1

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



В открывшемся окне редактора блока заполним имя переменной, выберем тип (Integer), и установим значение по умолчанию – 0



После чего перетащим новую переменную сначала в одну плату, а затем в другую. Так же соединим в первой плате вход переменный с выходом блока аналогового входа контроллера.



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



Теперь подключим его вход в случае LAD-а к блоку выхода аналогового соединителя, а в случае FBD к выходу переменной.

LAD


FBD


Рассмотрим логику работы индикатора уровня.
  • Светодиод «Уровень 1» должен загореться, если значение сигнала больше 0
  • Светодиод «Уровень 2» должен загореться, если значение сигнала больше 1
  • Светодиод «Уровень 3» должен загореться, если значение сигнала больше 2
  • Светодиод «Уровень 4» должен загореться, если значение сигнала больше 3
  • Светодиод «Уровень 5» должен загореться, если значение сигнала больше 4
  • Светодиод «Уровень 6» должен загореться, если значение сигнала больше 5
  • Светодиод «Уровень 7» должен загореться, если значение сигнала больше 6
  • Светодиод «Уровень 8» должен загореться, если значение сигнала больше 7
  • Светодиод «Уровень 9» должен загореться, если значение сигнала больше 8
  • Светодиод «Уровень 10» должен загореться, если значение сигнала больше 9

Для реализации данной логики мы используем в случае языка LAD реле сравнения, в случае языка FBD – компаратор.

LAD


FBD


В проекте на языке LAD вытащим на вторую плату 10 реле сравнения и привяжем их выходам, к которым подключён измеритель уровня ( смотри первый урок) и выставим тип сравнения «Больше».



Кликнув правой кнопкой на входе «В» каждого блока реле сравнения вызовем контекстное меню и выберем пункт «Вставить константу». В открывшемся окне редактирования константы оставим тип “Integer” и введём для каждого выхода значение соответствующее логике работы индикатора.



Входы «А» всех блоков реле сравнения соединим с выходом блока масштабирования. Должна получится такая схема.



В проекте на языке FBD вытащим на вторую плату 10 блоков «Comparator» так же настроим на вид сравнения «Больше» (двойной клик на блоке для вызова редактора блоков). Так же как и в LAD-e вставим константы на входы I2 блоков, а входы I1 соединим с выходом блока масштабирования.



После этого создадим 10 цифровых выходов привязанных к выходам платы, к которым подключён измеритель уровня (смотри первый урок) и вытащим их на вторую плату. И соединим каждый со своим компаратором.



Всё – программы готовы, можно компилировать и заливать в контроллер (смотри первый урок)

Комментарии (30)


  1. kalbasa
    01.02.2016 22:13

    на днях в arduino ide, последней версии, неприятный момент обнаружил.
    вот такая конструкция не работала: if (условие) { действие }
    не знаю у меня только такое или ещё у кого, но автор примите к сведению.


  1. Blago09
    02.02.2016 05:49

    В первой схеме надпись «Уровень 9» повторяется дважды.
    И у меня возникли такие же ощущения как и после изучения языка С попробовал Бейсик… Ощущение неуправляемости кода.


    1. totuin
      02.02.2016 05:54
      -1

      Извините, где вы здесь видите код?
      Что вижу я:
      Принципиальная схема устройства (ПЭ3), состоящая из блоков. Блоки имеют крышечку (редактор свойств блоков), под которой находятся подстроечные резисторы (InputField) и микропереключатели (CheckBox и RadioButton).
      Жаль что Вы этого не видите, видно не дано…


      1. den_vish
        02.02.2016 08:24

        а IL и ST поддерживает? или только LAD и FBD?


        1. totuin
          02.02.2016 08:26
          -1

          Нет IL и ST не поддерживает. Я не думаю что это необходимо целевой аудитории программы. Хотя в последней версии программы появилась возможность создавать пользовательские блоки используя язык C. Точнее тот его диалект, который используется в Arduino IDE


          1. den_vish
            02.02.2016 08:34

            ну в принципе да, это я уже совсем разогнался, нагляднее LD не придумано вроде ничего, но спасибо за ответ.


  1. AVKinc
    02.02.2016 10:46

    Я тут волею судьбы занялся кодингом на LAD.
    После Си это просто боль.
    Квадратики эти скобочки.
    Нафиг он нужен если есть Си?
    И я вам скажу, как я думаю этот язык изначально делался для перевода старых релейных схем в ПЛК. Потом он оброс финтифлюшками и в общем оказался удобным для автоматизации технологических процессов людьми, ничего не понимающими в программировании.
    А цель как-бы научиться программировать, на RLL это довольно затруднительно.
    Да и собственно, удивляет желание ардуиноподобных сред разработки максимально отдалить программиста от железа.
    ATmega контроллер очень простой, это же не Кортекс, мать его м3. Разобраться в нем можно реально за день, там всего то десяток-другой служебных регистров и там все понятно. И потом никогда не будет криков на форумах типа: «аааааа, подключил библиотеку, а она не работает, мама!!!» хотя там вообще никакая библиотека изначально была не нужна, а надо было пять строк написать.


  1. totuin
    02.02.2016 11:17
    -2

    Это с Вашей точки зрения — боль. Представляете какую боль испытывают электронщики привыкшие всю жизнь работать с этими самыми квадратиками когда видят портянки программы. Представляете их зубовный скрежет когда так горячо любимая Вами программа не работает из за неправильно поставленной запятой, или забытой скобки.
    Почему то Вы решили что главная мечта любого инженера — научится программировать. Это Вы так решили. На самом большинству из них это ни грамма не нужно. У них есть идея, и они хотят её реализовать, наиболее доступными для себя инструментами. И язык С не входит в их число. Кто хочет научится программировать на С, научится, слава богу по этому поводу информации хватает.

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

    По этому поводу я уже много раз писал. FLProg — это просто ещё один уровень абстракции. Скажите пожалуйста — почемы ВЫ — программисты пишете на языках программирования высокого уровня. Если следовать Вашим словам — вы должны писать в машинных кодах. Это же наиболее близкие отношения с железом. Да и контроллеры ВЫ программируете на C а не пишете в блокноте HEX файл. Вы так же обкладываетесь библиотеками, синтаксическим сахаром и т.д. Так что не стоит призывать к близости к железу если сами не владеете машинными кодами.


    1. AVKinc
      02.02.2016 12:12

      Я хотел сказать, что программист микроконтроллеров должен знать железо под которое пишет. Иначе непонятки и постоянные проблемы.
      Си сам по себе вполне достаточный уровень абстракции. И приближаться к железу ближе чем Си не нужно. Где вы там углядели, что нужно программировать на асме? То-есть, если человек знает регистры используемого процессора, он сразу ломится писать в hex кодах? Забавно. Да я и не программист по сути. Так, мимопроходил. Забавляюсь по необходимости. На самом деле я как раз электронщик. Никаких проблем с Си.
      LAD язык для ПЛК. Для довольно узкого спектра задач. Вот и все.
      Чет вас прямо подорвало, видать есть причины.


      1. totuin
        02.02.2016 12:30
        -2

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

        Почему С достаточный уровень абстракции, а FLProg — уже слишком много? Кто определил достаточный уровень абстракции. Кто провёл эту черту с одной стороны которой — GOOD а с другой — ФУУУУ.

        То-есть, если человек знает регистры используемого процессора, он сразу ломится писать в hex кодах?


        Ну судя по Вашему лозунгу «Ближе к железу» то да.

        А зачем обязательно знать регистры процессора. Если поставленную перед собой задачу можно решить без этого знания, — то зачем? Будет нужно — изучит. Я не понимаю когда делаются такие громкие заявления — «Должен знать и точка». Кому должен? Человек сам решает какие ему нужны знания, и что ему интересно.


      1. den_vish
        02.02.2016 12:42

        ИМХО, да тут не столько подорвало, сколько ваша реакция на использование ЛАД — какая разница каким инструментом вы решите задачу, если ваш
        инструмент её решит так же эффективно: Си, ЛАД, да хоть молоток и гвозди, если вы можете решить задачу и требования к её исполнению, используя любые из перечисленных инструментов, то какая разница на чем её решили? ЛАД хорош наглядностью, плох — громоздкостью и тратой времени, зато человеку слабо знакомому понятен, захочет человек новых трюков или оптимизировать свой труд — освоит Си, не захочет — ну значит не зацепило, не надо ему, хватает того что есть.

        насчет ЛАД язык для плк — ну на первых порах да, а дальше — паскалеподобный ST или IL, хотя последний МЭК уже не рекомендует использовать.


  1. AVKinc
    02.02.2016 12:44

    Ну дык на Си можно писать и не зная ни одного регистра. Но если знаешь — можно написать например быстрее или короче. Есть простор для творчества.
    LAD никакого творчества не подразумевает, это рутинная работа. Это язык АСУТП.


    1. totuin
      02.02.2016 13:38
      -1

      Вы подразумеваете что разработчики АСУТП — не творческие люди. То есть если бы программу для станка написал человек на С — то это было бы творчество, а если её написал специалист АСУТП на LAD-е или FBD то это тупая не творческая работа?.. Или блинк на из примеров Arduino — это творчество (хорошо даже не из примеров а с применением чистого С), а данный урок, это так клепание шаблонов? Уважаемый AVKinc не надо считать себя выше других если вы освоили язык программирования, а остальных которые его не знают заторможенными не творческими людьми. Комьютер за которым Вы работаете собран так же на базовых элементах типа тригера, ИЛИ, НЕ. И поверьте — те кто его создавал — были творческими людьми. А программирование придумали уже после создания компьютера. Причем те же творческие люди — электронщики.


    1. kalbasa
      02.02.2016 15:29

      вот такое определение слову творчество даёт википедия: творчество — Создание новых по замыслу культурных, материальных ценностей.

      слушайте. если вы в своей жизни ничего не придумали. ничего не создали. ничего не СОТВОРИЛИ. то вы не творческий человек. поэтому плевать в сторону творцов, которые каждый день что-то создают, творят не надо.


  1. AVKinc
    02.02.2016 15:43

    Да я сам АСУТПшник. И пишу на всех этих LAD и FB и пофиг на чем. Как поручик Ржеский. И я говорил, что я не настоящий сварщик. И стопудово никого не выше. Я довольно обычный инженер. Вы хоть читали вообще, что я писал?
    На RLL написать что-то по настоящему большое и сложное это очень долго и муторно.
    Он для простых в общем задач автоматизации производства предназначен.
    На Си можно написать все что угодно. И он совсем не сложен применительно к AVR. За пару дней можно освоить если есть базовые знания.
    На AVR очень редко выполняются задачи автоматизации.
    То есть должен же быть какой-то профит от LAD на AVR?
    Я его не вижу и говорю почему.
    Вы начинаете возбуждаться и в общем не приводите никаких доводов в свою пользу.
    При этом стараетесь меня унизить почему то.


    1. totuin
      02.02.2016 16:01

      Ладно, только факты.

      1. Число зарегистрированных пользователей на сайте проекта приближается к тысяче.
      2. Каждую новую версию программы скачивают около десяти тысячь раз (в сумме всех вариантов, то есть под Винду, Линукс и обновления со старых версий)

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

      Программа нужна как минимум этим людям:



    1. den_vish
      02.02.2016 17:00

      упс


  1. AVKinc
    02.02.2016 16:39

    Ну дык, факты то где плюсов LAD?
    Ну вы могли бы написать типа «можно за пару дней ничего не понимая в контроллерах написать простую программу»
    Я бы сказал «Ну и на Си можно, ну три дня уйдет, а через месяц на Си можно уже что-нибудь веселое написать.»
    Ну как то так, вы же начинаете хвастаться загрузками и постами никому не известных людей.
    Почему вы совершенно не воспринимаете критику?


    1. den_vish
      02.02.2016 17:01
      +1

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

      давай по порядку — если не прав — поправишь:
      ты утверждаешь: — ЛАД не практичный язык и решает узкоспециальные задачи, должны изучать Си ибо маст хэв
      тебе отвечают: — окей, но вот мы предлагаем инструмент ФЛПрог, который понравится людям, которые в основном работают со схемами.
      ты утверждаешь: — на Си быстрее и больше плюшек, а LD удел рутинных задач среди АСУТП прочих не творческих личностей.
      тебя отвечают: АСУТП — это вообще то творческая работа (с чем я абсолютно согласен, и уж более чем уверен — творчество зашкаливает).
      ты отвечаешь: Си МАСТ ХЭВ ИБО ОН В АВР ВСЕМОГУЧ!!!, а LD бесполезен ибо не вижу профита, причем профита ты не видишь в силу трудозатратности и муторности реализации на нём сложных алгоритмов (если я правильно понял).

      Да, LD любопытный язык, и то что ты можешь сделать на Си в две строчки, на LD и FBD может занять массу пространства и кучи кликов, но давай не будем откидывать тот факт что LD существенно проще в освоении и требует меньший порог вхождения (в отличии от Си, который за пару дней можно освоить если есть базовые знания, а если их нет, то всё бросить?)
      соответственно ФЛпрог с LD нужен как минимум для начинающих, он позволяет начать думать логичными алгоритмами, он прямо наглядно показывает все логические взаимосвязи — что, зачем и почему.
      И только за это автора этой программы благодарить надо, и уж тем более при этом утверждать что их работа бесполезна — это попросту не уважение к чужому труду, тем более что они проделали большую работу.


      1. kalbasa
        02.02.2016 17:39
        -1

        как жаль что рид-онли аккаунты не могут плюсовать :((
        ну да ладно. я думаю что он наверно не в курсе что ПО для промышленных контроллеров идёт изначально с пристройкой LAD или FBD или то и другое вместе. так же он наверно не в курсе что всё в промышленных контроллерах в LAD и FBD автоматически ковертится в IL перед заливкой в контроллер (как у автора FLProg, но только тут конвертация в Си). ассемблер никто не отменял :)). Тот же ST паскалеподобный, а не Си подобный. Про долю промышленных контроллеров с ПО на Си я вообще молчу. Встречал только зелёные вроде бы Латвийские контроллеры.
        Наверно он из серии ниши разработки ПО на Си для АВР или СТМ для управления к примеру ключами IGBT сборок электропривода. что достаточно узкоспециализированно, в отличие простых электриков, киповцев, в общем обслуживающего персонала или просто тех у кого руки из плечей растут и есть желание что-то для себя реализовать. Те, которые видят просто электрические схемы и для них проще и без заморочек видеть привычные им схемы в LAD или FBD.
        Не понимаю таких людей, которые считают своё мнение истинно правильным. А все остальные просто заблуждаются.


    1. totuin
      02.02.2016 17:02

      Ну так это не критика а заявление типа: «Мне не понравилось — значит это г...». Соответственно факты такие — же. Некоторому количеству людей понравилось, и их больше. Вы то один.
      Вы спрашивали про профит, так вот это он и есть, люди смогли реализовать свои идеи и заняться творчеством.

      Ну а если серьёзно, то задайтесь вопросом, почему все производители промышленного оборудования до сих пор используют для программирования своих систем FBD и LAD. Даже новейшая среда от Siemens (Tia-Portal) основана на них -же. Это то же может служить фактом.
      Ну я думаю Вы не будете утверждать что создание серьёзной системы АСУТП уровня какой ни будь электростанции не требует творческого подхода.
      Или я что то не понимаю в Ваших словах. Что Вы имеете в виду под профитом и творческим потенциалом?


  1. AVKinc
    02.02.2016 17:25

    Почему пользуются LAD.
    Потому что во первых это фактически стандарт и он прост. И изначально он был заточен под совершенно конкретные задачи.
    Он прост для простых вещей.
    Я вам не говорил, что ваш проект говно.
    Вот вы пишите, что ваш проект для электронщиков.
    Я электронщик, мне очень удобно писать на Си. Никаких проблем. Может все же не для электронщиков ваш проект?
    Про творческий потенциал я тоже не говорил. Я говорю, что LAD это по сути язык для производства. На котором сможет работать даже дилетант. Ибо АСУТП штука достаточно простая в целом.


    1. den_vish
      02.02.2016 17:39

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

      интересно когда уже теги сарказм и ирония появятся


    1. totuin
      02.02.2016 17:49
      -1

      Уважаемый AVKinc Вот вы пишете

      Вот вы пишите, что ваш проект для электронщиков.
      Я электронщик, мне очень удобно писать на Си. Никаких проблем. Может все же не для электронщиков ваш проект?

      А с чего Вы взяли что Вы выражаете общее мнение всех электронщиков. Вы председатель их профсоюза? Если Вам больше нравится С, это Ваше право. Но не надо говорить от имени всех. Насчет простоты АСУП. <ирония> Ну… у меня возникают вопросы какие проекты вы реализуете или обслуживаете</ирония>(как заказывали).


    1. kalbasa
      02.02.2016 18:00

      вся логика контроллеров для станков написана на LAD. думаю вам надо поспорить со станкостроителями «что проще перетягивать электрическую схему в станок в LAD или Си ?». а так же с остальными сферами где преимущественно электросхемы, провода, реле, контакторы и прочая атрибутика. ну и в добавок надо предусмотреть что вашу программу может смотреть обслуживающий персонал и он должен понимать что там в программе происходит, а не ковырять справочник по Си что бы понять что делает та или иная стандартная функция какой-нибудь библиотеки Си. всё должно быть очень быстрым для понимания и освоения. простой оборудования это всегда потеря денег. и так же не стоит забывать что иногда заказчик требует в ТЗ всю программу на LAD.
      так что ваши выпады или точнее сказать «высеры» в сторону FLProg и LAD c FBD мало того что беспочвенны, так ещё и не от опытности и больше похожи на высказывания школоты в период полового созревания когда идёт выпендрёж и весь мир крутится только вокруг них.