CODESYS форум

Добро пожаловать на официальный форум CODESYS, 3S-Smart Software Solutions GmbH | A member of the CODESYS Group
Deutsche Version English version russian version 
Текущее время: Ср апр 01, 2020 9:10 am

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 37 сообщений ]  На страницу 1 2 3 След.
Автор Сообщение
СообщениеДобавлено: Пт мар 13, 2009 10:59 am 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
День добрый, коллеги.

Начинаю программировать ПЛК WAGO 750-841, до этого опыта программирования ПЛК нет. В процессе возникают различные простые вопросы, но победить их самостоятельно не получается... Решил обратиться за помощью к колегам.

Начал писать первый пробный проект на ST (PLC_PRG), просто попробовать запрограммировать ПЛК пощёлкать клапанами, побаловаться с термопарами... вроде всё работает... Но столкнулся с тем, что с таймерами оказалось удобнее работать на FBD. Стал осваивать FBD, но как там организовать цикл или использовать условие, как IF на ST?! В общем, понял, что придётся как-то совмещать различные языки программирования в одном проекте, потому как что-то быстрее и проще сделать на ST, что-то на FBD...

Попробовал добавить к POU, рядом с PLC_PRG, который на FBD еще программ, допустим A1 и A2 на ST. А к PLC_PRG добавил действие RD_TMP. Но получить доступ из PLC_PRG к данным в A1, A2, RD_TMP и наоборот, не получилось. Т.е. как я понял, эти все части одного POU работают полностью параллельно и не могут использовать одни и те же переменные? Возможно ли как-то получить доступ к переменным из разных подпрограмм или действий одного POU.

Подскажите пожалуйста, как это можно реализовать и как вообще пишуться средние и большие проекты, где используется достаточно большое количество модулей ввода-вывода (для меня это больше десятка модулей I/O), какие-то более-менее витиеватые алгоритмы, переходы, условия, циклы?!


Вложения:
Комментарий к файлу: Структура проекта
block_vybora.jpg
block_vybora.jpg [ 19.54 КБ | 18324 просмотра ]
Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 13, 2009 1:31 pm 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Я бы не сказал что в ST менее удобно с таймерами работать. Один раз таймер запускается с параметрами. Затем достаточно его опрашивать. Для этого достаточно вызывать экземпляр блока без параметров и смотреть на выход. Ничего сложного.
Совет: очень разумная мысль использовать ST (еще лучше в связке с SFC). Это самый мощный язык. FBD, IL, LD нужны для тех, кто имеет к ним многолетнюю привычку и не готов ей изменить.

По умолчанию контроллер вызывает одну программу PLC_PRG. Все эти A1 и пр. надо явно вызывать из PLC_PRG. Это обычные подпрограммы не более того. Если они видны в дереве проекта, то это означает то, что они доступны для вызова из других мест, но не более того. Автоматом они не вызываются.
Переменные могут быть либо глобальные – доступные всем. Либо локальные доступные только в одном POU…

Посмотрите публикации тут. По таймерам: Программируем временные сложности.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 16, 2009 10:42 am 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
Большое спасибо, частично уже разобрался... :) Буду осваивать дальше.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 19, 2009 9:54 am 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
Может кому-то тоже будет интересно...

Пока нашёл для себя оптимальный вариант (стало получаться запрограммировать то, что раньше не выходило:) ) как связка: основной проект (PLC_PRG) на CFC + дополнительные подпрограммки на ST, возможно будут использованы и подпрограммы на FBD и LD.

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


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 19, 2009 12:58 pm 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
:idea: Постарайтесь свести к минимуму использование глобальных переменных. В качестве подпрограмм используйте функции и функциональные блоки с параметрами. Красивая подпрограмма (POU) должна быть как законченный черный ящик – получила данные на вход, выдала результаты на выход, без всяких глобальных переменных. Тогда ее можно использовать в разных проектах много раз. Можно будет взять ее переделать, если потом возникнет мысль как ее сделать лучше.

В одном проекте больше 2х языков не желательно применять – некрасиво.

Конечно, когда делаешь проект все равно красиво не красиво, только бы работало. Все выглядит понятным. Большие проблемы начинаются при сопровождении. Работает год или два-три, потом бац – надо нечто поправить. В памяти уже почти ноль. Смотришь на программу как на чужую и разобраться в ней бывает сложнее чем новую написать :roll: Поэтому делать надо сразу красиво и с очень избыточной аккуратностью и детальными комментариями, в расчете на полного чайника (себя через 3 года, разбуженного ночью в отпуске).


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 19, 2009 3:44 pm 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
Спасибо за рекомендации. Про использование нескольких языков в одном проекте не знал.

Igor Petrov писал(а):
Переменные могут быть либо глобальные – доступные всем. Либо локальные доступные только в одном POU…

И всё же локалные переменные на чтение могут быть доступны из любых подпрограмм одного проекта, а вот как в них вести запись я пока не понял. Получается, что обмен данными между подпрограммами возможен только через глобальные переменные?! Тогда как свести к минимуму использование глобальных переменных? Писать весь проект в PLC_PRG, а подпрограммы используются только как самостоятельные блоки без обмена данными с другими подпрограммами? Если использовать подпрограммы как самостоятельные блоки, во многих случаях можно отказаться от подпрограмм... для меня же они, в настоящее время, инструмент, с помощью которого можно сделать то, что на каком-то другом языке или сложно или не возможно. Но при этом результат работы подпрограммы нужно передавать в основную программу...

...Извиняюсь, возможно напичано немного сумбурно, но я старался... :)

Просто с чтением переменных только опытным путём удалось установить, что для обращения к переменной надо писать путь вида: [ИМЯ ПОДПРОГРАММЫ].[ИМЯ ПЕРЕМЕННОЙ] или если идёт обращение к FBD-блоку - [ИМЯ ПОДПРОГРАММЫ].[ИМЯ БЛОКА].[ИМЯ ПЕРЕМЕННОЙ ИЛИ ПАРАМЕТРА БЛОКА]. Предполагаю, что можно как-то разрешить и запись из другой подпрограммы... Подскажите пожалуйста.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 23, 2009 1:53 pm 
Не в сети
Site Admin

Зарегистрирован: Ср июл 20, 2005 2:32 pm
Сообщения: 153
Подпрограмма – некая поименованная часть программы в самом широком смысле, включая любые языки программирования. Подпрограмму можно вызывать много раз, в том числе из других подпрограмм. В языках программирования ПЛК применяется аналогичное по смыслу понятие POU – программный компонент (функция, программа, функциональный блок).

В классическом программировании ПЛК есть 1 единственная программа (PLC_PRG). Она строится на вызовах функций и экземпляров функциональных блоков. В многозадачных проектах (делается с помощью Менеджера задач) есть много программ. Они почти независимы и в идеале занимаются разными вещами и не имеют общих данных. Без опыта и большой нужды лучше не делать многозадачные проекты. Они сложны в отладке.

С функциями все просто. Параметры на вход дал – результат получил. Внутри никакой памяти нет и быть не должно. Классика y = sin(x). См. стандартные функции в CoDeSys, они все сделаны красиво. Использовать внутри функции глобальные переменные совсем нехорошо. Это выглядит как автомобиль, где глушитель привязан проволокой и рессора усилена доской. Можно использовать в функции некие глобальные константы и параметры, но не переменные. Функция должна получать все, что ей надо через параметры. Если внутри функции вылезает нужда запоминать некие промежуточные результаты, то ее пора переделать в функциональный блок.

В функциональном блоке есть входные и выходные переменные. Через них и нужно общаться с экземпляром блока. Глобальные переменные тоже нехорошо. Экземпляры теряют независимость, становятся сложными в понимании, способными вызывать ошибки со сложной симптоматикой и тяжелой диагностикой (глюки). На ST в экземпляр блока значения входов можно передавать как параметры функции в скобках. Тут же, при вызове можно забирать значения с выходов с помощью =>). Либо и к входам и к выходам обращаться через точку (описано в мануале, не нужно опытов). При этом не обязательно сам экземпляр вызывать. Можно постепенно по одному в программе присвоить значения входам через точку, затем вызвать сам экземпляр вообще без параметров. Нормальная практика. Например, таймер. Один раз его с параметрами вызвал (на ST), настроил параметры и запустил. Дальше вызываю регулярно без параметров и наблюдаю выход, когда сработает.

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

По-хорошему, глобальные переменные нужно использовать только как общий внешний интерфейс всего ПЛК в целом – входы, выходы, параметры. В старые времена в ПЛК часто не хватало памяти и процессоры были очень медленные. Тогда, с горя, широко использовали глобальные переменные для экономии на времени передачи и месте в ОЗУ (иногда даже одну ячейку памяти использовали попеременно для разных данных). Иногда трудно побороть привычку, но приходится. Правильная программа должна быть красивой – это верный признак того, что она будет работать долго и счастливо :D


Последний раз редактировалось Igor Petrov Пн мар 23, 2009 3:39 pm, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 23, 2009 2:07 pm 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
Спасибо за такой развёрнутый ответ!


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 07, 2009 2:40 pm 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
Подскажите пожалуйста, возможно ли и если да, то каким образом вывести текущие состояния некоторых переменных в Web-визуализацию? С чего начать?


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 08, 2009 10:25 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
Начать с лицензии на web-визализацию ;)
работаем на ПЛК ThinkIO-P (очень похож на WAGO 750-841), для web-визуализации нужна лицензия в самом ПЛК (доставить ее не получится!)
По созданию собственно визуализации:
1) создаем объект визуализации
2) вставляем объект Rectangle
3) в свойстве Text/Content пишем %s
4) в свойстве Variables/Textdisplay пишем имя переменной (или выбираем из списка по нажатию F2)
5) Если хотим изменять значение переменной, в свойстве Input ставим галочку Text input of variables Text
6) в свойствах таргета (Target Settings) активировать опцию Web Visualisation на вкладке Visualisation

ps. для корректной работы нужна java-платформа, но это уточните у производителя

pps. по визуализации почитайте CoDeSys_Visu_V23_RU.pdf


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 08, 2009 2:54 pm 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
А можно чуть подробнее про лицензию? У меня лицензионные таргеты WAGO, этого не достаточно и нужна еще какая-то дополнительная лицензия?

Спасибо за пошаговую инструкцию, всё проделал. В окне визуализации CoDeSys состояние переменной меняется, но при входе на web-сервер контроллера по ссылке WebVisu она не отображается. Судя по всему что-то происходит некорректно. Действительно, для работы потребовалась виртуальная Java машина, при первом входе на страничку WebVisu было предложено её загрузить и установить, что я и сделал. Перезагрузил компьютер на всякий случай. При первичной загрузке программы в контроллер (при первом подключении) вылетает следующая ошибка "Последний онлайн сервис был завершен некорректно...", показанная на рисунке в прикреплённом файле.

Нажимаю "Ок", подключение происходит нормально, программа в контроллере стартует. Но web-визуализация не работает.

Что это может быть? И сам файл webvisu.htm редактировать вручную не надо?

Галочку "Web визуализация" в свойствах целевой платформы я поставил.

СЕКУНДУ НАЗАД ОСЕНИЛО!! УБРАЛ ИЗ ИМЕНИ ПРОЕКТА КИРИЛЛИЦУ И ПРОЕКТ ПОЛНОСТЬЮ ЗАГРУЗИЛСЯ БЕЗ ОШИБКИ, НО Web-визуализация не отображается. Браузеры пробовал разные.


Вложения:
Error_Webvis.jpg
Error_Webvis.jpg [ 23.63 КБ | 18288 просмотров ]
Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 09, 2009 4:08 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
по вопросам лицензий лучше обратиться в техподдержку производителя.
или следующий вариант (предполагая, что наши ПЛК похожи):
в ПЛК встроен web-server, к котрому можно подключиться из браузера
Цитата:
http://[ip address of PLC]

в ней должна быть информация по лицензиям, версии прошивки и пр.

по визуализации:
проверьте правильность настроек в c:\Program Files\3S Software\CoDeSys V2.3\Visu\
в файле webvisu.htm нужно указать имя визуализации
Код:
<param name="STARTVISU" value="PLC_VISU">

в файле webserver_conf.xml указать IP контроллера
Код:
<target-ip-address> PLC </target-ip-address>


PS. прошу прощения! перепутал ваш контроллер с контроллером WAGO 758-870. запросите у вашего производителя информацию, действительно ли ваш ПЛК поддерживает визуализацию


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 09, 2009 7:32 am 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
Уважаемый Avgur, благодарю за ценные рекомендации! Благодаря Вам мне всё удалось и состояние переменных визуально отображается через Web! Действительно, оказалось достаточным прописать имя визуализации и ip-адрес контроллера.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 09, 2009 8:21 am 
Не в сети

Зарегистрирован: Ср июн 20, 2007 12:10 pm
Сообщения: 31
не за что. все когда-то начинали...

интереса ради: попробуйте увеличить объем информации, отображаемой в визуализации:
1) объявить несколько массивов по 100-200 целых переменных, например DWORD
2) в программе изменять значения элементов массива
3) на визуализацию добавить элемент Table и привязать его к массивам
4) оценить быстродействие контроллера

+ проверить то же самое на массивах строк (хоть и не рекомендуют так делать)


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 09, 2009 12:12 pm 
Не в сети

Зарегистрирован: Пт фев 13, 2009 2:17 pm
Сообщения: 0
Для начала решил попробовать вывести такую табичку:

FOR i:=1 TO 15 DO
FOR j:=1 TO 15 DO
Mass1[i,j]:=i+j;
END_FOR
END_FOR

Вставил графический элемент "таблица" привязал к массиву, но вместо таблицы получается только 1 строка с парой чисел 16/16, как на рисунке. Почему-то в свойствах элемента можно настроить только столбцы, а стрОки нет. Хотелось бы увидеть табличку в столбцах/строках которой были бы i/j, а в ячейчках значения.

Не могу понять, что не так?


Вложения:
massiv.jpg
massiv.jpg [ 47.32 КБ | 18273 просмотра ]
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 37 сообщений ]  На страницу 1 2 3 След.

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB