Внешние программы реально-временного про-смотра и обработки данных
Это программы, которые не возвращают результатов. Такими программами являются про-граммы визуализации, печати и т.п.. Они присоединяются к REALTIME как DCOM-клиенты по интерфейсу IIMSViewService и получают события по интерфейсу IIMSEventService. Интерфейсы описаны в файле REALTIME.TLB.
IIMSViewService {11A45860-0657-11D4-AF5F-0050DA79C21E}
IIMSEventService {11A45869-0657-11D4-AF5F-0050DA79C21E}
При присоединении по интерфейсу IIMSViewService программа должна передать в REALTIME следующую информацию о себе с помощью метода IIMSViewService\ViewerInfo со следующими параметрами:
• имя программы обработки;
• сетевое имя компьютера, на котором работает программа;
• адрес переменной, по которой будет возвращен результат выполнения.
Сервер интерфейса событий создается в клиенте, а в REALTIME пересылается указатель на него с помощью метода IIMSViewService\Advise. Для отсоединения сервера событий перед закрытием соединения вызовите метод IIMSViewService\Unadvise. По интерфейсу событий драйвер получает следующие события:
• IIMSEventService\EvDisconnectAndTest «проверка соединения или просьба за-крыть соединение» - эти события отличаются по флагу TestSignal:
o TRUE – сервер проверяет соединение, нужно только вернуть OK.
o FALSE – сервер просит закрыть соединение, так как он завершает выполне-ние. Рекомендуем восстанавливать соединение не менее чем через 30 се-кунд, так как возможно пользователь перезагружает компьютер.
• IIMSEventService\EvNewDataReady «событие прихода новых данных» - это со-бытие отсылается при окончании обработки новых данных.
• IIMSEventService\EvAutoSendData «событие автоматической отсылки данных клиенту» - это событие генерируется, если клиент заказал прием данных в автома-тическом режиме. По этому событию сервер отсылает новые данные по предвари-тельно заказанному списку параметров клиенту. Таким образом нет необходимости постоянно опрашивать сервер на наличие новых данных.
Клиент в любое время при наличии связи с REALTIME может изменять или устанавли-вать режим передачи данных с помощью метода IIMSViewService\SetModes, имеющего следующие параметры:
• OnlyModified – флаг передачи только изменившихся значений. Включенный флаг уменьшает загрузку трафика сети и времени на передачу данных.
• UseAutoSend – флаг автоматической передачи новых данных. При включенном флаге REALTIME автоматически отсылает новые данные клиенту, то есть клиент работает по событиям, не тратя времени на постоянный или периодический опрос REALTIME об изменении данных. Этот флаг работает только при наличии сервера событий IIMSEventService в клиенте.
Запрашивать данные REALTIME можно 2-мя способами:
• Прием данных по передаваемому списку параметров с помощью метода IIMSViewService\GetDataByList . В параметрах передаются:
o ListItems – массив кодов заказываемых параметров. Это значение типа VARIANT, содержащий в себе массив кодов параметров из справочника DTCIS.
o DataArray – ссылка на значение типа VARIANT, в который будут записаны значения заказанных параметров в формате, описанном выше.
o ResultFlag – флаг выполнения операции.
• Прием данных по заказанному списку параметров. Для этого используются сле-дующие методы:
o IIMSViewService\ClearList – очистить список заказываемых параметров в сервере;
o IIMSViewService\SetListItems – добавить параметры в список заказывае-мых параметров;
o IIMSViewService\GetListData – запрос данных по заказанному списку.
Оба способа не исключают друг друга, то есть при необходимости вы можете переклю-чаться между ними в вашем приложении, при этом список заказываемых параметров не будет изменен.
Передача данных клиентам осуществляется в виде значения типа VARIANT. В это значе-ние записан массив заказанных параметров. Каждый параметр представлен в виде массива 3-х чисел: код параметра, код единицы измерения, значение. Кодировка пара-метров в соответствии со справочником DTCIS. Для примера приводим код распаковки одного элемента массива присланных данных, написанный в среде C++Builder
bool GetDataItem(Variant Data, SPVServiceDataItem *DataItem)
{
try {
// инициализация
ZeroMemory(DataItem, sizeof(SPVServiceDataItem));
// распаковать код параметра
DataItem->Code = int(Data.GetElement(1));
// распаковать код единицы измерения
DataItem->UnitCode = int(Data.GetElement(2));
// распаковать значение параметра
DataItem->Value = Data.GetElement(3);
return true;
}
catch(...)
{
return false;
}
}