Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все по ФБ (VS6).doc
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
210 Кб
Скачать
☆

Получение признака качества

Для того чтобы получить признак качества значения, нужно вызвать

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 считается началом, а обратный переход – концом одного сообщения.