Пользовательские функции

Общие вопросы по оборудованию и программному обеспечению Компании ДЭП
Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 08 июн 2010, 05:42

При создании привязок создаются пользовательские функции:
для контроля
fastcall TfCtp14::RegCtrl(const AnsiString aFullRelativeOpcName,
TdepOpcListParUserFunc *aListParUserFunc, int aIndexParChange,
bool aAllConnected, bool aAllChanged, Variant &aValue, WORD &aQuality,
bool &aSetProperties)
для события
fastcall TfCtp14::PumpCmdOn(const AnsiString aFullRelativeOpcName,
TdepOpcListParUserFunc *aListParUserFunc, int aIndexParChange,
bool aAllConnected, bool aAllChanged, Variant &aWriteValue,
bool &aQualitySpecified, WORD &aWriteQuality, bool &aWriting)
Не нашел описания этих функций.
Опытным путем определил смысл параметров aFullRelativeOpcName, *aListParUserFunc, &aValue, &aWriteValue.
Будьте любезны, растолкуйте смысл остальных параметров. Или
скажите, где можно почитать.
С уважением, Б.Гаврилов
Теплосеть г. Королев.

Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 15 июн 2010, 04:42

Определен тип в модели:
Тип RegUst
Uv iInt
A wdNoA
Ustk wdAout

В привязке Uv=%f

Функция:
//--!-- virtual void RegUst::tact() ;public
void RegUst::tact()
{
inherited::tact();
if(Uv.value()!=0) {
Ustk=Uv;
A=true;
Uv=0;
}
else {A=true; Ustk=113; }
}

Результат: в базе WinDecont значение 113 без динамики, а нужно с битом динамики.
Примечание: пробовал A wdNoD с тем же результатом.
Помогите разобраться!
С уважением, Б.Гаврилов

Теплосеть г. Королев.

galina
Сообщения: 79
Зарегистрирован: 03 дек 2007, 09:56
Откуда: Компания "ДЭП"

Сообщение galina » 15 июн 2010, 14:18

Как выставлять динамику - написано в предыдущей теме:
http://www.dep.ru/forum/viewtopic.php?t=2273

Для этого надо использовать тактовую функцию в моделе для элемента wdAOut.

Справка по Конструктору: "Программирование/Элементы WinDecont":

Помимо перечисленных в разделе Элементы Windecont полей, типы wdDIn, wdDOut, wdAOut имеют поле D(bool) - признак динамики. Тип wdDIn при чтении из базы Windecont устанавливает поле D в true, если в дискрете установлен бит динамики. Поле D держится равным true на протяжении одного такта работы модели, затем сбрасывается в false. Для типов wdDOut и wdAOut если установлено поле D в true, то в элемент базы записывается значение с установленным битом динамики, после чего поле D сбрасывается в false.

и ещё базовые элементы имеют флаг:

"· bool written(); void setWritten(bool);

Признак записи некоторого значения в элемент после предыдущего такта работы.
Флаг взводится как при записи в элемент в методах обработки, так и при записи через OPC-интерфейс. Сбрасывается в конце такта после afterTact."


Поэтому, можно в тактовой функции написать что то подобное:

if( written() ) D=true;

Тогда при любой записи OPC-клиента в этот выходной аналог будет устанавливаться бит Динамики.

Dino
Сообщения: 163
Зарегистрирован: 21 фев 2005, 13:18
Откуда: Компания ДЭП

Сообщение Dino » 15 июн 2010, 17:59

Б.Е.Г. писал(а):Не нашел описания этих функций.
Опытным путем определил смысл параметров aFullRelativeOpcName, *aListParUserFunc, &aValue, &aWriteValue.
Будьте любезны, растолкуйте смысл остальных параметров. Или
скажите, где можно почитать.


Читайте файл помощи depComponentsPack3.chm(устанавливается вместе с depComponentsPack_RAD_Studio_2007-2010-3.x.exe) - OPC проект отображения мнемосхемы -> Редактор динамизации компонентов
-> Пользовательские функции.
С уважением Климов Александр
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150

Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 16 июн 2010, 15:00

Galina, здравствуйте. Спасибо за заботу. Но Вы не ответили на мой вопрос. Кстати, тактовую функцию я использовал.
Жду ответа.
С уважением, Б.Гаврилов

Теплосеть г. Королев.

Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 16 июн 2010, 15:16

Александр, здравствуйте. Спасибо.
Не скажу, что в Help'е описание полное. Я протестировал
WORD &aQuality и получил значения: 20 для неопределенных значений и 192 - для значений 0. Что это за цифры?
С уважением, Б.Гаврилов

Теплосеть г. Королев.

Dino
Сообщения: 163
Зарегистрирован: 21 фев 2005, 13:18
Откуда: Компания ДЭП

Сообщение Dino » 17 июн 2010, 13:56

Quality это качество в соответствии со спецификацией OPC Data Access. От значения сигнала оно не зависит, а просто можно сказать его дополняет. Смысловое значение данного параметра можно понять анализируя значения его битов. Можно почитать спецификацию OPC Data Access, а можно воспользоваться написанными нами функциями(depComponentsPack3.chm -> Программный доступ для расширенных возможностей -> Тип TdepOpcQuality и функции для работы с ним).
С уважением Климов Александр

Компания ДЭП

г. Москва

(495) 995-00-12 доб. 150

Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 20 июн 2010, 09:01

Жду ответа на мой вопрос от 15.06
С уважением, Б.Гаврилов

Теплосеть г. Королев.

galina
Сообщения: 79
Зарегистрирован: 03 дек 2007, 09:56
Откуда: Компания "ДЭП"

Сообщение galina » 20 июн 2010, 10:55

Вы получили ответ. Еще раз:
1) если вы используете тип wdDOut, wdAOut то в D надо писать true.
3) если wdDOutImp то динамика автоматически будет сформирована

Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 24 июн 2010, 14:33

Здравствуйте!
У меня такой вопрос: Дискретный согнал "Пожар" на объекте привязан к мнемосхеме через
пользовательскую функцию:
void __fastcall TfCTP3::ObjCtrl(const AnsiString aFullRelativeOpcName,
TdepOpcListParUserFunc *aListParUserFunc, int aIndexParChange,
bool aAllConnected, bool aAllChanged, Variant &aValue, WORD &aQuality,
bool &aSetProperties)
{
int p=aListParUserFunc->Items[0]->Value;
aValue=p;
//операторы организации оповещения оператора при аварии (р=1)
}
Функция возвращает два значения: 1 - пожар; 0 - в остальных случаях.
Нужно, чтобы возвращавлось три значения: 0,1,неопределенность.
Как это сделать?
Примечания:
1. речь идет о функции программы С++ мнемосхемы, а не модели.
2. Если можно использоать aQuality, то какое значение будет при чтении этого парматра?
С уважением, Б.Гаврилов

Теплосеть г. Королев.

galina
Сообщения: 79
Зарегистрирован: 03 дек 2007, 09:56
Откуда: Компания "ДЭП"

Сообщение galina » 25 июн 2010, 13:01

Для того, чтобы поставить неопределенность - надо использовать
procedure QualitySetBad(var aQuality: TdepOpcQuality);

Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 03 июл 2010, 11:39

Здравствуйте!
Скажите пожалуйста, как в "Конструкторе
"ОРС" можно определить неопределенность (недостоверность) параметра wdDin

А можно ли это сделать в С++? Я писал об этой проблеме, цититрую:
Б.Е.Г. писал(а):Здравствуйте!
У меня такой вопрос: Дискретный согнал "Пожар" на объекте привязан к мнемосхеме через
пользовательскую функцию:
void __fastcall TfCTP3::ObjCtrl(const AnsiString aFullRelativeOpcName,
TdepOpcListParUserFunc *aListParUserFunc, int aIndexParChange,
bool aAllConnected, bool aAllChanged, Variant &aValue, WORD &aQuality,
bool &aSetProperties)
{
int p=aListParUserFunc->Items[0]->Value;
aValue=p;
//операторы организации оповещения оператора при аварии (р=1)
}
Функция возвращает два значения: 1 - пожар; 0 - в остальных случаях.
Нужно, чтобы возвращавлось три значения: 0,1,неопределенность.
Как это сделать?
Примечания:
1. речь идет о функции программы С++ мнемосхемы, а не модели.
2. Если можно использоать aQuality, то какое значение будет при чтении этого парматра?
С уважением, Б.Гаврилов

Теплосеть г. Королев.

galina
Сообщения: 79
Зарегистрирован: 03 дек 2007, 09:56
Откуда: Компания "ДЭП"

Сообщение galina » 05 июл 2010, 10:38

Функция makeBad() делает элемент неопределенным

Аватара пользователя
Б.Е.Г.
Сообщения: 169
Зарегистрирован: 20 май 2009, 07:48
Откуда: Королев

Сообщение Б.Е.Г. » 05 июл 2010, 10:54

galina писал(а):Функция makeBad() делает элемент неопределенным

Здравствуйте, Галя!
Простите, но я спрашивал, как определить - в базе WinDecont парметр
опрелелен или нет.
Если нет связи или по какой-то другой причине параметр не определен, я должен отобразть параметр на мнемосхеме желтым цветом. если определен, отображается по значению: 0 - зеленый (норма), 1 - красный (авария).
Сейчас я не могу отличить неопределенность от значения 0. Представте, что творится на мнемосхеме, когда я работаю с PLDA!
И еще, Галя, я могу обрабатывать параметры в конструкторе ОРС (очевидно, там определена функция makeBad,) или в мнемосхеме, в среде С++, в пользовательской функции. А какие DEPовские функции определены в С?
С уважением, Б.Гаврилов

Теплосеть г. Королев.

galina
Сообщения: 79
Зарегистрирован: 03 дек 2007, 09:56
Откуда: Компания "ДЭП"

Сообщение galina » 06 июл 2010, 09:45

В модели:
· bool good();// Значение достоверно
· bool bad(); // Значение недостоверно
Для того, чтобы показать неопределенность желтым цветом, а в остальных случаях другими цветами, надо делать соответствующую привязку.. Сначала обрабатывать бит неопределенности, затем значение 0 и 1.