Datenübergabe

PG710

Level-1
Beiträge
45
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe folgendes Problem, bei dem ich nicht so recht weiterkomme.

Also, ich habe ein TP177, in dem ich in einem Bild Korrekturwerte für Roboterpositionen (X-Position, Y-Postion, Z-Position und das an verschiedene Stationen) eingebe. Die Werte werden in einen DB geschrieben.
So weit auch kein Problem.
Nun sollen die Werte, in dem DB, an die Robotersteuerung (über Profibus, der auch läuft) übergeben werden.
Und das soll laut dem Kunden so funktionieren:
Übertragung der X-Position von Station 1 (DB100 DBW 10) mit der Nr. 1 an die Robotersteuerung, die Robotersteuerung meldet die X-Position von Station 1 an die SPS zurück, die vergleicht die Werte und startet dann die nächste Datenübertragung, also Y-Position von Station 1 (DB100 DBW 12)mit der Nr. 2, wieder Rückmeldung der Robotersteuerung und vergleich der Werte durch die SPS. Danach Z-Position von Station 1 (DB100 DBW 14) mit der Nr. 3, X-Position von Station 2 (DB100 DBW 16) mit der Nr. 4, Y-Position von Station 2 (DB100 DBW 18) mit der Nr. 5 usw.
Für die Übertagung an die Robotersteuerung wird immer nur das AW60 für die Positionen und das AB66 für dir laufende Nr. verwendet.
So, nun hoffe ich, dass ich das verständlich rübergebracht habe und die Experten unter euch mir weiterhelfen können. Das wäre echt klasse.

Gruss
 
Gibt´s da kein Bit, das die Daten für gültig erklärt bzw. den Robby zur Übernahme auffordert ?
Grundsätzlich klingt das nach einer schönen Übung zum Thema Schrittkettenprogrammierung.

Grüße von HaDi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich finde den Hand-Shake zum Roboter nicht sauber.

Was passiert wenn der Rückgabewert ungleich deiner Vorgabe bleibt ?
Was passiert wenn Du zweimal z.B. einen Korrekturwert von 0 schickst, dann würde deine Abfrage beim zweiten Senden direkt durchlaufen da noch die 0 vom ersten Senden ansteht.

Ich würde es besser finden wenn es z.B. über Bits geht.
z.B.
SPS-> Robi Daten liegen an setzen
Robi->SPS Daten gelesen setzen
SPS->Robi Daten liegen an wegnehmen
Robi->SPS Daten gelesen wegnehmen
SPS->Robit Daten 2 liegen an setzen
.... suw

Ansonsten würde ich einen FB anlegen dem ich den QuellDB mit Startadresse und Anzahl angebe. Diesen kann man dann für jede Station variabel parametrieren und aufrufen.
 
@HaDi
Wozu Schrittkette?

Ich würde einen FC schreiben. Der schreibt immer die Nummer und die Position auf das Wort und das Byte. Als zweites vergleicht er die Rückantwort mit den gesetzten Daten. Bei Gleichheit wird die Laufende Nummer erhöht und die nächste damit verbundene Position ausgegeben, bei Ungleichheit passiert nichts. U.U. noch ein Timeout, für eine Fehlermeldung, falls sich zu lange nichts tut bei der Rückmeldung. Wenn die zu sendenden Daten in unterschiedlichen DB und nicht aufeinanderfolgend sind, würde ich einen extra DB anlegen, in welchen aufeinanderfolgend die Positionen stehen, die abzuarbeiten sind. Dann kann man fortlaufend machen, ist man am Ende angelangt wird der Zählwert wieder auf den Anfang gesetzt und es geht von vorn los.

@jabba
Das ist mit auch aufgefallen, ich denke, der gesendete Zählwert sollte auch zurückgegeben werden, dann kann beides auf Gleichheit verglichen werden.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo HaDi,
der Robbi empfängt die Daten, egal was kommt.
Er schickt die Daten dann wieder zurück an die SPS, die soll dann vergleichen. Bei unterschiede wird dann ein Fehler gemeldet.
Hast du ne Idee wie man das machen könnte.
Die Daten werden ja im DB100 DBW10 bis z.B DB100.DBW100 geschrieben.
Die Übertragung an die den Robbi soll aber nur in einem AW erfolgen.

Gruss
 
Ich würde einen FC schreiben. Der schreibt immer die Nummer und die Position auf das Wort und das Byte. Als zweites vergleicht er die Rückantwort mit den gesetzten Daten. Bei Gleichheit wird die Laufende Nummer erhöht und die nächste damit verbundene Position ausgegeben, bei Ungleichheit passiert nichts. U.U. noch ein Timeout, für eine Fehlermeldung, falls sich zu lange nichts tut bei der Rückmeldung. Wenn die zu sendenden Daten in unterschiedlichen DB und nicht aufeinanderfolgend sind, würde ich einen extra DB anlegen, in welchen aufeinanderfolgend die Positionen stehen, die abzuarbeiten sind. Dann kann man fortlaufend machen, ist man am Ende angelangt wird der Zählwert wieder auf den Anfang gesetzt und es geht von vorn los.

Hallo Ralle,

genau so solls funktionieren. Ich steh da aber voll auf dem Schlauch.
Wie würdest du das jetzt programmierne?

Gruss
 
@HaDi
Wozu Schrittkette?
Hallo Ralle,
vielleicht lege ich den Begriff "Schrittkette" zu großzügig aus, aber auch deine Variante enthält m.E. die grundlegenden Merkmale einer Schrittkette.

Grüße von HaDi

[edit]
Jetzt hab ich damit ja behauptet, dass eine Schleife eine Art Schrittkette ist. Darf ich das ? Was meinst du ?
Sollte ich weniger von dem Zeugs trinken ?
[/edit]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
der Robbi empfängt die Daten, egal was kommt.
Er schickt die Daten dann wieder zurück an die SPS, die soll dann vergleichen.
Wird denn nur die Position (AW60) zurückgemeldet oder auch die Nummer (AB66) und wo (EWxy, EBxy) ?
Werden die Daten konsistent über die gesamte Länge übertragen (steht in der HW-Konfig) ?

Grüße von HaDi
 
Wird denn nur die Position (AW60) zurückgemeldet oder auch die Nummer (AB66) und wo (EWxy, EBxy) ?
Werden die Daten konsistent über die gesamte Länge übertragen (steht in der HW-Konfig) ?

Hallo HaDi,

Es wird die Postion und die Nummer zurück gemeldet.
Ob die Daten konsistent übertragen werden weis ich grad nicht.
Das PG ist in der Firma (Gott sei dank :)), aber ist das wichtig ?

Gruss
 
Wenn "Konsistenz über gesamte Länge" vorliegt, dann kann kein Zustand eintreten, in dem Position und Nummer, die beim Robby ankommen, nicht zusammen gehören (und wenn´s nur ein Zyklus ist).
Ein vernünftiger Handshake wär halt schön ...

Grüße von HaDi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur so als Vorschlag, ist nicht getestet und andere hier im Forum können sowas erheblich eleganter:
Code:
       AUF   DB     3 // hier stehen die Positionen
       U     M     10.0 //Startbit für Übertragung
       SPB   los //los geht´s
       L     1 //Nummer auf 1 setzen
       T     MB    99 // und merken
       L     10 //ab DBW10 fangen die Positionen an
       SLD   3 //ins Pointerformat wandeln
       T     MD   100 //und merken
       BEA //Ende, weil kein Startbit
los:  L     DBW [MD 100] //Lade DBW10/12/14...
       T     AW    60
       L     MB    99 //Lade Nummer
       T     AB    66
       U(    
       L     EW    60 //Rückmeldung der Pos. 
       L     DBW [MD 100]
       ==I   
       )     
       U(    
       L     EB    66 //Rückmeldung der Nummer
       L     MB    99
       ==I   
       )     
       SPB   c_up //hochzählen
       BEA   // abwarten
c_up: L     MB    99
       L     1
       +I    
       T     MB    99 //Nummer eins hochzählen
       L     MD   100
       L     16
       +D    
       T     MD   100 //DBW um 2 (=16Bit) hochzählen
       L     MB    99
       L     45
       ==I   // alle Positionen übertragen
      R     M     10.0 //Ende
Grüße von HaDi
 
Hallo Ralle,
vielleicht lege ich den Begriff "Schrittkette" zu großzügig aus, aber auch deine Variante enthält m.E. die grundlegenden Merkmale einer Schrittkette.

Grüße von HaDi

[edit]
Jetzt hab ich damit ja behauptet, dass eine Schleife eine Art Schrittkette ist. Darf ich das ? Was meinst du ?
Sollte ich weniger von dem Zeugs trinken ?
[/edit]

Hast du ja Recht, Schrittkette hört sich halt etwas hochgegriffen an für so eine simple Sache. :ROFLMAO:

@PG710

Am einfachsten läßt sich so etwas mit SCL programmieren.
Hast du das nicht, benötigst du indirekte Adressierung. Hierzu lese bitte zuerst die guten Beiträge in der FAQ zu diesem Thema.

Ich skizziere hier nur mal das Prinzip, aber der ganze Spaß ist wirklich recht simpel zu machen:

1. Du hast ein MW oder DW, welches deinen Zähler enthält.
2. Du hast einen Offset, in dem steht, wo dein Datenbereich beginnt (10)

FC oder FB:

1. Netzwerk
Vergleich, ob Zähl-DW < 1
wenn ja, dann 1 Zähl-DW setzen (nur zur Sicherheit, damit nie ein falscher Wert genutzt wird!)
Vergleich, ob Zähl-DW > max Anzahl der zu übertragenden Daten (hier 45 DW (DW10-DW100)
wenn ja, dann Zähl-DW auf 1 setzen

2. Netzwerk
Indirekte Adresse für das zu sendende Datenwort aus Zähl-DW und Offset berechnen und den Zeiger erstellen.
Zähl-DW und Daten-DW auf den Output (am Besten INOUT) des FC legen

3. Netzwerk
Input vom Robbi mit den ausgegebenen Daten (Netzwerk 2) vergleichen
bei Ungleichheit --> internens Timeoutbit auf True
bei Gleichheit --> internes Timeoutbit auf False, Zähl-DW um 1 erhöhen

4. Netzwerk
Wenn Timeoutbit = True, Timer laufen lassen, der nach Ablauf der Zeit ein Störungsbit setzt


Das Ganze setzt tatsächlich voraus, daß das AB und das AW konsistent übertragen werden. Sonst kann es dazu kommen, daß du die Daten zwar abschickst, diese aber beim Robbi zu unterschiedlichen Zeiten eintreffen und umgekehrt. Wenn man das gar nicht garantieren kann, muß man z.Bsp. mit Triggern (Flanken) arbeiten. Man überwacht in diesem Fall z.Bsp. die Nummer (AB66) auf Änderung, bildet daraus eine Flanke und wartet dann noch eine Zeit X, bis man die Daten übernimmt. Ist diese Zeit groß genug gewählt, wird das ziemlich sicher gehen. Evt. besser wäre in diesem Fall ein Triggerbit. Man legt die Daten wie oben beschrieben auf die Ausgänge, wartet nun eine Zeit X und setzt danach ein Übernahmebit. Mit diesem Bit übernimmt der Robbi die Daten. Ich hab auch schon Varianten gesehen, wo die gleiche Nummer 2 Mal gesendet wird. AB60 Nummer_1 AW62 Daten, AB64 Nummer_2. Nur wenn beide Nummern gleich sind, werden die Daten vom Robbi übernommen. Ausgehend von der Annahme, daß die Daten in Reihenfolge nacheinander auf den Bus kommen, könnte man annehmen, daß dann die Daten in der Mitte auch komplett und gültig sind.

Wichtig ist auch mal zu abzuklären, was passiert, wenn der Robbi fehlerhafte Daten bekommt. Kann es dann zum Crash kommen?
 
Zuletzt bearbeitet:
Daten sicher empfangen

Hallo,

Ralle schrieb:
max Anzahl der zu übertragenden Daten (hier 45 DW (DW10-DW100)

Ich denke mal, nur ein Tippfehler von Dir ..:-D

Ralle schrieb:
Ausgehend von der Annahme, daß die Daten in Reihenfolge nacheinander auf den Bus kommen, könnte man annehmen, daß dann die Daten in der Mitte auch komplett und gültig sind.

Oder einfach als Alternative eine Prüfsumme über XOR mit den Daten bilden. Ist zwar auch nicht hundertprozentig fehlersicher (siehe Stichwort Hamming-Distanz), aber im allgemeinen Betrieb ausreichend.

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,



Ich denke mal, nur ein Tippfehler von Dir ..:-D

Na gut, 46! Alter Krümelkacker *ROFL*, hast ja Recht. :ROFLMAO: Ich hab schon beim Schreiben gestutzt, das stimmt nicht, war aber viel zu faul darüber nachzudenken. Ich bin halt von Natur aus faul, ehrlich :) Aber immerhin, es gibt noch Leute, die lesen die Beiträge.
 
Ich hab mal was versucht, hoffe es hilft dir weiter, bin aber sicher irgendwer findet eine einfacheres Lösung. Ich hab mal angenommen das die Rückmeldungen auf dem EW60, bzw. EB66 kommen. Poition hab ich auch aus dem DB bezogen (würd ich mittels UDT gleich anhängen) kann aber auch ander gelöst werden.

Code:
// Start
      AUF   DB   100
      U     DBX    0.0                  //Init. durchgeführt
      SPB   END
// Pointer init
      U     DBX    0.1
      SPB   SEND
      L     P#10.0                      //Position des ersten Wertes im DB
      LAR1  
      S     DBX    0.1                  //Init. am laufen
// Senden
SEND: L     DBW [AR1,P#0.0]             //Position senden
      T     AW    60
      L     DBB [AR1,P#2.0]             //Nummer senden
      T     AB    66
// Kontrolle
      L     EB    66                    //Nummer Kontrollieren
      ==I   
      SPBN  ERR
      L     AW    60                    //Position Kontrollieren
      L     EW    60
      ==I   
      SPBN  ERR
      L     P#3.0                       //Pointer um 3 erhöhen (1 DBW + 1 DBB)
      +AR1  
// Stopp
      TAR1  
      L     P#303.0                     //letzte Positon + 1 gesendet (Annahme für 100 Positionen)
      >=D   
      S     DBX    0.0                  //Init. durchgeführt
      R     DBX    0.1                  //Init. am laufen
      SPA   END
// Fehlerbehandlung
ERR:  L     S5T#10S
      SE    T      1
      U     T      1
      =     #Fehler                     //Fehler nach 10s ohne korrekte Antwort auslösen
END:  NOP   0

Gruss Züttu
 
Um dieses "Weiterspringen, wenn 2mal die gleiche Position gemeldet" kann es hilfreich sein, die jeweilige Flanke abzufragen, also:

- X- Position übertragen
- Robi setzt "OK" auf 1
- Daten vergleichen
- SPS quittiert "Übertragung erfolgreich"
- Roboter nimmt "OK" zurück
- und mit der fallenden Flanke die nächste Übertragung (Y-Position) starten.

Dauert länger, dann kommt man aber nicht in Schwulitäten, dass die Quittierung noch ansteht und dadurch die Übertragung gleich wegquittiert wird.

Gruß, Tobias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Am einfachsten läßt sich so etwas mit SCL programmieren.
Hast du das nicht, benötigst du indirekte Adressierung. Hierzu lese bitte zuerst die guten Beiträge in der FAQ zu diesem Thema.

Ich skizziere hier nur mal das Prinzip, aber der ganze Spaß ist wirklich recht simpel zu machen:

1. Du hast ein MW oder DW, welches deinen Zähler enthält.
2. Du hast einen Offset, in dem steht, wo dein Datenbereich beginnt (10)

FC oder FB:

1. Netzwerk
Vergleich, ob Zähl-DW < 1
wenn ja, dann 1 Zähl-DW setzen (nur zur Sicherheit, damit nie ein falscher Wert genutzt wird!)
Vergleich, ob Zähl-DW > max Anzahl der zu übertragenden Daten (hier 45 DW (DW10-DW100)
wenn ja, dann Zähl-DW auf 1 setzen

2. Netzwerk
Indirekte Adresse für das zu sendende Datenwort aus Zähl-DW und Offset berechnen und den Zeiger erstellen.
Zähl-DW und Daten-DW auf den Output (am Besten INOUT) des FC legen

3. Netzwerk
Input vom Robbi mit den ausgegebenen Daten (Netzwerk 2) vergleichen
bei Ungleichheit --> internens Timeoutbit auf True
bei Gleichheit --> internes Timeoutbit auf False, Zähl-DW um 1 erhöhen

4. Netzwerk
Wenn Timeoutbit = True, Timer laufen lassen, der nach Ablauf der Zeit ein Störungsbit setzt


Das Ganze setzt tatsächlich voraus, daß das AB und das AW konsistent übertragen werden. Sonst kann es dazu kommen, daß du die Daten zwar abschickst, diese aber beim Robbi zu unterschiedlichen Zeiten eintreffen und umgekehrt. Wenn man das gar nicht garantieren kann, muß man z.Bsp. mit Triggern (Flanken) arbeiten. Man überwacht in diesem Fall z.Bsp. die Nummer (AB66) auf Änderung, bildet daraus eine Flanke und wartet dann noch eine Zeit X, bis man die Daten übernimmt. Ist diese Zeit groß genug gewählt, wird das ziemlich sicher gehen. Evt. besser wäre in diesem Fall ein Triggerbit. Man legt die Daten wie oben beschrieben auf die Ausgänge, wartet nun eine Zeit X und setzt danach ein Übernahmebit. Mit diesem Bit übernimmt der Robbi die Daten. Ich hab auch schon Varianten gesehen, wo die gleiche Nummer 2 Mal gesendet wird. AB60 Nummer_1 AW62 Daten, AB64 Nummer_2. Nur wenn beide Nummern gleich sind, werden die Daten vom Robbi übernommen. Ausgehend von der Annahme, daß die Daten in Reihenfolge nacheinander auf den Bus kommen, könnte man annehmen, daß dann die Daten in der Mitte auch komplett und gültig sind.

Wichtig ist auch mal zu abzuklären, was passiert, wenn der Robbi fehlerhafte Daten bekommt. Kann es dann zum Crash kommen?
__________________
Gruß
Ralle

@all
erst mal vielen Dank für eure Antworten. Klasse

@ralle
SCL programmierung kann ich nun gar nicht.
Ich dachte mir schon dass du das recht simple findest. Deine Antworten hier im board sind echt klasse und du bist ja echt der Profi unter den Profis. Leider finde ichs nicht so easy und die beiden Vorschläge von HaDi und Zütti konnte ich noch net testen.
Kannst du dir bitte die Mühe machen und deinen Vorschlag auch noch posten. Vielen Dank für deine Bemühungen.

Wenn der Robby falsche Daten bekommt, kann dies schon zum crash führen. Man könnte auch das Eingabefeld im OP begrenzen so dass man nicht zu grosse Werte eintragen kann. Es sind schliesslich nur Korrekturwerte im mm Bereich.

Gruss an alle
 
@ralle
SCL programmierung kann ich nun gar nicht.
Ich dachte mir schon dass du das recht simple findest. Deine Antworten hier im board sind echt klasse und du bist ja echt der Profi unter den Profis. Leider finde ichs nicht so easy und die beiden Vorschläge von HaDi und Zütti konnte ich noch net testen.
Kannst du dir bitte die Mühe machen und deinen Vorschlag auch noch posten. Vielen Dank für deine Bemühungen.

Wenn der Robby falsche Daten bekommt, kann dies schon zum crash führen. Man könnte auch das Eingabefeld im OP begrenzen so dass man nicht zu grosse Werte eintragen kann. Es sind schliesslich nur Korrekturwerte im mm Bereich.

Gruss an alle

Dazu fehlt mir im Moment die Zeit, bin bei ner IBN, ich hab ja den Ablauf rel. genau beschrieben. Versuchs doch mal und stell den Code hier ein, wenn es Probleme gibt.
 
Zurück
Oben