Следующая проблема... Когда размер файла созданного и редактируемого посредством SysLibFile становится 1кб (1024байт), данные в него перестают добавляться. Как можно решить эту проблему?
Вид для печати
Следующая проблема... Когда размер файла созданного и редактируемого посредством SysLibFile становится 1кб (1024байт), данные в него перестают добавляться. Как можно решить эту проблему?
Для начала - выложить код
Ну вообщем код, который отвечает за запись в SysLibFile вот такой - не стал выкладывать полный код программы..
Два раза в сутки в файл дописываются значения переменных, и как размер файла становится 1КБ, информация перестаёт в него добавляться.
Код:PROGRAM new_EC
VAR
y: REAL; (* Преобразование EC *)
sizDWC:DINT; (*размер файла для записи SysLibFile*)
fileDWC:DWORD; (*исполнительный файл для SysLibFile*)
strokaDWC:STRING;(*Строка для записи DWC значений*)
END_VAR
strokaDWC:='DWC4'; END_IF;
strokaDWC:=CONCAT (strokaDWC, ' ');
strokaDWC:=CONCAT (strokaDWC, TimeAndDate.Data);
strokaDWC:=CONCAT (strokaDWC, ' ');
strokaDWC:=CONCAT (strokaDWC, TimeAndDate.Vremya);
strokaDWC:=CONCAT (strokaDWC, ' ');
strokaDWC:=CONCAT (strokaDWC, 'Слито');
strokaDWC:=CONCAT (strokaDWC, ' ');
strokaDWC:=CONCAT (strokaDWC, REAL_TO_STRING(TRUNC(Uroven_Setup.liters*100)));
strokaDWC:=INSERT(strokaDWC,'.',LEN(strokaDWC)-2);
strokaDWC:=CONCAT (strokaDWC, 'л.');
strokaDWC:=CONCAT (strokaDWC, ' ');
strokaDWC:=CONCAT (strokaDWC, 'EC=');
strokaDWC:=CONCAT (strokaDWC, Okruglenie_EC.strokaEC);
strokaDWC:=CONCAT (strokaDWC, 'мСм');
strokaDWC:=CONCAT (strokaDWC, ' ');
strokaDWC:=CONCAT (strokaDWC, 'PH=');
strokaDWC:=CONCAT (strokaDWC, REAL_TO_STRING(TRUNC(PH*100)));
strokaDWC:=INSERT(strokaDWC,'.',LEN(strokaDWC)-2);
strokaDWC:=CONCAT (strokaDWC, '$R$N');
sizDWC:=SysFileGetSize('DWC.txt');
fileDWC:=SysFileOpen('DWC.txt','w');
SysFileSetPos(fileDWC, sizDWC);
SysFileWrite(fileDWC, ADR(strokaDWC), LEN(strokaDWC));
SysFileClose(fileDWC);
Вот по увиденному я и высказываюсь, сравните когда я проверяю размер http://www.owen.ru/forum/showpost.ph...15&postcount=4
Да суть то не в этом. Суть в том что размер фала он проверяет и показывает что он более 1024байт, но данные в него почему-то не хочет записывать. Если файл менее 1024байт, то данные в него записываются без проблем и мой код работает... Натолкните на правильную мысль, где подвох?
Понимаете, вынутые из контекста куски бывают неговорят явно об ошибках. А точно строка-то есть ? Вы этот код как вызываете ? И как вы определяете что не пишется ? Тута никто не проверяет нигде return'ов SetPos/Write/Close.
Пакуем в case с сохранением ответа функций и CTRL-F5 в помощь.
Я примерно понял в чём проблема. С помощью функции SysFileGetSize я вижу что размер создаваемого мной файла действительно увеличивается, при добавлении в него новых данных. Но как только я копирую файл с плк на компьютер (Онлайн-Читать файл из ПЛК), то его размер всегда равен 1КБ. При чём не важно какой файл я пытаюсь скопировать с флэш ПЛК (debug.txt
config.dat
retain.bin
calib.inc
DEFAULT.PRG
DEFAULT.CHK
My Project.PRG
local_addres.dat
log.txt
source.dat)
Размер любого из этих файлов при копировании с ПЛК равен 1КБ. Пробовал копировать файлы как через меню (Онлайн-Читать файл из ПЛК), так и с помощью утилиты plc_io. Результат один. Размер любого файла 1КБ.
Вообщем всем спасибо, за помощь, проблему решил сам!)
Поможите чем сможите
Вот у меня такая штука.
PROGRAM MAC_Control
VAR
PRG_MAC_Contrl_Start:BOOL:=TRUE;
diFile: DWORD;
ReadSizeByte: DWORD;
File_Size: DWORD;
Local_Addres_DATA:ARRAY [0..255] OF BYTE;
END_VAR
IF PRG_MAC_Contrl_Start THEN
diFile:=SysFileOpen('local_addres.dat','r');
IF diFile > 0 THEN
File_Size:=SysFileGetSize('local_addres.dat');
ReadSizeByte:=SysFileRead(diFile, ADR(Local_Addres_DATA), File_Size);
SysFileClose(diFile);
ELSE
; (* Error file *)
END_IF
PRG_MAC_Contrl_Start :=FALSE;
END_IF
Размер показывает, если файл кинуть на ПК и посчитать посимвольно + на каждый перенос 2 байто. Размер верен.
Но данные не читаются?
Покурил экземплы, форум все вроде очень похоже.
Что может быть?
Вот еще вопросик - Как я понимаю размер файла local_addres.dat всегда постоянен 76 байт. Это так?
Ну чтоб массив не от 0..255 а 0..76 делать.
Спасибо.
С чтение разобрался. ( помогла перезагрузка , почему-то заводской сброс не помогал? )
С длинной файла вопрос остается.
Спасибо.
Если так необходима экономия памяти выделяй ее динамически, например SysMemAlloc из SySLibMem.lib )
И ышо. методически грамотней разбивать обращения к файлам по циклам ПЛК. то есть открыли - в следующем цикле измерили длинну. в следующем прочитали (а может быть и не в одном) в следующем закрыли.