АСУТП по-домашнему

Вкусная АСУ на малине, секреты приготовления

Напишите ответ

Введите сообщение и нажмите «Отправить»
Параметры

Назад

Обзор темы (новое вверху)

Puhov
2017-07-28 08:49:51

В этом топике будет показан процесс создания простейшего проекта с web-интерфейсом на борту.
Демонстрационный проект rpi_demo содержит web-интерфейс, но детально процесс его создания ещё не был затронут. Теперь пришло время пройтись по всем шагам этого мероприятия и вы увидите, что всё, в общем-то, не так сложно.

Для затравки рекомендуется ознакомиться с топиком "Как запустить первый проект", там вкратце приведены базовые принципы работы.

1. В среде разработки ISaGRAF Workbench создаём новый проект nScada (Файл->Новый):
1501052556_1.jpg

2. В проекте nScada создаём программу, скажем, main на языке, к примеру, FBD (Файл->Новый):
1501052977_20.jpg

3. Щелкаем по ней и заходим в FBD-редактор:
1501053280_30.jpg

Теперь можно написать программу, которая будет моделировать работу лифта. Вы нажимаете кнопку этажа, ПЛК включает-выключает нужные режимы двигателей. Всё это отображается через веб.
Написать это полностью на FBD конечно можно, но в процессе написания вы увидите, что fbd-схема всё растёт, растёт и постепенно начинает напоминать схему старого лампового телевизора. Поэтому давайте здесь только обозначим основные переменные, через которые будем управлять лифтом, а сам движок поместим в программу lift на языке SFC, который больше подходит для описания последовательностей.

4. Создаём SFC-программу lift:
1501056986_40.jpg

5. Щёлкаем по ней и открываем окно SFC-редактора:
1501059452_50.jpg
Что такое, скажете вы. У вас в окне появился только один квадратик и больше ничего! А здесь три квадратика и три крестика между ними. Всё правильно, просто я выложил скрин уже готовой программы, благо она невелика.
Квадратики - это шаги. Крестики - переходы из текущего шага в следующий, нижний шаг. Самый верхний шаг обведён двойной рамкой, это т.н. шаг инициализации, в нём оказывается программа при запуске. После каждого шага обязательно следует переход, таковы правила стандарта.
Но где же здесь логика управления лифтом? А логику надо вбить в шаги и переходы методом двойного клика по ним. При этом справа выскакивает текстовый редактор:
1501060145_60.jpg

5.1 Вы видите текст
ACTION (P) :
    if current=need then
        motor_up := false;
        motor_down := false;
    end_if;
END_ACTION;

который следует ввести в первый шаг (пока не надо, потом). Шаг это код на языке ST, похожем на Паскаль. Тут видно, что при равенстве переменных current и need переменным motor_* присваиваются логические нули (если не знакомы с двоичными/булевскими переменными, то лог.ноль это false (ложь), а лог. единица это true (истина)). А что такое ACTION() легко ищется в мануале изаграфа. Если коротко, действия шагов могут быть импульсными ( читай однократными, внутри  ACTION (P) как у нас) или 'несохранёнными' (ACTION(N)). Я не знаю почему их назвали несохранёнными, но суть в том, что код внутри ACTION(N) будет молотить постоянно, пока шаг активен. Вернее даже не постоянно, а с частотой цикла исполнения программы. Т.е. если цикл нашей программы 10 мС, а шаг продержался активным 1 сек, то ACTION(N) успеет отработать 100 раз.
Но как удерживать шаг в активном состоянии? Для этого служит переход под шагом. Если переход заперт, шаг продолжает выполняться. Если переход открыт, то активность получает следующий шаг и т.д.
Теперь про переходы. Если переход пуст, т.е. в нём не прописано никаких условий, то он всегда открыт. В противном случае анализируется условие, прописанное в переходе и по нему уже выясняется - открыт или заперт.

5.2 Набейте скелет программы, чтобы он выглядел так, как на последнем скрине. Просто введите пустые шаги и переходы. Если программу оставить в таком виде, то она тоже будет работать, в каждом цикле переходя на следующий шаг и так по кругу, ведь все переходы по умолчанию разрешены. Попробуйте проверить программу, нажав на красную галочку "Проверка программы". Должен отработать генератор кода и выдать подобное сообщение:
1501062158_70.jpg

5.3 Теперь наберите следующее содержимое шагов и переходов:
Шаг 1:
ACTION (P) :
    if current=need then
        motor_up := false;
        motor_down := false;
    end_if;
END_ACTION;

Переход 1:
need<>current

Шаг 2:
ACTION (P) :
    if current < need then
        motor_up := true;
    else
        motor_down := true;
    end_if;
END_ACTION;

Переход 2:
gs2.t>t#1s

Шаг 3:
ACTION (P) :
    if current < need then
        current := current+1;
    else
        current := current-1;
    end_if;
END_ACTION;

Переход 3 - пустой.

Небольшой комментарий к переходу 2. Выражение gs2.t>t#1s означает "время активности шага 2 (gs2.t) больше (>) секунды (t#1s)". Таким образом реализована задержка на проход 1 этажа.

5.4 Если теперь проверить программу, то генератор выплюнет кучу ошибок. Это от того, что переменные need, current, motor_up и motor_down не были созданы заранее. Это в php и js переменные создаются автоматом, а тут их надо явно прописать в словаре. Переменные следующие:

  • need - на какой этаж ехать

  • current - текущий этаж

  • motor_up  - мотор работает на подъём

  • motor_down - мотор работает вниз

Открываем словарь и вводим:
1501063580_80.jpg
1501063731_90.jpg
Все переменные делаем глобальными, т.к. они должны быть видны из FBD-программы main. Для этого нужно активировать соотв. флажок (обведён красным на последнем скрине).
Для переменной current нужно ввести начальное значение 1, т.е. при запуске программы мы должны как бы оказаться на первом этаже. Для этого в окне свойств указываем 1:
1501064406_100.jpg
Теперь проверка программы не должна выдать ошибок.

6. Теперь снова вернёмся в FBD-редактор программы main и набьём след. схему:
1501070234_110.jpg
По краям схемы расположены переменные, их вводят командой "Вставить переменную". Чтобы ввести константу (в данном случае это 1 и 10 как ограничители этажности) надо вставлять переменную, но вместо имени вписать число. В словарь следует добавить переменные web_need, delta (целочисленные) и motor_led (булевская) и сделать их локальными чтобы показать как достучаться до локальных переменных через web. И да, переменной web_need сделать начальное значение 1.
В центре схемы функциональные блоки (точнее функции) ИЛИ, limit и т.д. Они вводятся через выбор:
1501071110_120.jpg
А так, в целом FBD-редактор интуитивно понятен, вполне можно разобраться.

Касательно переменной delta (разница между заданным и текущим этажами). Я нарочно её ввёл чтобы показать как уродливо это делается на FBD. На ST это выглядело бы так:
delta := (ana)abs(real(current-need));
Поэтому зацикливаться на FBD, как это любят многие, непродуктивно.
По завершению набора нужно проверить программу и избавиться от возможных ошибок.

7. Теперь откроем окно опций компилятора (окно "Программы"->Создать->"Опции компилятора") :
1501072343_130.jpg
Вот так оно должно выглядеть.
А теперь опции выполнения (окно "Программы"->Создать->"Опции выполнения приложения") :
1501072564_140.jpg
Здесь вводим время цикла программы в мС.
А теперь пробуем не проверить, а создать приложение (окно "Программы"->Создать->"Создать приложение").
Ошибок быть не должно.

8. Прежде чем грузить приложение в контроллер, его можно погонять на симуляторе (я нарочно поставил галочку напротив симулятора в опциях проекта п.7). Запустив симулятор и расположив окна наглядным образом можно погонять лифт туда-сюда и буквально увидеть как работает программа:
1501073130_150.jpg
Гонять лифт можно записывая значение переменной web_need двойным кликом по ней. Другого способа пока нет, т.к. web-морду мы пока ещё не прикрутили. Но всё равно интересно!

продолжение следует

Подвал раздела