или мне достаточно будет узнать как можно записывать в архив периодически (ну скажем через секунду) строковую переменную '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
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
Последний раз редактировалось Ollegator; 25.11.2009 в 17:36.
Эта программа у меня вызывается после каждого сделанного цикла грузоподъемного крана, параметры этого цикла нужно регистрировать, в файле tenzo_reg.log сохраняется информация о 150 - 200 последних циклах, этого недостаточно. Полностью переписывать принцип регистрации, используя SysLibFile неохота, да и время поджимает.
хорошо, сейчас выложу, однако, чтобы протестировать проект, нужно подавать сигналы от датчиков на аналоговые входы плк, у меня для этого стоит другой плк , который имитирует эти сигналы по нужному алгаритму. кроме того, многие уставки вводятся с панели оператора.
используются все аналоговые входы, на первый и третий подается сигнал с датчика усилия основного подъема (они соединены последовательно, посчитали, что так входы будут работать быстрее), на второй с датчика усилия вспомогательного подъема, на четвертый, с датчика вылета стрелы.
цикл в программе начинается, когда усилие на датчике превышает определенное значение (5 т для основного подъема в этой программе) и регистрируется, если его длительность превышает 15 с.
конец цикла определяется, когда сигнал с датчика становится меньше определенного значения.
я еще прикрепил файл уставок, который надо записать на плк, чтобы не вводить с панели.
вообще, проект не мой, многое в нем мне самому не нравится, но мне его править.