
Сообщение от
capzap
дескриптор файла я откуда беру, через указатель из функции, следовательно поймать фронт изменения больше нуля не составляет проблем, а дальше если он не равен нулю ОС может не открывать повторно файл, ей ли не знать что она уже его открыла
Вы о чём вообще?
Цитирую ваш код:
Код:
1 IF loadReception THEN (* при загрузке плк *)
2 hFile:=SysFileOpen('rcpt.bin', 'r'); (* получение дескриптора файла *)
3 IF hFile>0 THEN (* если файл существует *)
4 logFileSize := SysFileGetSize('rcpt.bin'); (* вычисляем размер файла *)
5 (* читаем данные по минимуму, либо размер файла, либо размер массива *)
6 IF SysFileRead(hFile, ADR(reception)
7 ,MIN(UDINT_TO_DWORD(logFileSize)
8 ,INT_TO_DWORD(SIZEOF(reception)))) <> 0 THEN (* если приняли соответствующее количество байт *)
9 SysFileClose(hFile); (* закрываем файл *)
10 loadReception:=FALSE;
11 ELSE SysFileClose(hFile);loadReception:=FALSE; END_IF;
12 ELSE loadReception:=FALSE; END_IF;
END_IF;
Выполняться он будет так:
1) loadReception=TRUE (иначе вообще в IF не зайдём)
2) открываем файл. Считаем, что файл открылся, т.к. иначе неинтересно
3) файл открылся
4) берём filesize
6) пытаемся прочитать файл. <-- Вы признаёте, что эта функция может прочитать только 1 байт и вернуть 1?
Дальше 2 варианта:
а) Заходим в IF и на строке 9 закрываем файл <-- здесь может оказаться, что мы прочитали только 1 байт, а файл уже закрыли и флаг loadReception сбросили в FALSE
б) заходим в ELSE и на строке 11 закрываем файл <-- это ошибка чтения, поэтому не так интересно. Но файл всё равно закрывается
Видно, что при любом раскладе файл закрывается в том же самом цикле ПЛК.
Ожидать, что "Open увидит, что мы совсем недавно открывали этот же самый закрытый файл и продолжим чтение с прошлой позиции" это уж совсем мистика.
Просто согласитесь, что у вас там косяк получился.