Показано с 1 по 8 из 8

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

  1. #1

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

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

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,822

    По умолчанию

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

  3. #3

    По умолчанию

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

  4. #4

    По умолчанию

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

  5. #5

    По умолчанию

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

  6. #6

    По умолчанию

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

  7. #7
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,822

    По умолчанию

    Есть у кого-нибудь пример как правильно это реализовать? Я так понимаю нужно смотреть в сторону 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 - не будет.

  8. #8

    По умолчанию

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

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

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

    И по разнице числа включений я мог определить то, что ПЛК отключался.
    А по датам - когда это было.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

Похожие темы

  1. Ответов: 7
    Последнее сообщение: 10.07.2023, 14:33
  2. Ответов: 5
    Последнее сообщение: 14.08.2015, 15:01
  3. Ответов: 5
    Последнее сообщение: 31.05.2012, 12:18
  4. Ответов: 10
    Последнее сообщение: 04.09.2009, 08:34
  5. трм151 после пропадания питания
    от wiktors75 в разделе Эксплуатация
    Ответов: 6
    Последнее сообщение: 19.02.2009, 09:15

Ваши права

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