Я сторонник делать это все в контроллере, а любая скада, это трлько визуализация для меня. Захотите другую скаду или панель, опять все переделывать? И у всех свои реализации этого механизма...
Вид для печати
Распределение памяти в панели можно "подправить" и без расширенного режима
Вложение 86343
Только такой способ повлияет на ВСЕ вновь создаваемые проекты
Очень полезный совет. Спасибо.
Именно из-за того что, захотели вместо скады - панель, я здесь :)
Я только за - делать это в контроллере, может поделитесь примерчиком или хотя бы общей концепцией?
Опишу задачу:
ПЛК110-30.
Рецептов - штук 200, желательно структурировать по категориям.
В каждом - осмысленное название, символов 20 + переменных float - штук 15.
Возможность с панели изменять и создавать новые рецепты и категории.
Пока слабо представляю как организовать, что оператор подходит к панели, тычет пальцем кнопку "рецепт",
появляется список осмысленных названий рецептов, он тычет в нужный и он принимается к работе.
Ну и мастер иногда добавляет новые рецепты и сохраняет их.
Буду благодарен за пример или наводку
Вложение 86348
Был когда-то Заказчик, родился концепт, но до выполнения не дошло, сдулся на спецификации оборудования (по ценам из открытых источников, заметьте... ничего не накручивалось, все было по минимуму).
Имеем: установка дозирования строительных смесей (до 10 компонентов с разной очередностью подачи, с разным временем и весом пересыпа после остановки дозаторов, компоненты могут участвовать в приготовлении смеси, могут отсутствовать - 7*10*10 параметров, что-то флоатами, наименования строками (это самое негативное для передачи по модбас)). Тут 10 рецептов, все хранится в массиве (можно и до 1000 расширить, но надо тогда придумать навигацию по строкам массива). Передавать можно в регистрах модбас, например (тут плк 210, своя визуализация, поэтому механизм не разрабатывался, но концепция такая: активный рецепт вверху пишется, его можем редактировать, параметры подачи и участия компонентов задаем, если что поменяли, то активный рецепт можем сохранить. ну а если нас этот рецепт устраивает, жмякаем "загрузить рецепт", и он тупо копируется в задания для оборудования и алгоритма дозирования). И все это сводится к редактированию массива разных параметров например на 1000 элементов. Да, самый минус это навигация, а так что проще...?
Немного теории о работе с рецептами
Давным давно делал пример с картинками
Вложение 86345
И так,
Рецепты хранятся в выделенной пользователем памяти PFW в виде непрерывной области регистров
(1-ый параметр 1-ого рецепта)
(2-ой параметр 1-ого рецепта)
......................................
(N-ый параметр 1-ого рецепта)
========================
(1-ый параметр 2-ого рецепта)
(2-ой параметр 2-ого рецепта)
......................................
(N-ый параметр 2-ого рецепта);
========================
...........................................
...........................................
(1-ый параметр K-ого рецепта)
(2-ой параметр K-ого рецепта)
......................................
(N-ый параметр K-ого рецепта);
А в слейве ПЛК нужны только N регистров (содержимое одного рецепта)
Есть системный регистр PSW40, с помощью которого можно выбирать нужный рецепт, а дальше с помощью двух кнопок или аналогичных функций в ф.области или ф. кнопке можно записать набор параметров выбранного рецепта в сетевые регистры ПЛК или прочитать из сетевых регистров ПЛК набор параметров в выбранный рецепт
Вот простая реализация описанного выше
Вложение 86346
Грубо говоря у меня все то же самое, что и у petera, только это в ПЛК. Не знаю, удобно ли в панели создавать такие конструкции, но если это все находится в ПЛК, то нужен только механизм взаимодействие с элементами через несколько вспомогательных управляющих регистров (как и в панели), но этот механизм можно потом и в панели использовать, и в скаде... И он будет почти одинаков для любой системы верхнего уровня.
У меня на канале на РУТУБЕ и на ютубе есть видео из трех частей "Рецепты списком для СП307 СП310", в примере рецепт всего из одного параметра, но это не принципиально, главное принцип - "как организовать, что оператор подходит к панели, тычет пальцем кнопку "рецепт",
появляется список осмысленных названий рецептов, он тычет в нужный и он принимается к работе"
Вложение 86349
"и мастер иногда добавляет новые рецепты и сохраняет их"
Вложение 86350
Скрытый текст:
Спасибо, видео видел, по нему когда-то делал,
правда не в список, а выводил в таблицу, но не суть важно.
Но тогда рецептов и их параметров было мало.
Сейчас, вижу что стандартной области PFW будет недостаточно и группировка рецептов была бы весьма нелишней.
При большом количестве рецептов будет затруднительно искать нужный и новые добавляться будут в конец списка.
Как запасной вариант, держу в уме расширить область PFW и сделать как в вашем посте выше, но может есть другие пути.
Для облегчения поиска, наверное можно сделать макрос сортировки по названиям, все же облегчит поиск.
Надо покурить хелп кодесис и обдумать вариант МихаилГл .
У ПЛК110 вроде заявлено 6Мбайт(или Мбит?) памяти на диске.
В кодесисе нет возможности писать на внутренний диск ПЛК файлы с разными именами?
Никогда не пользовался там записью файлов.
Тогда можно было бы по модбас гонять индекс и название одного рецепта, плюс регистр команды (считать/записать новый),
а на стороне ПЛК уже сохранять или читать файл.
В мастер-скаде у меня было - один рецепт=один файл csv.
Разложение их по разным папкам - давали структурирование.
А вот как сейчас сделать - пока в раздумьях.
Буду рад любым советам.
Вот когда-то 2015 делал https://owen.ru/forum/showthread.php...l=1#post383715
там рецепты хранятся в файле ПЛК
Список рецептов - массиве структур, например
Чтение и запись рецептов из/в файл после редактиорвания выполняет такой ФБКод:TYPE Reciple :
STRUCT
Name:STRING(20); (*Название рецепта*)
Param1:INT;
Param2:INT;
Param3:REAL;
END_STRUCT
END_TYPE
Код:FUNCTION_BLOCK FileReciple
VAR_INPUT
FileName: STRING(15); (*Имя файла с рецептами*)
pt: POINTER TO ARRAY [0..32000] OF Reciple; (*Указатель на массив с рецептами*)
size:UINT; (*Размер массива рецептов*)
Restore: BOOL; (*Загрузить рецепты из файла*)
Save: BOOL; (*Сохранить рецепты в файл*)
END_VAR
VAR
StatusOfFile: INT:=100; (*Это значение нужно для правильной инициализации ФБ*)
f: DWORD; (*Дескриптор файла*)
statusf: DWORD;
NULL:Reciple; (*Пустая запись в массиве рецептов*)
i: INT;
R_TRIG1: R_TRIG;
R_TRIG2: R_TRIG;
END_VAR
Имена файлом могут быть любымиКод:CASE StatusOfFile OF
0:
R_TRIG1(CLK:=Restore);
R_TRIG2(CLK:=Save);
IF R_TRIG1.Q THEN
StatusOfFile:=100; (*Восстановить рецепты из файла*)
END_IF
IF R_TRIG2.Q THEN
StatusOfFile:=10; (*Записать рецепты в файл*)
END_IF
10: (*сохранить предыдущую версию файла*)
statusf:=SysFileCopy(CONCAT(FileName, '.bak'), FileName);StatusOfFile:=11;
11: (*открыть файл на запись*)
f:=SysFileOpen(FileName, 'w');StatusOfFile:=12;
12: (*записать буфер в файл*)
statusf:=SysFileWrite(f, pt, size);StatusOfFile:=102;
(*Эта часть выполняется однократно после старта ПЛК*)
100: (*Открыть файл на чтение*)
f:=SysFileOpen(FileName, 'r');
IF f=0 THEN
StatusOfFile:=200; (*Нет такого файла*)
ELSE
StatusOfFile:=101; (*ОК, файл существует*)
END_IF
101: (*Прочитать файл в буфер*)
statusf:=SysFileRead(f, pt, size);StatusOfFile:=102;
102: (*Закрываем файл*)
SysFileClose(f);StatusOfFile:=103;
103: (*Конец инициализации после включения ПЛК*)
StatusOfFile:=0;
200: (*Если файла нет, то попробовать его восстановить*)
statusf:=SysFileCopy(FileName, CONCAT(FileName, '.bak'));StatusOfFile:=201;
201:
IF statusf=0 THEN (*старой версии файла нет, создать новый*)
FOR i:=0 TO size/SIZEOF(NULL)-1 DO
NULL.Name:=CONCAT('Набор_', INT_TO_STRING(i+1));
pt^[i]:=NULL;
END_FOR
StatusOfFile:=11; (*Записать новый файл*)
ELSE
StatusOfFile:=100;
END_IF
END_CASE
Пример работы с ФБ
Код:PROGRAM PLC_PRG
VAR
Reciples: ARRAY [0..9] OF Reciple; (*Собственно массив рецептов для программы*)
FileRec: FileReciple; (*ФБ для записи/чтения файла с рецептами*)
n: UINT:=1; (*Текущий номер рецепта*)
Dlina: INT; (*Переменная для использования Param1 из текущего рецепта*)
Glubina: INT; (*Переменная для использования Param2 из текущего рецепта*)
Temperatura: REAL; (*Переменная для использования Param3 из текущего рецепта*)
selX:INT; (*Используется в визуализации (в таблице)*)
selY:INT; (*Используется в визуализации (в таблице)*)
END_VAR
В примере по ссылке команды на чтение рецепта из файла, редактирование рецептов и сохранение результатов в файл реализовано в визуализации проекта кодесисКод:FileRec(FileName:='Rec_1.dat' , pt:=ADR(Reciples) , size:=SIZEOF(Reciples) );
Dlina:=Reciples[n-1].Param1;
Glubina:=Reciples[n-1].Param2;
Temperatura:=Reciples[n-1].Param3;
Вложение 86355 Вложение 86356
Спасибо в очередной раз.
:) :)
Это в 2015 я просил совета, когда делал ту систему, которую сейчас на панель перевожу. :)
Рекурсия, блин.
Тогда я остановился на хранении рецептов в скаде и в контроллер углубляться не стал.
Знал бы прикуп, жил бы в Сочи - сделал бы тогда хранение в ПЛК, сейчас бы не парился.
К сожалению, там ссылка на пример из 2015 уже не доступна, надо у себя в архивах порыться
Пример тут выложен https://owen.ru/forum/showthread.php...l=1#post383715
Проект из 2015г "PLCWinNT_1.pro" прикрепил в сообщение выше
petera, kondor3000
благодарю, буду разбираться.
Овен предложил библиотеку для асинхронного обмена с файлами OwenLibFileAsync.
Она чуть сложнее при обращении к её функциям, но зато после обращения функцией к файлу - программа не ждёт результата "на месте" (подвисает), а продолжает работу, а функция когда-нибудь завершит выполнение через много-много машинных циклов.
Лучше использовать OwenLibFileAsync
А может ли переключатель переключать не один бит, а два (синхронно)?
Два бита одной кнопкой
Скрытый текст:
Это здорово! И это очевидно. А вопрос про переключатель илии переключатель с индикацией. Вот такие:Вложение 86407. Но, судя по ответам, уже понятно, что нельзя. Жаль. Буду ломать функциональные кнопки.
Вариант два бита одной кнопкой
Сделаем переключатель с индикацией, который управляет двумя битами
Скрытый текст:
Еще пару переключателей с индикацией
Скрытый текст:
Здравствуйте! Не могу разобраться, почему то на прямую не хочет выводить на цифровой дисплей данные с пр200, но при переписывании с регистра PLC во внутренний регистр панели, все выводится. Помогите разобраться!
Лучше так и делайте. Опрос отдельно отображение отдельно. Меньше лагв будет
На данный момент пытаюсь с модбас слева выдавать значения, уже как только не пробовал, и флоат в разных вариациях и ансайнед и сайнед не выводит и все, если с помощью макроса перекидываю на внутренний регистр то работает, биты тоже из одного регистра считываются из другого ни в какую не считываются. Вот например на видимость двух кнопок, одна сброс появляется вторая пуск не появляется.Вложение 86603Вложение 86604Вложение 86605 там же есть регистры в конце, они работают через присвоение внутреннему регистру, 560 не выводится как только не изголялся, сейчас там уже даже флоат, но ти флоат не работает, до этого саинд ансайд пробовал, в настройках самого вывода все перебрал уже, кстати мастер сп307 пр102 будет слейвом/ Сейчас еще попробовал сделал функциональную кнопку с записью значения в 559 регистр, в модбас слейв записалось значение 11 бита, а вот Пуск так и не появился
Зачем вы с битов видимости начали ?
Сначала разберитесь с целым числом и Float, когда целое примите, биты уже сами работать будут.
Создайте целое в 512 и 513 регистре в ПР слейве, в панели Мастере дисплеи ввода, целые WORD (Unsigned), адреса 4х512 и 4х513.
Не забудьте в каждом дисплее поставить слейв адрес ПР, по умолчанию 16.
Вещественное в ПР, адрес 514 Float (2 регистра), в панели DWORD ( Float), адрес 4х 514 (занимает 514 и 515 регистры). Поставьте кол-во знаков до и после запятой.
Для правильного отображения Float, поставьте (снимите) галку в настройках панели "Изменить порядок регистров".
При включении 0 бита в целом числе будет 1, 1 бита - 2, 2 бита - 4, 3 бита - 8 и т. д.
Вложение 86606Вложение 86607Вложение 86608Вложение 86609
Вот сделал как вы сказали, вместо битов завел целые числа, все как работало так и работает, что не работало не работает, 562 регистр сделал флоат, поставил галочку в настройках панели, настроил вывод, но так ни чего не заработало
Сорян, переделал, но ни чего не изменилось. Я понять не могу, почему некоторые регистры работают, а некоторые настроены также а работать не хотят.
Нет ни каких наложений, они все разные, и их еще не так много, сейчас 559 записал во внутренний регистр и привязал внутренний регистр к видимости ПУСК, и все заработало.
Проблемы у вас как у всех, потому что не разобравшись на примере, на 2-3 переменных, начинаете писать проект.
Адреса и настройки не соблюдаете.
Адреса надо не в Пуле смотреть, а в ПР слейве и их соответствие в мастере. Настроить правильно 1 Float и дальше по аналогии.
Галку тоже можно поставить или снять, в зависимости от правильного отображения.
Товарищи, добрый день.
Прошу помочь советом - существует ли возможность связать между собой симулятор панели СП300 в конфигураторе и симулятор ПР200 в Owen Logic в рамках одного компьютера? Помню, когда-то работал с сименсом (линейка desigo) и там удачно получалось для этих целей использовать адаптер замыкания на себя KS Test, задав ему нужное количество ip адресов. По сути, задача следующая - отладить программу реле и графику панели при отсутствии оных на столе. К сожалению, железо установлено на объекте, и забрать его для опытов невозможно. Нужно будет приехать с уже готовой программой. Так как на объекте предстоит еще втащить туда и управление частотниками + верхний мониторинг, то хотелось, хотя бы, пофиксить заранее все возможные свои косяки между ПР00 и СП300. С Овеном ранее не работал, не считая каких-то ТРМ в студенческие годы : ) Был приятно удивлен изменившимся ассортиментом за последние 20 лет!
Большое спасибо за быстрый ответ! Жаль, не задал вопрос на форуме раньше, сэкономил бы себе полдня : )
Делать нечего, пойдем искать реле на барахолку... авось потом и на даче сгодится.