Составные пользовательские блоки могут содержать внутри блоки из библиотеки paSync. В этом случае синхронизация блоков работает автоматически. Количество вложенностей составных блоков должна быть не больше 7.
Пользовательские блоки на С++ могут также быть синхронизируемыми. Для этого при создании блока необходимо:
- значения, которые должны синхронизироваться, сделать выходами блока
- описать дополнительные переменные в классе, в которых будут храниться значения синхронизированные с ведущего (одна дополнительная переменная на каждый выход из п.1)
- при инициализации задать соответсвие между дополнительными переменными (из п.2) и выходами (из п.1) при помощи функции
paSync_SyncManager::regSyncData - в основном цикле проверять активность синхронизации при помощи функции
paSync_SyncManager::isSyncOnи подставлять синхронизированные значения - в проекте или библиотеке обеспечить наличие ссылок на библиотеки paControls и paSync (это можно сделать создав любой блок из этих библиотек, либо вручную как описано ниже)
Пример создания библиотеки Test с синхронизируемым блоком TestInteg
- В библиотеке Test создаем ссылку на paControls. Для этого в разделе Ссылки делаем ПКМ- создать группу типов, называем paControls. В свойствах нового раздела добавляем свойство Уникальный идентификатор и копируем в него значение из такого же свойства библиотеки paControls (сам идентификатор в библиотеке не выделяется, но достаточно кликнуть по полю и нажать Сtrl+C).
- Аналогичным образом добавляем ссылку на paSync.
- Добавляем тип блока TestInteg
- В блоке TestInteg создаем файл TestInteg.hpp. Там создаем вспомогательную переменную.
TestInteg.hpp
float m_bal_out; //значение от мастера для балансировки выхода ведомого - В блоке TestInteg создаем файл TestInteg.init. В нем вызываем paSync_SyncManager::regSyncData для связки выхода out ведущего с переменной внутри ведомого.
TestInteg.init
paSync_SyncManager::regSyncData( (CBaseBlock*)this, &out, &m_bal_out ); - Добавляем код в work. Обрабатываем условие: если синхронизация активна, то в промежуточные переменные подставляем нужные значения, т.е. 1 на бит балансировки и m_bal_out на балансировочное значение.
TestInteg.work// локальные переменные для входов и выходов float loc_base = (*base); uint8_t loc_reset = (*reset); float loc_out = out; if ( paSync_SyncManager::isSyncOn(this) ) { // синхронизация включена, это ведомый loc_reset = 1; loc_base = m_bal_out; } if ( ( loc_reset ) == 0 ) { for ( int i=0; i<inputs_num; i++ ) { loc_out += (*inputs[i]); } } else loc_out = loc_base; // обновление выхода out = loc_out;