Forum: PC-Programmierung zwei Systeme miteinaner kommunizieren lassen


von Walter Jenschko (Gast)


Lesenswert?

Hallo,

ich habe zwei verschiedene Hardwaregeräte, die nicht mit einer 
gemeinsamen Taktquelle gespeist werden. Beide Systeme laufen mit 2kHz 
(aber jedes nicht zu 100 Prozent mit 2kHz). Es müssen Daten hin- und 
hergetauscht werden.

Nach einer Weile passiert es immer, dass beim Hin- und Hersenden der 
Daten Fehler entstehen - wegen der gemeinsamen leichten 
Nicht-Synchronität, die Systeme laufen nach einer Weile immer etwas 
auseinander und laufen dann wieder für eine Weile stabil.

Beispiel:

Sender: 01234 56789 01234 56789 01234 56789
Empf. : 01234 46679 01234 56789 01234 46679
............:.====....................====.

Der Fehler ist z.B. der, dass ein Wert vom Empfänger zweimal gelesen 
wird und
der, der eigentlich kommen müsste, verschluckt wird.

Gäbe es irgendwelche Möglichkeiten, das softwaremässig abzufangen? Oder 
könntet Ihr mir irgendwelche Literatur empfehlen, wo man noch etwas mehr 
über diese Problematik nachlesen könnte?

Beitrag #4994312 wurde von einem Moderator gelöscht.
von c-hater (Gast)


Lesenswert?

Walter Jenschko schrieb:

> ich habe zwei verschiedene Hardwaregeräte, die nicht mit einer
> gemeinsamen Taktquelle gespeist werden. Beide Systeme laufen mit 2kHz
> (aber jedes nicht zu 100 Prozent mit 2kHz). Es müssen Daten hin- und
> hergetauscht werden.

Und wie genau passiert das nun? Das ist doch der springende Punkt.

Wenn der Takt nicht synchronisiert ist, muss halt wenigstens die 
Kommunikation synchronisiert werden. Wie das zu realisieren ist, hängt 
aber davon ab, wie genau die Dinger miteinander reden.

Beitrag #4994368 wurde von einem Moderator gelöscht.
von Reinhard #. (gruebler)


Lesenswert?

Walter Jenschko schrieb:
> Gäbe es irgendwelche Möglichkeiten, das softwaremässig abzufangen?

Du musst eine Serielle Datenschnittstelle
mit Startbit, Baud Rate u.s.w nachbilden.

von Rolf M. (rmagnus)


Lesenswert?

genervt schrieb im Beitrag #4994368:
> AngularJS hat nichts mit dem Thema zu tun, also bitte ignorieren

Ich vermute, er wollte damit sagen, dass zur Beantwortung der Fragen 
essenzielle Informationen fehlen. Das scheinst du ja auch gemerkt zu 
haben, da du selbst auch keine Antwort lieferst.

Walter Jenschko schrieb:
> ich habe zwei verschiedene Hardwaregeräte, die nicht mit einer
> gemeinsamen Taktquelle gespeist werden. Beide Systeme laufen mit 2kHz
> (aber jedes nicht zu 100 Prozent mit 2kHz). Es müssen Daten hin- und
> hergetauscht werden.

Deine Systeme sind mit 2 Kilohertz getaktet?

> Nach einer Weile passiert es immer, dass beim Hin- und Hersenden der
> Daten Fehler entstehen - wegen der gemeinsamen leichten
> Nicht-Synchronität, die Systeme laufen nach einer Weile immer etwas
> auseinander und laufen dann wieder für eine Weile stabil.

Ganz entscheidend wäre hier, wie dein Übertragungsprotokoll aussieht. 
Das kann ja hier keiner raten. Und womit sind die Systeme getaktet? 
Quarz? RC-Oszillator? Schlagzeug? Welche Genauigkeit haben die 
Taktquellen in etwa?

von Fabian F. (fabian_f55)


Lesenswert?

Ziemlich simpel, ja.
Einfach eine Botschatszähler (BZ) in die Nachricht packen. Wenn zwei mal 
der gleiche Wert kommt-> Ignorieren.
Wenn es knapp wird, kann es aber passieren, dass man eine Botschaft 
verpasst.
An der Lücke im BZ kann der Empfänger aber erkennen, dass ein Zyklus 
fehlt und den ggf. noch mal anfordern.

von Walter Jenschko (Gast)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:
> Und wie genau passiert das nun? Das ist doch der springende Punkt.

Es handelt sich um zwei Systeme. Das erste System ist ein Siemens 
iPC-Box-PC mit zwei Karten. Die eine Karte ist eine CP1616-Karte für 
Profinet-Kommunikation und eine ehtercat-fähige Netzwerkkarte (Modell 
weis ich grade nicht, aber eine mit Intel-Chipsatz, die 
Ethercatkommunikation zulässt).

Programmiert wird dieses System mit Simulink. Die CP1616-Karte verfügt 
über eine Clock-Leitung, auf die das Simulink-Modell getaktet wird.

Die Ethercat-Karte arbeitet in dem System für sich alleine als 
Ethercatmaster. Auch dort ist die Geschwindigkeit auf 2kHz eingestellt.

Simulink-Realtime bietet bereits fertige Blöcke zur 
Ethercatkommunikation an. Diese werden verwendet. Die Daten, die über 
Ethercat versendet werden sollen, werden über den Kommunikationsblock in 
die jeweiligen Sende- und Empfangsregister der Netzwerk-Karte gesendet 
und die Karte sendet die Daten halt nicht auf den Sampletakt von der 
CP1616-Karte getriggert an das Zielsystem.

Das Zielsystem besteht auch aus zwei Teilen - der Empfangseinheit für 
die Ethercatkommunikation (das als Ethercat-Slave arbeitet) und einem 
weiteren Teil, in dem das Regelsystem arbeitet. Das sind zwei 
unabhängige FPGAs, die auch mit Simulink programmiert werden und auch 
zwei eigentständige Taktquellen haben und Daten über Register 
miteinander austauschen.

Ich arbeite gerade an der Kommunikationseinheit an dem Zielsystem (man 
braucht sich momentan nicht um die Synchronisation zw. Regelsystem und 
Kommunikationssytem zu kümmern, da der Fehler bereits im eigenständig 
programmierbaren Kommunikationsmodul auftritt). Das Zielsystem ist nicht 
in der Lage, auf ein externes Triggersignal zu reagieren (ich kann also 
nicht eine Triggerleitung von Simatic-iPC an das Zielsystem senden).

Ich habe mal eine Skizze angefügt.

von c-hater (Gast)


Lesenswert?

Walter Jenschko schrieb:

> Es handelt sich um zwei Systeme. Das erste System ist ein Siemens
> iPC-Box-PC mit zwei Karten. Die eine Karte ist eine CP1616-Karte für
> Profinet-Kommunikation und eine ehtercat-fähige Netzwerkkarte (Modell
> weis ich grade nicht, aber eine mit Intel-Chipsatz, die
> Ethercatkommunikation zulässt).

Bullshit. Ethercat agiert erstens in Frequnzbereichen weit oberhalb der 
von dir angegebenen 2kHz und enthält zweitens hinreichende Mechanismen 
zur Bitsynchronisation. Genau das ist ja der Sinn von Ethercat.

So, wie's aussieht, versuchst du ein sehr viel langsameres und völlig 
dummes Protokoll auf den (nicht mit diesem semmeldummen Protokoll 
synchronisierten) Bitstream von Ethercat aufzusetzen.

Kann man machen (wenn man es nicht besser weiss). Dann muss man aber 
halt ein Protokoll bauen, welches den eigenen Takt synchronisiert, 
völlig unabhängig vom Takt des drunterliegenden Ethercat. Am einfachsten 
dürfte es wohl sein, eine UART nachzubauen...

Weitaus sinnvoller wäre allerdings, Ethercat so zu benutzen, wie es 
eigentlich gedacht ist. Sprich: beide Geräte müssen erstmal auf die 
Bitrate des Ethercat-Streams synchronisiert werden. Darauf setzt man 
dann auf.

Ein minimales Protokoll zur Word-Synchronisation brauchst du aber auch 
dann noch, ist aber auch schon Bestandteil von Ethercat, muss nur 
benutzt werden.

Fazit: lies die verschissene Dokumentation zu Ethercat, benutze das 
vorhandene API. Dann geht nicht nur 2kHz synchron, sondern auch noch 
sehr viel mehr...

Hausaufgabe?

von Thomas (kosmos)


Lesenswert?

Ganz einfach man übertragt einfach Impulse von z.B. 1 mSek diese sind 
dann auch zur Synchronisation die darauffolgende Länge der low Pause 
bestimmt obs ne 1 oder 0 ist. Man spart sich also eine 
Synchronisationleitung und es wird trotzdem jedes Bit synchronisiert.

1 mSek high+ 1 mSek low = 1
1 mSek high + 2 mSek low = 0

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.