
Сообщение от
Sherverpupa
Спасибо, видео видел, по нему когда-то делал,
правда не в список, а выводил в таблицу, но не суть важно.
Но тогда рецептов и их параметров было мало.
Сейчас, вижу что стандартной области 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