Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Просьба подсказать как отловить событие, Событие не визуального компонента 
V
    Опции темы
Rodeon
Дата 19.5.2019, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

Репутация: нет
Всего: нет



Есть некая библиотека для работы с Modbus RTU.
Если все компоненты размещать на форме, то все отлично, по нажатию кнопки отправляет запрос, принимает пакет.
нужны всего 2 компонента:
ModbusClient
ModbusConnection

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ModLink;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    ModbusClient1: TModbusClient;
    ModbusConnection1: TModbusConnection;

    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ModbusClient1HoldingRegistersRead(Sender: TModbusClient; const Info: TTransactionInfo; StartReg, RegCount: Word; const RegValues: TRegValues);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ModbusConnection1: TModbusConnection;
  ModbusClient1: TModbusClient;

implementation

{$R *.dfm}

function LayerFunc(Bin: string): Single;
var
 SomeVar: Byte;
begin
 SomeVar := StrToInt(Bin[1]);
end;     
 
function IntToBinFloat(Value: Integer; var Float: Single): string;
var
 i: Integer;
begin
 Result := '';
 for i := 31 downto 0 do
   if Value and (1 shl i) <> 0 then
     Result := Result + '1'
   else
     Result := Result + '0';
 Float := LayerFunc(Result);
end;

function HexToFloat(Hex: string): Single;
begin
 try
   IntToBinFloat(StrToInt('$' + Hex), Result);
 except
   Result := 0.0
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ModbusConnection1.Port:='COM3';
  ModbusConnection1.BaudRate:=br115200;
  ModbusConnection1.DataBits:=db8;
  ModbusConnection1.Parity:=psEven;
  ModbusConnection1.StopBits:=sb1;
  ModbusConnection1.Open;
  ModbusClient1.Connection:= ModbusConnection1;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ModbusClient1.ReadHoldingRegisters(4096, 60);
end;

procedure TForm1.ModbusClient1HoldingRegistersRead(Sender: TModbusClient; const Info: TTransactionInfo; StartReg, RegCount: Word; const RegValues: TRegValues);
Var
i:Integer;
begin
  if Info.Reply = srNormalReply then
  begin
  For i:=0 to 29 do
{Эта часть пока чисто для визуализации, смотрю верные данные приходят или нет, данные по 4 байта}
    Memo1.Lines.Add(inttostr(i) + ' ' + IntToHex(RegValues[i*2],4)+IntToHex(RegValues[i*2+1],4)+' ' + FormatFloat('0.####',HexToFloat(IntToHex(RegValues[i*2],4)+IntToHex(RegValues[i*2+1],4))));
  end;

end;

end.


Таже самая форма, компоненты ModbusConnection и ModbusClient создаются программно.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ModLink;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ModbusConnection1: TModbusConnection;
  ModbusClient1: TModbusClient;

implementation

{$R *.dfm}


function LayerFunc(Bin: string): Single;
var
 SomeVar: Byte;
begin
 SomeVar := StrToInt(Bin[1]);
end;     
 
function IntToBinFloat(Value: Integer; var Float: Single): string;
var
 i: Integer;
begin
 Result := '';
 for i := 31 downto 0 do
   if Value and (1 shl i) <> 0 then
     Result := Result + '1'
   else
     Result := Result + '0';
 Float := LayerFunc(Result);
end;

function HexToFloat(Hex: string): Single;
begin
 try
   IntToBinFloat(StrToInt('$' + Hex), Result);
 except
   Result := 0.0
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ModbusConnection1.Port:='COM3';
  ModbusConnection1.BaudRate:=br115200;
  ModbusConnection1.DataBits:=db8;
  ModbusConnection1.Parity:=psEven;
  ModbusConnection1.StopBits:=sb1;
  ModbusConnection1.Open;
  ModbusClient1.Connection:= ModbusConnection1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  If ModbusConnection1.Active=true then   ModbusConnection1.Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ModbusConnection1:=TModbusConnection.Create(self);
  ModbusClient1:=TModbusClient.Create(self);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ModbusClient1.ReadHoldingRegisters(4096, 60);
end;

procedure ModbusClient1HoldingRegistersRead(Sender: TModbusClient; const Info: TTransactionInfo; StartReg, RegCount: Word; const RegValues: TRegValues);
Var
i:Integer;
begin
  if Info.Reply = srNormalReply then
  begin
  For i:=0 to 29 do
    Form1.Memo1.Lines.Add(inttostr(i) + ' ' + IntToHex(RegValues[i*2],4)+IntToHex(RegValues[i*2+1],4)+' ' + FormatFloat('0.####',HexToFloat(IntToHex(RegValues[i*2],4)+IntToHex(RegValues[i*2+1],4))));
  end;

end;

end.

Проверяю в снифере порта - все работает, данные уходят, устройство данные отправляет. Не могу понять как объявить процедуру события ModbusClient1HoldingRegistersRead?
На всякие нажатия кнопки и создание компонентов во время создания формы не обращайте внимания, как все заработает выведу все в ДЛЛ-ку. 
Подскажите, кто знает.

PM MAIL   Вверх
Snowy
Дата 20.5.2019, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код
ModbusClient1.OnHoldingRegistersRead := ModbusClient1HoldingRegistersRead;

PM MAIL   Вверх
Rodeon
Дата 20.5.2019, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 28.8.2008
Где: Россия, Ухта

Репутация: нет
Всего: нет



Блин, спасибо огромное. Заработало, все как надо.
Мало ли кому будет интересно куда добавил, остальной текст весь ранее выложил, библиотека ModLink, если что:
Код

procedure TForm1.Button3Click(Sender: TObject);
begin
  ModbusClient1.ReadHoldingRegisters(4096, 60); // Считывание с регистров данных начиная с адреса 4096 60 регистров.
  ModbusClient1.OnHoldingRegistersRead := ModbusClient1HoldingRegistersRead; // Вот как раз этой строчки не хватало.
end;


Сейчас все перенесу в ДЛЛ-ку и готово.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.