16KB seri port buffer bellegi bulunan bir mikrokontroller ile haberleşmeye çalışıyorum. bu 16 KB bellege delphi aracılığıyla "txt" bir dosyada yazılı olan satırları sırayla göndermek gerekiyor. bu satırlarda x y z ve c düzlemlerinin yapacakları hareketlerin hız ve yol bilgileri yer alıyor. mikrokontroller ilgili kod kendisine ulastıktan sonra ilgili eksene hareketini yaptırıyor. Hareket bittikten sonra bilgisayara hareket tamamlandı yenisini gönder diye bir "OK" kodu yollanıyor. Şimdi benim bu kodları bir buton vasıtasıyla tek tek göndermem gerekiyor. Kısacası makina yapacagı sabit işlerde txt dosyadan bilgi okumayacak bu butonun altında yer alan sabit komut dizinleri sırasıyla gönderilecek, bir txt dosya kullanılamayacak
komut yollanacak makinadan "ok"alınacak başka bir tane komut yollananacak. olay bu şekilde devam edecek birde stop butonum var bu butona bastığım zaman ise diğer işlerin arasına girilip stop komutu gönderilecek. böylece sistem tıpkı bir NC gibi çalışabilecek.
komut yollama butonuna bastığım zaman arka planda sürekli bir task çalışacak stop butonuna bastığımda ise bu task durudurulacak bunu nasıl yapabilirim...?
Comport'a bilgi yollamak....(CNC ye GCODE transferi )
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul
Comport'a bilgi yollamak....(CNC ye GCODE transferi )
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
Merhaba,
Delphi ile seri porta bilgi göndermek için ne kullanıyorsunuz belirtmemişsiniz ama Turbo Power'ın bu konuda başarılı bir bileşeni var. Bu bilşeni kullanarak bu istediklerinizi çok basit bir şekilde yapabilirsiniz.
Bir outbuffer oluşturursunuz. Tstringlist tipinde. Bu OutBuffer'a Komutların bulunduğu dosyayı yüklersiniz.
Sonrası kabaca
Umarım işini görür kolay gelsin.
Delphi ile seri porta bilgi göndermek için ne kullanıyorsunuz belirtmemişsiniz ama Turbo Power'ın bu konuda başarılı bir bileşeni var. Bu bilşeni kullanarak bu istediklerinizi çok basit bir şekilde yapabilirsiniz.
Bir outbuffer oluşturursunuz. Tstringlist tipinde. Bu OutBuffer'a Komutların bulunduğu dosyayı yüklersiniz.
Sonrası kabaca
Kod: Tümünü seç
//GonderClick
Port.PutString(Outbuffer.Strings[0]);
OutBuffer.Delete(0);
GonderimDevam:=True;
//PortTriggerAvail
If PorttanGelenCevap<>'OK' Then
Begin
Port.PutString(SonGidenMesaj) // (veya hata var diyebilirsin)
Exit;
End;
If (GonderimDevam) And (OutBuffer.Count>0)Then //Buffer boşaldıysa dur mesajı göndersin
Begin
Port.PutString(Outbuffer.Strings[0]);
SonGidenMesaj:=Outbuffer.Strings[0];
OutBuffer.Delete(0);
End Else Port.PutStirng(StopKarakteri);
//StopClick
GonderimDevam:=False
Umarım işini görür kolay gelsin.
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul
yapmak istediğim sey belli parçaların şekilleri aynı sadece boyutları farklı
ve toplam 20 veya 30 tane parça var. örneğin 1. parça için ekrandan parçanın boyutlarını girecek program bu boyutlara göre gcode üretecek ve transfer gerçeklecek... her seferinde çiz konvert et çok zaman alıyor ve CNC yi kullanan bunlardan pek anlamıyor. evet apro kullanıyorum bende, ilk denemeler olumlu tek tek gönderdiğim gcode ları işlenip bana "ok" cevabı döndü... CNC nin buffer biraz küçük 16KB kadar
yeri geliyor 1MB ye yakın gcode transfer etmen gerekiyor, bu yüzden ya 16k 16k transfer yapacaksın ki bu sefer bir hatalı işlem olduğunda stop komutu yollayamazsın, bundan dolayı satır satır göndermek daha mantıklı göründü...
ilgine çok teşekkür ederim. sağolasın.
ve toplam 20 veya 30 tane parça var. örneğin 1. parça için ekrandan parçanın boyutlarını girecek program bu boyutlara göre gcode üretecek ve transfer gerçeklecek... her seferinde çiz konvert et çok zaman alıyor ve CNC yi kullanan bunlardan pek anlamıyor. evet apro kullanıyorum bende, ilk denemeler olumlu tek tek gönderdiğim gcode ları işlenip bana "ok" cevabı döndü... CNC nin buffer biraz küçük 16KB kadar
yeri geliyor 1MB ye yakın gcode transfer etmen gerekiyor, bu yüzden ya 16k 16k transfer yapacaksın ki bu sefer bir hatalı işlem olduğunda stop komutu yollayamazsın, bundan dolayı satır satır göndermek daha mantıklı göründü...
ilgine çok teşekkür ederim. sağolasın.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
seri porttan okuma
mrb
aşağıdaki linkten seri portları okuyabilen kodlara ulaşabilirsin.
http://www.swissdelphicenter.ch/torry/s ... php?id=841
iyi çalışmalar
aşağıdaki linkten seri portları okuyabilen kodlara ulaşabilirsin.
http://www.swissdelphicenter.ch/torry/s ... php?id=841
iyi çalışmalar
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul
dosya transferi protokü tamamlandı seri portta karşılıklı onaylatarak dosya transfer edecek arkadaşlar için ;dosya satır satır yollanıyor ve
karşıdaki cihazın işlemlerini bitirmesi bekleniyor....
1. buton transferi başlatıyor.
2. buton transferi durduruyor...
editlerden durum izlenebiliyor...
diğer butonlar özel veri transferleri içindir...
karşıdaki cihazın işlemlerini bitirmesi bekleniyor....
Kod: Tümünü seç
unit butonstop;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OoMisc, AdPort;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
ApdComPort1: TApdComPort;
Edit2: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ApdComPort1TriggerAvail(CP: TObject; Count: Word);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
FExit: Boolean;
Dosya: TextFile;
DosyaAdi, Satir: string;
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Enabled:=false;
FExit:=false;
DosyaAdi := 'c:\gcode.txt';
AssignFile(Dosya, DosyaAdi);
{$I-}
Reset(Dosya);
if IOResult = 0 then
sleep(100);
form1.Edit2.Clear;
form1.Edit2.Refresh;
ReadLn(Dosya, Satir);
form1.Edit1.Text:=Satir;
form1.ApdComPort1.PutString(satir);
while not EOF(Dosya) and (not FExit) do
begin
Application.ProcessMessages;
if form1.Edit2.Text='OK' then
begin
sleep(1000);----------------------------------olayları rahat seyretmek için
ReadLn(Dosya, Satir);
form1.Edit1.Text:=Satir;
form1.ApdComPort1.PutString(satir);
form1.Edit2.Clear;
form1.Edit2.Refresh;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
button1.Enabled:=true;
FExit:= True;
end;
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
begin
form1.Edit2.Text:=form1.ApdComPort1.GetChar;
form1.Edit2.Text:=form1.Edit2.Text+form1.ApdComPort1.GetChar;
form1.Edit2.Refresh;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.ApdComPort1.PutString('27--');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
form1.ApdComPort1.PutString('05--');
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
form1.ApdComPort1.PutString('06--');
end;
end.
2. buton transferi durduruyor...
editlerden durum izlenebiliyor...
diğer butonlar özel veri transferleri içindir...
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma