[gelöst] serielle Schnittstelle zeitnah abfragen

Für Fragen von Einsteigern und Programmieranfängern...
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

[gelöst] serielle Schnittstelle zeitnah abfragen

Beitrag von NoCee »

Hallo zusammen

ich hab gerade im Betrieb eine Anlage am laufen,
die über eine serielle Kommunikation zwischen einem Steuer PC
und an einem Master-Slave Bus hängenden AVR Platinen läuft.
Jetzt wollte ich die Telegramme mitschneiden um hinter
die Telegrammstruktur zu kommen.
Mit einem Schnittstellenwandler hab ich jetzt an einem PC
2 RS232 kompatible Schnittstellen zur Verfügung. 1 für Telegramme vom Master
und eine für die Slaves. Das ganze läuft mit 9600bd und mit Telegrammen von wenigen
Bytes bis irgend was mit 30Byte oder so.
Der Master pollt alle Platinen der Adresse nach durch und wenn nichts zu melden ist,
antworten die AVRs nur mit einem ETX, also 1 Byte dann kommt die nächste Adresse dran.

So halblebig hab ich das hinbekommen nur hab ich das Problem,
daß ich nicht die richtige Reihenfolge der Daten bekomme.
Ich hab da schon verschiedene Möglichkeiten ausprobiert hat aber alles nicht funktioniert.
Beim Auslesen der Schnittstelle von nur einem Byte ist der PC zu langsam und die Schnittstellenpuffer laufen über.
Wenn ich ganze Blöcke auslese, ist das Lesen schnell genug, aber die Reihenfolge paßt natürlich nicht mehr.
Ich habe jetzt die Vermutung, daß das mit Windows so einfach nicht umsetzbar ist.
Hier haben wir eine gekaufte MS-DOS Software die das kann, aber die liest halt direkt vom Chip
und braucht halt Dos.
Ist so etwas mit einfachen Mitteln mit Windows ohne speziellen Echtzeittreiber überhaupt machbar?

Als Alternative bin ich am Überlegen, ob ich nicht einen Arduino mit 3 seriellen Schnittstellen nehme
der auf den 2 Schnittstellen für die Anlage alles liest und auf der 3 Schnittstelle mit viel höheren Baudrate
an den PC schickt und alle Telegramme mit Master bzw. Slave markiert.
Am PC kann ich das dann Blockweise auslesen und aufbereiten.
Weiß aber auch nicht ob das dann paßt. Ich gehe aber davon aus, das der Arduino
weil er nichts anderes tut, dafür allemal schnell genug ist.

Hat da jemand eine Idee dazu?
Grüße
NoCee
Zuletzt geändert von NoCee am Do 19. Okt 2017, 19:24, insgesamt 1-mal geändert.

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

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von Mathias »

Verstehe ich es richtig, die Willst mit einem 2. PC die Kommunikation zwischen einem AVR und einem anderen PC abfangen ?

Wen das so ist, ist der Arduino gut geeignet, weil diesen kannst du dann per USB an den 2. PC anschliessen. Und dies Kommunikation, kannst du bis zu 1'000'000Baud laufen lassen.
Noch besser ist ein Arduino-Leonardo, der hat dies beste Kommunikation über USB.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von Timm Thaler »

Türlich geht das, da ist der PC allemal schnell genug, zumal man durchaus Puffer bis 16kByte einstellen kann.

Aber ohne Programm kann man nicht sagen, woran es liegt. Werden die Uarts zu selten abgefragt? Werden zu wenige Daten aus den Uarts geholt? Ist zu wenig Puffer eingestellt? Glaskugelmodus?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von af0815 »

Ich gehe davon aus, dein Problem ist, das du mit 2 Schittstellen am PC arbeitest und die Daten nicht in Relation zueinander bekommst. Du siehst den Master (Schnittstelle 1), kannst aber nicht die Daten von den Clienten (Schnittstelle 2) zuordnen. Ist das dein Problem ?


Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: serielle Schnittstelle zeitnah abfragen

Beitrag von NoCee »

der Arduino-Leonardo fällt da aus da der ja nur eine Hardwareschnittstelle hat.
Die Kommunikation bis 1'000'000Baud laufen zu lassen heißt noch nicht, daß
er die Daten auch auf 2 Schnittstellen schnell genug lesen und weitergeben kann.
Ich brauch ja unbedingt die richtige Reihenfolge von Master und Slave.

Aber ohne Programm kann man nicht sagen, woran es liegt. Werden die Uarts zu selten abgefragt? Werden zu wenige Daten aus den Uarts geholt? Ist zu wenig Puffer eingestellt? Glaskugelmodus?

Ich hab das in verschiedenen Varianten ausprobiert.
Eine Variante war u.a. 1 Byte abwechselnd vom com1 dann vom com2 lesen.
Wenn ich das so mache, laufen die Puffer voll ist also irgendwie zu langsam.
Meine Software macht quasi nichts anderes. Lesen, Anzeigen, Lesen, Anzeigen....
Mit größerem Puffer bringt mir nichts, da ich ja 2 davon habe und die genaue Reihenfolge daraus
nicht rekonstruieren kann.

Ich hab im Internet noch ein paar ähnliche Sachen gefunden. Speziell im professionellen Bereich
um z.B. den Can-Bus im PKW mitzuloggen. Und die haben alle einen eigenen Prozessor in einem
Kästchen verwendet. Klar, diese Busse takten ja erheblich höher.

Wenn ich nicht weiter komme probiert ich das mal mit dem Arduino Mega 2560,
den hab ich glaub ich noch in der Schublade und der hat glaube ich 4 Hardwareschnittstellen.

NoCee

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: serielle Schnittstelle zeitnah abfragen

Beitrag von NoCee »

Ich gehe davon aus, dein Problem ist, das du mit 2 Schittstellen am PC arbeitest und die Daten nicht in Relation zueinander bekommst. Du siehst den Master (Schnittstelle 1), kannst aber nicht die Daten von den Clienten (Schnittstelle 2) zuordnen. Ist das dein Problem ?

ganau das isses
Ich seh vom Slave viele Ack, Ack, Ack, Nak, Ack...
Das Nak heißt daß der Empfänger ein Telegramm nicht verstanden hat.
Aber welches?


NoCee

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von Timm Thaler »

NoCee hat geschrieben:Lesen, Anzeigen, Lesen, Anzeigen....


Das wird Dein Problem sein: Da das Anzeigen unter Windows immer in die Eventschleife reinfällt, bekommst Du unkalkulierbare Verzögerungen rein.

Mein Ansatz wäre jetzt: Alle anfallenden Bytes aus beiden Uarts sofort in einen String oder eine Datenarray schreiben. Dabei markieren, welches Byte woher kommt.

Jetzt hängt es davon ab, wie die Daten aussehen, die anfallen: Sind es nur Ascii-Zeichen zwischen 0x00 und 0x7f, dann könnte man das höchste Bit für die Markierung nehmen. Sind es nur Buchstaben und Zahlen, könnte man sie im String in Klammern setzen. Sind es Bytes im Zeichenraum 0x00 bis 0xff, würde ich die in Hex wandeln und in Klammern in den String schreiben. Willst Du die Bytes als Bytes erhalten, musst Du die eh in ein Array of Bytes schreiben, dann kannst Du ein zweites Array mitlaufen lassen, in dem zu jedem Index die Quelle steht.

Das hängt jetzt von Dir ab. Und dann erst den String oder das Array ausgeben.

Jetzt hast Du aber ein anderes Problem. Wenn das wirklich einzelne Bytes sind, ist ein Byte bei 9600Baud 1msec lang. Da bei Windows die Timeslots irgendwo bei 10msec liegen, bekommst Du die Daten nur in Quasi-Echtzeit da raus, wenn Du die Priorität Deines Programmes kurzzeitig erhöhst. Unter PureBasic könnte ich Dir sagen, wie das geht, unter Pascal hab ich das noch nicht gemacht. Du solltest die Prio aber wirklich nur immer für ein paar hundert Millisekunden erhöhen, sonst wird der Rechner unbedienbar und irgendwann schießt Windows Dein Programm ab, weil es denkt es wäre abgestürzt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von af0815 »

Timm Thaler hat geschrieben:Du solltest die Prio aber wirklich nur immer für ein paar hundert Millisekunden erhöhen, sonst wird der Rechner unbedienbar und irgendwann schießt Windows Dein Programm ab, weil es denkt es wäre abgestürzt.

Wenn die Threads für den Empfang auf ein absolutes minimum gehen, kann man die Prio sehr hoch machen. Habe ich schon gemacht für die Synchronisierung mit einer Maschine. Mal sehen ob ich noch Infos dazu finde.

Edit: Grundlagen dazu http://www.michael-puff.de/Programmieru ... Delphi.pdf so um die Seite 28. Ich befürchte das habe ich damals mit Delphi 7.0 gemacht.

Edit2: TThread hat die Property Priority
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
tpTimeCritical);

Damit sollte es gehen, es ist bei Lazarus/FPC einfacher geworden :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von af0815 »

NoCee hat geschrieben:Ich seh vom Slave viele Ack, Ack, Ack, Nak, Ack...
Das Nak heißt daß der Empfänger ein Telegramm nicht verstanden hat.
Aber welches?

Das heisst aber für mich, das du dem Masterteil einen Buffer spendierst und den Clientteil nur ein Byte. Triggert der Slave, so kannst du ja den Buffer des masters auch auslesen, das das ACK, NAK dann zuordenbar ist - anhand der Masterdaten.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von Timm Thaler »

NoCee hat geschrieben:Ich seh vom Slave viele Ack, Ack, Ack, Nak, Ack...


Quick and dirty: Wenn Du nur an der Position der Ack interessiert bist und Ack und Masterdaten zeitlich immer getrennt sind, und Du Ack und Masterdaten am Hexcode unterscheiden kannst, dann kannst Du auch einfach beide Txe auf den Rx eines gemeinsamen Uart mit einem Pull-Down-Widerstand und 2 Dioden verodern. Ruhepegel ist logisch high mit -12V, also muss der Widerstand nach -12V gehen und die Dioden den Rx nach oben ziehen.

Dann stehen die Ack immer richtig zwischen den Masterdaten.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von af0815 »

Der ist genial, vor lauter Software vergisst man auf die Hardware. Das gute alte Oder mit Dioden. :shock:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: serielle Schnittstelle zeitnah abfragen

Beitrag von NoCee »

Quick and dirty: Wenn Du nur an der Position der Ack interessiert bist und Ack und Masterdaten zeitlich immer getrennt sind, und Du Ack und Masterdaten am Hexcode unterscheiden kannst, dann kannst Du auch einfach beide Txe auf den Rx eines gemeinsamen Uart mit einem Pull-Down-Widerstand und 2 Dioden verodern. Ruhepegel ist logisch high mit -12V, also muss der Widerstand nach -12V gehen und die Dioden den Rx nach oben ziehen.


du hast nicht zufällig eine kleine Skizze mit Dimensionierung davon.
Ich hab so etwas in der mal in einer Hardware bei uns gesehen und konnte mir nicht erklären was das sein sollte.
Wenn das funktioniert wäre das genial und das aktuelle Problem wäre sofort gelöst.

Edit2: TThread hat die Property Priority
TThreadPriority = (tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest,
tpTimeCritical);


das schau ich mir mal genauer an

vielen Dank für eure Hilfe
NoCee

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von mschnell »

Wenn Dein "Schnittstellen-Wandler" per USB an den PC gekoppelt ist, kann der die empfangenen seriellen Daten zu Blöcken zusammenfassen, bevor er sie per USB an den PC schickt. Da kannst du dann kaum etwas gegen machen (außer selber einen bauen).

-Michael

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: serielle Schnittstelle zeitnah abfragen

Beitrag von NoCee »

ja super.
Das mir die Hardware in die Suppe spucken könnte
hatte ich absolut nicht auf dem Schirm. Ich benutze 2 USB-RS232 Wandler.


Dann wäre der Trick mit den Widerständen und Dioden recht witzig weil ich dann ja nur 1 Schnittstelle hätte.
Ansonsten nehm ich doch noch einen Arduino

Danke für die Info
NoCee

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: serielle Schnittstelle zeitnah abfragen

Beitrag von Timm Thaler »

NoCee hat geschrieben:Ich benutze 2 USB-RS232 Wandler.


Dann kannst Du das mít dem Timing vergessen. Das las sich aber oben wie zwei echte RS232.

Dioden 1N4148 oder was Ähnliches, Widerstand 3k3 bis 4k7. Bei 9600 Baud ist das unkritisch.

Schaltung ähnlich http://www.dieelektronikerseite.de/Projects/RS232-Weiche.htm, D1 und D3 kannst Du weglassen, wenn Du den R auf -5 bis -12V oder zur Not auch auf GND legen kannst. Die angegebenen 100k halte ich für zu hoch.

Bei der Belegung von Pin 2 und Pin 3, TxD und RxD musst Du schauen wie Deine Geräte das machen, das wird mitunter sehr "kreativ" gehandhabt, je nachdem ob Stecker oder Buchse und DCE oder DTE.

Antworten