
- •Введение
- •Создание функциональных блоков Создание новой библиотеки функциональных блоков
- •Последовательность разработки функциональных блоков
- •Использование групп, набор входов которых определяется пользователем.
- •Определение группы free_pingroup_def в фб.
- •Инструкция по внедрению шаблона cfbPropPageImpl в страничку свойств функционального блока.
- •Атрибуты входов, находящихся в группе free_pingroup_def.
- •Проверка правильности в страничках свойств.
- •Использование таймера в функциональных блоках.
- •Получение событий от таймера
- •Получение текущего времени
- •Признаки качества в Функциональных блоках Коды признака качества значения
- •Установка признаков качества выходов фб
- •Получение признака качества
- •Передача признаков качества входа выходу
- •Сообщения в фб.
- •Вывод информация об ошибках в фб в протокол работы.
- •Восстановление состояния фб при горячем рестарте.
- •Страницы свойств фб
- •Справка к фб
- •Справка к страницам свойств фб
- •Разработка визуальных фб на основе существующей библиотеки фб
- •Создание общего h-файла (подкл в файл описания фб и файл описания контрола)
- •Изменения в создании фб
- •Создание ActiveX контрола
- •Чтобы создать свойства нужно:
Использование групп, набор входов которых определяется пользователем.
Шаблон CFBPropPageImpl предназначен для создания страничек свойств функциональных блоков. Этот шаблон обеспечивает управление составом группы входов этого ФБ (определенной с помощью макроса FREE_PINGROUP_DEF) со стороны пользователя (добавление входа, удаление входа, переименование, перетаскивание выходов из дерева).
Определение группы free_pingroup_def в фб.
С помощью этого макроса можно определить группу входов, которая может содержать входы с произвольными именами и произвольных типов.
Для этого в раздел BEGIN_FB_MAP нужно поместить строчку
FREE_PINGROUP_DEF (GROUP_ID, "Group Name"),
где GROUP_ID – идентификатор группы (определенный в BEGIN_GROUP_NAMES_DEF),
"Group Name" – имя группы.
Группа изначально создается пустой. Добавление и удаление входов обычно осуществляется со странички свойств с использованием шаблона CFBPropPageImpl.
Необходимо обеспечить персистентность структуры блока. Если функциональный блок использует класс IPersistStreamInitImpl (из ATL) для обеспечения своей персистентности, то достаточно в описание класса поместить макрос FB_STANDARD_LOAD_SAVE (CMyClass).
Если же интерфейс IpersistStreamInit реализуется вручную, то в функцию Load нужно добавить LoadItems (pStm), а в функцию Save - SaveItems (pStm).
Инструкция по внедрению шаблона cfbPropPageImpl в страничку свойств функционального блока.
В редакторе ресурсов создать ListView установить стиль просмотра Report, назначив ему ID = IDC_LIST_GROUPMAP и установить стиль просмотра - Report, создать кнопки «Добавить» и «Удалить» (IDC_ADD_GROUPMAP и IDC_DEL_GROUPMAP соответственно).
В header-файл класса странички свойств добавить #include "FBPropPageImpl.h".
Нужно определить идентификаторы групп функционального блока (из BEGIN_GROUP_NAMES_DEF). Описать их как enum еще раз в страничке свойств. Например:
enum
{
SINGROUP,
SAWGROUP,
FREEGROUP
};
Параметризовать шаблон CFBPropPageImpl (поскольку он используется в 2 местах лучше его переименовать) :
class CMyPP;
typedef CFBPropPageImpl<CMyPP, GROUP_ID> CGROUPImpl; где CMyPP – класс странички свойств, GROUP_ID – идентификатор группы, CGROUPImpl – произвольный идентификатор.
В список базовых классов добавить CGROUPImpl (переименованный шаблон CFBPropPageImpl).
В раздел BEGIN_MSG_MAP вначале вставить переадресацию сообщений базовому классу CHAIN_MSG_MAP (CGROUPImpl).
В функции Apply вызвать HRESULT hr = ApplyGroup(); (определена в CFBPropPageImpl). Эта функция переносит набор входов, сформированный на страничке свойств, в определение группы в функциональном блоке.
При получении сообщения WM_INITDIALOG описание набора входов из ФБ заносится в массив m_items, а также формируется ListView. Массив m_items модифицируется при добавлении, удалении, переименовании. Позиции входов в массиве m_items соответствуют позициям в ListView.
Функциональный блок содержит подобный массив. Функция ApplyGroup() очищает этот массив и заносит в него описания всех входов из массива странички свойств m_items.
Атрибуты входов, находящихся в группе free_pingroup_def.
Имя – отображается в дереве проекта. Может меняться (при переименовании входа в ListView).
Индекс – позиция данного входа в массиве входов данной группы. Может меняться при удалении других входов.
ID – однозначно идентифицирует вход. Присваивается при первоначальном создании входа.
Тип – при перетаскивании выхода устанавливается равным типу выхода.
Значение по умолчанию – …