Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.21;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
15-1190286598
ANTPro
2007-09-20 15:09
2007.10.21
Подкажите программу


15-1190486179
Veiron
2007-09-22 22:36
2007.10.21
Значение по умолчанию


4-1176989866
Dmitry_177
2007-04-19 17:37
2007.10.21
Правильно завершить ожидающий поток


2-1191087359
olevacho_
2007-09-29 21:35
2007.10.21
размеры формы


2-1190641305
Terc
2007-09-24 17:41
2007.10.21
дяденки Не посылайте меня HTML