Step 7 Array (32 Byte) über PN/PN empfangen und senden?

Flo.S

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

vielicht kann mir hier jemand weiterhelfen.
Ich würde gern ein Array mit 32 Byte über einen PN/PN Koppler lesen und später wieder zurück schreiben. Bisher habe ich sowas noch nicht machen müssen und weiß nicht wie ich das machen kann.
Ich habe mir einen FB angelegt indem ich das Array verwalten will. Dieser FB hat einen IN Parameter der als Array deklariert wurde siehe Anlage1.
Naiv wie ich bin habe ich gedacht ich kann mit einen pointer diregt auf den eingangsbeeich des PN/PN Kopplers schauen und so den ganzen Block auf einmal einlesen und im FB weiterverarbeiten. Dort schreibe ich über den SFC20 den IN Parameter auf einen DB.
Es scheitert aber jetzt schon daran das ich nich weiß wie ich auf den IN parameter des FB den entsprechenden Eingangsbereiche zu parametreien habe.
In Anlage 2 ist die Konfiguration des PN/PN Kopplers.

Hat jemand einen Tipp wie ich vogehen könnte?

Ich habe ein CPU 315 und bin noch mit Step7 unterwegs.

vielen dank schon mal

Flo
 

Anhänge

  • Anlage 1.png
    Anlage 1.png
    8 KB · Aufrufe: 18
  • Anlage 2.png
    Anlage 2.png
    15 KB · Aufrufe: 19
Es ist zwar schon etwas her das ich Classic Programmiert habe.

Aber ich hätte den Lösungsansatz über Any-Pointer und BLK_MOV versucht.
Dass ich die Eingänge über einen Anypointer adressiere und dann auf ein Array kopiere, vorausgesetzt man benötigt für die Weiterverarbeitung ein Array.

Im FB
also IN:
Pun_Number........ Datentyp Any

Im Baustein ein Aufruf von SFC20 (wenn ich die BLK_MOV Nummer noch richtig im Kopf habe)
SRCBLK: Pun_Number....
DSTBLK : Array

Verschaltung vom FB
Hier bin ich mir nicht sicher ob der Pointer direkt angegeben werden kann
z.B. über P#A130.0 Byte 32

Ansonsten wurde ich den Anypointer einfach zusammenbauen
In den Lokaldaten einen AnyPointer anlegen und das Adressregister auf den Pointer Adressieren:

LAR1 P##QANY //zeiger ins adressregister laden
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [AR1,P#0.0]
L W#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L #32 //Anzahl Bytes
T LW [AR1,P#2.0]
L #0 //Quell-DB (Da kein DB hier 0)
T LW [AR1,P#4.0]
L #130 //Anfang der Quelle
SLD 3
T LD [AR1,P#6.0]
L B#16#81 //Speicherbereich (Eingänge)
T LB [AR1,P#6.0]


So hätte ich es versucht.

Entschuldige die Rohform, aber habe auf dem Laptop an dem ich sitze keinen Manager mehr drauf.

Edit:
Hier noch die Anleitung für Any-Pointer, leider wird der BB-Code vom Forum mit den Farben etc. nicht mehr ausgeführt bei mir.

Es wäre möglich dass der Anypointer von IN nicht direkt auf den BLK_MOV verschalten werden kann. Entweder müsste man ihn dann auf den Temp Bereich umkopieren oder was noch eine Alternative wäre das umkopieren als schleife selbst schreiben mit den Informationen aus dem Pointer. Oder den Pointer erst im FB zusammenbauen
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Deklaration des FB INPUT Pun_Number_LD_IN : "Array [0..32] Of Byte" sind 33 Byte !
Im Koppler Steckplatz 6 das Modul IN_PUN Number E130...161 sind 32 Byte

In Step7 classic kann man Arrays und Strukturen nicht an E/A-Adressen deklarieren (sondern nur in DB und Baustein-Schnittstellen), da geht die Adressierung eines Bereichs nur mit einem ANY-Pointer.

Wenn der FB-Input unbedingt als Array deklariert werden soll, dann kannst Du vor Aufruf des FB mit SFC20 BLKMOV von den Eingängen des Kopplers in den FB-Input kopieren:
Code:
      CALL  "BLKMOV"
       SRCBLK :=P#E 130.0 BYTE 32
       RET_VAL:=#Tmp_Int
       DSTBLK :="IDB2".Pun_Number_LD_IN

      CALL  "FB2" , "IDB2"
       Pun_Number_LD_IN:=

Liegen E130...161 außerhalb des Prozessabbild der Eingänge (PAE) und Konsistenz ist "Gesamt" projektiert, dann müsstest Du mit SFC14 DPRD_DAT kopieren.

Harald
 
Zuletzt bearbeitet:
Wenn du Strukturen in ein DB definiert der genau die Grösse wie die Transfer Bereiche für den PN/PN Koppler definiert hast, dann einfach DPWR_DAT und DPRD_DAT aus den Standardbibliotek verwenden.

Du spezifizierst den gesammten Struktur (dein Array) bei den Aufruf von DPWR_DAT oder DPRD_DAT.

OBS, die E/A Adressen müssen Ausserhalb von das Prosessabbild liegen.
 
Harald war schneller (wie immer) ...

Oft müssen die Daten die man über ein PN/PN Koppler übertragt konsistent sein.
Selbst wenn sie nicht konsistent sein muss, ist die Verfahren mittels DPWR_DAT und DPRD_DAT sehr einfach.
Deswegen empfehle ich diese Variante.
 
Hallo Zusammen,

vielen dank für die schnelle hilfe. Schaut jetzt gut aus.(y):p
Erstmal habe ich die Anzahl der Byte's Korrigiert und über den BLKMOV kopiere ich mir die daten bevor ich sie auf den Eingang des FB's schreibe.

Flo
 
Zurück
Oben