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

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

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

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

    По умолчанию

    Это иллюстрация подхода, а не готовый код. Написано дома во время больничного без проверки на контроллере. Там ещё фраза есть:
    Что-то вроде такого
    Если кому-то нужен рабочий проверенный код, то пожалуйста:
    Код:
    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. #2

    По умолчанию

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

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

    По умолчанию

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

Похожие темы

  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

Ваши права

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