Arraybereich auslesen

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich würde gern einen Bereich eines Arrays auslesen. ich weiß nicht wie lang das Array immer sein wird, aber länger wie 15 byte nicht. man müsste immer die ersten und die letzten 5 byte "abschneiden", damit ich an den bereich komme den ich haben möchte.
wie würdet ihr da vorgehen? gibt es in s7 schon passende bausteine für sowas?
danke.
 
Warum hat das ne unterschiedliche Länge? Du musst doch vorher definieren wie groß es ist.
Theoretisch kannst du halt immer die maximale Länge lesen, aber dann muss der DB in dem du das Array definierst auch "groß" genug sein.
Willst du z.B. 100Byte lesen, aber der DB ist nur 50Byte groß hast du halt einen Fehler an der CPU.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum hat das ne unterschiedliche Länge? Du musst doch vorher definieren wie groß es ist.
Theoretisch kannst du halt immer die maximale Länge lesen, aber dann muss der DB in dem du das Array definierst auch "groß" genug sein.
Willst du z.B. 100Byte lesen, aber der DB ist nur 50Byte groß hast du halt einen Fehler an der CPU.

nun, es gibt nun mal anwendungen, bei denen die nutz-arraylänge nicht definiert ist. z.b. bei rezepten deren parameterzahl unterschiedlich ist, oder beim erstellen von funktionen für eben unterschiedliche arraylängen.

leider wissen wir nicht mehr über die anwendung und den aufbau, so dass wir hier nur theoretisch abhandeln können.

angenommen das speicherarray hat eine feste größe, eine worst-case-größe -> größtes anzunehmendes nutzarray passt hinein, dann ist es ein einfaches die unterschiedlichen nutzarrays darin abzulegen und mit einem stop-zeichen zu versehen. bei einem array of byte würde sich etwas wie FF anbieten, wenn man sicher sein kann, dass diese folge im nutzarray nicht auftritt.

bei der verarbeitung dann einfach dieses FF zählend suchen, so hat man die länge des nutzarrays im speicherarray. der rest ist mit indirekter adressierung (AWL) oder mit SCL sehr einfach zu erschlagen.
 
Danke für eure Antworten.
das ganz läuft über ethernet ab, also ein normales tcpreceive, wofür es ja auch einen baustein gibt. das funktioniert auch. nur möchte ich halt gerne einen bereich der empfangen daten auslesen und abspeichern. die daten sind nicht jedesmal gleich groß. bei dem auslesen tu ich mir halt grad noch schwer. sollte alles in awl ablaufen.
 
Selbst wenn du etwas über Ethernet ausließt, hast du ja irgendwo einen bestimmten Bereich den du definierst.. z.B. 1000Byte

Und selbst wenn du die Bytemenge die du ließt dynamisch machst, kannst du doch dieses Merken und nutzen wenn du die Daten abarbeitest..

Hast du denn kein Datenfeld welches immer ungleich null ist wenn es benutzt ist?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok. da hast du natürlich recht. eine höchstgrenze kann man natürlich schon ziehen. also mehr als 15 byte werden es wohl nicht werden. das mit dem datenfeld hab ich leider nicht wirklich verstanden...

wir würde ich sowas jetzt in awl umstetzen. angenommen 15 byte array und würde davon nur die mittleren fünf bytes benötigen, um sie irgendwo in ne datei zu schreiben ?

danke :)
 
Solange du nur 5 Bytes kopieren möchtest könntest du es so lösen.


Länge 15 Bytes
0 1 2 3 4 | 5 6 7 8 9 | 10 11 12 13 14

Byte 5-9 wird benötigt.

(erstes Byte)
L DB1.DBB5 // Quelle (dein Array)
T DB2.DBB0 // Speicherort (Datenbaustein oder Merker)

(zweites Byte)
L DB1.DBB6
T DB2.DBB1

(drittes Byte)
.
.
.



Sollte die Anzahl von 5 Bytes jedoch deutlich überschritten werden,
würde ich die Speicherung in einer Schleife oder mit dem SFC 20 lösen.
Sollte sich auch der Speicherbereich/ort ändern kannst du es mit einem
Any-Zeiger lösen.

Alex
 
ok. da hast du natürlich recht. eine höchstgrenze kann man natürlich schon ziehen. also mehr als 15 byte werden es wohl nicht werden. das mit dem datenfeld hab ich leider nicht wirklich verstanden...

wir würde ich sowas jetzt in awl umstetzen. angenommen 15 byte array und würde davon nur die mittleren fünf bytes benötigen, um sie irgendwo in ne datei zu schreiben ?

danke :)

Du musst einen Weg finden Daten bzw. Datensätze zu identifizieren. Habe ich z.B. ein Array voll mit Produkten und dem dazugehörigen Datensätzen, dann würde ich halt nur die Datensätze lesen, dessen Produkte (Nr, Name) nicht Null sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Solange du nur 5 Bytes kopieren möchtest könntest du es so lösen.


Länge 15 Bytes
0 1 2 3 4 | 5 6 7 8 9 | 10 11 12 13 14

Byte 5-9 wird benötigt.

(erstes Byte)
L DB1.DBB5 // Quelle (dein Array)
T DB2.DBB0 // Speicherort (Datenbaustein oder Merker)

(zweites Byte)
L DB1.DBB6
T DB2.DBB1

(drittes Byte)
.
.
.



Sollte die Anzahl von 5 Bytes jedoch deutlich überschritten werden,
würde ich die Speicherung in einer Schleife oder mit dem SFC 20 lösen.
Sollte sich auch der Speicherbereich/ort ändern kannst du es mit einem
Any-Zeiger lösen.

Alex


sorry. mein beispiel war nicht gut.
wichtig für mich wäre dass die ersten und letzten 5 bytes abgeschnitten werden. die in der "mitte" sind ja variabel groß.
hättest du mir da noch nen lösungsansatz ?
 
kennst du die Länge deiner "Nutzdaten" ?

ne, sie schwankt immer ein wenig. einmal 3, einmal 5. darum ja besser den festen bereich am anfang und ende schneiden.

- steht diese Länge im Telegrammkopf?

ja, ich denke schon. (schade dass ich es nicht sicher weiß -.-)
.

- einfach die Daten aus dem ersten DB "beschnitten" in den zweiten DB kopieren?

jup.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So als Lesestoff für den Restabend:

http://www.sps-forum.de/showthread.php?t=8877

http://www.sps-forum.de/showthread.php?t=8887

Wichtig ist, das du dir deine Datenstruktur gut vorbereitest.. mit AWL wird es später etwas kompizierter wenn sich da nachträglich etwas verschiebt.

Wenn du schon etwas hast (Siehe Alex) dann mach nen Screenshot und stell den hier ein (wenn möglich)

screenshot wäre erst morgen möglich. ja, muss ich mich mal durchkämpfen, aber soviel scheints gar nicht zu sein.
 
kann mir jemand ein wenig helfen ?

Es würde Sinn machen, genauer zu beschreiben, was du willst.
Welche SPS, wo kommen die Daten per TCP her, wo landen sie, wie sieht das dann genau aus, was kommt an (paar Beispiele), was willst du dann da rausschneiden.

Wenn die Daten immer unterschiedliche Länge haben, braucht du eine der neueren PN-SPS, sonst verschieben sich die Daten im Empfangsbereich bei jedem Datenempfang, da die älteren SPS und m.E. auch de CP343 mit festen Telegrammlängen arbeiten. Oder dein Telegramm hat eine Endekennung, dann kann man damit die Daten korrekt aus dem Array herauspulen, was aber nicht ganz trivial ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also.
ich versuchs einfach nochmal:
ich habe ein telegramm über den receivebaustein(recv) empfangen. dort werden unter anderem die länge(int) und die daten(any) verarbeiten.
ich würde gerne den anfang und den das ende des telegramms um 5 stellen abschneiden.
das "endeabschneiden" ist mir gelungen. habe einfach 5 von der länge subtrahiert und die neue länge dann als Größe(wiederholungsfaktor) im anypointer verwendet...und dann die daten ausgegeben.
jetzt würde halt noch die ersten fünf fehlen... :)
ich hoffe es ist verständlich. :)
 
Schreibe die Daten aus dem TCP Baustein temporär weg und "kappe" dann aus den temporären Daten die ersten 5 und die letzten 5 weg und speichere das dann in deinem Ziel-DB.

Starten bei 0+5 ende bei länge-5.
 
Zurück
Oben