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

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

Thema: Array variabler Länge an FB übergeben (TIA 12, SCL, S7-1200 & S7-1500)

  1. #1
    Registriert seit
    24.05.2007
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    Ich konnte leider über Google bisher nichts finden was mir weiterhilft. Sorry, falls das Thema schon abschliessend irgendwo behandelt wurde.

    Ich möchte in meinem FB kein Array fester Grösse als IN_OUT Variable definieren, da dessen Grösse sich erheblich unterscheiden kann -> Unötige Speichervorbelegung, da ich vom grössten Fall ausgehen muss.
    Da der Baustein auf einer S7-1200 und einer S7-1500 gleichermassen laufen sollte, fällt AWL weg. Pointer gibt es auf der 1200 nicht und Variant scheint noch nicht "öffentlich" nutzbar zu sein.

    Kenn jemand von Euch einen Weg, wie ich ein Array so übergeben kann und wie ich anschliessend auf die Daten lesend/schreibend zugreifen kann?

    Vielen Dank
    Florian
    Zitieren Zitieren Array variabler Länge an FB übergeben (TIA 12, SCL, S7-1200 & S7-1500)  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.322
    Danke
    391
    Erhielt 807 Danke für 655 Beiträge

    Standard

    Warum musst Du denn das Array erst in den FB übergeben und arbeitest nicht direkt mit der Quelle?
    Bei IN_OUT stecket dieses doch bestimmt in einem DB, oder?

  3. #3
    joergflorian ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2007
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja das Array steckt in einem DB.
    Der Baustein muss aber multi-instanz-fähig sein. D.h. ich muss ja jedem Instanz-Aufruf ein eigenes Array übergeben können.
    Oder versteh ich Dich falsch?

  4. #4
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.322
    Danke
    391
    Erhielt 807 Danke für 655 Beiträge

    Standard

    Zitat Zitat von joergflorian Beitrag anzeigen
    Ja das Array steckt in einem DB.
    Der Baustein muss aber multi-instanz-fähig sein. D.h. ich muss ja jedem Instanz-Aufruf ein eigenes Array übergeben können.
    Kann es sein, dass Du gerade Multiinstanz und mehrfache Verwendung des FB miteinander verwechselst?

    Arbeitet denn jede Instanz des FBs mit einem eigenen Array-DB? Wenn ja, übergib' den DB z.B. als BlockDB.
    Bin da jetzt aus dem Kopf nicht so firm drin, aber halt anstatt die ganzen Daten nur den Weg zu diesen übergeben und dann dort direkt bearbeiten.

  5. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.172
    Danke
    129
    Erhielt 1.506 Danke für 1.107 Beiträge

    Standard

    Da ist mir auch noch nichts elegantes eingefallen.
    Bei Step7 habe ich mir wenn ich sowas brauchte in der Quelle immer eine Konstante (CONST ARR_SIZE := 100; END_CONST) angelegt, und dann in einem Rutsch beim Anlegen eines Arrays diese Konstante mit angeben können, und auch bei Schleifenbearbeitung gleich auf diese Konstante aufsetzen können.

    Bei TIA hat man sich überlegt die lokalen Konstanten entfallen zu lassen und auf globale Konstanten zu wechseln. Prinzipiell war die Idee ja nicht schlecht, nur kann man diese Konstanten nicht mehr bei einer Variablendeklaration angeben.

    In einer externen Quelle kann man zwar CONST immer noch angeben und der Compiler frisst das sogar anstandslos (außer wenn man anstelle CONST VAR_CONST schreibt, dann stürzt das TIA Portal beim Übersetzen ab). Vielleicht war das irgendwann mal aktiv, und als man feststellte man bekommts nicht gebacken ist es rausgeflogen. In der Doku ist CONST auch noch als Schlüsselwort gelistet.

    Wahrscheinlich könnte man um das umzusetzen etwas mit PEEK/POKE zusammenbauen. Meiner Meinung nach sind diese Funktionen aber das schlimmste was Siemens sich bei den neuen Steuerungen hat einfallen lassen. Ein einfacher Pointer-Datentyp wie bei Codesys, und man hätte sich den ganzen Käse mit Peek/Poke/Any/Variant und sowas schenken können.

    Mit einem UDT der das Array beinhaltet und einer globalen Konstante mit der Array-Größe könnte man das noch halbwegs anständig hinbekommen. Wenn sich die Array-Größe ändert müsste man zumindest nur zwei Stellen bearbeiten. Ändert man nur eines von beiden handelt man sich einen Fehler ein.

  6. #6
    joergflorian ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2007
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @hucki
    Ich glaube nicht. Jede Instanz kriegt Ihren eigenen Instanz-DB.

    also z.B.
    Instanz1 des FB soll mit DB1.Array1 und DB1.Array2 ... gefüttert werden können (je nach Aufruf). Wobei Array1 und Array2 ... unterschiedlich gross sein können.
    Instanz2 des FB mit DB1.Array10 und DB1.Array11 ...

    Mit Block_DB müsste ich ja dem FB jeweils noch den Startoffset des jeweiligen Arrays mitgeben, was mir bei vielen Arrays etwas mühselig scheint...
    Oder halt für jedes Array einen eigenen DB verwenden.

    Danke für Dein Vorschläge.

    @Thomas_v2.1
    Ja ein einfacher Pointer-Datentyp... Das wärs ...
    Das mit der Const geht leider nur, wenn alle Arrays gleich gross sein können.

    Danke auch Dir. Da sollte Siemens noch was tun!

  7. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.172
    Danke
    129
    Erhielt 1.506 Danke für 1.107 Beiträge

    Standard

    Spätestens wenn du in einem DB die wirkliche Array-Größe angibst, musst du die Größe wissen und als Konstante eingeben.
    Oder willst du auch die Datenbausteine erst während der Laufzeit erzeugen? Wie entscheidest du dann wie viel Platz noch in der CPU ist, und was passiert wenn zu wenig?

    Ich finde es am Besten wenn alle Größen statisch und zur Compilezeit festgelegt sind. Mit den Konstanten des Step7-SCL ging das noch halbwegs komfortabel. Wenn man beim TIA die Anwenderkonstanten auch bei Array-Größen einsetzen könnte, wäre das sogar noch besser als bei Step7. Das wäre mein Favorit.
    Vielleicht kommts ja in einer späteren Version.

  8. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.322
    Danke
    391
    Erhielt 807 Danke für 655 Beiträge

    Standard

    Zitat Zitat von joergflorian Beitrag anzeigen
    @hucki
    Ich glaube nicht. Jede Instanz kriegt Ihren eigenen Instanz-DB.

    also z.B.
    Instanz1 des FB soll mit DB1.Array1 und DB1.Array2 ... gefüttert werden können (je nach Aufruf). Wobei Array1 und Array2 ... unterschiedlich gross sein können.
    Instanz2 des FB mit DB1.Array10 und DB1.Array11 ...
    Ich glaube doch.

    Bei einer Multiinstanz beinhaltet der Instanz-DB eines übergeordnetem FBs die Instanz eines (oder mehrerer) untergeordneten FBs, so das dieser keinen eigenen Instanz-DB besitzt.
    Es sind also nicht viele Instanz-DBs eines FBs vorhanden, sondern viele Instanz-DBs in einem Multiinstanz-DB zusammengefasst.



    Zitat Zitat von joergflorian Beitrag anzeigen
    Mit Block_DB müsste ich ja dem FB jeweils noch den Startoffset des jeweiligen Arrays mitgeben, was mir bei vielen Arrays etwas mühselig scheint...
    Oder halt für jedes Array einen eigenen DB verwenden.
    Ja, mit den separaten DBs ist es da wahrscheinlich einfacher, aber nicht unbedingt übersichtlicher.

    Aber wenn nicht mal Thomas_v2.1 dafür 'ne Lösung hat ...
    Geändert von hucki (06.01.2014 um 19:41 Uhr) Grund: Legasthenie

  9. #9
    joergflorian ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2007
    Beiträge
    19
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich glaube doch.
    Du glaubst richtig ... Der Baustein sollte trotzdem auf beide Arten funktionieren

    Spätestens wenn du in einem DB die wirkliche Array-Größe angibst, musst du die Größe wissen und als Konstante eingeben.
    Oder willst du auch die Datenbausteine erst während der Laufzeit erzeugen? Wie entscheidest du dann wie viel Platz noch in der CPU ist, und was passiert wenn zu wenig?

    Ich finde es am Besten wenn alle Größen statisch und zur Compilezeit festgelegt sind.
    Das sind berechtigte Einwände und ich bin Deiner Meinung, dass alle Grössen bereits zur Compilezeit festgelegt sind.
    Ich möchte dem Anwender halt möglichst viel Flexibilität bei der Grösse der Arrays geben. Zum Beispiel sind nicht alle Rezepturen von gleicher Grösse (Komplexität). Da wären verschiedene Arraygrössen gut, um Speicherplatz zu sparen.


    Ich danke Euch beiden für die Inputs!

    Ich tendiere zur Umsetzung mit BLOCK_DB. Damit bleibt der Anwender flexibel, was ein wenig zu Lasten der Übersicht geht.
    Geändert von joergflorian (07.01.2014 um 08:10 Uhr) Grund: ,das ,dass ;)

  10. #10
    Registriert seit
    24.04.2013
    Beiträge
    306
    Danke
    21
    Erhielt 150 Danke für 86 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi

    noch geht das was du machen willst nicht. Zumindest nicht für dich.
    Aber vielleicht bringt die V13 neben vielen neuen Fehlern ja doch ein paar Verbesserungen.

    Wer sich mal den TSEND oder den TRCV angesehen (gibt es glaube ich seit V11), der stellt fest, dass es diese Bausteine schaffen Arrays unterschiedlicher Länge entgegen zu nehmen und mit deren Inhalt etwas zu tun.
    Es ist also möglich dem TSEND an der einen Stelle im Programm ein Array[1..100] of DTL und an anderer Stelle im Programm ein Array[-1..33] of "MyUdt4711" zu übergeben. Beide werden korrekt auf eine andere Steuerung übertragen und können dort von TRCV wieder in entsprechende Arrays abgelegt werden. Der Datentyp dieses Wunderbeinchens ist VARIANT.

    S. hat also noch ein paar Asse im Ärmel und laut Mitarbeitern am Messestand soll die V13 auch uns armen Anwendern die echte Verwendung von VARIANT erlauben. Wie viel hatte der allerdings keine Ahnung.

    Die Verwendung von BLOCK_DB klappt auf einer 1200 gar nicht. Dort gibt es statt dessen nur einen DB_ANY. Eben das was an diese unsäglichen PEEK und POKE dran kommt.

    Wir merken halt immer wieder, das TIA noch recht grün ist.

    'n schön' Tach noch
    HB

  11. Folgende 2 Benutzer sagen Danke zu HelleBarde für den nützlichen Beitrag:

    joergflorian (09.01.2014),steuerung (08.01.2014)

Ähnliche Themen

  1. Array an DWORD übergeben (SCL)
    Von MatthiasH24 im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 30.01.2014, 20:04
  2. Sprungmarke in SCL anlegen?! S7-1200 und TIA-Portal
    Von fk- princess im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 16.10.2012, 10:13
  3. Array länge mit SCL ermitteln
    Von Linowitch im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 08.07.2010, 12:12
  4. Array ohne Pointer übergeben? (SCL)
    Von tahren im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 15.06.2010, 12:08
  5. Array an FC übergeben und löschen (SCL)
    Von Isha im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 22.04.2010, 10:23

Lesezeichen

Berechtigungen

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