Показано с 1 по 10 из 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.

Похожие темы

  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

Ваши права

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