Sashka : |
19.11.12 11:24 |
unit hydralink;
interface
const // Типы подключений HL_CONNTYPE_SER = $00000; // Серийный порт HL_CONNTYPE_TCP = $00001; // TCP/IP // Вид протокола, объединяется по | с типом подключения HL_CONNTYPE_HLINK = $00000; // HLink HL_CONNTYPE_MODBUS = $10000; // MODBUS HL_CONNTYPE_TCPEXT = $20000; // Внешний TCP-адаптер
// Виды запрашиваемой информации HL_INFOKIND_SPECS = $0001; // Общеприборные спецификации HL_INFOKIND_CFG = $0002; // Общеприборные изменяемые настройки HL_INFOKIND_VSPECS = $0004; // Спецификации выбранных теплосистем HL_INFOKIND_VCFG = $0008; // Изменяемые настройки выбранных теплосистем HL_INFOKIND_CURRENT = $0010; // Текущие значения измеряемых параметров выбранных теплосистем HL_INFOKIND_GLOBALS = $0020; // Значения накопителей нарастающего итога выбранных теплосистем HL_INFOKIND_TIME = $0040; // Полное время прибора (исп. команда введ. с v. 2.08 ПО прибора) HL_INFOKIND_HEADER = $0080; // Заголовок архива HL_INFOKIND_RECORD = $0100; // Записи с момента, указанного в параметре // ------------------------------- Режимы синхронизации часов HL_INFOKIND_CLSYN0 = $1000; // Синхронизировать часы (10 сек) HL_INFOKIND_CLSYN1 = $2000; // Синхронизировать часы (60 сек - 1 мин) HL_INFOKIND_CLSYN2 = $4000; // Синхронизировать часы (300сек - 5 мин) HL_INFOKIND_CLSYN3 = $8000; // Синхронизировать часы (900сек - 15 мин) HL_INFOKIND_CLSYN = $F000; // Общая маска синхронизации
// Маски выбора теплосистем HL_CONTOUR_NONE = $0000; HL_CONTOUR_1 = $0001; // первый виртуальный прибор (Т/С) HL_CONTOUR_2 = $0002; // второй виртуальный прибор (Т/С) HL_CONTOUR_3 = $0004; // третий виртуальный прибор (Т/С)
HL_PARAM_C1VMAX =0; HL_PARAM_C1VMIN =1; HL_PARAM_C1PMAX =2; HL_PARAM_C2VMAX =3; HL_PARAM_C2VMIN =4; HL_PARAM_C2PMAX =5; HL_PARAM_C3VMAX =6; HL_PARAM_C3VMIN =7; HL_PARAM_C3PMAX =8; HL_PARAM_TIME =9;
HL_VALUETYPE_NOTEXIST =0; HL_VALUETYPE_DOUBLE =1; HL_VALUETYPE_UINT32 =2; HL_VALUETYPE_TIME =3;
type HL_CONNECT = record serial : array [0..31] of Char; commdev : Integer; netno : Integer; port : Integer; baud : Integer; ip : Cardinal; tcpport : Integer; end;
PHL_Connect = ^HL_Connect;
HL_TIME = record hour : Integer; min : Integer; sec : Integer; day : INteger; month : Integer; year : Integer; end;
HL_VALUE = record ltype : Cardinal; // Тип параметра, см. HL_VALUETYPE_... */ val : double; e : Cardinal; //* Ошибка. Значение не определено, если не ноль */ pnt : Cardinal; //* Рекомендуемое число знаков после запятой*/ end; PHL_VALUE = HL_VALUE;
HL_REQUEST = record cmask : Cardinal; // Объединённые по | дефайны HL_CONTOUR_? infokind : Cardinal; // Объединённые по | дефайны HL_INFOKIND password : PChar; // Указатель на пароль для операции синхронизации часов pfunc : Pointer; // Указатель на функцию, которой передаются проценты fpdata : Cardinal; // Пользовательский параметр, передаётся вторым параметром функции fp end; PHL_REQUEST = ^HL_REQUEST;
HL_CURRENT_VALUES = record case Byte of 0 : (lval : array [0..14] of HL_VALUE); 1 : (v : array [0..2] of HL_VALUE; g : array [0..2] of HL_VALUE; t : array [0..3] of HL_VALUE; p : array [0..2] of HL_VALUE; q : HL_VALUE; e : HL_VALUE; ); end; PHL_CURRENT_VALUES = ^HL_CURRENT_VALUES;
HL_GLOBALS_VALUES = record case Byte of 0 : ( lval : array [0..7] of HL_VALUE); 1 : ( tnar : HL_VALUE ; v : array [0..2] of HL_VALUE; g : array [0..3] of HL_VALUE; q : HL_VALUE); end; PHL_GLOBALS_VALUES = ^HL_GLOBALS_VALUES;
HL_RECORD_VALUES = record case Byte of 0 : ( lval : array [0..28] of HL_VALUE); 1 : ( tm : HL_VALUE; // Время записи 1 //-------------------------- v : array [0..2] of HL_VALUE; // 2,3,4 g : array [0..2] of HL_VALUE; // Нарастающий 5,6,7 tnar : HL_VALUE; // Итог 8 q : HL_VALUE; // 9 //-------------------------- tnarh : HL_VALUE; // 10 vh : array [0..2] of HL_VALUE ; // За час 11,12,13 gh : array [0..2] of HL_VALUE; // 14,15,16 th : array [0..3] of HL_VALUE; // 17,18,19,20 ph : array [0..2] of HL_VALUE; // 21,22,23 qh : HL_VALUE; // 24 eh : HL_VALUE; // 25 tminh : HL_VALUE; // 26 tmaxh : HL_VALUE; // 27 tdth : HL_VALUE; // 28 tpowh : HL_VALUE; // 29 ) end; PHL_RECORD_VALUES = ^HL_RECORD_VALUES;
function HLINK_Read (connect : PHL_CONNECT; request : PHL_REQUEST; var Res : Pointer; param : Integer) : Integer; stdcall; external 'Hydralink.dll';
function HLINK_UnpackCurrent(cvs : PHL_CURRENT_VALUES; contour : integer; readRes : Pointer) : Integer; stdcall ; external 'Hydralink.dll';
function HLINK_UnpackGlobals(gvs : PHL_GLOBALS_VALUES; contour : Cardinal; readRes : Pointer) : Integer; stdcall; external 'Hydralink.dll';
function HLINK_UnpackRecord(rvs : PHL_RECORD_VALUES; contour : Cardinal; readRes : Pointer; param : Integer) : Integer; stdcall; external 'Hydralink.dll';
function HLINK_Clear(readRes : Pointer) : Integer; stdcall; external 'Hydralink.dll';
function HLINK_GetValue ( var dest : HL_VALUE; paramKind : Integer; contour : Integer; readRes : Pointer) : Integer; stdcall ; external 'Hydralink.dll';
function ValToType (hlvalue : HL_VALUE; IsItTime : Boolean = false) : Double;
implementation Uses JclDateTime;
function ValToType (hlvalue : HL_VALUE; IsItTime : Boolean = false) : Double; var c : Cardinal; i : Integer; begin Result := 0; if (hlvalue.e > 0) then Exit; if (IsItTime) then hlvalue.ltype := 4; case hlvalue.ltype of 1 : Result := hlvalue.val; 2 : begin c := pinteger(@hlvalue.val)^; Result := c; end; 4 : begin Result := JclDateTime.UnixTimeToDateTime(pinteger(@hlvalue.val)^); end; end; end;
end.
-------------------------------------------------------------------------------------------------------------------------- Пример опроса .... var connect : HL_CONNECT; req : HL_REQUEST; readRes : Pointer; err : PChar; bErr : Integer; cvs : HL_CURRENT_VALUES; gvs : HL_GLOBALS_VALUES; rvs : HL_RECORD_VALUES; i,j, k : Integer; temp : String; v : HL_VALUE; begin connect.commdev := HL_CONNTYPE_TCP; // TCP/IP connect.netno := 255; // Сетевой номер прибора (задан в его настройках) connect.baud := 9600; // Скорость (как в приборе 9600 или 19200) connect.ip := $C0A8FE46; // IP-адрес прибора (в примере 192.168.0.1) connect.tcpport := 5000; // TCP-порт прибора (по умолчанию порт 1590) req.cmask := HL_CONTOUR_1 or HL_CONTOUR_2 or HL_CONTOUR_3; req.infokind := HL_INFOKIND_RECORD; // HL_INFOKIND_CURRENT or HL_INFOKIND_TIME or HL_INFOKIND_GLOBALS; req.pfunc := nil; bErr := HLINK_Read(@connect, @req,ReadRes,-35); if (bErr <> 0) then begin Err := PChar(readREs); ShowMessage(Err); HLINK_Clear(readRes); Exit; end;
for k := 0 to 2 do begin
bErr := HLINK_UnpackCurrent(@Cvs,k,readRes); if (bErr <> 0) then begin HLINK_Clear(readRes); Exit; end;
for i := 0 to 14 do begin if (cvs.lval[i].ltype > 0) and (cvs.lval[i].e = 0) then begin temp := IntToStr(i) + '. type:' + IntToStr(cvs.lval[i].ltype) + ' ' + FloatToStr(ValToType(cvs.lval[i])); mmo1.Lines.ADd (temp); end; end; mmo1.Lines.Add('>>') end;
bErr := HLINK_GetValue( V, HL_PARAM_TIME,0,readRes); if (bErr = 0) and (v.e = 0) then begin mmo1.Lines.Add (DateTimeToStr(ValToType(V,True))); end;
HLINK_Clear(readRes);
end; | |
|