Step 7 Sende String mit einem Byte

pzky

Level-1
Beiträge
3
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,

im Rahmen einer internen Umstellung muss ich einen 9-stelligen numerischen String mit einem 20-stelligen ersetzen.
Vorher wurde dieser über Profibus als DINT an die nachfolgende Maschine übergeben.
Nun habe ich nicht mehr genügend Bytes zur Verfügung und habe mir was zusammengebastelt um diesen einzeln zu übergeben.

Leider kann ich das aktuell nicht an der betroffenen Anlage testen und zur Umstellung habe ich nur ein Zeitfenster von 2 Stunden.
Daher meine Frage an euch, habt ihr Vorschläge um das entweder anders zu lösen, oder zur Verbesserung des Bausteins?
Das einzige was mir Bauchschmerzen bereitet ist das XOR für #iCom/#oCom, bzw. der Sprung, um sicherzustellen, dass der Empfänger bereit ist für den nächsten Byte.

Grüße
pzky

Code:
VAR_INPUT
      iStart        Bool        //    Übertragungsstart
      iDbOut        DB_Block    //    DB in welchen gespeichert werden soll
      iDbOutAdr        Int            //    Startadresse innerhalb des DB
      iDbIn            DB_Block    //    DB aus welchem gelesen werden soll
      iDbInAdre        Int            //    Startadresse innerhalb des DB
      iLength        Int            //    Länge des Strings (ohne Header)
      iCom            Bool        //    Kommunikationsaustauschsbit Senden

VAR_OUTPUT
      oCom            Bool        //    Kommunikationsaustauschsbit Empfang
     
VAR_STATIC
      sStartTrig    Bool        // Flankenmerker Start
      sComTrig        Bool        // Flankenmerker Com-Toggle
      loop_DbInAdr    Int            // Zähler für Adresse
      loop_count    Int            // Zähler für die Loopanzahl
_____________________________________________________________________________________

      A     #iStart
      FP    #sStartTrig
      JCN   wrt

      L     #iDbInAdr
      +     -1
      T     #loop_DbInAdr

      SET  
      =     #oCom

      L     #iLength

anf:  T     #loop_count

xor:  X     #iCom
      X     #oCom
      JCN   xor

      L     #loop_DbInAdr
      +     1
      T     #loop_DbInAdr
      SLD   3
      OPN   #iDbIn
      LAR1
      L     DBB [AR1,P#0.0]

      L     #iDbOutAdr
      SLD   3
      OPN   #iDbOut
      LAR1
      TAK  
      T     DBB [AR1,P#0.0]

      FP    #sComTrig
      X     #oCom
      =     #oCom
      CLR  
      =     #sComTrig

      L     #loop_count
      LOOP  anf

wrt:  NOP   0

Der Empfangsbaustein ist nahezu identisch, nur dass DbIn und DbOut getauscht sind, bzw. oCom vor dem Loop auf 0 gesetzt wird.
 
muss ich einen 9-stelligen numerischen String mit einem 20-stelligen ersetzen.
Vorher wurde dieser über Profibus als DINT an die nachfolgende Maschine übergeben.
Nun habe ich nicht mehr genügend Bytes zur Verfügung
Meinst du per zyklischem Profibus DP Master-Slave?
Gab es da schon ein Handshake für die Übergabe des Zahlenwertes?
Kannst du nicht einfach in den DP-Transferbereichen noch einen zusätzlichen Slot mit 6 oder 10 oder 22 Bytes projektieren?
Einen 20 stelligen numerischen Wert kann man z.B. als 10 Bytes BCD übertragen oder als STRING in 22 Bytes.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meinst du per zyklischem Profibus DP Master-Slave?
Yes
Gab es da schon ein Handshake für die Übergabe des Zahlenwertes?
Leider nichts dergleichen, deshalb mein Versuch mit den beiden Bits.
Kannst du nicht einfach in den DP-Transferbereichen noch einen zusätzlichen Slot mit 6 oder 10 oder 22 Bytes projektieren?
Verrückt, ich nahm immer an das sei fest limitiert und man kann nichts weiter hinzufügen.
Das vereinfacht das ganze natürlich ungemein und ich kann mir diesen Baustein sparen...

Da mich nun aber meine Neugierde trotzdem packt:
Der Sprung innerhalb des Loops um auf das XOR zu warten.
Würde der so funktionieren wie ich es mir dachte oder würde es die SPS in einen Laufzeitfehler schmeißen?
 
Du kannst ja mal überlegen, wie lange es dauert, bis dein XOR wieder empfangsbereit meldet, und wie lange deine Zykluszeitüberwachung ist.
Ich denke, es könnte kritisch werden.
Dein "LOOP anf" springt aber auch wieder im selben Netzwerk zurück, was beim Überfliegen für mich heißt,
du hängst im Baustein, bis alle Bytes übertragen sind. Und das wird m.E. relativ sicher Probleme machen.
Überspringe lieber, was du zum jetzigen Zeitpunkt NICHT machen möchtest.
Also wenn das nächste Byte noch nicht gesendet werden kann, überspringe die Stelle mit dem Senden.
 
Gab es da schon ein Handshake für die Übergabe des Zahlenwertes?
Leider nichts dergleichen
Dann wirst du auch kein zusätzliches Handshake brauchen. Du ersetzt ja nur die Übertragung des Wertes als 4-Byte-Wert durch einen anderen Mehrbyte-Wert.

Kannst du nicht einfach in den DP-Transferbereichen noch einen zusätzlichen Slot mit 6 oder 10 oder 22 Bytes projektieren?
Verrückt, ich nahm immer an das sei fest limitiert und man kann nichts weiter hinzufügen.
Das vereinfacht das ganze natürlich ungemein und ich kann mir diesen Baustein sparen...
Das kommt auf den DP-Slave drauf an. Ich vermute aber mal, die "nachfolgende Maschine" ist ein I-Slave (eine CPU), da brauchst du nur bei beiden SPS jeweils einen Steckplatz hinzufügen und in beide SPS laden (erfordert STOP der CPU). Knifflig wird das erst, wenn du auf insgesamt > x Bytes (vermutlich 240 Bytes) kommst.


Zu deinem AWL-Code: bei flüchtigem Betrachten sieht der so aus, als ob der nur umständlich einen String zwischen 2 DB kopieren soll (das wäre sicher auch per BLKMOV gegangen). Die genauere Betrachtung des #iCom und #oCom scheint aber eher so, als ob du in der Schleife die Bytes über ein Netz verschicken willst mit Warten auf das Handshake des Empfängers - sowas geht bei einer SPS natürlich nicht (wegen deren zyklischer Arbeitsweise und der Zykluszeit-Überwachung).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
du hängst im Baustein, bis alle Bytes übertragen sind
So war es gedacht. Ein Trigger um über einen Byte jeden Char einzeln zu senden und zu empfangen.
Also wenn das nächste Byte noch nicht gesendet werden kann, überspringe die Stelle mit dem Senden.
Da fällt mir maximal ein, dass wenn der Empfänger noch nicht bereit ist, ich aus dem LOOP rausgehe, ein Bit setze und erst wieder in den LOOP springe, sobald die Empfangsbereitschaft wieder vorhanden ist.

die "nachfolgende Maschine" ist ein I-Slave (eine CPU)
Der Austausch findet über einen DP/DP-Koppler (6ES7 158-0AD01-0XA0) statt.
Läuft aber auf das gleiche hinaus, einfach die Bytes die ich benötige hinzufügen und (hoffentlich) Spaß haben.
Zu deinem AWL-Code: bei flüchtigem Betrachten sieht der so aus, als ob der nur umständlich einen String zwischen 2 DB kopieren soll (das wäre sicher auch per BLKMOV gegangen). Die genauere Betrachtung des #iCom und #oCom scheint aber eher so, als ob du in der Schleife die Bytes über ein Netz verschicken willst mit Warten auf das Handshake des Empfängers - sowas geht bei einer SPS natürlich nicht (wegen deren zyklischer Arbeitsweise und der Zykluszeit-Überwachung).
An sich ja, nur war der Gedanke dass nur ein Byte benötigt wird zum Übertragen. Deshalb funktioniert BLKMOV nicht.
Ein Char wird übergeben aus einem DB, der Empfänger liest und schreibt es in seinen eigenen DB, meldet danach dass er bereit ist für den nächsten Char. #iCom und #oCom für den Austausch, aber so wie ich schon rauslesen konnte, wird es so nicht ganz klappen.

Am Ende werde ich jetzt einfach die Bytes hinzufügen und den vollen String übertragen.
Danke für die Hilfe :)
 
Zurück
Oben