[gelöst] Synaser - RS232 ansprechen

Für Fragen von Einsteigern und Programmieranfängern...
l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Hallo,
danke für eure Hilfe.
Es Funktioniert jetzt, aber ich hab nun folgendes Problem:
Wenn ich den Wert ein zweites mal durch den Button abfragen möchte, bekomme ich die Fehlermeldung "Access violation".
Habe schon versucht das kompilierte Programm als Administrator zu starten, leider ohne Besserung...

Die Schnittstelle wird nach dem einlesen eingenltich auch wieder freigegeben, deshalb kann ich mir die Fehlermeldung nicht erklären.

Ich verwende folgenden Quelltext:

Code: Alles auswählen

 
procedure TForm1.btnEwAClick(Sender: TObject);
begin
 //Schnittstelle freigeben
 ser.free;
 //Dem String die 10te und 13te Stelle zuweisen
 ch := chr(13)+ chr(10);
 ser:=TBlockSerial.Create;
 
 Sleep(10000);
 //COM1 verbinden mit folgenden Boudraten, Datenbits, Paritätsbit und Anzahl der Stopbits
 ser.Connect('COM1');
 ser.config(1200, 8, 'N', SB1, False, False);
 //
 LabelIstwertA.Text := ser.RecvTerminated(1000, ch);
 //Am Ende die Schnittstelle wieder freigeben
 ser.free;
end;
 


Jemand eine Idee? Danke vorab

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Synaser - RS232 ansprechen

Beitrag von baumina »

Du versuchst gleich am Anfang der Procedure eine Variable freizugeben, von der du nicht sicher sein kannst, dass sie überhaupt initialisiert wurde.
.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Synaser - RS232 ansprechen

Beitrag von Mathias »

Das 2. Free ist sicher Gift.

Aber wieso tust du die Schnittstelle bei jedem Klick neu initialisieren ?

Am Programm-Anfang ein Create und am Ende ein Free, die sollte reichen.
Ausser du willst zur Laufzeit die Schnittstelle wechseln.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Mathias hat geschrieben:Das 2. Free ist sicher Gift.

Aber wieso tust du die Schnittstelle bei jedem Klick neu initialisieren ?

Am Programm-Anfang ein Create und am Ende ein Free, die sollte reichen.
Ausser du willst zur Laufzeit die Schnittstelle wechseln.


Danke für den Tipp. Dachte ich muss das immer machen, nicht das ein anderes Programm z.B. aktuell auf die Schnittstelle zugreift....

Hätte aber noch einmal zwei Fragen:

-Ich möchte den Command Code "T" übertragen (die Waage soll sich dann auf Null stellen - Taring), mit welchen Befehl macht mann das?

-Ich empfange die Daten aktuell mit Label.Text:= ser.RecvPacket(1000). Das Funktioniert auch so erstmal, ich bekomme aber leider bei einem Wert von 75,1542g auf die Anzeige 75.15g. Ich möchte aber die dritte Nachkommastelle auch angezeigt haben. Außerdem stört mich der Punkt, dort hätte ich gerne ein Komma. Wie funktioniert das?

Danke für eure Hilfe

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Synaser - RS232 ansprechen

Beitrag von Mathias »

Das Funktioniert auch so erstmal, ich bekomme aber leider bei einem Wert von 75,1542g auf die Anzeige 75.15g. I

Das Problem wird da eher auf Seite der Waage sein. Wird das "g" auch mit ausgegeben ?

Außerdem stört mich der Punkt, dort hätte ich gerne ein Komma. Wie funktioniert das?

Am einfachste mit StringReplace: http://wiki.freepascal.org/StringReplace/de



-Ich möchte den Command Code "T" übertragen (die Waage soll sich dann auf Null stellen - Taring), mit welchen Befehl macht mann das?

Weiter oben hat es ein Code von mir, welcher auch Daten ausgibt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Mathias hat geschrieben:Das Problem wird da eher auf Seite der Waage sein. Wird das "g" auch mit ausgegeben ?


Das "g" wird auch nicht ausgegeben. Das hätte ich dann mit Format float noch angefügt.

Mathias hat geschrieben:Weiter oben hat es ein Code von mir, welcher auch Daten ausgibt.


Die Übertragung klappt leider auch nicht so recht.
Habe es wie in deinem Beispiel versucht, die Übertragung funktioniert zwar, es wird aber immer nur ein "Print" ausgelöst, also der aktuelle Wert der Waage ausgegeben, unabhängig was ich an die Waage übermittel.....

Im Anhang habe ich mal ein Auszug aus dem Datenblatt eingefügt.

Gruß,

l0lhaxx
Dateianhänge
Daten.PNG

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Synaser - RS232 ansprechen

Beitrag von NoCee »

Laut deinem Datenblatt sollte aber das "g" mit übertragen werden wenn die Waage richtig eingestellt ist.
Machst du das serielle Einlesen in einem OnButtonclick oder kontinuierlich (pollen)?
Bei OnButtonclick taucht das natürlich nur 1 mal auf.
Wenn die Waage ständig von selber sendet, brauchst du an diese zur Gewichtsabfrage auch nichts senden.
Was ist das eigentlich für eine Waage, die auf 4 Stellen nach dem Komma in g auflöst?
Hab beim Überfliegen bei Kern nur bis 3 Stellen gefunden. Außerdem ist das Standardtelegrammformat
von Kern scheinbar länger als in deinem Datenblatt (was aber nichts heißen muß).
Schreib mal den Typ der Waage, vielleicht findet man bei Kern dann das Handbuch.

Gruß
NoCee

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Code: Alles auswählen

 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
 
 ser:=TBlockSerial.Create;
 //Buffer leeren
 ser.Purge;
 ser.Connect('COM1');
 Sleep (1000);
 ser.config(19200, 8, 'N', SB1, False, False);
...
 


Code: Alles auswählen

 
procedure TForm1.btnEwAClick(Sender: TObject);
begin
 ser.SendBuffer(Pointer(Edit1.Text), Length(Edit1.Text));
 LabelIstwertA.Text:= ser.RecvPacket(10000);
end;                                                                   
 


Über einen Button mache ich das ganze. Im 150ms Takt sendet die Waage den aktuellen Wert. Wenn ich meinen Button zur richtigen Zeit drücke bekomme ich in mein Label tatsächlich den Wert ' 20,541<5>g' geschrieben. Wenn ich das Senden manuell an der Waage starte bekomme ich eben nur den Wert '20.54'. Wie erwische ich jetzt den Takt immer? Hab doch schon eine hohe Timeout zeit....

Habe in der Anleitung jetzt auch eine Möglichkeit gesehen direkt ein Komma statt Punkt auszugeben.
Die Waage ist nicht von Kern. Es handelt sich um eine AUW 120 von Shimadzu.

Gruß

Nachtrag: Zur Gewichtsabfrage möchte ich auch nichts senden, es gibt die Möglichkeit durch das Kommando "T" das Taring durchzuführen, z.B.
Dateianhänge
Waage RS232.pdf
(2.61 MiB) 69-mal heruntergeladen

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Synaser - RS232 ansprechen

Beitrag von NoCee »

Ich dachte von Kern, weil ganz oben mal ein Kabel von Kern erwähnt wurde.

Du könntest den Empfangsteil z.B. in eine Timerroutine packen die regelmäßig
im OnTimerevent den Port ausliest. Der Timer muß dann häufiger aufgerufen werden
als da Werte kommen. Sonnst stauen sich die Daten und du bekommst ab und zu
mehrere Werte auf einmal.
Wobei alle 150ms einen Wert für den Typ von Waage schon ziemlich häufig ist.

Das Tarieren würde ich in einen Buttonevent schreiben.
Also z.B. im ButtonTarierenOnClick ein ser.sendstring('T') oder in der Art.

NoCee

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Synaser - RS232 ansprechen

Beitrag von Mathias »

Genau dies macht mein Beispiel weiter oben.

Ich habe als Test-Zweck einen Arduino angeschlossen, welcher regelmässig Daten ausgibt.
Gleichzeitig kann ich auch Daten(Parameter) an den Arduino senden.
Bei einer Waage ist dies das selbe in grün.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Dann brauch ich aber noch eine Abfrage ob ein Wert eingelesen ist. Sonst kommt ja nach jedem Timer Intervall wieder ein leeres Feld zurück....
Mit diesem Code funktioniert bei mir nichts. Auch das Taring wird nicht durchgeführt.

Code: Alles auswählen

 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
 ser:=TBlockSerial.Create;
 //Buffer leeren
 ser.Purge;
 ser.Connect('COM1');
 Sleep (1000);
 ser.config(19200, 8, 'N', SB1, False, False);
 
 Timer1.Interval:=100;
 Timer2.Interval:=100;
 Timer3.Interval:=100;
 Timer1.Enabled:=False;
 Timer2.Enabled:=False;
 Timer3.Enabled:=False
 
...
 
rocedure TForm1.btnEwAClick(Sender: TObject);
 
begin
 Counter1:= 10;
 ser.sendstring('T');
 Timer1.Enabled:=True;
 
 
end;
 
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 //Eine ganze Zahl abwärts zählen
 dec (Counter1);
 LabelIstwertA.Text:= ser.RecvPacket(10);
 If Counter1=0 Then
 begin
  Timer1.Enabled:=False;
 end;
 
end
 
 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Synaser - RS232 ansprechen

Beitrag von Mathias »

Muss man bei Taring nur ein 'T' senden ?
Muss da nicht noch ein #13 oder was Ähnliche angehängt werden ?

Wen du willst, kannst mal mein Programm im Anhang ausprobieren.

Die Funktion GetSerialPortNames
Dateianhänge
Serial Monitor.zip
(126.87 KiB) 67-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Synaser - RS232 ansprechen

Beitrag von NoCee »

bei der Waage läßt sich das Satzende einstellen.
Je nach Einstellung muß da sicherlich wie Mathias schon geschrieben hat ein Delemiter mit angepappt werden.

Mit synaser kann man unter anderem abfragen, ob was neues empfangen wurde.
Hier mal den Link einer Doku, falls du den nicht hast.
http://synapse.ararat.cz/doc/help/synas ... erial.html
Waitingdata liefert dir die Anzahl an Bytes im Puffer zurück.
Das kannst du abfragen und wenn 0 drinsteht, das Labelupdate auslassen.
Ist im Programm von Mathias auch so gemacht.

NoCee

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Hallo,
erstmal danke für eure super Unterstützung. Das senden von Daten ist im oben angehängten Datenblatt angegeben. Ich kann da keine Angaben zum anhängen von einem Delimiter finden.

Aber wie funktioniert das dann? Etwa so?

Code: Alles auswählen

 
procedure TForm1.btnClick(Sender: TObject);
var
 ch: string;
 
begin
 
 Counter1:= 10;
 ch := chr(13);
 ser.sendstring('T'+ch);
 Timer1.Enabled:=True;
 
 
end;
 
Danke und Gruß
 

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Synaser - RS232 ansprechen

Beitrag von mse »

l0lhaxx hat geschrieben: Wie erwische ich jetzt den Takt immer? Hab doch schon eine hohe Timeout zeit....

Indem du auf das EOR-Zeichen (End Of Record, #13) achtest. In deinem älteren Code macht das

Code: Alles auswählen

 
 LabelIstwertA.Text := ser.RecvTerminated(1000, ch);
 

http://synapse.ararat.cz/doc/help/synas ... Terminated
Wobei du dich entscheiden musst ob EOR #13 oder #13#10 sein soll und die Kommunikationsparameter der Waage entsprechend eingestellt sein müssen.
Das senden von Daten ist im oben angehängten Datenblatt angegeben. Ich kann da keine Angaben zum anhängen von einem Delimiter finden.
 
Aber wie funktioniert das dann? Etwa so?

Code: Alles auswählen

 
procedure TForm1.btnClick(Sender: TObject);
var
 ch: string;
 
begin
 
 Counter1:= 10;
 ch := chr(13);
 ser.sendstring('T'+ch);
 Timer1.Enabled:=True;
 
 
end;
 


Ja. Einfacher:

Code: Alles auswählen

 
 ser.sendstring('T'+#13);
 

Ich könnte dir noch MSEgui TSerCommChannel in Verbindung mit TserCommPort empfehlen. TSerCommChannel hat die Eventproperty OnResponse, welche automatisch aufgerufen wird, sobald eine vollständige Antwort eingetroffen ist. Um die Portabfrage muss man sich nicht kümmern, die läuft automatisch in einem separaten Thread.

Antworten