TpApro ApdComPort Terazi Okuma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
enesharun
Üye
Mesajlar: 15
Kayıt: 17 Eki 2014 10:46

TpApro ApdComPort Terazi Okuma

Mesaj gönderen enesharun » 06 May 2019 09:29

Merhaba Arkadaşla,

Hazırladığım projede TEM Marka bir teraziden gelen veriyi okumam gerekiyor. Aşağıda kullandığım kod mevcut. Terazinin gönderdiği veri şu şekilde:
+ 0.122kg
t 0.000kg
+ 0.122kg
t 0.000kg
+ 0.122kg
t 0.000kg
+ 0.122kg
t 0.000kg


Sürekli gönderim yapan bir terazi. Benim + ile gelen değerden 0.122 olan kısmı ayırmam gerekiyor ve bunu ekrana yazmam gerekiyor. Fakat bir türlü başaramadım. Sadece yukarıdaki şekilde alabiliyorum. Desteğinize ihtiyacım var acilen. Teşekkürler.


procedure TTartiEkran.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
I, j: Word;
gelenkarakter: AnsiChar;
sonuc: string;
Derece: Double;
begin // butonlara basıldığında yapılması gereken iş burada derlenecek
try
sonuc := '';
for I := 1 to Count do
begin
gelenkarakter := ApdComPort1.GetChar;
case gelenkarakter of
#0 .. #1: { Don't display }
;
else
sonuc := sonuc + gelenkarakter;
end;
end;
lbGramaj.Caption:=Sonuc;
except
end;
end;

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 136
Kayıt: 01 Oca 2008 05:34

Re: TpApro ApdComPort Terazi Okuma

Mesaj gönderen Commandx » 06 May 2019 02:32

Tekrar deneyin bakalım (Altta Copy ile başlayan string parse işlemi ile bir deneyin)

Kod: Tümünü seç

procedure TTartiEkran.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
I, j: Word;
gelenkarakter: AnsiChar;
sonuc: string;
Derece: Double;
begin // butonlara basıldığında yapılması gereken iş burada derlenecek
try
sonuc := '';
for I := 1 to Count do
begin
gelenkarakter := ApdComPort1.GetChar;
case gelenkarakter of
#0 .. #1: { Don't display }
;
else
sonuc := COPY((sonuc + gelenkarakter),2,7) ; // burası
end;
end;
lbGramaj.Caption:=Sonuc;
except
end;
end;
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Zamane tickcount'u
except
ON E: Exception do
Begin
Application.MessageBox(Pchar('Can sıkıntısı '+#13+E.Message),'Hata',MBOKk+MB_ICONWARNING);
Abort;
End;
end;

enesharun
Üye
Mesajlar: 15
Kayıt: 17 Eki 2014 10:46

Re: TpApro ApdComPort Terazi Okuma

Mesaj gönderen enesharun » 06 May 2019 02:44

Merhaba,

Teşekkürler fakat olmadı :(



Commandx yazdı:
06 May 2019 02:32
Tekrar deneyin bakalım (Altta Copy ile başlayan string parse işlemi ile bir deneyin)

Kod: Tümünü seç

procedure TTartiEkran.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
I, j: Word;
gelenkarakter: AnsiChar;
sonuc: string;
Derece: Double;
begin // butonlara basıldığında yapılması gereken iş burada derlenecek
try
sonuc := '';
for I := 1 to Count do
begin
gelenkarakter := ApdComPort1.GetChar;
case gelenkarakter of
#0 .. #1: { Don't display }
;
else
sonuc := COPY((sonuc + gelenkarakter),2,7) ; // burası
end;
end;
lbGramaj.Caption:=Sonuc;
except
end;
end;

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2134
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: TpApro ApdComPort Terazi Okuma

Mesaj gönderen freeman35 » 07 May 2019 11:23

if Pos(gelenkarakter,'.0123456789')>0 then sonuc:= sonuc +gelenkarakter;
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

enesharun
Üye
Mesajlar: 15
Kayıt: 17 Eki 2014 10:46

Re: TpApro ApdComPort Terazi Okuma

Mesaj gönderen enesharun » 09 May 2019 08:43

Merhabalar sorunumu çözdüm fakat yazma zamanım olmadı. Gün içerisinde çözüm kodlarını yayınlayacağım.

enesharun
Üye
Mesajlar: 15
Kayıt: 17 Eki 2014 10:46

Re: TpApro ApdComPort Terazi Okuma

Mesaj gönderen enesharun » 10 May 2019 09:05

Hepinize teşekkürler. Örneklerinizin faydası oldu.
Programın show olayında ApdComPort1.open:=true; yapıyorum. Sonrası da aşağıda.

Kod: Tümünü seç

procedure TTartiEkran.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
 I: Word;
 gelenkarakter: AnsiChar;
 sonuc: string;
 artivar: integer;  
begin
 try
   sonuc := '';
   for I := 1 to Count do
   begin
     gelenkarakter := ApdComPort1.GetChar;
     case gelenkarakter of
       #0 .. #31: { Don't display }
         ;
     else
       if (gelenkarakter <> ' ') and (gelenkarakter <> 'k') and
         (gelenkarakter <> 'g') then
       begin
         sonuc := sonuc + gelenkarakter;
         if (length(sonuc) = 6) then
         begin
           artivar := ansipos('+', sonuc);
           if artivar <> 0 then
           begin
             delete(sonuc, 1, 1);
             if sonuc <> sonuc1 then
             begin
               sonuc1 := sonuc;
               sonuc := '';
             end
             else
             begin
               sonuc1 := stringreplace(sonuc1, '.', ',',
                 [rfReplaceAll, rfIgnoreCase]);
               lbTutar.Caption := floattostr(strtofloat(lbBirimfiyat.Caption) *
     (strtofloat(sonuc1)));
               lbGramaj.Caption := floattostr(strtofloat(sonuc1) * 1000);
             end;
           end;
         end;
       end;
     end;
 
   end;
 
 except
 showmessage('hata var');
 end;
end;

Ahmet Bilgehan
Üye
Mesajlar: 8
Kayıt: 19 Nis 2016 10:00
Konum: izmir
İletişim:

Re: TpApro ApdComPort Terazi Okuma

Mesaj gönderen Ahmet Bilgehan » 14 May 2019 11:05

kolay gelsin ben terazi işi yapıyorum proje ne üzerine açaba ögrenebilirmiyim ilginiz için şimdiden teşekkür ederim

ertank
Üye
Mesajlar: 1188
Kayıt: 11 Eyl 2015 11:45

Re: TpApro ApdComPort Terazi Okuma

Mesaj gönderen ertank » 09 Haz 2019 10:24

enesharun yazdı:
06 May 2019 09:29
Merhaba Arkadaşla,

Hazırladığım projede TEM Marka bir teraziden gelen veriyi okumam gerekiyor. Aşağıda kullandığım kod mevcut. Terazinin gönderdiği veri şu şekilde:
+ 0.122kg
t 0.000kg
+ 0.122kg
t 0.000kg
+ 0.122kg
t 0.000kg
+ 0.122kg
t 0.000kg


Sürekli gönderim yapan bir terazi. Benim + ile gelen değerden 0.122 olan kısmı ayırmam gerekiyor ve bunu ekrana yazmam gerekiyor. Fakat bir türlü başaramadım. Sadece yukarıdaki şekilde alabiliyorum. Desteğinize ihtiyacım var acilen. Teşekkürler.


procedure TTartiEkran.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
I, j: Word;
gelenkarakter: AnsiChar;
sonuc: string;
Derece: Double;
begin // butonlara basıldığında yapılması gereken iş burada derlenecek
try
sonuc := '';
for I := 1 to Count do
begin
gelenkarakter := ApdComPort1.GetChar;
case gelenkarakter of
#0 .. #1: { Don't display }
;
else
sonuc := sonuc + gelenkarakter;
end;
end;
lbGramaj.Caption:=Sonuc;
except
end;
end;
Merhaba,

Farklı bir yöntem olarak TApdDataPacket bileşenini kullanmanızı tavsiye edeceğim. Bu bileşen sizin yapmak istediğiniz işi ve fazlasını yapmak için tasarlanmıştır.

Özetle yapmanız gereken:
- Form üzerine ApdDataPacket bileşenini ekleyin.
- Object Inspector içinde "ApdDataPacket1.ComPort = ApdComPort1" şeklinde ayarlayın (otomatik olarak bu şekilde ayarlanmış olabilir)
- Form üzerindeki ApdDataPacket1 bileşeni üzerinde sağ tuş ile tıklayıp "Edit Properties" seçeneğini seçin
- Packet start condition için "When this string is received" seçeneğini seçip sağ tarafındaki Edit alanı içine "+ " (artı ve boşluk) karakterlerini yazın
- Packet end condition için "When this string is received" seçeneğini seçip sağ tarafındaki Edit alanı içine "kg" karakterlerini yazın
- Include start/end string(s) in packet seçeneğinin işaretini kaldırın.
- Diğer tüm seçenekleri olduğu gibi bırakıp OK butonunu tıklayın.
- Form üzerinde ApdDataPacket1 bileşenini seçin (sol tuşla bir defa tıklayın)
- Object Inspector içinde Events tab ını açın. OnPacket() olayını çift tıklayıp açın.
- Editöre aşağıdaki kodları yazın.

Kod: Tümünü seç

procedure TForm2.ApdDataPacket1Packet(Sender: TObject; Data: Pointer;
  Size: Integer);
var
  Bytes: TBytes;
  I: Integer;
  TempString: string;
  Agirlik: Double;  
begin
  SetLength(Bytes, Size);
  Move(Data^, Pointer(Bytes)^, Size);

  TempString := EmptyStr;
  for I := Low(Bytes) to High(Bytes) do
  begin
    TempString := TempString + Chr(Bytes[I]);
  end;
  Agirlik := StrToFloat(TempString);
end;
Bu olay terazi sürekli bilgi gönderdiği için sürekli tetiklenecektir. Siz uygulamanızda Form veya Uygulama genelince bir ağırlık değişkeni tanımlayıp bu değişkenin son değerini istediğiniz zaman kullanabilirsiniz.

NOT: Eğer kullandığınız Delphi sürümünde "TBytes" desteği yok ise bunun yerine aşağıdaki şekilde kullanmanız mümkün

Kod: Tümünü seç

var
  Bytes: Array of Byte;
NOT2: İşletim sistemi ondalık ayracı nokta dışında bir karakter ise;
Delphi 7 için:

Kod: Tümünü seç

  StringReplace(TempString, '.', DecimalSeparator, []);
  Agirlik := StrToFloat(TempString);
Delphi 2009 ve sonrası için:

Kod: Tümünü seç

  StringReplace(TempString, '.', FormatSettings.DecimalSeparator, []);
  Agirlik := StrToFloat(TempString, AFormatSettings);
şeklinde kodlar eklemeniz gerekebilir.

Cevapla