Форум: "Corba";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизOPC клиент (передача серверу нескольких значений переменных) Найти похожие ветки
← →
sam98 © (2006-01-26 11:36) [0]Файл №1 содержит следующий фрагмент определения типов:
...
type
TOleEnum = type Integer;
OPCHANDLE = DWORD;
POPCHANDLE = ^OPCHANDLE;
OPCHANDLEARRAY = array[0..65535] of OPCHANDLE;
POPCHANDLEARRAY = ^OPCHANDLEARRAY;
PVarType = ^TVarType;
TVarTypeList = array[0..65535] of TVarType;
PVarTypeList = ^TVarTypeList;
POleVariant = ^OleVariant;
OleVariantArray = array[0..65535] of OleVariant;
POleVariantArray = ^OleVariantArray;
...
Файл №2 содержит следующий фрагмент определения интерфейса:
...
IOPCSyncIO = interface(IUnknown)
["{39C13A52-011E-11D0-9675-0020AFD8ADB3}"]
function Read(
dwSource: OPCDATASOURCE;
dwCount: DWORD;
phServer: POPCHANDLEARRAY;
out ppItemValues: POPCITEMSTATEARRAY;
out ppErrors: PResultList): HResult; stdcall;
function Write(
dwCount: DWORD;
phServer: POPCHANDLEARRAY;
pItemValues: POleVariantArray;
out ppErrors: PResultList): HResult; stdcall;
end;
...
В Файле №3 определены функции чтения и записи, использующие вызовы соответствующих функций из IOPCSyncIO, для ОДНОЙ переменной.
...
// wrapper for IOPCSyncIO.Read (single item only)
function ReadOPCGroupItemValue(GroupIf: IUnknown; ItemServerHandle: OPCHANDLE;
var ItemValue: string; var ItemQuality: Word): HResult;
var
SyncIOIf: IOPCSyncIO;
Errors: PResultList;
ItemValues: POPCITEMSTATEARRAY;
begin
Result := E_FAIL;
try
SyncIOIf := GroupIf as IOPCSyncIO;
except
SyncIOIf := nil;
end;
if SyncIOIf <> nil then begin
Result := SyncIOIf.Read(OPC_DS_CACHE, 1, @ItemServerHandle, ItemValues,
Errors);
if Succeeded(Result) then begin
Result := Errors[0];
CoTaskMemFree(Errors);
ItemValue := VarToStr(ItemValues[0].vDataValue);
ItemQuality := ItemValues[0].wQuality;
VariantClear(ItemValues[0].vDataValue);
CoTaskMemFree(ItemValues);
end;
end;
end;
// wrapper for IOPCSyncIO.Write (single item only)
function WriteOPCGroupItemValue(GroupIf: IUnknown; ItemServerHandle: OPCHANDLE;
ItemValue: OleVariant): HResult;
var
SyncIOIf: IOPCSyncIO;
Errors: PResultList;
begin
Result := E_FAIL;
try
SyncIOIf := GroupIf as IOPCSyncIO;
except
SyncIOIf := nil;
end;
if SyncIOIf <> nil then
begin
Result := SyncIOIf.Write(1, @ItemServerHandle, @ItemValue, Errors);
if Succeeded(Result) then
begin
Result := Errors[0];
CoTaskMemFree(Errors);
end;
end;
end;
...
Файл №4 содержит определения переменных и вызовы функций :
...
const
ServerProgID = "Lectus.da.2";
Item0Name = "Node.Cmd.C1";
Item1Name = "Node.Cmd.C2";
...
var
ServerIf: IOPCServer;
GroupIf: IOPCItemMgt;
GroupHandle: OPCHANDLE;
Item0Handle: OPCHANDLE;
Item1Handle: OPCHANDLE;
ItemType: TVarType;
ItemValue: string;
ItemQuality: Word;
HR: HResult;
...
HR := ReadOPCGroupItemValue(GroupIf, Item1Handle, ItemValue, ItemQuality);
{ Обработка значени HR }
...
{ Прочитанное значение увеличиваем на 1 }
ItemValue := IntToStr( StrToInt( ItemValue ) + 1 );
HR := WriteOPCGroupItemValue(GroupIf, Item1Handle, ItemValue);
...
Задача заключается в следующем, в файле №3 нужно определить новые функции чтения и записи, которые бы позволяли передавать не одно значение, как это сделано в данном примере, а сразу несколько.
Потому что определение функциий интерфейса из Файла №2 позволяет это сделать.
Как мне представляется в Файле №4 следует ввести следующие два указателя на массивы указателей:
IHandle : POPCHANDLEARRAY;
IValue : POleVariantArray;
Далее проинициализировать IHandle таким образом, чтобы он содержал ссылки на Item0Name, Item1Name.
IValue - содержит ссылки значений переменный .
А потом эти указатели передать в вызовы функции чтения - записи
интерфейса IOPCSyncIO.
Подскажите мне как правильно нужно это сделать ?
Заранее Спасибо. :-)
← →
AbrosimovA (2006-01-30 09:17) [1]А что мешает сделать так:
function ReadOPCGroupItemValues(GroupIf: IUnknown; dwCount: integer;
ItemServerHandle: POPCHANDLEARRAY; var ItemValues: POPCITEMSTATEARRAY;
var Errors: PResultList): HResult;
var
SyncIOIf: IOPCSyncIO;
begin
Result := E_FAIL;
try
SyncIOIf := GroupIf as IOPCSyncIO;
except
SyncIOIf := nil;
Exit;
end;
Result := SyncIOIf.Read(OPC_DS_CACHE, dwCount, @ItemServerHandle, ItemValues,
Errors);
SyncIOIf := nil;
end;
end;
← →
AbrosimovA (2006-01-30 09:20) [2]
> @ItemServerHandle
@ не нужно
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c