Задание: синхронизировать время в ПЛК (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 секунды, в зависимости от используемой коммуникации. |