• plotn (01.06.09 12:27) [0]
    Господа, а работал ли кто нибудь с OPC HDA? Неделю бьюсь над 3мя строками - не могу разобраться.

    Скачал эмулятор от матрикона, HDA эксплорер от него же. В нем информация видна (тестирую один канал).

    Мне бы буквально прочитать массив данных с одного канала (пример) - дальше б разобрался сам.

    Код в дельфи (вылетает в дебаггер на HDASyncRead.ReadRaw становит на инструкцию ret в асм коде):

    function GetItemServerHandle(ServerIf: IUnknown;
     sItem: string; iClient: DWORD; var iServer: DWORD): HRESULT;
    var
     sItemW: WideString;
     PsItemW: POleStr;
     arrPsItemW: array [0..0] of pointer;
     arrClient: array [0..0] of DWORD;
     phClient, pphServer: POPCHANDLEARRAY;
     Errors: PResultList;

    begin
     Result := E_FAIL;
     iServer:=0;
     try
       ServIf := ServerIf as IOPCHDA_Server;
     except
       ServIf := nil;
     end;
     if ServIf <> nil then
     begin
       sItemW:=sItem; PsItemW:=POleStr(sItemW);
       arrPsItemW[0]:=PsItemW;
       arrClient[0]:=iClient;
       phClient:=@arrClient;
       Result := ServIf.GetItemHandles(1,
         @arrPsItemW, phClient, pphServer, Errors);
       if Succeeded(Result) then
       begin
         Result := Errors[0];
         CoTaskMemFree(Errors);
         iServer:=pphServer^[0];
         CoTaskMemFree(pphServer);
       end;
     end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var i: integer;
       iServerH: DWORD;
       Res: HRESULT;
       // чтение
       htStartTime:                OPCHDA_TIME;
       htEndTime:                  OPCHDA_TIME;
       dwNumValues:                DWORD;
       bBounds:                    BOOL;
       dwNumItems:                 DWORD;
       phServer:                   POPCHANDLEARRAY;
       arrServer:                  array [0..0] of DWORD;
       ppItemValues:               POPCHDA_ITEMARRAY;
       ppErrors:                   PResultList;
       ppItemValuesItem:           OPCHDA_ITEM;
       pvDataValues:               POleVariantArray;
    begin
     HDAServerIf :=nil;
     try
       HDAServerIf := CreateComObject(ProgIDToClassID('Matrikon.OPC.Simulation.1'))
         as IOPCHDA_Server;
       Res:=GetItemServerHandle(HDAServerIf,'Square Waves.Real8',
         1,iServerH);
       // Чтение данных
       HDASyncRead := CreateComObject(ProgIDToClassID('Matrikon.OPC.Simulation.1'))
         as IOPCHDA_SyncRead;
       htStartTime.bString:=false;
       htStartTime.ftTime:=DateTimeToFileTime(
         EncodeDate(2009,5,1));
       htEndTime.bString:=false;
       htEndTime.ftTime:=DateTimeToFileTime(now);
       arrServer[0]:=iServerH;
       phServer:=@arrServer;
       Res:=HDASyncRead.ReadRaw(htStartTime, htEndTime,10, False, 1,
         phServer,ppItemValues,ppErrors);
       if Res=E_FAIL then ShowMessage('fail');
       ppItemValuesItem:=ppItemValues^[0];
       pvDataValues:=ppItemValuesItem.pvDataValues;
       for i := 0 to 10 do
       begin
         ListBox1.AddItem(pvDataValues^[i],nil);
       end;
     except
       HDAServerIf := nil;
     end;
    end;
  • Тарас (09.11.11 12:03) [1]
    Покскажите пожалуйтса что это за такая функция DateTimeToFileTime??

    Сейчас делаю ОРС клиент HDA и возникла проблема с подачей временного промежутка.
      htStartTime:                OPCHDA_TIME;
      htEndTime:                  OPCHDA_TIME;

    А  OPCHDA_TIME = record
       bString:                            BOOL;
       szTime:                             POleStr;
       ftTime:                             TFileTime;
     end;

    Как правильн озадать временный промижуток в моем случае???

    Пробовал просто строкой, то в логе сервера запрос почему то идет на 01.01.1601.
  • Тарас (09.11.11 12:04) [2]
    Покскажите пожалуйтса что это за такая функция DateTimeToFileTime??

    Сейчас делаю ОРС клиент HDA и возникла проблема с подачей временного промежутка.
      htStartTime:                OPCHDA_TIME;
      htEndTime:                  OPCHDA_TIME;

    А  OPCHDA_TIME = record
       bString:                            BOOL;
       szTime:                             POleStr;
       ftTime:                             TFileTime;
     end;

    Как правильн озадать временный промижуток в моем случае???

    Пробовал просто строкой, то в логе сервера запрос почему то идет на 01.01.1601.
  • Тарас (09.11.11 12:18) [3]
    Ответ нашел сам)))

    function DateTimeToFileTime(FileTime: TDateTime): TFileTime;
    var
      LocalFileTime, Ft: TFileTime;
      SystemTime: TSystemTime;
    begin
      Result.dwLowDateTime  := 0;
      Result.dwHighDateTime := 0;
      DateTimeToSystemTime(FileTime, SystemTime);
      SystemTimeToFileTime(SystemTime, LocalFileTime);
      LocalFileTimeToFileTime(LocalFileTime, Ft);
      Result := Ft;
    end;
Есть новые Нет новых   [118452   +47][b:0][p:0]