Просмотр полной версии : Регистрация Даты и времени пропадания и возвращения питания ПЛК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 - не будет.
(Важно: я пишу с другого компа, где CodeSys у меня не стоит, и поэтому не смогу дать точные названия функций и переменных из проекта - даю сам концепт)
Мысли от меня. Я ставил такие опыты на СПК1хх, и там в TargetVars была информация о числе включений ПЛК.
Я использовал PERSISTENT-переменные и хранил в них:
* Текущую дату
* Текущее число включений
При отключении питания ПЛК в них это и сохранялось.
Дальше я делал функцию, привязанную к системному событию PLCStarted.
Она стартовала раньше, чем PERSISTENT-переменные получали новые значения при работе программы ПЛК.
И вот в ней я копировал значения из PERSITENT-переменных во временные обычные.
Получалось, что на момент следующего включения ПЛК я имел:
* Текущие Дату и Время
* Текущее число включений
* Прошлые Дату и Время
* Прошлое число включений
И по разнице числа включений я мог определить то, что ПЛК отключался.
А по датам - когда это было.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot