PDA

Просмотр полной версии : Проблема с SysLibFile



lava_02
07.05.2013, 23:11
Следующая проблема... Когда размер файла созданного и редактируемого посредством SysLibFile становится 1кб (1024байт), данные в него перестают добавляться. Как можно решить эту проблему?

Валенок
07.05.2013, 23:31
Для начала - выложить код

lava_02
08.05.2013, 01:48
Для начала - выложить код

Ну вообщем код, который отвечает за запись в 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);

capzap
08.05.2013, 06:26
Ну вообщем код, который отвечает за запись в 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);

Странно что вообще работает, мне кажется сперва надо файл открыть, потом его размер вычислить

lava_02
08.05.2013, 12:59
Странно что вообще работает, мне кажется сперва надо файл открыть, потом его размер вычислить

Так вот же в конце, смотрите внимательней...

sizDWC:=SysFileGetSize('DWC.txt');
fileDWC:=SysFileOpen('DWC.txt','w');
SysFileSetPos(fileDWC, sizDWC);
SysFileWrite(fileDWC, ADR(strokaDWC), LEN(strokaDWC));
SysFileClose(fileDWC);

capzap
08.05.2013, 15:51
Так вот же в конце, смотрите внимательней...

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

lava_02
08.05.2013, 17:08
Вот по увиденному я и высказываюсь, сравните когда я проверяю размер http://www.owen.ru/forum/showpost.php?p=109415&postcount=4

Да суть то не в этом. Суть в том что размер фала он проверяет и показывает что он более 1024байт, но данные в него почему-то не хочет записывать. Если файл менее 1024байт, то данные в него записываются без проблем и мой код работает... Натолкните на правильную мысль, где подвох?

Валенок
08.05.2013, 22:47
Понимаете, вынутые из контекста куски бывают неговорят явно об ошибках. А точно строка-то есть ? Вы этот код как вызываете ? И как вы определяете что не пишется ? Тута никто не проверяет нигде return'ов SetPos/Write/Close.
Пакуем в case с сохранением ответа функций и CTRL-F5 в помощь.

lava_02
09.05.2013, 01:34
Понимаете, вынутые из контекста куски бывают неговорят явно об ошибках. А точно строка-то есть ? Вы этот код как вызываете ? И как вы определяете что не пишется ? Тута никто не проверяет нигде 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КБ.

Валенок
09.05.2013, 09:28
http://www.owen.ru/forum/showpost.php?p=57350&postcount=4

lava_02
10.05.2013, 11:40
http://www.owen.ru/forum/showpost.php?p=57350&postcount=4

На самом деле проблема решилась другим способом. Ставлю проект на паузу, считываю файл - считывается полностью. Если же проект в запущенном состоянии, то всё происходит как я писал выше, любой из скачиваемых файлов не более 1кб.

capzap
10.05.2013, 12:15
Понимаете, вынутые из контекста куски бывают не говорят явно об ошибках.

Вот тут уже упоминалось, надо видеть весь проект и из моего кода может тоже можно извлечь пользу, если дескриптор не возвращает ошибку, то можно производить какие либо действия, а если файл занят, то нечего в него и писать

lava_02
10.05.2013, 12:59
Вообщем всем спасибо, за помощь, проблему решил сам!)

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
С чтение разобрался. ( помогла перезагрузка , почему-то заводской сброс не помогал? )
С длинной файла вопрос остается.

Спасибо.

lazy
15.11.2013, 12:17
С длинной файла вопрос остается.


Если так необходима экономия памяти выделяй ее динамически, например SysMemAlloc из SySLibMem.lib )

И ышо. методически грамотней разбивать обращения к файлам по циклам ПЛК. то есть открыли - в следующем цикле измерили длинну. в следующем прочитали (а может быть и не в одном) в следующем закрыли.