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

Results 1 to 10 of 10

Thread: S7 1500 - FB mit IO-Variable - HMI Zugriff

  1. #1
    Join Date
    24.06.2013
    Posts
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe folgendes Problem bei einer S7 1511 in Zusamenhang mit einem Eaton HMI.

    Es werden Daten vom HMI als IO Variable in FB's übergeben.
    Wenn sich während der Bearbeitung des FB die HMI Variable ändert, wird diese beim beenden des FB wieder auf das HMI zurückgeschrieben.
    Dieses Problem scheint soweit auch bekannt zu sein (Siemens).
    Leider habe ich bisher noch keinen Lösungsansatz gefunden.

    Meine Idee wäre gewesen, die Daten im IO-Bereich des FB als "Call by referece" zu übergeben.
    Dies soll wohl so sein, aber nur wenn beide Bausteine (HMI-DB und FB) optimierten Bausteinzugriff haben.
    Durch das Eaton HMI bin ich aber (hier) auf absoluten Zugriff festgelegt.

    Daher habe ich verucht in der Bausteinschnittstelle in irgendeiner Form als Zeiger o.ä. direkt auf die HMI Variable zuzugreifen.
    Dies gelingt mir nicht.

    Hat jemand dieses Problem schon mal gelöst oder hat Tipps?


    Vielen Dank
    Gruß
    Falk
    Reply With Quote Reply With Quote S7 1500 - FB mit IO-Variable - HMI Zugriff  

  2. #2
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,684
    Danke
    1,114
    Erhielt 4,049 Danke für 3,273 Beiträge

    Default

    Hallo,

    die eigentliche Ursache Deines Problems ist, daß es in der S7-1500 keinen Zykluskontrollpunkt für HMI-Kommunikation gibt und das BS völlig unkooperativ den OB1 unterbricht, wo/wann es dem BS gerade einfällt. Deshalb darf auf HMI-Variablen im Anwenderprogramm immer nur ein einziges Mal im Zyklus lesend zugegriffen werden.
    (Das Thema haben wir hier im Forum schon oft diskutiert, Suchbegriffe: hmi kommunikation zykluskontrollpunkt)
    Das "nur einmal zugreifen" (ohne unbedingtes Zurückschreiben am Ende des FB) läßt sich bei Übergabe an FB per INOUT nur realisieren, wenn die HMI-Variable per Referenz übergeben wird. Und das wiederum läßt sich forcieren, indem man die HMI-Variable in einen STRUCT oder UDT packt, dann wird der STRUCT per Referenz übergeben.

    Ich meine, der FB muß dann auch Standard-Zugriff haben, wenn der STRUCT mit der HMI-Variable aus einem Speicherbereich (DB) mit Standardzugriff kommt. Wenn Aktualparameter und formaler Parameter in Speicher mit unterschiedlichem Zugriff (Standard vs. "optimiert") liegen, dann wird wohl auch die STRUCT-Übergabe auf Übergabe per Value (Kopie) umgemodelt. Das können sicher andere Forumuser noch bestätigen/korrigieren.

    Achtung: Auch im FB darf der INOUT-Parameter nur einmal gelesen werden, weil sich ja zwischen den Lesezugriffen der Wert geändert haben kann. Und darf auch nur höchstens einmal beschrieben werden.

    Geht es Dir um Bedien/Tasten-Bits, die im FB abgelöscht werden sollen, oder um Werteingaben, die im FB auf Grenzwerte limitiert werden sollen?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Falkd is offline Neuer Benutzer
    Themenstarter
    Join Date
    24.06.2013
    Posts
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Default

    Hallo Harald,


    >Ich meine, der FB muß dann auch Standard-Zugriff haben, wenn der STRUCT mit der HMI-Variable aus einem Speicherbereich (DB) mit Standardzugriff kommt. Wenn >Aktualparameter und formaler Parameter in Speicher mit unterschiedlichem Zugriff (Standard vs. "optimiert") liegen, dann wird wohl auch die STRUCT-Übergabe auf Übergabe >per Value (Kopie) umgemodelt.
    Ja, habe ich auch so gelesen und auch getestet.

    ich übergebe einen Teil einer Struct (word), da mein HMI so aufgebaut ist.
    (z.b. "DB Geschwindigkeiten.Produktabhaengig.V22_Transport" - Wobei dann V22 Transport ein Word ist)

    >Geht es Dir um Bedien/Tasten-Bits, die im FB abgelöscht werden sollen, oder um Werteingaben, die im FB auf Grenzwerte limitiert werden sollen?
    Keine Bedien / Tasten usw. - mehr Grenzwerte usw...

    gibt es keine Mögichkeit ein "call by reference" zu erwingen, z.b. indem ich (beim IO) einen Zeiger auf den DB setze, so dass dann der DB direkt im Programm genutz wird.
    Ich habe hier ein wenig mit "Variant" und "Ref to Word" experimentiert, bin aber auf keinen grünen Zweig gekommen (unter Anderem wieder wegen der Unterschiede optimiert / nicht optimiert).

    Gruß Falk

  4. #4
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,684
    Danke
    1,114
    Erhielt 4,049 Danke für 3,273 Beiträge

    Default

    Sind das alles gleiche STRUCT oder ist die HMI-Variable immer an der selben Stelle/Offset des STRUCT? Kannst Du nicht den ganzen STRUCT übergeben? Das ist für den Aufruf kein Mehraufwand, es wird eh' nur die Referenz übergeben.

    Was auch gehen müsste: die HMI-Variablen jeweils in einen STRUCT oder UDT packen, der nur ein Word () bzw. einen INT oder UINT enthält. Der STRUCT oder UDT kann in einen übergeordneten STRUCT gepackt werden.
    Code:
    Produktabhaengig : STRUCT
      V22_Transport : STRUCT  //oder z.B. UDT (PLC Datentyp) "HMI_INT"
        Einstellwert : INT;   //oder "HMI_Wert" oder ...
      END_STRUCT;
    END_STRUCT;
    An den FB übergebe den STRUCT "V22_Transport" - das sollte als Referenz passieren.

    Man könnte den INOUT als Typ POINTER deklarieren, dann wird dort die Adresse der angeschalteten Variable übergeben. Der FB erhält aber keine Info, was da angeschaltet wurde (welcher Datentyp bzw. wie groß die Variable ist). Und man verliert jegliche Kontrolle des Compilers, ob da die "richtigen" Variablen angeschaltet wurden.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    Falkd is offline Neuer Benutzer
    Themenstarter
    Join Date
    24.06.2013
    Posts
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Default

    Hallo Harald,

    - Word () <- hat historische Gründe
    - die ganze Struct kann ich nicht übergeben, da mein(e) DB etwa diesen Aufbau haben
    --------------------------------
    DB Geschwindigkeit

    - produktabhängig
    -- V1
    -- V2
    -- ..
    - V499

    - Produktunabahängig
    -- V500
    -- V501
    -- ..
    -- V999

    --------------------------------

    - das was du in deinem Codebeispiel schreibst habe ich mir auch schon überlegt, ich scheue momentan aber noch den Aufwand
    (>10 DB mit jeweils ca. 1000 Daten)

    - ich komme nochmal auf die Datenübergabe zurück:

    kann ich nicht im FB ein IO so deklarieren, dass er die übergebene Variable (DB100.DBW10 o.ä.) als Referenz übernhemen muss.
    Also z.B. als Variant, Pointer o.ä.?

    Danke für die Tipps
    Gruß Falk

  6. #6
    Join Date
    17.07.2009
    Location
    Am Rande der Ostalb
    Posts
    6,333
    Danke
    1,295
    Erhielt 1,470 Danke für 1,143 Beiträge

    Default

    Wenn sich während der Bearbeitung des FB die HMI Variable ändert, wird diese beim beenden des FB wieder auf das HMI zurückgeschrieben.
    Ein simples Umkopieren des DBs in einen "Arbeits-DB" geht nicht?
    Das ist eigentlich der "Standard"-Ratschlag der Hotline.

    Gruß
    Blockmove

  7. #7
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,684
    Danke
    1,114
    Erhielt 4,049 Danke für 3,273 Beiträge

    Default

    Mir scheint, als ob Falkd im FB die HMI-Variable auch beschreiben will - das wäre dann wirkungslos bei einem Arbeits-DB ("Prozessabbild der HMI-Eingänge").

    Quote Originally Posted by Falkd View Post
    kann ich nicht im FB ein IO so deklarieren, dass er die übergebene Variable (DB100.DBW10 o.ä.) als Referenz übernhemen muss.
    Also z.B. als Variant, Pointer o.ä.?
    Dein Eaton HMI erfordert, daß der DB mit den HMI-Variablen Standard-Zugriff hat. Also setze den FB auch auf Standard-Zugriff, dann wird ein STRUCT aus dem DB an INOUT als Referenz übergeben.

    Variant kenne ich mich nur sehr wenig aus, geht aber vermutlich nicht mit Aktualparameter aus einem DB mit Standard-Zugriff.
    Ansonsten hatte ich schon in Beitrag #4 die Übergabe als Typ POINTER erwähnt. Eventuell geht/hilft auch noch eine Übergabe als ANY - bei beiden weiß ich aber grad nicht (und kann nicht testen), ob man da evtl. nur mit AWL auf den Aktualparameter zugreifen kann oder ob ein S7-1500-FUP/KOP/SCL-Compiler das auch kann. Beides wäre aber sehr undurchsichtig und der Compiler könnte die Datentypen nicht überprüfen ...

    Ist das Dein erstes Projekt mit S7-1500 und dann gleich tausende HMI-Variablen ungünstig/falsch deklariert? Da mußt Du wohl jetzt durch und das ganze umSTRUCTurieren...

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #8
    Falkd is offline Neuer Benutzer
    Themenstarter
    Join Date
    24.06.2013
    Posts
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Default

    Hallo Harald,

    hast du ein Beispiel zur Übergabe mit POINTER (also sowohl bei der Deklarierung, dem Zugriff im FB und der Beschaltung des IO)?
    Damit wäre mir geholfen.

    Danke
    Falk

  9. #9
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,684
    Danke
    1,114
    Erhielt 4,049 Danke für 3,273 Beiträge

    Default

    Ich bin unterwegs, kann jetzt nicht testen.
    Hier ein Beispiel für Übergabe eines Word via Pointer an einen FC
    Sollte auch mit FB funktionieren, ist so aber nicht multiinstanzfähig - der FB muß mit eigenem IDB aufgerufen werden:
    Code:
    CALL  "MyFB","MyIDB"
     IN_POINTER:="DB Geschwindigkeiten.Produktabhaengig.V22_Transport"
    Ob und wie sowas in TIA auch in SCL oder FUP/KOP geht weiß ich nicht. Habe ich noch nie versucht.
    Ich denke immer noch, die Übergabe der HMI-Variable via POINTER ist eine schlechte Lösung für Dein Problem.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #10
    Falkd is offline Neuer Benutzer
    Themenstarter
    Join Date
    24.06.2013
    Posts
    6
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    da ich zwischenzeitlich keine Schreibrechte mehr im Forum hatte kann ich mich erst jetzt melden.
    Ich habe das Problem folgendermaßen gelöst:
    ich habe die Parameter jeweils in ein STRUCT gepackt damit der FB gezungen ist den Parameter als "CallByValue" zu übergeben.

    Vielen Dank für eure Hilfe.

    Gruß Falk

    P.S. wenn mir jetzt noch einer erklärt wie man ein Thema auf "gelöst" setzt würde ich das gerne machen.

Similar Threads

  1. TIA Zugriff auf Variable in Excel mit Skript
    By Vetsrob in forum HMI
    Replies: 1
    Last Post: 21.06.2017, 14:05
  2. TIA HMI: Symbolischer Zugriff auf PLC mit S7-300
    By Tigerente1974 in forum HMI
    Replies: 8
    Last Post: 09.12.2016, 08:21
  3. TIA Zykluskontrollpunkt S7-1200 und S7-1500 mit HMI
    By hubert in forum Simatic
    Replies: 18
    Last Post: 26.04.2016, 02:00
  4. Step 7 Zugriff auf IN_OUT-Variable mit Pointer
    By MisterCP in forum Simatic
    Replies: 1
    Last Post: 04.04.2016, 15:16
  5. Zugriff auf Variable über String mit Var-Namen
    By grosser_marco in forum CODESYS und IEC61131
    Replies: 14
    Last Post: 03.09.2009, 07:43

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •