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

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

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

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    а почему я должен его постоянно открывать? Взять те же примеры по сетевому обмену, отдельно функция по открытию сокета, отдельно по ожиданию приема
    Покажете как на ваш взгляд должен выглядеть "привычный код" для случая

    открыть файл
    записать
    IF записалось
    прочитать
    END_IF
    закрыть файл

    повторить (ну, чтобы файл обновлялся новыми данными по мере того, как работает ПЛК)

    ОВЕН показали. У них это 7 состояний и 100 строк

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Покажете как на ваш взгляд должен выглядеть "привычный код" для случая

    открыть файл
    записать
    IF записалось
    прочитать
    END_IF
    закрыть файл

    повторить (ну, чтобы файл обновлялся новыми данными по мере того, как работает ПЛК)

    ОВЕН показали. У них это 7 состояний и 100 строк
    нет у меня сейчас ни чего с асинхронной бибкой, но было бы что то подобное этому
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  3. #3

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    нет у меня сейчас ни чего с асинхронной бибкой, но было бы что то подобное этому
    Тот код выглядит странным, ведь там на каждом цикле ПЛК файл открывается, читается и закрывается.

    Если же SysFileRead будет читать по 1 байту (имеет право), то ваш код вообще никогда не сможет файл прочитать.

    И, всё-таки, оно будет не "подобное", а с кучей IF/CASE. Как-никак, если код сначала M циклов тратит на открытие файла, потом N циклов на запись, потом K циклов на закрытие, то где-то нужно хранить "что же мы сейчас должны делать" и нужно правильно учитывать "а что делать дальше" (например, чтобы не забыть закрыть)

    Поэтому я и говорю: "обычный рукописный код" будет сложнее чем 1 IF, который вы показываете.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Тот код выглядит странным, ведь там на каждом цикле ПЛК файл открывается, читается и закрывается.

    Если же SysFileRead будет читать по 1 байту (имеет право), то ваш код вообще никогда не сможет файл прочитать.

    И, всё-таки, оно будет не "подобное", а с кучей IF/CASE. Как-никак, если код сначала M циклов тратит на открытие файла, потом N циклов на запись, потом K циклов на закрытие, то где-то нужно хранить "что же мы сейчас должны делать" и нужно правильно учитывать "а что делать дальше" (например, чтобы не забыть закрыть)

    Поэтому я и говорю: "обычный рукописный код" будет сложнее чем 1 IF, который вы показываете.
    это кусок рабочей программы с производства, показывающий как я читаю файлы, ни чего больше к нему я дописывать не должен, максимум код может повториться один для настроек программы, другой для рецептуры

    ЗЫ не приходило в голову что сишный код в библиотеке сам решает первый это запрос на открытие или ожидание ответа
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  5. #5

    По умолчанию

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

    Вы где-нибудь видели гарантии, что SysFileRead читает всегда ровно столько байт, сколько её просили?

    Из документации: "The return value is the number of successfully read bytes"
    Она запросто может прочитать 1 байт (или 1024 байта или вообще сколько там КДС/ОВЕН задумали) и всего делов.
    А у вас потом недорецептура получится. Из всей структуры заполнится только 1 байт, а вы посмотрели, что <>0 и пошли пользоваться такой палёной рецептурой. Счастливой отладки!

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

    Знаете же, что есть слово POSIX и там read не обязано прочитать всё до конца.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Ещё раз: то, что код работает на конкретном ПЛК (на конкретной прошивке) и на конкретном размере файла не означает, что он будет продолжать работать и дальше.

    Вы где-нибудь видели гарантии, что SysFileRead читает всегда ровно столько байт, сколько её просили?

    Из документации: "The return value is the number of successfully read bytes"
    Она запросто может прочитать 1 байт (или 1024 байта или вообще сколько там КДС/ОВЕН задумали) и всего делов.
    А у вас потом недорецептура получится. Из всей структуры заполнится только 1 байт, а вы посмотрели, что <>0 и пошли пользоваться такой палёной рецептурой. Счастливой отладки!

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

    Знаете же, что есть слово POSIX и там read не обязано прочитать всё до конца.
    ну мы же условились не обсуждать оптимизацию кода , вызов библиотечных функций от этого не измениться, за исключением SysFileRead которая пару циклов дольше прочтется, если что
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну мы же условились не обсуждать оптимизацию кода , вызов библиотечных функций от этого не измениться, за исключением SysFileRead которая пару циклов дольше прочтется, если что
    Оптимизацию -- пофиг.
    В вашем коде алгоритимически-логическая ошибка.

    Код завязан на то, что SysFileRead всегда сможет прочитать весь файл целиком.
    Вы файл закрываете на строках 9 или 11.
    А на строках 10 или 11 вообще ставите loadReception:=FALSE, т.е. вся эта операция по загрузке рецепта максимум 1 раз будет.
    Никаких "постепенных дочитываний" код не предполагает

  8. #8

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ЗЫ не приходило в голову что сишный код в библиотеке сам решает первый это запрос на открытие или ожидание ответа
    Ничего он не решает. В вашем коде всегда жёсткая последовательность открыть-прочитать-закрыть и всё всегда в одном цикле ПЛК.

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

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Ничего он не решает. В вашем коде всегда жёсткая последовательность открыть-прочитать-закрыть и всё всегда в одном цикле ПЛК.
    дескриптор файла я откуда беру, через указатель из функции, следовательно поймать фронт изменения больше нуля не составляет проблем, а дальше если он не равен нулю ОС может не открывать повторно файл, ей ли не знать что она уже его открыла
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  10. #10

    По умолчанию

    Цитата Сообщение от 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.

Похожие темы

  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

Ваши права

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