PDA

Просмотр полной версии : Регистрация Даты и времени пропадания и возвращения питания ПЛК200



aspirine
12.02.2026, 13:48
Добрый день!
Не смог найти или не понял. Есть ли в шаблонах ПЛК200 регистрация и сохранение данных параметров. Как я понял из мануала, watchdog ргестирует только програмные исключения и при перезагруки по питанию у него все обнуляется.
Есть у кого-нибудь пример как правильно это реализовать? Я так понимаю нужно смотреть в сторону PersistentVars и OwenRTC.

Евгений Кислов
12.02.2026, 15:33
Добрый день!
Не смог найти или не понял. Есть ли в шаблонах ПЛК200 регистрация и сохранение данных параметров. Как я понял из мануала, watchdog ргестирует только програмные исключения и при перезагруки по питанию у него все обнуляется.
Есть у кого-нибудь пример как правильно это реализовать? Я так понимаю нужно смотреть в сторону PersistentVars и OwenRTC.

Добрый день.
Уточните, как должна быть реализована эта регистрация?
Нужно записывать в некий файл информацию о каждом включении и выключении контроллера?

aspirine
13.02.2026, 19:41
я это представляю как некий массив(или набор регистров), когда питание пропадает, ПЛК пишет дату и время пропадания. Когда он включается, соответвенно так же пишет.
Я уперся в то что не нашел никаких встроенных средств остлеживания состояния питания ПЛК.

aspirine
13.02.2026, 19:42
Ну и соответветсвенно, самое главное тут иметь этот самый бит которые будет S при регистрации события. А

Емельянов Кирилл
14.02.2026, 03:26
В конфигурации задач есть вкладка системные события. Среди событий есть "PrepareStart" и "PrepareStop". Добавляете событие, создаёте для него функцию, в функции пишите обработку. Я иногда размещаю архивы событий в persistent переменных в виде массива, единственное тип события лучше указывать числовым кодом, а не текстом, а в таблице делать привязку через список текстов, тогда в память влезет очень много. Единственное не уверен, что при пропадании питания ПЛК успеет выполнить "PrepareStop" (и будет ли вообще?) - надо проверять.

Николай Суриков
14.02.2026, 10:24
Наверное надо брать ПЛК210-1х, там вроде можно даже успеть в файл что-нибудь записать при отключении питания.

Евгений Кислов
14.02.2026, 17:20
Есть у кого-нибудь пример как правильно это реализовать? Я так понимаю нужно смотреть в сторону PersistentVars и OwenRTC.

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



я это представляю как некий массив(или набор регистров), когда питание пропадает, ПЛК пишет дату и время пропадания. Когда он включается, соответвенно так же пишет.Я уперся в то что не нашел никаких встроенных средств остлеживания состояния питания ПЛК.

Встроенных средств в ПЛК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 - не будет.

Cs-Cs
15.02.2026, 00:20
(Важно: я пишу с другого компа, где CodeSys у меня не стоит, и поэтому не смогу дать точные названия функций и переменных из проекта - даю сам концепт)
Мысли от меня. Я ставил такие опыты на СПК1хх, и там в TargetVars была информация о числе включений ПЛК.
Я использовал PERSISTENT-переменные и хранил в них:
* Текущую дату
* Текущее число включений
При отключении питания ПЛК в них это и сохранялось.

Дальше я делал функцию, привязанную к системному событию PLCStarted.
Она стартовала раньше, чем PERSISTENT-переменные получали новые значения при работе программы ПЛК.
И вот в ней я копировал значения из PERSITENT-переменных во временные обычные.

Получалось, что на момент следующего включения ПЛК я имел:
* Текущие Дату и Время
* Текущее число включений
* Прошлые Дату и Время
* Прошлое число включений

И по разнице числа включений я мог определить то, что ПЛК отключался.
А по датам - когда это было.