- •Введение
- •Создание функциональных блоков Создание новой библиотеки функциональных блоков
- •Последовательность разработки функциональных блоков
- •Использование групп, набор входов которых определяется пользователем.
- •Определение группы free_pingroup_def в фб.
- •Инструкция по внедрению шаблона cfbPropPageImpl в страничку свойств функционального блока.
- •Атрибуты входов, находящихся в группе free_pingroup_def.
- •Получение событий от таймера
- •Получение текущего времени
- •Проверка правильности в страничках свойств.
- •Использование таймера в функциональных блоках.
- •Признаки качества в Функциональных блоках Коды признака качества значения
- •Установка признаков качества выходов фб
- •Получение признака качества
- •Передача признаков качества входа выходу
- •Сообщения в фб.
- •Вывод информация об ошибках в фб в протокол работы.
- •Восстановление состояния фб при горячем рестарте.
- •Страницы свойств фб
- •Справка к фб
- •Справка к страницам свойств фб
- •Разработка визуальных фб на основе существующей библиотеки фб
- •Создание общего h-файла (подкл в файл описания фб и файл описания контрола)
- •Изменения в создании фб
- •Создание ActiveX контрола
- •Чтобы создать свойства нужно:
Получение признака качества
Для того чтобы получить признак качества значения, нужно вызвать
CComVariant varVal;
DWORD dwValidity;
FILETIME ft;
GetPinData (id, &varVal, &ft, &dwValidity);
В dwValidity и хранятся все признаки качества. Вот их список:
1.
Если превышаются параметры, заданные на страничке свойств выхода "Контроль
значений":
PC_MAX_SPEED Максимальная скорость изменения
PC_MIN_WARNING Нижняя предупредительная граница
PC_MIN_ERROR Нижняя аварийная граница
PC_MAX_WARNING Верхняя предупредительная граница
PC_MAX_ERROR Верхняя аварийная граница
Одновременно могут быть установлены сразу несколько признаков.
Для проверки наличия какого-то признака качества пишется что-то вроде
такого:
if (dwValidity & PC_MIN_ERROR)
{
//Установлен PC_MIN_ERROR
}
if (dwValidity & PC_MAX_WARNING)
{
//Установлен PC_MAX_WARNING
}
...
2.
Признаки качества, которые устанавливает ФБ можно проверить с помощью такой конструкции:
if ((dwValidity & OPC_MASK) == OPC_QUALITY_DEVICE_FAILURE)
{
//Установлен OPC_QUALITY_DEVICE_FAILURE
}
else if ((dwValidity & OPC_MASK) == OPC_QUALITY_CONFIG_ERROR)
{
//Установлен OPC_QUALITY_CONFIG_ERROR
}
...
Одновременно может быть установлен только один из признаков.
Также можно получить признаки качества с помощью функций
DWORD GetPinValidity (long nPinIndex)
DWORD GetPinValidity (long nGroupIndex, long nPinIndex)
Можно получить отметку времени с помощью
FILETIME GetPinTimeStamp (long nPinIndex)
FILETIME GetPinTimeStamp (long nGroupIndex, long nPinIndex)
Передача признаков качества входа выходу
Возможна ситуация, когда значение выхода не является новой сущностью, а берется сразу от входа. В этом случае целесообразно передать признаки качества и метку времени входа выходу. Это можно сделать, запомнив полученные в функции GetPinData() значения метки времени и признака недостоверности и передав из затем в SetPoutData(). Если значение входа не используется в алгоритме, можно воспользоваться функцией
HRESULT GetPinSetPoutData(long lPinGroup, long lPinIndex, long lPoutGroup, long lPoutIndex)
Сообщения в фб.
Сообщения работают только в тех ФБ, в которых входы и выходы декларированы описанным выше способом (используют шаблон CFBImpl)
ФБ может выдавать сообщения в виде текстовой строки. Бывает два вида сообщений: предопределенные и определяемые разработчиком ФБ. Предопределенные имеют стандартные идентификаторы и имена.
1. Описание типов сообщений, выдаваемых ФБ:
В декларацию класса введите следующий макрос, в котором перечислите все идентификаторы не предопределенных сообщений, которые используются в этом ФБ.
BEGIN_EVENT_DEF
MyAlarm,
END_EVENT_DEF
Где MyAlarm – идентификатор сообщения (любое имя)
Введите макрос, в котором опишите все типы сообщений, которые используются в этом ФБ.
BEGIN_EVENT_MAP
SYSTEM_EVENT (EVENT_DIVIDE_BY_ZERO)
CUSTOM_EVENT (MyAlarm, _T("Мое сообщение"), Warning)
END_EVENT_MAP
SYSTEM_EVENT (ID) – описывает предопределенные сообщения с идентификатором ID.
Предопределенные сообщения
текст сообщения |
ID |
"Деление на 0" |
EVENT_DIVIDE_BY_ZERO |
"Недопустимое основание степени" |
EVENT_POWER |
"Недопустимый период тригонометрической функции" |
EVENT_SINUS |
"Недопустимое основание логарифма" |
EVENT_LN |
"Некорректная точность сравнения" |
EVENT_ACCURACY |
"Некорректный интервал времени" |
EVENT_INTERVAL |
"Некорректное значение времени" |
EVENT_CLOCK |
CUSTOM_EVENT (ID, _T("Имя сообщения"), CategoryID) – описывает новое сообщение с идентификатором ID, который описан в разделе BEGIN_EVENT_DEF. CategoryID – идентификатор категории по умолчанию для этого сообщения (возможные значения – Error, Warning и UndefinedValue).
CUSTOM_EVENT_EX(ID, _T("Имя сообщения"), CategoryID, flags) – аналогично предыдущему макросу. В качестве flags можно указывать любую комбинацию таких флагов –
fbefDisable – по умолчанию сообщение отключено
fbefDisableAck – сообщение не требует квитарования
2. Как выдавать сообщения в Run Time режиме
вызвать функцию
FireEvent(ID)
, где ID – идентификатор сообщения. При этом текстом сообщения является имя этого сообщения;
если нужно изменить текст сообщения, нужно вызвать
FireEvent(ID, _T(“текст”))
3. Если необходимо избежать вылета сообщения на каждом такте, можно пользоваться функцией
SetEventState (MyError, условие, необяз строка сообщения)
Эта функция выдает сообщение только в случае, если значение условие TRUE, а предыдущее его значение FALSE. При этом, переход из FALSE в TRUE считается началом, а обратный переход – концом одного сообщения.
