Синхронизация времени Magelis и M340

Задание: синхронизировать время в ПЛК (Modicon М340) с временем на панели (Magelis XBTGT)
по команде оператора (по нажатию кнопки).

1. Время на панели меняется оператором с помощью существующих на ней системных окон.
Для этого можно вызвать системное окно конфигурации панели,
например по нажатию переключателя (switch) со следующими настройками.

2. Добраться в панели к значению этого времени можно через системные внутренние переменные:
_Year4, _Month, _Day, _Hour, _Minutes, _Seconds  

3. Трудность заключается в том,
что все значения с этой группы переменных должны быть записаны в ПЛК одновременно,
а не по одной, как обычно это делает панель при изменении значения переменной.
Для этого в Magelis используем блочные переменные (Block Variable).
Сначала создаем блочную переменную типа INT - NOW_SP:
Эта переменная содержит 6 элементов типа INT,
привязанных к адресам %MW178-%MW183.

4. Чтение блочной переменной будет производиться периодически, аналогично как для остальных переменных,
но с учетом их обязательного группового чтения (консистентность данных).
Для записи значения блочной переменной в ПЛК, необходимо использовать специальный метод  sendData.
Учитывая все особенности использования блочных переменных, запишем скрипт,
который будет вызываться при нажимании (When Touch) на кнопке пересылки даты/времени в ПЛК:



Переменная DataIsGood нужна для проверки качества блочной переменной NOW_SP.
Это делается для удостоверения наличия связи с ПЛК.
Если связь нормальная (DataIsGood) - записываем значение:
года, месяца, дня, часа, минуты, секунды, соответственно 0-й…5-й элемент блочной переменной.
После этого производится отправка данных на ПЛК (метод sendData).

5. На стороне ПЛК создаем структурный тип DT_INT и переменную на основе этого типа NOW_INT_SP,
с заведомо определенными согласно пункту 3 адресами.







6. Программу в М340 запишем на языке FBD.
Для начала проверяем наличие хотя бы одного  некорректного значения переменной (например 0).
Если в дате есть хотя бы одно таковое, отправляем программу по метке NoSETDT,
минуя программу обновления значения системного времени ПЛК. 
 7. Ненулевая дата означает наличие новых данных для записи в системное время,
так как данные потом в ПЛК обнуляются.
Запись системного времени проводится с помощью функции WRTC_DT,
которая на входе принимает переменную типа DT.
Тип DT же формируется с помощью массива с 4-х элементов типа INT,
сохраняющих дату/время в формате BCD, а именно:
  0 -  seconds,-- (16#ss,--),
  1 - hour, minute (16#hhmm),
  2 -  month, day (16#mmdd), 
  3 - year (16#yyyy),
Например, если массив DateAndTime_ARRAY: 
DateAndTime_ARRAY[1] = 16#1600
DateAndTime_ARRAY[2] = 16#1046
DateAndTime_ARRAY[3] = 16#0511
DateAndTime_ARRAY[4] = 16#2006
то код в ST
DT_Variable := ARINT_TO_DT (DateAndTime_ARRAY) ;
даст результат
DT_Variable = dt#2006-05-11-10:46:16

Исходя из этого, создаем массив NOW_SP для хранения даты/времени в формате BCD

8. Записываем в NOW_SP значение переданные с панели,
предварительно преобразовывая в формат BCD.
Для смещения байт в словах используем функции SHL и OR.



9. Преобразовываем массив INT(в формате BCD) в DT и перезаписываем системное время.

В результате достигается синхронизация с точностью порядка в 1-3 секунды,
в зависимости от используемой коммуникации.

Comments