У кого есть готовый пример как при помощи owen_io_lib считать с трм 202 значения? Адаптер АС3 - полуавтоматический. Можно на мыло Parxs@mail.ru
У кого есть готовый пример как при помощи owen_io_lib считать с трм 202 значения? Адаптер АС3 - полуавтоматический. Можно на мыло Parxs@mail.ru
Я делал через OPC сервер. Качал для дельфы сервер, в CODESYS настраивал трм, только у меня 138, и в оболочке уже отображал температуру
C наилучшими пожеланиями, Иванов Даниил
Тоже искал ответ на этот вопрос. Но не нашел. Пришлось разбираться самому.
// ...
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,vidWORD): Integer; Stdcall; External 'owen_io.dll';
function ClosePort: Integer; Stdcall; External 'owen_io.dll';
function OwenIO(adr,adr_type,is_readWORD;command,params:PChar;var param_sz:Integer): Integer; Stdcall; External 'owen_io.dll';
function WriteFloat24(adr,adr_typeWORD;command:PChar;value:Single;index:Integer):Int eger;Stdcall; External 'owen_io.dll';
function ReadFloat24(adr,adr_typeWORD;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;
// ...
Попробовал представленный пример, всё работает.
Попытался по аналогии изменить положение десятичной точки, не получилось. Подскажите что делаю не так.
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;