Цитата Сообщение от Владимир Ситников Посмотреть сообщение
Вы о чём вообще?
Цитирую ваш код:
Код:
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 закрываем файл
б) заходим в ELSE и на строке 11 закрываем файл

Видно, что при любом раскладе файл закрывается в том же самом цикле ПЛК.
Ожидать, что "Open увидит, что мы совсем недавно открывали этот же самый закрытый файл и продолжим чтение с прошлой позиции" это уж совсем мистика.

Просто согласитесь, что у вас там косяк получился.
С указателями напутал, это из асинхронной библиотеки, здесь сама функция возвращает ссылку на файл.
6) может прочитать и меньше, не зря я вычисляю logFileSize , но видимо не пригодился и так работает на плк, не подводил. Даже если будем делать проверку, чем это будет отличаться от Вашего кода, там её тоже нет, поэтому количество строк возрастет одинаково
вместе с закрытием файла я сбрасываю loadReception до следующего открытия файла, поэтому многократные открытия не предвидятся