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