Здравствуйте! Возникла такая проблема, необходимо изменить уставку регулятора на объекте с АРМа компьютера диспетчера. На компьютере диспетчера запущен экран диспетчера и модель для объектов. При изменении уставки на компьютере диспетчера она записывается в КУставку, передается на контроллер на объекте и должна считываться в ИУставку. Компонент регулятора на объекте работает по такому принципу и все нормально работает. На компьютере диспетчера новая уставка записывается в КУставку. но в базе параметров WinDecont можно увидеть, что флаг динамики при этом не установлен и в таком виде она передается на контроллер на объекте и без флага динамики не считывается и не меняется. Соответствие номеров сигналов в модели проверено. Если в базе параметров WinDecont вручную установить флаг динамики, то значение ИУставка на объекте меняется.
Ниже приведена функция и небольшой фрагмент кода программы, которые отвечают за изменение уставки регулятора.
void __fastcall TfCtp4::UstReg(const AnsiString aFullRelativeOpcName,
TdepOpcListParUserFunc *aListParUserFunc, int aIndexParChange,
bool aAllConnected, bool aAllChanged, Variant &aWriteValue,
bool &aQualitySpecified, WORD &aWriteQuality, bool &aWriting)
{
if(flWait==1) {
aWriting=true;
aWriteValue=edUst->Text;
pnU->Visible=false;
flWait=0;
}
Если диспетчер хочет изменить уставку регулятора, то flWait==1 и aWriting=true и aWriteValue=edUst->Text, форма изменения уставки становится невидимой и flWait=0.
Подразумевается, что параметр Writing отвечает за установку признака динамики. Подскажите пожалуйста, как правильно выйти из данной ситуации.
Не устанавливается признак динамики в WinDecont
Добрый день! Прошу прощения, но в моем ящике lgmk@mail.ru ответа на этот вопрос нет, может быть, произошла какая-то ошибка?
В ОРС нет такого понятия, как признак динамики. В нашей системе внизу признак тревоги расценивается как признак динамики. Поэтому:
- aWriting означает писать или не писать значение
- aQualitySpecified означает записать качество(в терминах OPC), в котором можно установить признак тревоги
- с помощью функции procedure QualitySetAlarmed(var aQuality:
TdepOpcQuality; const b: Boolean); вы можете взвести тревогу
Поэтому, чтобы взвести тревогу надо написать:
aWriting = true;
aQualitySpecified = true;
QualitySetAlarmed(aWriteQuality, true);
- aWriting означает писать или не писать значение
- aQualitySpecified означает записать качество(в терминах OPC), в котором можно установить признак тревоги
- с помощью функции procedure QualitySetAlarmed(var aQuality:
TdepOpcQuality; const b: Boolean); вы можете взвести тревогу
Поэтому, чтобы взвести тревогу надо написать:
aWriting = true;
aQualitySpecified = true;
QualitySetAlarmed(aWriteQuality, true);
Для этого надо использовать тактовую функцию в моделе для элемента 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-клиента в этот выходной аналог будет устанавливаться бит Динамики.
Справка по Конструктору: "Программирование/Элементы 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-клиента в этот выходной аналог будет устанавливаться бит Динамики.