Библиотека paSync обеспечивает синхронизацию данных между дублированными модулями контроллеров и организацию резервирования.
Один из контроллеров выбирается ведущим – с ним синхронизируется ведомый контроллер. Синхронизация сигналов во время работы контроллеров обеспечивается для блоков с поддержкой синхронизации из библиотеки paSync, которые реализуют базовые алгоритмы аналогично блокам из библиотек paCore и paControls. Работа данных блоков описана в справке среды и в этом документе не рассматривается.
Для добавления библиотеки paSync в проект следует:
Перейти в меню Окна/Проекты. В появившемся окне отобразится текущий проект и добавленные библиотеки.

Добавление библиотеки Нажать кнопку Открыть и перейти в папку с файлами библиотеки, которую необходимо добавить.
В выпадающем списке выбрать тип файла Библиотека Полигон 2 (*.ll2).

Добавление библиотеки В окне появится файл библиотеки с расширением .ll2. Следует выбрать его и нажать Открыть.

Добавление библиотеки
Добавленная библиотека отобразится в окне Проекты.
Менеджер синхронизации (SyncMan)
Блок SyncMan обеспечивает синхронизацию данных между ведущим и ведомым контроллерами. В ведомом контроллере создается подписка на изменение данных от ведущего. Обмен происходит по протоколу OPC UA.
SyncMan основан на блоке OpcUAClient из библиотеки paOpcUA. Подробнее реализация протокола OPC UA в среде Полигон описана в документе Обмен с верхним уровнем. Библиотека paOpcUA.
Данный блок можно разместить только в Фоне.
Данные, необходимые для синхронизации блоков *_sync библиотеки paSync, добавляются в подписку автоматически. Дополнительные входы/выходы, которыми необходимо обмениваться с сервером, нужно добавить в раздел Данные внутри блока SyncMan.
Назначение входов и выходов SyncMan
| Элемент | Описание |
|---|---|
| Входы | |
| enb | Разрешение на работу блока |
| sync | Синхронизация: 0 – выключена; 1 – включена На данный вход можно подать инвертированный сигнал с выхода L_Master блока MasterSel или пользовательского блока, реализующего алгоритм определения ведущего контроллера. |
| wait | Таймаут ожидания ответа от сервера, мс (константный) |
| lip | Локальный IP адрес (константный) |
| lprt | Локальный порт (константный) |
| sdr | Сетевой стек, для ПЛК ОВЕН "/" (константный) |
| rip | IP адрес сервера (константный) |
| rprt | Порт сервера (константный) |
| usr | Логин для доступа к серверу (константный) |
| psw | Пароль для доступа к серверу (константный) |
| prio | Приоритет дополнительного потока (константный), в котором выполняется синхронизация. Обычно элемент задают выше других фоновых потоков, чтобы обеспечить максимальную скорость синхронизации: 0 – отключает создание дополнительного потока (обмен идет в текущем фоновом потоке); 1…47 – приоритет потока Максимально возможное значение приоритета для конкретной ОС контроллера можно определить с помощью блока ThreadMan из библиотеки paCore, раздел Системные. |
| rst | Сброс максимальных значений временных счетчиков: выходов mwrk и mscan |
| fnum | Максимальное количество подмененных во время отладки входов/выходов, которое можно синхронизировать: 0 – отключает синхронизацию подмененных значений |
| m_rbufs | Вход для подключения блоков типа BufSupEx (циклический) |
| Выходы | |
| sts | Статус работы: 0 – нет обмена; 1 – обмен; 2 – в резерве; >2 – переходное состояние |
| svld | Синхронизация работает |
| sst | Статус сервера в соответствии со спецификацией OPC UA (см. Part 5 – 12.6 ServerState) |
| ssl | Дополнительный статус сервера ServiceLevel в соответствии со спецификацией OPC UA (см. Part 4 – 6.6.2.4.2 ServiceLevel) |
| sid | ID подписки |
| ssn | Номер уведомления подписки |
| rcnt | Количество принятых пакетов |
| wcnt | Количество отправленных пакетов |
| prio | Приоритет дополнительного потока (0 – отключен) |
| dsz | Количество синхронизируемых данных (входов и выходов блоков *_sync и добавленных в раздел SyncMan) |
| wrk | Текущее время работы одного цикла потока синхронизации, мс |
| mwrk | Максимальное время работы одного цикла потока синхронизации, мс |
| scan | Текущее время получения всех изменившихся данных (входов и выходов) от соседнего контроллера, мс |
| mscan | Максимальное время получения всех изменившихся данных (входов и выходов) от соседнего контроллера, мс |
| diag | Диагностический счетчик (используется для контроля получения всех данных и расчета времени) |
| fnumo | Количество синхронизируемых подмененных во время отладки входов/выходов |

Выходы функциональных блоков, добавленные в раздел Данные, передаются на сервер всегда в соответствии со свойствами (подробнее см. в описании блока OpcUAClient из библиотеки paOpcUA).
Входы функциональных блоков, добавленные в раздел Данные, читаются из сервера в соответствии со следующими правилами:
Если у входа есть свойство ID источника/приемника, то он читается из сервера всегда при наличии связи. Такие данные используются для двустороннего обмена между ведущим и ведомым независимо от текущей роли контроллера.
Если у входа нет свойства ID источника/приемника, то он читается из сервера только при включенной синхронизации (sync = 1). Такие данные используются для синхронизации вручную.
Для синхронизации параметров можно использовать блоки BufSupEx, подключенные к входам m_rbufs блока SyncMan (дополнительные входы добавляются командой Создать). Значения параметров блока BufSupEx синхронизируются только при sync = 1.
Определение ведущего (MasterSel)
Блок MasterSel определяет роли ведущий/ведомый для двух контроллеров в резервированной конфигурации.
Назначение входов и выходов MasterSel
| Элемент | Описание |
|---|---|
| Входы | |
| me1 | Признак ПЛК1 (me1 = 1 у ПЛК1). Под ПЛК1 подразумевается тот контроллер, который должен становиться ведущим при неопределенных условиях (восстановление связи между двумя работающими контроллерами) |
| ready | Внешнее условие готовности контроллера (разрешение стать основным) |
| init | Запуск таймера на инициализацию |
| master1 | Команда ПЛК1 стать ведущим (внутри выделяется фронт с 0 на 1) |
| master2 | Команда ПЛК2 стать ведущим (внутри выделяется фронт с 0 на 1) |
| tpila | Таймер залипания пилы, мс |
| trecon | Таймер восстановления связи, мс |
| tinit | Таймер на инициализацию, мс |
| Выходы | |
| L_Master | Признак ведущего: 0 – данный контроллер ведомый; 1 – данный контроллер ведущий |
| L_pila | Диагностика: генерируемый пилообразный сигнал этого контроллера |
| L_ready | Диагностика: готовность этого контроллера |
| L_init_over | Инициализация завершена |
| conn_fault | Нет связи с соседним контроллером |
| R_pila_1 | Диагностика: пила соседнего контроллера по каналу связи 1 |
| R_pila_2 | Диагностика: пила соседнего контроллера по каналу связи 2 |
| R_ready | Диагностика: готовность соседнего контроллера |
| R_master | Диагностика: соседний контроллер ведущий |
После запуска программы контроллера, выход блока L_Master = 0, т.е. ПЛК является ведомым.
Любое из условий переключения в роль ведущего может сработать только после завершения инициализации (выход L_init_over = 1). Инициализация считается завершенной после окончания отсчета времени tinit от появления единицы на входе L_init (обычно сразу установлен в 1).
Контроллер может стать ведущим при одном из условий:
Если он ведомый и готов (L_Master = 0 и L_ready = 1), а соседний – не готов (R_ready = 0);
Если соседний ведущий контроллер получает команду на смену мастера (master1 или master2). Тогда этот контроллер станет ведущим, если он готов, или оба контроллера не готовы;
После восстановления связи между ПЛК, когда оба ведомые, и этот контроллер – ПЛК1 (вход me1 = 1);
При потере связи с соседним ПЛК (conn_fault = 0).
Контроллер может стать ведомым при одном из условий:
Если он ведущий и не готов (L_Master = 1 и L_ready = 0), а соседний – готов (R_ready = 1)
Если он получает команду на смену мастера (master1 или master2). Тогда другой контроллер станет ведущим, если он готов, или оба контроллера не готовы;
После восстановления связи между контроллерами, когда оба ведущие, и этот ПЛК – ПЛК2 (вход me1 = 0).
В иных случаях смены ролей не происходит.
Готовность контроллера (выход L_ready блока) формируется на основании двух условий по логике «И»:
Есть внешнее условие готовности, заводимое на вход ready;
Инициализация связи завершена.
Обмен данными с соседним контроллером происходит через две выделенные линии синхронизации. Связь контролируется посредством передачи по каждой линии пилообразного сигнала:
Если не происходит обновления значений пилообразных сигналов ни по одной линии за заданное время (вход tpila), то фиксируется потеря связи между ПЛК (выход conn_fault = 1);
Наличие связи фиксируется (выход conn_fault = 0) с задержкой времени (вход trecon) после того, когда снова начинают изменяться значения передаваемых пилообразных сигналов;
Текущие значения пилообразного сигнала выдаются на выходы: L_pila и R_pila_1, R_pila_2, соответственно, собственный сигнал и сигналы от соседнего контроллера по двум линиям связи.
Для обмена двумя диагностическими сигналами в проекте контроллера следует добавить в проект два менеджера SyncMan, каждый из которых связывается по своему порту.
Выход L_Master используется в прикладной программе для задания признака ведущего у линейки ввода/вывода. Инверсия выхода задает признак необходимости синхронизации (входы sync блоков SyncMan). Другие выходы блока можно использовать для диагностики и в пользовательской логике.

Пример работы с блоком приведен в разделе.