Показано с 1 по 10 из 64

Тема: ST, паузы, async/await/coroutines

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от 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 увидит, что мы совсем недавно открывали этот же самый закрытый файл и продолжим чтение с прошлой позиции" это уж совсем мистика.

    Просто согласитесь, что у вас там косяк получился.
    Последний раз редактировалось Владимир Ситников; 10.10.2017 в 18:36.

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,606

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Вы о чём вообще?
    Цитирую ваш код:
    Код:
    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 до следующего открытия файла, поэтому многократные открытия не предвидятся
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    6) может прочитать и меньше, не зря я вычисляю logFileSize , но видимо не пригодился и так работает на плк, не подводил.
    Об этом я и говорю:
    а) может оказаться, что на другой прошивке SysFileRead прочитает не весь файл, а частично
    б) может оказаться, что у SysFileRead есть какой-то внутренний предел (например, не более 8 килобайт за раз). Тогда код прочитает только часть файла. И начнёт работать с неправильной рецептурой.

    Да, сейчас вам везёт, что "всё читается за 1 цикл ПЛК и целиком". Хотите -- продолжайте верить в то, что так всегда будет и дальше.
    Вы же именно в такой ошибке упрекали мой пример, что, мол "мне везёт, что за 1 цикл всё читается".

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


    Цитата Сообщение от capzap Посмотреть сообщение
    Даже если будем делать проверку, чем это будет отличаться от Вашего кода, там её тоже нет, поэтому количество строк возрастет одинаково
    вместе с закрытием файла я сбрасываю loadReception до следующего открытия файла, поэтому многократные открытия не предвидятся
    Будет. Будет.
    Если вы сделаете "поддержку дочитывания" (ну, повторный вызов read, если на прошлом цикле недочиталось), то у вас появится переменная "что сейчас делаем" (начинаем, дочитываем или подобная). Как раз из-за неё код и усложнится.

    И, да, я не говорю, что в конкретно вашем случае (просто читаем и закрываем файл) прямо нужен подход с паузами. В основном я говорю про то, что у вас "нет защиты от потенциально возможного случая, когда read прочитает меньше, чем просили".
    Но, вполне может оказаться, что даже на таком простом примере как "чтение файла" подход на паузах будет сокращать код и исключать потенциальные ошибки

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 11.05.2018, 13:01
  2. Режим паузы в ТРМ251 на прошивке 2.10
    от Brewer в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 29.03.2016, 16:10
  3. Реализация паузы в SFC
    от KoT'86 в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 05.06.2013, 21:28
  4. ПЛК63 - непонятные паузы в исполнении при опросе по 485
    от Alex_yu в разделе Помощь Разработчикам
    Ответов: 9
    Последнее сообщение: 02.07.2011, 22:54

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •