PDA

Просмотр полной версии : ТРМ 202 + Delphi



Parxs
13.08.2012, 20:27
У кого есть готовый пример как при помощи owen_io_lib считать с трм 202 значения? Адаптер АС3 - полуавтоматический. Можно на мыло Parxs@mail.ru

DanJer
15.08.2012, 07:29
Я делал через OPC сервер. Качал для дельфы сервер, в CODESYS настраивал трм, только у меня 138, и в оболочке уже отображал температуру

Ivan U
13.10.2012, 01:53
У кого есть готовый пример как при помощи owen_io_lib считать с трм 202 значения? Адаптер АС3 - полуавтоматический. Можно на мыло Parxs@mail.ru

Тоже искал ответ на этот вопрос. Но не нашел. Пришлось разбираться самому.

// ...

const
spd_300:Integer=-3;
spd_600:Integer=-2;
spd_1200:Integer=-1;
spd_2400:Integer=0;
spd_4800:Integer=1;
spd_9600:Integer=2;
spd_14400:Integer=3;
spd_19200:Integer=4;
spd_28800:Integer=5;
spd_38800:Integer=6;
spd_57600:Integer=7;
spd_115200:Integer=8;


prty_NONE:Integer=0;
prty_EVEN:Integer=1;
prty_ODD:Integer=2;

databits_7:Integer=0;
databits_8:Integer=1;

stopbit_1:Integer=0;
stopbit_1_5:Integer=1;
stopbit_2:Integer=2;

RS485CONV_MANUAL:Integer=0;
RS485CONV_AUTO:Integer=1;
RS485CONV_MANUAL_DTR:Integer=2;

ADRTYPE_8BIT:Integer = 0;
ADRTYPE_11BIT:Integer = 1;

// ...

function OpenPort(n,speed,part,bits,stop,vid:DWORD): Integer; Stdcall; External 'owen_io.dll';
function ClosePort: Integer; Stdcall; External 'owen_io.dll';
function OwenIO(adr,adr_type,is_read:DWORD;command,params:P Char;var param_sz:Integer): Integer; Stdcall; External 'owen_io.dll';
function WriteFloat24(adr,adr_type:DWORD;command:PChar;valu e:Single;index:Integer):Integer;Stdcall; External 'owen_io.dll';
function ReadFloat24(adr,adr_type:DWORD;command:PChar;var value:Single;index:Integer):Integer;Stdcall; External 'owen_io.dll';

// ...

var TempPV, TmpSp1: Single;
Address, Fres : Integer;
params: array [0..3] of Char;

// ...


// Подключаюсь
if OpenPort(ComPortNb-1, spd_115200, prty_NONE, databits_8, stopbit_1, RS485CONV_AUTO)<0 then
begin
// Ругаюсь что не подключился
Exit;
end;

Address := 28; // У меня адрес устройства 28

// Определяю показания термодатчика
Fres := ReadFloat24(Adress, ADRTYPE_8BIT, 'Pv ', TempPV, -1);
if Fres < 0 then
// Ругаюсь что не получил значение TempPV

// Определяю значение терморегулятора 1

Fres := ReadFloat24(Address, ADRTYPE_8BIT, 'Sp ', TmpSp1, 0);
if Fres < 0 then
// Ругаюсь что не получил значение TmpSp1

// Устанавливаю значение терморегулятора

TmpSp1 := 30; // Задаю значение
// Сначала необходимо получить разрешение на запись параметра Sp
params[0] := #0;
params[1] := #0;
params[2] := chr(145); // код команды
params[3] := chr(7); // Sp

Fres := OwenIO(Address, ADRTYPE_8BIT, 1, 'attr', params, 4);
if Fres < 0 then
// Ругаюсь что не получилось получить разрешение на запись параметра Sp

else
begin
Fres := WriteFloat24(Address, ADRTYPE_8BIT, 'Sp ', TmpSp1, 0);
if Fres < 0 then
// Ругаюсь что не получилось задать значение TmpSp1
end;

ClosePort;

// ...

AlexGold
15.04.2013, 09:26
Попробовал представленный пример, всё работает.

Попытался по аналогии изменить положение десятичной точки, не получилось. Подскажите что делаю не так.

dP1 := 2; // Задаю значение

params[0] := #0;
params[1] := #0;
params[2] := chr(179);
params[3] := chr(235);


Fres := OwenIO(Address, ADRTYPE_8BIT, 1, 'attr', params,4);

if Fres < 0 then
begin
//
end
else
begin
Fres := WriteByte(Address, ADRTYPE_8BIT, 'dP ', dP1, 0);
if Fres < 0 then
//
end;