-
Господа, а работал ли кто нибудь с 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;
-
Покскажите пожалуйтса что это за такая функция DateTimeToFileTime??
Сейчас делаю ОРС клиент HDA и возникла проблема с подачей временного промежутка. htStartTime: OPCHDA_TIME; htEndTime: OPCHDA_TIME;
А OPCHDA_TIME = record bString: BOOL; szTime: POleStr; ftTime: TFileTime; end;
Как правильн озадать временный промижуток в моем случае???
Пробовал просто строкой, то в логе сервера запрос почему то идет на 01.01.1601.
-
Покскажите пожалуйтса что это за такая функция DateTimeToFileTime??
Сейчас делаю ОРС клиент HDA и возникла проблема с подачей временного промежутка. htStartTime: OPCHDA_TIME; htEndTime: OPCHDA_TIME;
А OPCHDA_TIME = record bString: BOOL; szTime: POleStr; ftTime: TFileTime; end;
Как правильн озадать временный промижуток в моем случае???
Пробовал просто строкой, то в логе сервера запрос почему то идет на 01.01.1601.
-
Ответ нашел сам)))
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;
|