Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 30

Тема: SysLibTime + SislibFile можно ли решить задачу?

  1. #11
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Это иллюстрация подхода, а не готовый код. Написано дома во время больничного без проверки на контроллере. Там ещё фраза есть:
    Что-то вроде такого
    Если кому-то нужен рабочий проверенный код, то пожалуйста:
    Код:
    PROGRAM PLC_PRG
    VAR
    	PowerPrevStatus: BOOL := FALSE;
    	logFileHandle, timestamp: DWORD := 0;
    	logFileSize: DINT := 0;
    END_VAR
    VAR CONSTANT
    	logFileName: STRING := 'idletime.bin';
    END_VAR
    
    IF PowerStatus <> PowerPrevStatus THEN
    	logFileSize := SysFileGetSize(logFileName);
    	IF logFileSize > 1048576 THEN
    		SysFileDelete(logFileName);
    	END_IF
    	logFileHandle := SysFileOpen(logFileName, 'w');
    	IF logFileHandle <> 0 THEN
    		timestamp := GetCurrentUnixTime();
    		IF PowerStatus THEN
    			SysFileSetPos(logFileHandle, logFileSize - (logFileSize MOD 8));
    		ELSE
    			SysFileSetPos(logFileHandle, logFileSize);
    		END_IF
    		SysFileWrite(logFileHandle, ADR(timestamp), SIZEOF(timestamp));
    		SysFileClose(logFileHandle);
    		logFileHandle := 0;
    	END_IF
    	PowerPrevStatus := PowerStatus;
    END_IF
    Функция GetCurrentUnixTime и набор библиотек без изменений как выше. В конфигурацию добавить модуль Statistic и сделать там переменную PowerStatus. Код не фильтрует сеансы по длительности.

    К сообщению также прикрепляю программу для перевода bin-файлов в текстовый вид (работает с .NET Framework 4). Код программы примитивный:
    Код:
    static void Main(string[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("No argument supplied.");
            return;
        }
        var input = new BinaryReader(File.OpenRead(args[0]));
        bool isShutdownTimestamp = false;
        DateTime prevStep = new DateTime();
        while (input.PeekChar() > -1)
        {
            var dt = new DateTime(1970, 1, 1).AddSeconds(input.ReadUInt32());
            Console.Write(string.Format("{0}, {1}", isShutdownTimestamp ? "IDL" : "ACT", dt));
            Console.WriteLine(", {0}", prevStep.Ticks > 0 ? dt - prevStep : new TimeSpan());
            isShutdownTimestamp = !isShutdownTimestamp;
            prevStep = dt;
        }
        input.Close();
    }
    Формат вывода:
    Код:
    ACT, 01.01.2000 1:54:41, 00:00:00
    IDL, 01.01.2000 1:57:17, 00:02:36
    ACT, 01.01.2000 1:57:52, 00:00:35
    В третьем столбце разность. Пример использования для перевода idletime.bin в result.txt: LogConverter D:\Test\idletime.bin > result.txt
    Можно соединить вместе с утилитой PLC_IO в bat-файле для автоматизации процесса получения протокола.

    На самом деле, как в личной беседе заметил Robur, на контроллере и так ведётся файл log.txt, где записаны события включения и выключения. Поэтому можно не городить лишний код на контроллере и парсить именно log.txt.
    Вложения Вложения
    Последний раз редактировалось Yegor; 07.09.2012 в 05:31.

  2. #12

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Это иллюстрация подхода, а не готовый код....
    Проверено мною на ОВЕН150, полностью рабочий код . А про log.txt... Ну упрямый заказчик попался, захотел отдельный файл, где только он/офф и не более. Бывает такое
    Последний раз редактировалось Robur; 08.09.2012 в 13:35.

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

    По умолчанию

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

  4. #14
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Не мешает ли обработка события включения питания
    Здесь не обработка события или прерывания, а опрос переменной из главного цикла ПЛК. Поэтому данная операция имеет не больший приоритет, чем любая другая. При этом каких-то особых предписаний касательно файловых операций при запуске и отключении я нигде не видел. Также логично будет предположить, что к первому циклу ритэйны считаны, а записываются лишь за последним циклом. Если что-то срабатывает ненадёжно или не срабатывает вообще, то сообщайте — обсудим.

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

    По умолчанию

    Здесь не обработка события или прерывания, а опрос переменной из главного цикла ПЛК. Поэтому данная операция имеет не больший приоритет, чем любая другая.
    Сформулирую по другому, что будет если как говорите в главном цикле, сосчитать два файла одновременно, это получится?
    При этом каких-то особых предписаний касательно файловых операций при запуске и отключении я нигде не видел.
    Ну как же, в описании сказано: "Выполнение функций библиотеки синхронное"
    Поэтому предположение о считывании ретайнов у меня пока логически недоказано, я сделал попытку считывания рецептов и при передергивании питания у меня в модбас перестали сохраняться значения, попозже когда снова уделю время на эти операции может выяснится, что они просто перестали записыватся в ретайн, но это позже, сейчас пока вот такой факт имеет место

  6. #16
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    в главном цикле, сосчитать два файла одновременно
    Это невозможная ситуация, противоречие: если мы в одном потоке и пользуемся только синхронными операциями чтения, то ни о какой одновременности речи быть не может в принципе — такой код просто не получится написать. То есть вопрос поставлен некорректно.

    Даже если предположить, что ритэйны инициализируются и «консервируются» в отдельном потоке, то это всё равно происходит соответственно до и после исполнения написанной вами программы. Так что в теории конфликтов быть не должно.

    -------8<-------

    А, я, похоже, понял, в чём у вас загвоздка — наивное (для программирования) понимание терминов «синхронный» и «асинхронный». Ща будет разрыв шаблона: «синхронный» это последовательное исполнение, а «асинхронный» — параллельное. Правда, это очень-очень грубая формулировка. Рекомендую погуглить материалы для ознакомления с вопросом.
    Последний раз редактировалось Yegor; 10.09.2012 в 08:04.

  7. #17
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    бегло взглянув на программу не понравилось сравнение Поверстатус <> Поверстатус.
    Нужно в последней строке делать присвоение Поверстатус промежуточной переменной, к примеру Поверстатус_1. И сравнивать Поверсатус<>Поверстатус_1. Так будет корректнее и нагляднее.
    Не читал все сообщения, извиняюсь, если кто уже на это указывал.

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

    По умолчанию

    я уже проверил, сейчас и ретайны и рецепты вернули свои значения после включения питания, может как то связано что плк уже довольно старый и флеш изношена

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

    По умолчанию

    Цитата Сообщение от lara197a Посмотреть сообщение
    бегло взглянув на программу не понравилось сравнение Поверстатус <> Поверстатус.
    Нужно в последней строке делать присвоение Поверстатус промежуточной переменной, к примеру Поверстатус_1. И сравнивать Поверсатус<>Поверстатус_1. Так будет корректнее и нагляднее.
    Не читал все сообщения, извиняюсь, если кто уже на это указывал.
    в коде есть различия, как раз таки когда бегло то их не видно, переменные различаются "серединкой"

  10. #20
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,054

    По умолчанию

    Да нормально все у Егора. Тем более обещает обсудить если что.
    Псевдоасинхронно теме : csv кто-нибудь использует ?

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. SysLibTime
    от Chupakabra в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 11.10.2018, 14:26
  2. Немного про библиотеку SyslibTime
    от Ильнур в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 04.11.2012, 23:19
  3. Возможно ли решить нижеописанную задачу средствами Овен?
    от Вова в разделе Подбор Оборудования
    Ответов: 7
    Последнее сообщение: 23.02.2011, 14:40
  4. Миллисекунды в SysLibTime
    от Leonid в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 14.03.2010, 10:35
  5. Библиотека SysLibTime
    от Serp в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 01.10.2008, 15:14

Ваши права

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