Я хотел бы внести ясность. У меня следующая конфигурация системы: есть ПК, на котором установлен ОРС сервер, в котором находится массив байт (как он туда попадает не имеет значения). Далее клиент, написанный на VB с использованием tbl (OPC DA Wrapper), устанавливает связь, и по какому то событию (например по истечению таймера), считывает этот массив с использованием функции, которая экспортируется из этой самой tlb, а именно:
- Код: Выделить всё
ConnectedGroup.SyncRead 1, ItemCount, ServerHandles(), ReadValues, Errors'функция читающая из ОРС сервера
. Эта функция требует в качестве параметра массив типа variant, что следует из ее описание в idl:
- Код: Выделить всё
HRESULT SyncRead(
[in] short Source,
[in] long NumItems,
[in] SAFEARRAY(long)* ServerHandles,
'Вот это параметр:
[out] SAFEARRAY(VARIANT)* Values,
[out] SAFEARRAY(long)* Errors,
[out, optional] VARIANT* Qualities,
[out, optional] VARIANT* TimeStamps);
Vi писал(а):А пока это - всё домыслы
Почему домысл? Программа написана и работает. Функция, описанная выше, работает именно так, как я описал своем предыдущем посте. Это точно.
Vi писал(а):Я много лет работаю с СОМом и никогда не видел, чтобы СОМ (а это почти что ОРС) сам по себе изменял тип массивов.
И кое что уточнить: в моей программе я никаких интерфейсов DCOM не создавал и не использовал в явном виде. Все это делают закрытые функции в классе ОРС. Чтобы мне установить связь, достаточно написать OPCServer.Connect (IDPC, IDServer), где IDPC - IP адрес или, в случае внутренней сети, имя компьютера, а IDServer - имя ОРС сервера. Как, и по средствам каких интерфейсов, DCOM далее общаются между собой, я не знаю. Поэтому я не имею понятия о том, в каком виде ф-ция получает данные из ОРС сервера, я лишь
утверждаю, что мне она предоставляет их в виде массива вариантов, в котором каждый байт неявно приводится к типу вариант, и становится одним из элементов массива. Так же, как если бы исходным был не массив байт а массив слов. Каждое слово привелось бы неявно к варианту, и стало бы так же элементом массива. Это проверено опытным путем. Вот ссылка на документацию, описывающую используемую tlb:
http://www-ad.fnal.gov/controls/opc/OPC_DA_Auto_2.02_Specification.pdf