Есть у кого-нибудь пример как правильно это реализовать? Я так понимаю нужно смотреть в сторону PersistentVars и OwenRTC.
Пример см. ниже. Использовал для хранения RETAIN, но если подразумевается, что проект будет дорабатываться, а лог нельзя при этом терять - то да, можно перейти на PERSISTENT. Соответственно, будет достаточно перенести переменные из области VAR RETAIN программы в узел PersistentVars.

Сообщение от
aspirine
я это представляю как некий массив(или набор регистров), когда питание пропадает, ПЛК пишет дату и время пропадания. Когда он включается, соответвенно так же пишет.Я уперся в то что не нашел никаких встроенных средств остлеживания состояния питания ПЛК.
Встроенных средств в ПЛК200 действительно нет. Так что узнать о факте выключения ПЛК можно только в момент его включения.
Вот простейший пример, который вы можете рассматривать как отправную точку для решения своей задачи:
Код:
{attribute 'qualified_only'}
{attribute 'strict'}
// Перечисление со списком возможных событий
TYPE EVENT :
(
UNDEFINED := 0,
POWER_OFF := 1,
POWER_ON := 2
) BYTE;
END_TYPE
Код:
// Структура данных события
{attribute 'pack_mode' := '1'}
TYPE EVENT_DATA :
STRUCT
dtTimeStamp: DT;
eEvent: EVENT;
END_STRUCT
END_TYPE
Код:
PROGRAM PLC_PRG
VAR
xInit: BOOL;
END_VAR
VAR RETAIN
astEventBuffer: ARRAY [1..c_uiMaxEventCount] OF EVENT_DATA;
uiCurrentEventId: UINT;
dtRetainTimeStamp: DT;
// TRUE - буфер как минимум один раз переполнился и начал перезаписываться заново
xIsEventBufferOverflow: BOOL;
END_VAR
VAR CONSTANT
// Максимальное кол-во событий в буфере
c_uiMaxEventCount: UINT := 100;
END_VAR
// код программы
// При запуске приложения ПЛК - однократно фиксируем метку времени его отключения и включения
IF NOT(xInit) THEN
IF uiCurrentEventId >= (c_uiMaxEventCount - 1) THEN
uiCurrentEventId := 0;
xIsEventBufferOverflow := TRUE;
END_IF
uiCurrentEventId := uiCurrentEventId + 1;
astEventBuffer[uiCurrentEventId].dtTimeStamp := dtRetainTimeStamp;
astEventBuffer[uiCurrentEventId].eEvent := EVENT.POWER_OFF;
uiCurrentEventId := uiCurrentEventId + 1;
// эта переменная привязана в OwenRTC к каналу "Date and time"
astEventBuffer[uiCurrentEventId].dtTimeStamp := TargetVars.stRtc.dtDateAndTime;
astEventBuffer[uiCurrentEventId].eEvent := EVENT.POWER_ON;
xInit := TRUE;
END_IF
// Это позволит узнать метку времени выключения ПЛК
dtRetainTimeStamp := TargetVars.stRtc.dtDateAndTime;
при пропадании питания ПЛК успеет выполнить "PrepareStop" (и будет ли вообще?)
ПЛК200 - не будет.