-
или мне достаточно будет узнать как можно записывать в архив периодически (ну скажем через секунду) строковую переменную 'slovo'. в данной программе оно записывается только 1 раз. если кто поможет то буду очень благодарен!!!
PROGRAM PLC_PRG
VAR
x:STRING; (*строка для архивирования*)
number: DWORD; (*дескриптор файла*)
dipos: DINT; (*текущая позиция в файле*)
dwSize: DWORD; (*количество записанных байт данных*)
dwSize1: DWORD; (*размер файла*)
END_VAR
(*открываем файл*)
number:=SysFileOpen('arc.log', 'w');
(*создаём строку*)
x:='slovo';
(*Пишем строку в файл*)
dwSize:=SysFileWrite(number,ADR(x),LEN(x));
(*получаем текущую позицию в файле*)
dipos:=SysFileGetPos(number);
(*получаем размер файла в байтах*)
dwSize1:=SysFileGetSize('arc.log');
-
см. другой пост. зачем их дублировать?
-
прошу прощения, думал одно из сообщение не отправилось. скорость интеренета на работе оставляет желать лучшего)
-
Здравствуйте.
У меня вопрос. Попытался воспользоваться функцией SysFileGetSize
Она работает некорректно, на файл размером в 18 кБ, возвращается непонятное число - 9 с лишнем миллионов.
Нужно вот для чего, у меня ведется архивация с помощью модуля Archiver, на вашем форуме я прочитал, что размер архива не может превышать 32 кБ, практика показала, что это правда (почему -то не указанная в документации). Нужно внести такие изменения в программу, чтобы она проверяла размер архива, и, в случае превышения его размера, скажем, 30 кБ, копировала его в новый файл.
Функция SysFileCopy, кстати, то же работает у меня не корректно, новый файл создается, но он пустой.
Как быть?
-
1. Опишите что за ПЛК
2. "неработающий" код в студию.
3. Архиватор - не абсолютное решение, а предназначен для простых задач. Если его функционала не хватает - Вы можете сами написать его улучшенный аналог использую библиотеку SysLibFile.lib
-
Выложу написанный мной текст программы, который сейчас не работает как надо
PROGRAM Archive
VAR
FileSize: DWORD;
filename: STRING [40];
Files_Name_Array: Files_Name;
fAD,fSize, fileadr: DWORD;
END_VAR
VAR RETAIN
Flag:BOOL;
END_VAR
TYPE Files_Name :
STRUCT
File_Name_Array: ARRAY[1..50] OF STRING[40];
NFile: BYTE;
END_STRUCT
END_TYPE
FileSize:=SysFileGetSize('tenzo_reg.log'); (*Определение размера файла регистратора *)
IF FileSize> 30000 AND (NOT Flag) THEN (*Если размер файла превысел 30 Кбайт, то сохраняем данные в новом файле *)
filename:=CONCAT('reg' , '_');
filename:=CONCAT(filename ,INT_TO_STRING(DT_NOW[3]));
filename:=CONCAT(filename , '_');
filename:=CONCAT(filename ,INT_TO_STRING(DT_NOW[2]));
filename:=CONCAT(filename , '_');
filename:=CONCAT(filename ,INT_TO_STRING(DT_NOW[1]));
filename:=CONCAT(filename , '_');
filename:=CONCAT(filename ,INT_TO_STRING(DT_NOW[4]));
filename:=CONCAT(filename , '_');
filename:=CONCAT(filename ,INT_TO_STRING(DT_NOW[5]));
filename:=CONCAT(filename , '.log');
SysFileCopy(filename,'tenzo_reg.log');
Flag:=TRUE;
fAD:=ADR(Files_Name_Array);
fSize:=SIZEOF(Files_Name_Array);
fileadr:=SysFileOpen('Nfile.txt','r');
SysFileRead(fileadr,fAD,fSize); (*Считываем данные об уже записанных фалах*)
SysFileClose(fileadr);
IF Files_Name_Array.NFile < 50 THEN
Files_Name_Array.NFile:=Files_Name_Array.NFile+1;
ELSE Files_Name_Array.NFile:=1;
END_IF;
SysFileDelete(Files_Name_Array.File_Name_Array[Files_Name_Array.NFile]); (*удаляем старый файл*)
Files_Name_Array.File_Name_Array[Files_Name_Array.NFile]:=filename; (*Записываем в массиы имя нового файла*)
fAD:=ADR(Files_Name_Array);
fSize:=SIZEOF(Files_Name_Array);
fileadr:=SysFileOpen('Nfile.txt','w');
SysFileWrite(fileadr,fAD,fSize); (*Записываем в файл данные об имеющихся файлах регистратора*)
ELSE Flag:=FALSE;
END_IF;
В файле tenso_reg.log ведется архив через модуль Archiver в режиме Shift mode. Нужно его периодически копировать в новый файл.
По факту происходит следующее. FileSize принимает то невероятно большие значения, то становится равным 0, в результате у меня в ПЛК создается куча файлов (за полчаса работы штук 20), все пустые.
Что я делаю неправильно?
ПЛК 150 IM
-
Эта программа у меня вызывается после каждого сделанного цикла грузоподъемного крана, параметры этого цикла нужно регистрировать, в файле tenzo_reg.log сохраняется информация о 150 - 200 последних циклах, этого недостаточно. Полностью переписывать принцип регистрации, используя SysLibFile неохота, да и время поджимает.
-
пришлите весь проект, я его протестирую.
какой у вас плк, версии прошивок, логи загрузки пришлите.
-
хорошо, сейчас выложу, однако, чтобы протестировать проект, нужно подавать сигналы от датчиков на аналоговые входы плк, у меня для этого стоит другой плк , который имитирует эти сигналы по нужному алгаритму. кроме того, многие уставки вводятся с панели оператора.
-
Вложений: 3
плк 150 Im
прошивка 10.5.0
используются все аналоговые входы, на первый и третий подается сигнал с датчика усилия основного подъема (они соединены последовательно, посчитали, что так входы будут работать быстрее), на второй с датчика усилия вспомогательного подъема, на четвертый, с датчика вылета стрелы.
цикл в программе начинается, когда усилие на датчике превышает определенное значение (5 т для основного подъема в этой программе) и регистрируется, если его длительность превышает 15 с.
конец цикла определяется, когда сигнал с датчика становится меньше определенного значения.
я еще прикрепил файл уставок, который надо записать на плк, чтобы не вводить с панели.
вообще, проект не мой, многое в нем мне самому не нравится, но мне его править.