Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.063 c
2-1190999717
Pacific
2007-09-28 21:15
2007.10.21
System


2-1190654029
Евгений Р.
2007-09-24 21:13
2007.10.21
Номер записи в tCollection


2-1190909885
_@_@_
2007-09-27 20:18
2007.10.21
Как в Memo отловить перенос строки.


2-1190619662
F@T@L_Err0r
2007-09-24 11:41
2007.10.21
TrackBar


3-1181792140
Klopan
2007-06-14 07:35
2007.10.21
Текстовые поля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский