TIA S7 1500 - FB mit IO-Variable - HMI Zugriff

Falkd

Level-1
Beiträge
6
Reaktionspunkte
0
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 :)roll:) 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
 
Hallo Harald,

- Word :)roll:) <- hat historische Gründe :p
- 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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").

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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zurück
Oben