Именно из-за того что, захотели вместо скады - панель, я здесь
Я только за - делать это в контроллере, может поделитесь примерчиком или хотя бы общей концепцией?
Опишу задачу:
ПЛК110-30.
Рецептов - штук 200, желательно структурировать по категориям.
В каждом - осмысленное название, символов 20 + переменных float - штук 15.
Возможность с панели изменять и создавать новые рецепты и категории.
Пока слабо представляю как организовать, что оператор подходит к панели, тычет пальцем кнопку "рецепт",
появляется список осмысленных названий рецептов, он тычет в нужный и он принимается к работе.
Ну и мастер иногда добавляет новые рецепты и сохраняет их.
Буду благодарен за пример или наводку
Последний раз редактировалось Sherverpupa; 24.10.2025 в 11:13.
11111.png
Был когда-то Заказчик, родился концепт, но до выполнения не дошло, сдулся на спецификации оборудования (по ценам из открытых источников, заметьте... ничего не накручивалось, все было по минимуму).
Имеем: установка дозирования строительных смесей (до 10 компонентов с разной очередностью подачи, с разным временем и весом пересыпа после остановки дозаторов, компоненты могут участвовать в приготовлении смеси, могут отсутствовать - 7*10*10 параметров, что-то флоатами, наименования строками (это самое негативное для передачи по модбас)). Тут 10 рецептов, все хранится в массиве (можно и до 1000 расширить, но надо тогда придумать навигацию по строкам массива). Передавать можно в регистрах модбас, например (тут плк 210, своя визуализация, поэтому механизм не разрабатывался, но концепция такая: активный рецепт вверху пишется, его можем редактировать, параметры подачи и участия компонентов задаем, если что поменяли, то активный рецепт можем сохранить. ну а если нас этот рецепт устраивает, жмякаем "загрузить рецепт", и он тупо копируется в задания для оборудования и алгоритма дозирования). И все это сводится к редактированию массива разных параметров например на 1000 элементов. Да, самый минус это навигация, а так что проще...?
Немного теории о работе с рецептами
Давным давно делал пример с картинками
Захват-8.png
И так,
Рецепты хранятся в выделенной пользователем памяти PFW в виде непрерывной области регистров
(1-ый параметр 1-ого рецепта)
(2-ой параметр 1-ого рецепта)
......................................
(N-ый параметр 1-ого рецепта)
========================
(1-ый параметр 2-ого рецепта)
(2-ой параметр 2-ого рецепта)
......................................
(N-ый параметр 2-ого рецепта);
========================
...........................................
...........................................
(1-ый параметр K-ого рецепта)
(2-ой параметр K-ого рецепта)
......................................
(N-ый параметр K-ого рецепта);
А в слейве ПЛК нужны только N регистров (содержимое одного рецепта)
Есть системный регистр PSW40, с помощью которого можно выбирать нужный рецепт, а дальше с помощью двух кнопок или аналогичных функций в ф.области или ф. кнопке можно записать набор параметров выбранного рецепта в сетевые регистры ПЛК или прочитать из сетевых регистров ПЛК набор параметров в выбранный рецепт
Вот простая реализация описанного выше
Захват-11.png
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
У меня на канале на РУТУБЕ и на ютубе есть видео из трех частей "Рецепты списком для СП307 СП310", в примере рецепт всего из одного параметра, но это не принципиально, главное принцип - "как организовать, что оператор подходит к панели, тычет пальцем кнопку "рецепт",
появляется список осмысленных названий рецептов, он тычет в нужный и он принимается к работе"
Захват-11.png
"и мастер иногда добавляет новые рецепты и сохраняет их"
Захват-12.png
Скрытый текст:
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Спасибо, видео видел, по нему когда-то делал,
правда не в список, а выводил в таблицу, но не суть важно.
Но тогда рецептов и их параметров было мало.
Сейчас, вижу что стандартной области 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;
Захват-11.png Захват-12.png
Последний раз редактировалось petera; 24.10.2025 в 14:39.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Спасибо в очередной раз.
![]()
![]()
Это в 2015 я просил совета, когда делал ту систему, которую сейчас на панель перевожу.![]()
Рекурсия, блин.
Тогда я остановился на хранении рецептов в скаде и в контроллер углубляться не стал.
Знал бы прикуп, жил бы в Сочи - сделал бы тогда хранение в ПЛК, сейчас бы не парился.
К сожалению, там ссылка на пример из 2015 уже не доступна, надо у себя в архивах порыться
Последний раз редактировалось Sherverpupa; 24.10.2025 в 14:24.