Step 7 [SCL] IN1, IN2, .., INX indirekt adressieren ?

Warum kann man nicht den 'normalen' Verfahren verwenden, d.h. je 'Objekt' ein FB Aufruf mit ein IDB. Ob da 50-100 FB Aufrufe gibt mit je ein IDB, geht das programmieren einfach und schnell wenn man den Symbolik so erstellt hat das man den E/A Schnell durch suchen-und-ersetzen für die FB Aufrufe aktualisieren kann.

Logik durch indirekte Addressierung und Schleifen (egal welche Verfahren) finde ich problematisch. Wenn es funktioniert ist es gut, wenn da Probleme gibt ist es ein Alptraum.

Das es gibt viele gleichartige 'Objekte' von denselben Typ ist ja nichts spezielles. Genau dafür hat man FBs + IDBs.
Es ist wenig "Ressourcenfressend".
Es ist einfach zum debuggen.
Ist diese Idee mit "durchschleifen" dadurch gekommen weil der Programmierer zu faul ist die E/As einzutippen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mal ne ganz banale frage, wieso kann ich denn meine IN_OUTs (Slave, Kopfbst) nicht miteinander verbinden im CFC ?? {S7_link := 'true'}

Warum kann man nicht den 'normalen' Verfahren verwenden, d.h. je 'Objekt' ein FB Aufruf mit ein IDB. 8...9Ist diese Idee mit "durchschleifen" dadurch gekommen weil der Programmierer zu faul ist die E/As einzutippen ?

Ne, aber dann müsste ich jeden FB mit allen relevanten Signalen mit dem einen Treiberbaustein verbinden. Außerdem bräuchte ich nach wie vor eine Logik, die entscheidet welcher Slave nun senden/empfangen darf - das dezentral zu halten ist ein alptraum.
In meinem Konstrukt verbinde ich jeden Slavebaustein (der nur zur Slaveparametrierung und Sollwert/Messwert verschaltung dient) per UDT an einen Kopfbaustein, der zentral die Slaves verwaltet und nur einmal an die relevanten Signale des Treiberbaustein verbunden ist.
 
"Mal ne ganz banale frage, wieso kann ich denn meine IN_OUTs (Slave, Kopfbst) nicht miteinander verbinden im CFC ?? {S7_link := 'true'}"

Ich steh diesbezüglich grad echt aufm Schlauch

PS: PCS 7 V8.0.1.1 --> CFC V8.0.3 (der momentan aktuellste)
 
Zuletzt bearbeitet:
Inout mit inout verknüppeln geht nicht, war wohl eine fehlannahme. Habe nun eine andere Lösung gefunden
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
hab nun eine Lösung gefunden, bin aber mit der Art der Adressierung nicht zufrieden.

Lösung:
Global-DB (DB1, "DATA", enthält "Slave" (Array[1..100] of UDT)) anlegen. Aus FB lesend und
schreibend adressierbar per "DATA".Slave[Slave_ID]. ... / DB1.Slave[Slave_ID]. ...
Nun würde ich gerne den DB variabel halten, indem er von außen anparametriert wird. Mir ist
bisher nur folgender Weg bekannt: z.B. 'DB77' --> IN : BLOCK_DB --> DB_Var.
Leider kann ich dann nurnoch absolut über DB_Var.DBW[ID] durch die Datenstruktur navigieren :(

FRAGE: wie kann ich trotz 'DB-Platzhalter' (im FB) durch die UDT-Struktur im Global-DB per Index
navigieren ?

Gruß
Flux
 
Das Array aus dem übergebenen DB in eine gleichartige Struktur in TEMP umkopieren.
Oder halt das komplette Array als Array of UDT übergeben.
Oder das Array of UDT direkt in STAT des FB anlegen.

Harald
 
Hallo Harald,
danke für deine Antwort, habe noch ein Paar Fragen dazu:

Das Array aus dem übergebenen DB in eine gleichartige Struktur in TEMP umkopieren.

Im FB: TmpArr := DB_Var.Slave ? Wie gesagt, bei "Slave" meckert nun der Compiler, da der DB erst zur Runtime bekannt ist.


Oder halt das komplette Array als Array of UDT übergeben.

Ok, das wäre aus Sicht des Kopfbausteins: DBx.Slave --> IN_OUT: Slave : Array[1..100] of UDT

Aus Sicht des Slaves wäre es: DBx.Slave[1] --> IN_OUT: Slave : UDT

So?

Oder das Array of UDT direkt in STAT des FB anlegen.

Aus Sicht des Kopf-Bst. am einfachsten.
Aber wie schreiben die Slaves darein? Absolut wie in der Variante hierdrüber? Das Problem dabei ist, dass die Instanz-DBNr. des Kopf-FB jedesmal nach dem Übersetzen eine andere sein kann (PCS 7 halt)..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mir ist noch eingefallen, dass wenn man IN : BLOCK_DB nimmt, man zwar nur auf die nackigen Bitdatentypen zugreifen kann (die UDT-Struktur also dahin ist), man die Struktur wiedergewinnen sollte, wenn man eine entsprechende Sicht (AT) auf den Datenbereich anwendet.

Letztendlich habe ich ein UDT für OUT und eins für IN erstellt, um darüber zu kommunizieren - hat den Vorteil, dass man die Verbindung der beiden Bausteine einfacher nachvollziehen kann (Randleistensprung).


Danke für alle Antworten!

Flux
 
Zurück
Oben