Step 7 Array of Byte transfer to output PROFINET

Bachelor_OS2017

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Forum,

ich arbeite gerade mit einer SPS S7-300 und dem Programm SIMATIC Manager Step 7 V5.5.
Hier wird für einen Test eine STRING Variable mit der Funktion SFC20 in ein ARRAY of BYTE geschrieben. Anschließend soll das Array of Bytes von max. 256 Zeichen über PROFINET an ein externes Gerät übertragen werden. Auf dem Gerät ist die Programmierumgebung Node-RED installiert.
Aktuell wird nur ein Byte empfangen, obwohl alle Bytes übertragen werden.


Hier der Beispiel-Code für 9 Zeichen.

Das ARRAY of BYTE wird auf die Adressen PAB 305 bis PAB 313 transferiert.

L DB5.DBB 12 //9
T PAB 305
L DB5.DBB 13 //8
T PAB 306
L DB5.DBB 14 //T
T PAB 307
L DB5.DBB 15 //e
T PAB 308
L DB5.DBB 16 //s
T PAB 309
L DB5.DBB 17 //t
T PAB 310
L DB5.DBB 18 //1
T PAB 311
L DB5.DBB 19 //2
T PAB 312
L DB5.DBB 20 //3
T PAB 313




Für die STRING Variable wurden die Adressen PAB 305 bis PAB 560 (256) erstellt.

Muss das ARRAY of BYTE anders auf die Ausgangsbytes transferiert werden oder ist es ein Fehler auf dem externen Gerät????
Gibt es eine Funktion oder Baustein, womit das ARRAY of BYTE automatisch auf alle BYTES transferiert wird?? Denn wenn ein STRING von 254 benötigt wird, gibt es bestimmt eine elegantere Form als es wie oben als Beispiel angegeben ist.
Oder müssen alle 256 BYTES in ein ARRAY geschrieben werden und dann als ganzes PAKET übertragen werden??

bin offen für Ratschläge!!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ist das so richtig?
Aktuell gibt es keine Änderungen!


Netzwerk 1:
CALL SFC 20
SRCBLK :="STRING".DB_D1
RET_VAL:=MW0
DSTBLK :="ARRAY Gross".DB_A1
NOP 0

Netzwerk 2:
CALL SFC 15
LADDR :=W#16#131
RECORD :="ARRAY Gross".DB_A1
RET_VAL:=MW1
NOP 0

Netzwerk 3:
CALL SFC 14
LADDR :=W#16#131
RET_VAL:=MW2
RECORD :="ARRAY Gross".DB_A2
NOP 0

Netzwerk 4:
CALL SFC 20
SRCBLK :="ARRAY Gross".DB_A2
RET_VAL:=MW3
DSTBLK :="STRING".DB_STRING_OUT
NOP 0

Mit STRING [256] in DB500 mit dem Namen DB_D1 und DB_STRING_OUT.
Mit ARRAY [0 .. 255] of BYTE in DB501 mit dem Namen DB_A1 und DB_A2.

Im Node-RED Programm soll ein Byte-Array von 0 bis 255 verarbeitet werden!

Danke für die Hilfe.
 
Warum den Zwischenspeicher Array_gross ?
Warum nicht direkt von der Quelle ?
Du musst nur den gesammte Datenmenge in ein Struktur sammeln, und dann mit SFC15 übertragen.
Etwa:

DB "MySTRINGs"
AlleStrings STRUCT
String1 : STRING[20]
String2 : STRING[20]
String3 : STRING[20]
..
END_STRUCT


Dann...
CALL SFC 14

LADDR :=W#16#131
RET_VAL:=MW2
RECORD :="MySTRINGs".AlleStrings

NB. Ich wäre überrascht wenn STEP7 zulässt das du dein DB "STRING" nennst. STRING ist ein reservierten Bezeichner.
 
Bei dem Spielchen müsst halt generell nur noch bedacht werden, dass ein Sting[20] eigentlich 22 Byte lang ist, weil die ersten beiden Bytes Headerbytes mit der maximalen bzw. tatsächlichen Länge sind.
Korrekterweise müsste man hier also keinen String sondern ein Array of CHAR verwenden.
Desweiteren kann ein normaler S7-300 String maximal 254 projektierte Zeichen lang sein, d.h. String[256] gibt es nicht.
 
Zuletzt bearbeitet:
Darum braucht man nicht zu kümmern wenn man den ganzen STRUCT übertragt.
Es ist den Vorteil wenn man so weit wie möglich symbolisch programmiert.
Das hängt jetzt davon ab, ob das "gegenüber" mit den Headerbytes was anfangen kann oder nicht. Sehr oft ist das nicht so ...

Was ist das eigentlich für ein ominöses Gerät?
Zu Node-Red gibt es z.B. NodeS7, welches aber wiederum über RFC1006 kommuniziert, also nichts womit man mit PAB oder SFC14 etwas anfangen könnte.
 
Klaro, wenn es ein ARRAY OF CHAR sein muss, dann ein ARRAY OF CHAR, oder wenn es ein STRING[254] sein muss, dann ein STRING[254].

Ich kenne Node-Red nicht. Mein Hinweis gelt nur wie man den Datentransfer am einfachsten macht wenn man ein Profinet Teilnehmer hat.
Den Beschreibung von Batchelor_ deutet an dass der Partner ist ein Profinet IO Device für der S7-300 als Profinet IO Controller (wegen die direkten Peripheriezugriffe).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Netzwerk 1:
CALL SFC 20
SRCBLK :="STRING".DB_D1
RET_VAL:=MW0
DSTBLK :="ARRAY Gross".DB_A1
NOP 0

Netzwerk 2:
CALL SFC 15
LADDR :=W#16#131
RECORD :="ARRAY Gross".DB_A1
RET_VAL:=MW1
NOP 0

Netzwerk 3:
CALL SFC 14
LADDR :=W#16#131
RET_VAL:=MW2
RECORD :="ARRAY Gross".DB_A2
NOP 0

Netzwerk 4:
CALL SFC 20
SRCBLK :="ARRAY Gross".DB_A2
RET_VAL:=MW3
DSTBLK :="STRING".DB_STRING_OUT
NOP 0
Welchen Wert liefern die RET_VAL der SFC14 und SFC15?
Außerdem sind hier auch noch Fehler - die MW0, MW1, MW2 und MW3 überlappen sich. Besser wäre MW0, MW2, MW4 und MW6.

Harald
 
Danke JesperMP und MSB,

das schreiben in das Gerät hat geklappt!
Es lag an einer Einstellung im Node-RED Programm und wahrscheinlich auch am Namen des Datenbausteins "STRING".

Nun muss für das schreiben der STRING Variablen der richtige Code im Node-RED Programm erstellt werden....

Danke für die Hintergrundinfos zum String[254] und der symbolischen Programmierung
!!! Wertvolle Zeit konnte eingespart werden :).
 
Zurück
Oben