Просмотр полной версии : Проблема с SysLibFile
Следующая проблема... Когда размер файла созданного и редактируемого посредством 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);
Ну вообщем код, который отвечает за запись в 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);
Странно что вообще работает, мне кажется сперва надо файл открыть, потом его размер вычислить
Странно что вообще работает, мне кажется сперва надо файл открыть, потом его размер вычислить
Так вот же в конце, смотрите внимательней...
sizDWC:=SysFileGetSize('DWC.txt');
fileDWC:=SysFileOpen('DWC.txt','w');
SysFileSetPos(fileDWC, sizDWC);
SysFileWrite(fileDWC, ADR(strokaDWC), LEN(strokaDWC));
SysFileClose(fileDWC);
Так вот же в конце, смотрите внимательней...
izDWC:=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.php?p=109415&postcount=4
Вот по увиденному я и высказываюсь, сравните когда я проверяю размер http://www.owen.ru/forum/showpost.php?p=109415&postcount=4
Да суть то не в этом. Суть в том что размер фала он проверяет и показывает что он более 1024байт, но данные в него почему-то не хочет записывать. Если файл менее 1024байт, то данные в него записываются без проблем и мой код работает... Натолкните на правильную мысль, где подвох?
Понимаете, вынутые из контекста куски бывают неговорят явно об ошибках. А точно строка-то есть ? Вы этот код как вызываете ? И как вы определяете что не пишется ? Тута никто не проверяет нигде return'ов SetPos/Write/Close.
Пакуем в case с сохранением ответа функций и CTRL-F5 в помощь.
Понимаете, вынутые из контекста куски бывают неговорят явно об ошибках. А точно строка-то есть ? Вы этот код как вызываете ? И как вы определяете что не пишется ? Тута никто не проверяет нигде 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КБ.
http://www.owen.ru/forum/showpost.php?p=57350&postcount=4
http://www.owen.ru/forum/showpost.php?p=57350&postcount=4
На самом деле проблема решилась другим способом. Ставлю проект на паузу, считываю файл - считывается полностью. Если же проект в запущенном состоянии, то всё происходит как я писал выше, любой из скачиваемых файлов не более 1кб.
Понимаете, вынутые из контекста куски бывают не говорят явно об ошибках.
Вот тут уже упоминалось, надо видеть весь проект и из моего кода может тоже можно извлечь пользу, если дескриптор не возвращает ошибку, то можно производить какие либо действия, а если файл занят, то нечего в него и писать
Вообщем всем спасибо, за помощь, проблему решил сам!)
pavelrer
15.11.2013, 01:22
Поможите чем сможите
Вот у меня такая штука.
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 делать.
Спасибо.
pavelrer
15.11.2013, 01:38
С чтение разобрался. ( помогла перезагрузка , почему-то заводской сброс не помогал? )
С длинной файла вопрос остается.
Спасибо.
С длинной файла вопрос остается.
Если так необходима экономия памяти выделяй ее динамически, например SysMemAlloc из SySLibMem.lib )
И ышо. методически грамотней разбивать обращения к файлам по циклам ПЛК. то есть открыли - в следующем цикле измерили длинну. в следующем прочитали (а может быть и не в одном) в следующем закрыли.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot