НПО Тепловизор. Теплосчетчики и расходомеры К вершинам эволюции теплосчетчика
Продукция Поддержка Форум Контакты
     
Пользователь    Пароль  
Регистрация | Пароль?  
Главное меню
НовостиПродукцияФайлы/ДокументыСтатьиФорумОпросыФотогалереяО компанииРекламодателям
Потребители о нас
"В период с августа 2003 года... Предприятием №2 был заключён договор на проведение госповерки и обслуживание приборов учёта с ЗАО «НПО «Тепловизор». Весь объём работ был выполнен в сжатые сроки с учётом требований «Правил учёта тепловой энергии и теплоносителя»."

А.В.Свиридов, Главный инженер Предприятия №2 ТсиС ГУП «МОСТЕПЛОЭНЕРГО»
Наши партнёры
Свернуть/Развернуть ТЕПЛОСЧЕТЧИКИ • ВОДОСЧЕТЧИКИ • РАСХОДОМЕРЫ • ВИС.Т Свернуть/Развернуть
/  Архив форума
   /  Программное обеспечение
/  пример на Delphi (pascal) для HydraLink.dll

Форум : Программное обеспечение

Название : пример на Delphi (pascal) для HydraLink.dll

© NegaSoft co., 2005
http://www.teplovizor.ru

URL этой темы
http://www.teplovizor.ru/forum/viewtopic.php?topic_id=249&forum=2


 AlexMPEI :

4.10.12 17:13
 Здравствуйте! Есть ли у кого пример на Delphi (pascal) для работы с HydraLink.dll ?

 xBocT :

8.10.12 14:14
 Добрый день!

К сожалению с Delphi у нас никто не работает, так что не сможем Вам помочь.

 AlexMPEI :

8.10.12 14:33
 xBocT
Цитата:

К сожалению с Delphi у нас никто не работает, так что не сможем Вам помочь.

А нет ли у вас тогда какого-то тестового счетчика, подключенного, например к МОХА конвертеру через rs232, имеющему внешний IP чтобы я мог удаленно сделать себе виртуальный СОМ порт и попробовать свой переделанный под Delphi софт?

 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;

 AlexMPEI :

19.11.12 12:07
 Цитата:

Sashka пишет:
...


Болшущее спасибо, Sashka!!!