Yorumları: 114
Konuları: 29
Kayıt Tarihi: 06-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.993 Programcı
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ü
Yorumları: 130
Konuları: 12
Kayıt Tarihi: 06-06-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.478 Programcı
Teşekkürler @ guverdik hocam. IdModBusClient.pas dosyasına nasıl ulaşabiliriz?
Yorumları: 114
Konuları: 29
Kayıt Tarihi: 06-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.993 Programcı
(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ü
Yorumları: 130
Konuları: 12
Kayıt Tarihi: 06-06-2020
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.478 Programcı
Teşekkürler @ guverdik hocam
Yorumları: 12
Konuları: 3
Kayıt Tarihi: 19-03-2021
Aktif Kullandığınız Delphi Sürümü:
- Delphi 10.3
- Delphi XE Serisi
Rep Puanı: 149 Başlangıç
25-04-2021, Saat: 02:05
(Son Düzenleme: 25-04-2021, Saat: 02:09, Düzenleyen: nuheroglu.)
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.
Yorumları: 114
Konuları: 29
Kayıt Tarihi: 06-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.993 Programcı
(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ı.
Teknik Öğretmen
Bilgisayar Formatörü
Yorumları: 315
Konuları: 25
Kayıt Tarihi: 16-11-2019
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 633 Acemi
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”
Yorumları: 114
Konuları: 29
Kayıt Tarihi: 06-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.993 Programcı
(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ü
Yorumları: 315
Konuları: 25
Kayıt Tarihi: 16-11-2019
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 633 Acemi
02-05-2021, Saat: 16:22
(Son Düzenleme: 02-05-2021, Saat: 16:27, Düzenleyen: enigma.
Sebep: ekleme
)
(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);
Yorumları: 114
Konuları: 29
Kayıt Tarihi: 06-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 1.993 Programcı
(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.
Teknik Öğretmen
Bilgisayar Formatörü
|