Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ModBusTCP Library ile Mobile Delta PLC kontrol
#1
MODBUS protokolü
(FPGA TABANLI MODBUS AĞ GEÇİDİ TASARIMI yüksek lisans tezi Şirin AKKAYA İstanbul Teknik Üniversitesi 9 Ocak 2015)
 
Protokol lisanları aynı iki olgu arasında, belirli bir düzeyde iletişimi sağlamak amacı ile gerekli kuralları ortaya koyan bir sistemdir. Endüstriyel haberleşme protokolleri endüstriyel sistemler arasında veri alışverişini sağlayan standart dillerdir. İki cihaz arasında veri iletimi olabilmesi için cihazların aynı endüstriyel protokol ile haberleşmeleri ya da arada dönüştürücü bir cihaz kullanmaları gerekir. Günümüzde en çok kullanılan endüstriyel haberleşme protokolleri Profibus, Modbus, Canbus, Lin vb olarak sıralanabilir. Modbus protokolü 1970'li yıllarda geliştirilmiş ve zamanla yeni sürümleri oluşturulmuştur. Kolay, hızlı ve açık kaynaklı bir protokol olması günümüzde elektronik cihazlarda çok yaygın olarak kullanılmasının en büyük etkenlerindendir. 

Modbus protokolü ilk defa seri hat üzerinden gerçekleştirilmiştir. Modbus seri hat protokolü Modbus RTU ve Modbus ASCII olmak üzere iki alt protokolden oluşur. Ethernet teknolojinin gelişmesi ve yaygınlaşması ile beraber Modbus protokolünü Ethernet ağına uygun hale getirme ihtiyacı duyulmuş ve Modbus TCP protokolü geliştirilmiştir. Günümüzdeki PLC ler de TCP protokolü standartlaşmış durumdadır. Kullanılan Delta DVP12SE modeli PLC’nin geçerli “default” IP adresi 192.168.1.250 ve portu 502 dir. Aşağıda Delta 12SE modeli PLC nin fiziksel giriş (X), yardımcı röle giriş (M) ve fiziksel çıkış (Y) bölgelerine ait modbus protokol bilgilerinin ilk 14 BIT’i yer almaktadır. Her bir sütundaki bilgiler ardışık devam ettirilerek X ve Y tipi hafıza bölgelerinin adres aralığı 0 ~ 377 aralığındadır. M tipi hafıza bölgesinin adres aralığı ise 0 ~4096

   

Android uygulamamız.
   

Kaynak kodları:  
unit Unit1;

interface

uses
 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls,
 IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdModBusClient, FMX.Edit, FMX.Memo.Types,
 FMX.ScrollBox, FMX.Memo;

type
 TForm1 = class(TForm)
   Label1: TLabel;
   IdModBusClient1: TIdModBusClient;
   Label2: TLabel;
   Edit1: TEdit;
   Edit2: TEdit;
   Label3: TLabel;
   Button1: TButton;
   Memo1: TMemo;
   CheckBox1: TCheckBox;
   CheckBox2: TCheckBox;
   CheckBox3: TCheckBox;
   CheckBox4: TCheckBox;
   procedure Button1Click(Sender: TObject);
   procedure CheckBox1Change(Sender: TObject);
   procedure CheckBox2Change(Sender: TObject);
   procedure CheckBox3Change(Sender: TObject);
   procedure CheckBox4Change(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
 Data: array[0..4096] of Boolean;
 Adet: Integer;   i: Integer;  Mesaj: String;
begin
 Adet := 4; Memo1.Lines.Clear;
 if (Adet > 0) then
 begin
   IdModBusClient1.Host := Edit1.Text;
   if IdModBusClient1.ReadCoils(StrToInt(Edit2.Text), Adet, Data) then
   begin
     Mesaj := 'PLC den okunan adres ve değerleri:';
     for i := 0 to (Adet - 1) do
       Mesaj := Mesaj + #13#10 + IntToStr(StrToInt(Edit2.Text) + i) +
       ': 0x'  + BoolToStr (Data[i]);
     Memo1.Lines.Add(Mesaj);
   end else Memo1.Lines.Add('PLC okuma işlemi başarısız!');
 end;
end;

procedure TForm1.CheckBox1Change(Sender: TObject);
begin
 Memo1.Lines.Clear;
 IdModBusClient1.Host := Edit1.Text; // PLC IP Adres.
 IdModBusClient1.WriteCoil(1281, CheckBox1.IsChecked);
 Button1Click(Self);
end;
procedure TForm1.CheckBox2Change(Sender: TObject);
begin
 Memo1.Lines.Clear;
 IdModBusClient1.Host := Edit1.Text; // PLC IP Adres.
 IdModBusClient1.WriteCoil(1282, CheckBox2.IsChecked);
 Button1Click(Self);
end;
procedure TForm1.CheckBox3Change(Sender: TObject);
begin
 Memo1.Lines.Clear;
 IdModBusClient1.Host := Edit1.Text; // PLC IP Adres.
 IdModBusClient1.WriteCoil(1283, CheckBox3.IsChecked);
 Button1Click(Self);
end;
procedure TForm1.CheckBox4Change(Sender: TObject);
begin
 Memo1.Lines.Clear;
 IdModBusClient1.Host := Edit1.Text; // PLC IP Adres.
 IdModBusClient1.WriteCoil(1284, CheckBox4.IsChecked);
 Button1Click(Self);
end;

end.
Teknik Öğretmen
Bilgisayar Formatörü
WWW
Cevapla
#2
Teşekkürler @guverdik hocam. IdModBusClient.pas dosyasına nasıl ulaşabiliriz?
saygılar mustafa ֍zgün 
Cevapla
#3
(24-04-2021, Saat: 11:23)emozgun Adlı Kullanıcıdan Alıntı: Teşekkürler @guverdik hocam. IdModBusClient.pas dosyasına nasıl ulaşabiliriz?

https://github.com/coassoftwaresystems/delphi-modbus
Teknik Öğretmen
Bilgisayar Formatörü
WWW
Cevapla
#4
Teşekkürler @guverdik hocam
saygılar mustafa ֍zgün 
Cevapla
#5
Merhaba katkı olması amacı ile ModbusTCP Library' nin Thread ile kullanımına bir örnek vermek isterim.

unit sorgu;

interface

uses
Classes {$IFDEF MSWINDOWS}, Windows {$ENDIF}, IdModBusClient, SysUtils;

type
TSorgu = class(TThread)
private
  { Private declarations }
  procedure CallExternalProc;
  procedure Comporta_Oku();
protected
  procedure Execute; override;
public
  constructor Create;
end;

var
Sayac: Integer = 0;
Sorgu_Basla: TSorgu;
Comporta_Yazilacak_Veri: String;
Sorgu_Tipi: Integer;

implementation

uses ana, Gvar;

{ TSorgu }

constructor TSorgu.Create;
begin
inherited Create(True); 
FreeOnTerminate := True;
Resume; 
end;

function Register_Oku(Okunacak_Adres : Word; Register_Sayisi : Word): Variant;
begin
IdModBusClient_Mikrodev.ReadHoldingRegisters(Okunacak_Adres,Register_Sayisi,PLC_Okunan_Degerler);
end;

procedure TSorgu.Comporta_Oku();
var
Okunan_Veriler : Variant;
Ortalama_Gerilim_L : Real;
Ortalama_Gerilim_NL : Real;
Ortalama_Akim_L : Real;
Ortalama_Akim_NL : Real;
CosW          : Real;
High_Voltaj_Akim_Degeri : Real;
begin
With Form_Ana do
begin
  Register_Oku(4001,35);
  if (TabSheet_L.TabVisible = True) and (AdvSmoothToggleButton_L_Start_Test.Down)  then
  begin
    Edit_L_U1.Text      := FloatToStrF((PLC_Okunan_Degerler[0]*65535+PLC_Okunan_Degerler[1])/10,ffFixed,100,2);
    Edit_L_U2.Text      := FloatToStrF((PLC_Okunan_Degerler[2]*65535+PLC_Okunan_Degerler[3])/10,ffFixed,100,2);
    Edit_L_U3.Text      := FloatToStrF((PLC_Okunan_Degerler[4]*65535+PLC_Okunan_Degerler[5])/10,ffFixed,100,2);
    Edit_L_Uavr.Text    := FloatToStrF((StrToFloat(Edit_L_U1.Text)+StrToFloat(Edit_L_U2.Text)+StrToFloat(Edit_L_U3.Text))/3,ffFixed,100,2);
    Ortalama_Gerilim_L  := StrToFloat(Edit_L_Uavr.Text);
    Edit_L_I1.Text      := FloatToStrF((PLC_Okunan_Degerler[6]*65535+PLC_Okunan_Degerler[7])/1000,ffFixed,100,2);
    Edit_L_I2.Text      := FloatToStrF((PLC_Okunan_Degerler[8]*65535+PLC_Okunan_Degerler[9])/1000,ffFixed,100,2);
    Edit_L_I3.Text      := FloatToStrF((PLC_Okunan_Degerler[10]*65535+PLC_Okunan_Degerler[11])/1000,ffFixed,100,2);
    Edit_L_Iavr.Text    := FloatToStrF((StrToFloat(Edit_L_I1.Text)+StrToFloat(Edit_L_I2.Text)+StrToFloat(Edit_L_I3.Text))/3,ffFixed,100,2);
    Ortalama_Akim_L     := StrToFloat(Edit_L_Iavr.Text);
    CosW                := (PLC_Okunan_Degerler[12]*65535+PLC_Okunan_Degerler[13])/1000;
    Edit_L_Pcu.Text     := FloatToStrF(1.732*Ortalama_Gerilim_L*Ortalama_Akim_L*CosW,ffFixed,100,0);
  end;
  if (TabSheet_NL.TabVisible = True) and (AdvSmoothToggleButton_NL_Start_Test.Down)  then
  begin
    Edit_NL_U1.Text     := FloatToStrF((PLC_Okunan_Degerler[0]*65535+PLC_Okunan_Degerler[1])/10,ffFixed,100,2);
    Edit_NL_U2.Text     := FloatToStrF((PLC_Okunan_Degerler[2]*65535+PLC_Okunan_Degerler[3])/10,ffFixed,100,2);
    Edit_NL_U3.Text     := FloatToStrF((PLC_Okunan_Degerler[4]*65535+PLC_Okunan_Degerler[5])/10,ffFixed,100,2);
    Edit_NL_Uavr.Text   := FloatToStrF((StrToFloat(Edit_L_U1.Text)+StrToFloat(Edit_L_U2.Text)+StrToFloat(Edit_L_U3.Text))/3,ffFixed,100,2);
    Ortalama_Gerilim_NL := StrToFloat(Edit_NL_Uavr.Text);
    Edit_NL_I1.Text     := FloatToStrF((PLC_Okunan_Degerler[6]*65535+PLC_Okunan_Degerler[7])/1000,ffFixed,100,2);
    Edit_NL_I2.Text     := FloatToStrF((PLC_Okunan_Degerler[8]*65535+PLC_Okunan_Degerler[9])/1000,ffFixed,100,2);
    Edit_NL_I3.Text     := FloatToStrF((PLC_Okunan_Degerler[10]*65535+PLC_Okunan_Degerler[11])/1000,ffFixed,100,2);
    Ortalama_Akim_NL    := StrToFloat(Edit_NL_Iavr.Text);
    Edit_NL_Iavr.Text   := FloatToStrF((StrToFloat(Edit_L_I1.Text)+StrToFloat(Edit_L_I2.Text)+StrToFloat(Edit_L_I3.Text))/3,ffFixed,100,2);
    CosW                := (PLC_Okunan_Degerler[12]*65535+PLC_Okunan_Degerler[13])/1000;
    Edit_NL_Pfe.Text    := FloatToStrF(1.732*Ortalama_Gerilim_NL*Ortalama_Akim_NL*CosW,ffFixed,100,0);
  end;

  if (TabSheet_70KW.TabVisible = True) and (AdvSmoothToggleButton_AV_High_Voltage.Down) then
  begin
    Edit_AV_U.Text    := FloatToStrF((PLC_Okunan_Degerler[14]*65535+PLC_Okunan_Degerler[15])/10,ffFixed,100,2);
    High_Voltaj_Akim_Degeri := (PLC_Okunan_Degerler[16]*65535+PLC_Okunan_Degerler[17])/1000;
    if High_Voltaj_Akim_Degeri >= 10.0 then
    begin
      Edit_AV_I.Text    := FloatToStrF((PLC_Okunan_Degerler[16]*65535+PLC_Okunan_Degerler[17])/1000,ffFixed,100,2);
    end
    else
      Edit_AV_I.Text    := '0';

    Edit_AV_FR.Text   := FloatToStrF((PLC_Okunan_Degerler[18]*65535+PLC_Okunan_Degerler[19])/100,ffFixed,100,2);
  end;
  if (TabSheet_Frekans.TabVisible = True) and (AdvSmoothToggleButton_IV_Jen.Down) then
  begin
    Edit_IV_U1.Text    := FloatToStrF((PLC_Okunan_Degerler[20]*65535+PLC_Okunan_Degerler[21])/10,ffFixed,100,2);
    Edit_IV_U2.Text    := FloatToStrF((PLC_Okunan_Degerler[22]*65535+PLC_Okunan_Degerler[23])/10,ffFixed,100,2);
    Edit_IV_U3.Text    := FloatToStrF((PLC_Okunan_Degerler[24]*65535+PLC_Okunan_Degerler[25])/10,ffFixed,100,2);
    Edit_IV_I1.Text    := FloatToStrF((PLC_Okunan_Degerler[26]*65535+PLC_Okunan_Degerler[27])/1000,ffFixed,100,2);
    Edit_IV_I2.Text    := FloatToStrF((PLC_Okunan_Degerler[28]*65535+PLC_Okunan_Degerler[29])/1000,ffFixed,100,2);
    Edit_IV_I3.Text    := FloatToStrF((PLC_Okunan_Degerler[30]*65535+PLC_Okunan_Degerler[31])/1000,ffFixed,100,2);
    if (PLC_Okunan_Degerler[20]*65535+PLC_Okunan_Degerler[21])/10 > 3 then
      Edit_IV_FR.Text    := IntToStr(198+Random(3))
    else
      Edit_IV_FR.Text    := '000';
  end;
  if ((StrToFloat(Edit_L_Iavr.Text) > Secili_Akim_Trafosu) or
    (StrToFloat(Edit_NL_IAvr.Text) > Secili_Akim_Trafosu) or
    (StrToFloat(Edit_IV_I1.Text) > 25.0) or
    (StrToFloat(Edit_IV_I2.Text) > 25.0) or
    (StrToFloat(Edit_IV_I3.Text) > 25.0) or
    (High_Voltaj_Akim_Degeri >= 5.0))  then
  begin
    Tum_Kontaktorler_Reset();
    Label_Alarm.Caption := 'AŞIRI AKIM';
    Label_Alarm.Visible := True;
  end;
end;
end;

procedure TSorgu.Execute;
begin
NameThreadForDebugging('Sorgu');
inherited;
while not Terminated do
begin
    try
      CoInitialize(nil);
      Synchronize(Sorgu_Basla, Comporta_Oku);
      Sleep(2000);
    except
    on E: Exception do
    begin

    end;
  end;
end;
end;

end.
NUH EROĞLU
Elektrik-Elektronik Yük. Müh.
Cevapla
#6
(25-04-2021, Saat: 02:05)nuheroglu Adlı Kullanıcıdan Alıntı: Merhaba katkı olması amacı ile ModbusTCP Library' nin Thread ile kullanımına bir örnek vermek isterim.

unit sorgu;

interface

uses
Classes {$IFDEF MSWINDOWS}, Windows {$ENDIF}, IdModBusClient, SysUtils;

type
TSorgu = class(TThread)
private
  { Private declarations }
  procedure CallExternalProc;
  procedure Comporta_Oku();
protected
  procedure Execute; override;
public
  constructor Create;
end;

var
Sayac: Integer = 0;
Sorgu_Basla: TSorgu;
Comporta_Yazilacak_Veri: String;
Sorgu_Tipi: Integer;

implementation

uses ana, Gvar;

{ TSorgu }

constructor TSorgu.Create;
begin
inherited Create(True); 
FreeOnTerminate := True;
Resume; 
end;

function Register_Oku(Okunacak_Adres : Word; Register_Sayisi : Word): Variant;
begin
IdModBusClient_Mikrodev.ReadHoldingRegisters(Okunacak_Adres,Register_Sayisi,PLC_Okunan_Degerler);
end;

procedure TSorgu.Comporta_Oku();
var
Okunan_Veriler : Variant;
Ortalama_Gerilim_L : Real;
Ortalama_Gerilim_NL : Real;
Ortalama_Akim_L : Real;
Ortalama_Akim_NL : Real;
CosW          : Real;
High_Voltaj_Akim_Degeri : Real;
begin
With Form_Ana do
begin
  Register_Oku(4001,35);
  if (TabSheet_L.TabVisible = True) and (AdvSmoothToggleButton_L_Start_Test.Down)  then
  begin
    Edit_L_U1.Text      := FloatToStrF((PLC_Okunan_Degerler[0]*65535+PLC_Okunan_Degerler[1])/10,ffFixed,100,2);
    Edit_L_U2.Text      := FloatToStrF((PLC_Okunan_Degerler[2]*65535+PLC_Okunan_Degerler[3])/10,ffFixed,100,2);
    Edit_L_U3.Text      := FloatToStrF((PLC_Okunan_Degerler[4]*65535+PLC_Okunan_Degerler[5])/10,ffFixed,100,2);
    Edit_L_Uavr.Text    := FloatToStrF((StrToFloat(Edit_L_U1.Text)+StrToFloat(Edit_L_U2.Text)+StrToFloat(Edit_L_U3.Text))/3,ffFixed,100,2);
    Ortalama_Gerilim_L  := StrToFloat(Edit_L_Uavr.Text);
    Edit_L_I1.Text      := FloatToStrF((PLC_Okunan_Degerler[6]*65535+PLC_Okunan_Degerler[7])/1000,ffFixed,100,2);
    Edit_L_I2.Text      := FloatToStrF((PLC_Okunan_Degerler[8]*65535+PLC_Okunan_Degerler[9])/1000,ffFixed,100,2);
    Edit_L_I3.Text      := FloatToStrF((PLC_Okunan_Degerler[10]*65535+PLC_Okunan_Degerler[11])/1000,ffFixed,100,2);
    Edit_L_Iavr.Text    := FloatToStrF((StrToFloat(Edit_L_I1.Text)+StrToFloat(Edit_L_I2.Text)+StrToFloat(Edit_L_I3.Text))/3,ffFixed,100,2);
    Ortalama_Akim_L     := StrToFloat(Edit_L_Iavr.Text);
    CosW                := (PLC_Okunan_Degerler[12]*65535+PLC_Okunan_Degerler[13])/1000;
    Edit_L_Pcu.Text     := FloatToStrF(1.732*Ortalama_Gerilim_L*Ortalama_Akim_L*CosW,ffFixed,100,0);
  end;
  if (TabSheet_NL.TabVisible = True) and (AdvSmoothToggleButton_NL_Start_Test.Down)  then
  begin
    Edit_NL_U1.Text     := FloatToStrF((PLC_Okunan_Degerler[0]*65535+PLC_Okunan_Degerler[1])/10,ffFixed,100,2);
    Edit_NL_U2.Text     := FloatToStrF((PLC_Okunan_Degerler[2]*65535+PLC_Okunan_Degerler[3])/10,ffFixed,100,2);
    Edit_NL_U3.Text     := FloatToStrF((PLC_Okunan_Degerler[4]*65535+PLC_Okunan_Degerler[5])/10,ffFixed,100,2);
    Edit_NL_Uavr.Text   := FloatToStrF((StrToFloat(Edit_L_U1.Text)+StrToFloat(Edit_L_U2.Text)+StrToFloat(Edit_L_U3.Text))/3,ffFixed,100,2);
    Ortalama_Gerilim_NL := StrToFloat(Edit_NL_Uavr.Text);
    Edit_NL_I1.Text     := FloatToStrF((PLC_Okunan_Degerler[6]*65535+PLC_Okunan_Degerler[7])/1000,ffFixed,100,2);
    Edit_NL_I2.Text     := FloatToStrF((PLC_Okunan_Degerler[8]*65535+PLC_Okunan_Degerler[9])/1000,ffFixed,100,2);
    Edit_NL_I3.Text     := FloatToStrF((PLC_Okunan_Degerler[10]*65535+PLC_Okunan_Degerler[11])/1000,ffFixed,100,2);
    Ortalama_Akim_NL    := StrToFloat(Edit_NL_Iavr.Text);
    Edit_NL_Iavr.Text   := FloatToStrF((StrToFloat(Edit_L_I1.Text)+StrToFloat(Edit_L_I2.Text)+StrToFloat(Edit_L_I3.Text))/3,ffFixed,100,2);
    CosW                := (PLC_Okunan_Degerler[12]*65535+PLC_Okunan_Degerler[13])/1000;
    Edit_NL_Pfe.Text    := FloatToStrF(1.732*Ortalama_Gerilim_NL*Ortalama_Akim_NL*CosW,ffFixed,100,0);
  end;

  if (TabSheet_70KW.TabVisible = True) and (AdvSmoothToggleButton_AV_High_Voltage.Down) then
  begin
    Edit_AV_U.Text    := FloatToStrF((PLC_Okunan_Degerler[14]*65535+PLC_Okunan_Degerler[15])/10,ffFixed,100,2);
    High_Voltaj_Akim_Degeri := (PLC_Okunan_Degerler[16]*65535+PLC_Okunan_Degerler[17])/1000;
    if High_Voltaj_Akim_Degeri >= 10.0 then
    begin
      Edit_AV_I.Text    := FloatToStrF((PLC_Okunan_Degerler[16]*65535+PLC_Okunan_Degerler[17])/1000,ffFixed,100,2);
    end
    else
      Edit_AV_I.Text    := '0';

    Edit_AV_FR.Text   := FloatToStrF((PLC_Okunan_Degerler[18]*65535+PLC_Okunan_Degerler[19])/100,ffFixed,100,2);
  end;
  if (TabSheet_Frekans.TabVisible = True) and (AdvSmoothToggleButton_IV_Jen.Down) then
  begin
    Edit_IV_U1.Text    := FloatToStrF((PLC_Okunan_Degerler[20]*65535+PLC_Okunan_Degerler[21])/10,ffFixed,100,2);
    Edit_IV_U2.Text    := FloatToStrF((PLC_Okunan_Degerler[22]*65535+PLC_Okunan_Degerler[23])/10,ffFixed,100,2);
    Edit_IV_U3.Text    := FloatToStrF((PLC_Okunan_Degerler[24]*65535+PLC_Okunan_Degerler[25])/10,ffFixed,100,2);
    Edit_IV_I1.Text    := FloatToStrF((PLC_Okunan_Degerler[26]*65535+PLC_Okunan_Degerler[27])/1000,ffFixed,100,2);
    Edit_IV_I2.Text    := FloatToStrF((PLC_Okunan_Degerler[28]*65535+PLC_Okunan_Degerler[29])/1000,ffFixed,100,2);
    Edit_IV_I3.Text    := FloatToStrF((PLC_Okunan_Degerler[30]*65535+PLC_Okunan_Degerler[31])/1000,ffFixed,100,2);
    if (PLC_Okunan_Degerler[20]*65535+PLC_Okunan_Degerler[21])/10 > 3 then
      Edit_IV_FR.Text    := IntToStr(198+Random(3))
    else
      Edit_IV_FR.Text    := '000';
  end;
  if ((StrToFloat(Edit_L_Iavr.Text) > Secili_Akim_Trafosu) or
    (StrToFloat(Edit_NL_IAvr.Text) > Secili_Akim_Trafosu) or
    (StrToFloat(Edit_IV_I1.Text) > 25.0) or
    (StrToFloat(Edit_IV_I2.Text) > 25.0) or
    (StrToFloat(Edit_IV_I3.Text) > 25.0) or
    (High_Voltaj_Akim_Degeri >= 5.0))  then
  begin
    Tum_Kontaktorler_Reset();
    Label_Alarm.Caption := 'AŞIRI AKIM';
    Label_Alarm.Visible := True;
  end;
end;
end;

procedure TSorgu.Execute;
begin
NameThreadForDebugging('Sorgu');
inherited;
while not Terminated do
begin
    try
      CoInitialize(nil);
      Synchronize(Sorgu_Basla, Comporta_Oku);
      Sleep(2000);
    except
    on E: Exception do
    begin

    end;
  end;
end;
end;

end.

Teşekkürler. Gayet kullanışlı.   Shy
Teknik Öğretmen
Bilgisayar Formatörü
WWW
Cevapla
#7
Delta ile bende pek çok kez değişik projelerde haberleştim. Yalnız buradaki komponent TCP/IP üzerinden çalışıyor. Delta'nın kısmen ucuz modllerinde RS232 ile haberleşebiliyorsunuz. Bunun içinde belli bir formatta Com port üzerinden bir mesaj göndermeniz gerekiyor.

GÖNDERİLEN FORMAT:
Baslangic 3A
Slave Adres 01
Fonksiyon 01
Baslangic Adresi (Yuksek) 04
Baslangic Adresi (Dusuk) 00
Nokta Sayisi (Yuksek) 00
Nokta Sayisi (Dusuk) 10
Hata Kontrol ( LRC ) EA

GELEN CEVAP:
Baslangic 3A
Slave Adres 01
Fonksiyon 81
Istisnai Kod 02
Hata Kontrol ( LRC ) 7C

LRC denen CheckSum hesabı. Bunu da hesaplatıp göndereceğiniz mesajın (komutun) arkasına eklemeniz gerekiyor.

ÖRNEK:
01 no'lu PLC'nin T20~T27 bobinlerinin degerini okuma
PC→PLC
“:01 03 06 14 00 08 DA CR LF”
PLC→PC
“:01 03 10 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 B8 CR LF”
Cevapla
#8
(30-04-2021, Saat: 14:38)enigma Adlı Kullanıcıdan Alıntı: Delta ile bende pek çok kez değişik projelerde haberleştim. Yalnız buradaki komponent TCP/IP üzerinden çalışıyor. Delta'nın kısmen ucuz modllerinde RS232 ile haberleşebiliyorsunuz. Bunun içinde belli bir formatta Com port üzerinden bir mesaj göndermeniz gerekiyor.

GÖNDERİLEN FORMAT:
Baslangic 3A
Slave Adres 01
Fonksiyon 01
Baslangic Adresi (Yuksek) 04
Baslangic Adresi (Dusuk) 00
Nokta Sayisi (Yuksek) 00
Nokta Sayisi (Dusuk) 10
Hata Kontrol ( LRC ) EA

GELEN CEVAP:
Baslangic 3A
Slave Adres 01
Fonksiyon 81
Istisnai Kod 02
Hata Kontrol ( LRC ) 7C

LRC denen CheckSum hesabı. Bunu da hesaplatıp göndereceğiniz mesajın (komutun) arkasına eklemeniz gerekiyor.

ÖRNEK:
01 no'lu PLC'nin T20~T27 bobinlerinin degerini okuma
PC→PLC
“:01 03 06 14 00 08 DA CR LF”
PLC→PC
“:01 03 10 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 B8 CR LF”
RS232 ile yapılan bir örnek bizi oldukça sevindirir.
Teknik Öğretmen
Bilgisayar Formatörü
WWW
Cevapla
#9
(01-05-2021, Saat: 16:15)guverdik Adlı Kullanıcıdan Alıntı:
(30-04-2021, Saat: 14:38)enigma Adlı Kullanıcıdan Alıntı: Delta ile bende pek çok kez değişik projelerde haberleştim. Yalnız buradaki komponent TCP/IP üzerinden çalışıyor. Delta'nın kısmen ucuz modllerinde RS232 ile haberleşebiliyorsunuz. Bunun içinde belli bir formatta Com port üzerinden bir mesaj göndermeniz gerekiyor.

GÖNDERİLEN FORMAT:
Baslangic 3A
Slave Adres 01
Fonksiyon 01
Baslangic Adresi (Yuksek) 04
Baslangic Adresi (Dusuk) 00
Nokta Sayisi (Yuksek) 00
Nokta Sayisi (Dusuk) 10
Hata Kontrol ( LRC ) EA

GELEN CEVAP:
Baslangic 3A
Slave Adres 01
Fonksiyon 81
Istisnai Kod 02
Hata Kontrol ( LRC ) 7C

LRC denen CheckSum hesabı. Bunu da hesaplatıp göndereceğiniz mesajın (komutun) arkasına eklemeniz gerekiyor.

ÖRNEK:
01 no'lu PLC'nin T20~T27 bobinlerinin degerini okuma
PC→PLC
“:01 03 06 14 00 08 DA CR LF”
PLC→PC
“:01 03 10 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 B8 CR LF”
RS232 ile yapılan bir örnek bizi oldukça sevindirir.

LRC yani CheckSum hesaplaması 2 byte'lık hex formatında bir sonuç veriyor. Hesaplaması şu şekilde;


type st2 = String[2];

function LRC(cmd: string): st2;  // CheckSum Hesabı
var i,l,t,c,x: byte; ss: st2;
begin
  i := 0; t := 0; c := 0;
  l := length(cmd);
  while i < l do
  begin
    inc(i);
    if Odd(i) then t := t + StrToIntDef('$'+cmd[i]+cmd[i+1],0);
  end;
  x := 256-t;
  Result := IntToHex(x,2);
end;

Bu hesaplamayı formattaki gibi PLC'ye göndereceğiniz mesajın arkasına ekleyip göndermeniz gerekiyor. PLC'nin kendi içinde yaptığı LRC hesabı ile sizinki aynıysa komutu işleme koyuyor. Bu hesaplatma yöntemi sadece Delta PLC'ye özel yani Panasonic marka bir PLC için bu farklı olmakta.

Daha önce yaptığım bir uygulamadan alıntı yaoarak komutları nasıl kullanacağınıza dair örnekler şöyle;

CR = #13;
LF = #10;

PLCCmd := '010508010000'; // Konveyör Start..
cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
CommPortDriver1.SendString(cmd);

PLCCmd := '01050801FF00'; // Konveyör stop..
cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
CommPortDriver1.SendString(cmd);

PLCCmd := '01050803FF00'; // rejecti başlat..
cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
Form1.CommPortDriver1.SendString(cmd);

PLCCmd := '010508030000'; // rejecti bitir.
cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
CommPortDriver1.SendString(cmd);
Cevapla
#10
(02-05-2021, Saat: 16:22)enigma Adlı Kullanıcıdan Alıntı:
(01-05-2021, Saat: 16:15)guverdik Adlı Kullanıcıdan Alıntı: RS232 ile yapılan bir örnek bizi oldukça sevindirir.

LRC yani CheckSum hesaplaması 2 byte'lık hex formatında bir sonuç veriyor. Hesaplaması şu şekilde;


type st2 = String[2];

function LRC(cmd: string): st2;  // CheckSum Hesabı
var i,l,t,c,x: byte; ss: st2;
begin
  i := 0; t := 0; c := 0;
  l := length(cmd);
  while i < l do
  begin
    inc(i);
    if Odd(i) then t := t + StrToIntDef('$'+cmd[i]+cmd[i+1],0);
  end;
  x := 256-t;
  Result := IntToHex(x,2);
end;

Bu hesaplamayı formattaki gibi PLC'ye göndereceğiniz mesajın arkasına ekleyip göndermeniz gerekiyor. PLC'nin kendi içinde yaptığı LRC hesabı ile sizinki aynıysa komutu işleme koyuyor. Bu hesaplatma yöntemi sadece Delta PLC'ye özel yani Panasonic marka bir PLC için bu farklı olmakta.

Daha önce yaptığım bir uygulamadan alıntı yaoarak komutları nasıl kullanacağınıza dair örnekler şöyle;

CR = #13;
LF = #10;

 PLCCmd := '010508010000';   // Konveyör Start..
 cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
 CommPortDriver1.SendString(cmd);

 PLCCmd := '01050801FF00';       // Konveyör stop..
 cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
 CommPortDriver1.SendString(cmd);

 PLCCmd := '01050803FF00';  // rejecti başlat..
 cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
 Form1.CommPortDriver1.SendString(cmd);

 PLCCmd := '010508030000';  // rejecti bitir.
 cmd := ':' + PLCCmd + lrc(PLCCmd) + CR + LF;
 CommPortDriver1.SendString(cmd);
Örneklemeler için teşekkrüler. Shy
Teknik Öğretmen
Bilgisayar Formatörü
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Port Kavramları ve Görsel Bileşenlerin Delphi'ye Yüklenmesi guverdik 15 5.571 25-11-2020, Saat: 10:40
Son Yorum: m_ekici
  #4 USCO API ile SERİ PORT Kontrol guverdik 2 1.352 01-06-2020, Saat: 21:08
Son Yorum: guverdik
  #3 USCO API ile USCO 01 Kontrol guverdik 2 1.396 29-05-2020, Saat: 13:33
Son Yorum: guverdik
  EBA TV için Hazırlanan Endüstriyel Otomasyon Alanı Bilgisayarlı Kontrol Ders Linkleri guverdik 2 1.592 03-04-2020, Saat: 20:14
Son Yorum: guverdik
  Delphi İçinde Dijital Gösterge, Analog Gösterge, Termometre ve Potansiyometre guverdik 0 840 12-02-2020, Saat: 09:01
Son Yorum: guverdik



Konuyu Okuyanlar: 1 Ziyaretçi