Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Arraybereich auslesen

  1. #1
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard


    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.
    Zitieren Zitieren Arraybereich auslesen  

  2. #2
    Registriert seit
    21.07.2008
    Beiträge
    1.066
    Danke
    51
    Erhielt 140 Danke für 136 Beiträge

    Standard

    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.

  3. #3
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Deltal Beitrag anzeigen
    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.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  4. #4
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    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.

  5. #5
    Registriert seit
    21.07.2008
    Beiträge
    1.066
    Danke
    51
    Erhielt 140 Danke für 136 Beiträge

    Standard

    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?

  6. #6
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    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

  7. #7
    Registriert seit
    04.09.2008
    Beiträge
    22
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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

  8. #8
    Registriert seit
    21.07.2008
    Beiträge
    1.066
    Danke
    51
    Erhielt 140 Danke für 136 Beiträge

    Standard

    Zitat Zitat von Limette Beitrag anzeigen
    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.

  9. Folgender Benutzer sagt Danke zu Deltal für den nützlichen Beitrag:

    Limette (03.10.2011)

  10. #9
    Limette ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2010
    Beiträge
    239
    Danke
    107
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Zitat Zitat von Alex S. Beitrag anzeigen
    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 ?

  11. #10
    Registriert seit
    21.07.2008
    Beiträge
    1.066
    Danke
    51
    Erhielt 140 Danke für 136 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Du hast nicht zufällig das SCL Paket?

Ähnliche Themen

  1. S7-200 CPU 226 CN auslesen
    Von RGELEKTRO im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 03.10.2016, 16:39
  2. S7 MMC auslesen
    Von Wowa05 im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 30.01.2010, 11:20
  3. Arraybereich durch Variable bestimmen
    Von boggle im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 21.09.2009, 07:39
  4. PAW auslesen?
    Von metacircle im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 03.12.2008, 13:11
  5. SPS mit c auslesen
    Von Speedy3311 im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 24.08.2005, 15:30

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •