beim FC aufruf den IDB des im Baustein verwenden FB angeben

taucherd

Level-2
Beiträge
61
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, habe folgendes Problem oder bräuchte einen anderen Lösungsvorschlag.
Ich habe in SCL einen FC erstellt indem ich einen "Siemens FB" der nicht Multiinstanzfähig ist aufrufe, der einen IDB benötigt. Jetzt möchte ich die DB NR von außen übergeben, was aber mit folgenden nicht funktioniert hat:

VAR_Input
DB_NR : Block_DB;
END_VAR

//daten zur gruppenadresse senden
"KNX/EIB2S7 RW".DB_NR (CREATE_TASK := _mb[6],// IN: BOOL
CONFIGDB := "Interface_1_Cnfg", // IN: BLOCK_DB
GROUPADDRESS_MAIN :=rw_hauptg, // IN: INT
GROUPADDRESS_MIDDLE :=rw_mittelg, // IN: INT
GROUPADDRESS_SUB := rw_unterg, // IN: INT
DPT := rw_dpt, // IN: INT
RW := true, // IN: BOOL
DATA := _mb[5]);
_test := DB_NR.QSTATE; // OUT: WORD

oder
VAR_Input
DB_NR : INT;
END_VAR
“KNX/EIB2S7 RW".WORD_TO_BLOCK_DB(INT_TO_WORD(DB_NR)


Derzeitige Lösung ist jene, dass ich einen weiteren FC erstellt habe und den FB „KNX/EIB2S7 RW“ und meinen FC in diesem FC aufrufe. Bin mit dieser Lösung aber nicht zufrieden, konnte aber nichts finden im Forum. Nur ähnliche Problemstellungen, wo es auch nicht funktioniert in SCL.

Vielleicht hat jemand eine Idee, Danke.
 
Ich habe in SCL einen FC erstellt indem ich einen "Siemens FB" der nicht Multiinstanzfähig ist aufrufe, der einen IDB benötigt

Kann es sein, dass es Sinn macht, wenn Siemens keine Multiinstanz zulässt, dass du nicht über eine Eselsbrücke diese Vorgabe umgehen kannst?


Wenn der Baustein den Datenbaustein absolut braucht, dann ist dies so.



bike


P.S: Speicherverwaltung ist hier das Stichwort
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Per Variable eine IDB-Nr. vorzugeben ist mir auch noch nicht gelungen!

Ich weiß nicht genau ob das funktioniert, aber meine Idee dazu wäre, das Du für jede Multiinstanz einen IDB anlegst und vor Aufruf des eigentlichen FBs per Blockmove den kompletten Instanz-DB-Inhalt kopierst und nach dem beenden wieder in eine Instanz-DB-Kopie sicherst! Das Ganze könne je nach Größe des IDB's und Häufigkeit des Aufrufes natürlich um einiges die Zykluszeit verlängern!
 
Zuletzt bearbeitet:
Per Variable eine IDB-Nr. vorzugeben ist mir auch noch nicht gelungen!

Ich weiß nicht genau ob das funktioniert, aber meine Idee dazu wäre, das Du für jede Multiinstanz einen IDB anlegst und vor Aufruf des eigentlichen FBs per Blockmove den kompletten Instanz-DB-Inhalt kopierst und nach dem beenden wieder in eine Instanz-DB-Kopie sicherst!

Der Sinn dieser Operation erschließt sich mir jetzt nicht.
Warum nicht akzeptieren, dass es nicht möglich aus einem nicht multiinstanzfähigen DB einen mit Gewalt bauen zu wollen?



bike
 
bike, ich habe da eine SCL Quelle und den FC muss ich meine Projekt ca. 50mal verwenden- das ist der Sinn dahinter, weshalb ich eine andere Lösung suche!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bike, ich habe da eine SCL Quelle und den FC muss ich meine Projekt ca. 50mal verwenden- das ist der Sinn dahinter, weshalb ich eine andere Lösung suche!

Vor solchen Problemen stehen alle Entwickler.
Doch wenn Siemens dies nicht direkt zulässt, warum dann schimpfen und mit aller Gewalt eine Lösung zu suchen, die zunächst funktioniert und ggF dann irgendwann Mist macht?

Mir ging es schon oft so, dass ich mich gefragt habe, warum geht das nicht wie ICH es will.
Ganz einfach, weil ich nicht das Programm geschrieben habe und nicht jeden Hintergrund kenne.


bike
 
Du kannst auch den Bausteinschutz entfernen und den Baustein selber Multiinstantfähig machen. Wenn Siemens nicht will muss man eben selber nachhelfen ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wäre eine Lösung. Wie ist es aber mit dem Eingang beim FB CONFIGDB als BLOCK_DB? hätte das eine Auswirkung? Ich glaube nicht, dass dieser Baustein von Siemens unbewusst als nicht Multiinstanzfähig erstellt wurde. Es ist auch, das dieser Baustein in den Kommunikationsbaustein schreibt und dieser nur einen Puffer für 23 Schreibaufträge hat. Wenn also der Puffer voll ist und beim QState diese Aktion auftritt muss der Schreibauftrag nochmals gestartet werden.
Das Ganze ist für eine EIB/KNX Anbindung zu S7.
 
Eigentlich geht es dem TE doch garnicht darum, den Siemens-FB als "Multiinstanz" laut Definition zu benutzen.
Er will doch nur mehrere "normale" Instanzen des FB aufrufen - selbstverständlich jede mit eigenem IDB.
Doch er hat ein Problem, in SCL die gewünschte IDB-Nummer als Variable beim FB-Aufruf anzugeben.

Was ist daran verwerflich, falls Siemens nicht sagt, von dem FB darf es nur 1 Instanz geben?

Es ist natürlich möglich, daß der Siemens-FB irgendwelche begrenzten Ressourcen oder Aufträge verwaltet und
darüber den Überblick behalten muß. Dann darf es von diesem FB tatsächlich nur 1 Instanz geben.
Dann ist es auch egal, ob man eine elegante oder eine Krücken-Lösung benutzt, um trotzdem mehrere Instanzen
aufzurufen - es darf einfach nicht sein.

@taucherd
Was sagt Siemens, wieviele Instanzen des FB "KNX/EIB2S7 RW" zulässig sind?

Wieviele Instanzen brauchst Du denn?
Bei wenigen Instanzen könnte man in einer CASE-Anweisung mehrere verschiedene Instanz-Aufrufe komplett ausprogrammieren
und dann je nach Case nur eine bestimmte Instanz aufrufen.

Wie man eventuell in SCL die IDB-Nummer für den FB-Aufruf variabel gestalten kann, weiß ich nicht.
Doch imho ist es selbst in AWL nicht möglich, einen FB mit Parameterübergabe mit variabler IDB-Nummer aufzurufen.
Gut möglich, daß es deshalb auch in SCL keine Möglichkeit gibt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Doch imho ist es selbst in AWL nicht möglich, einen FB mit Parameterübergabe mit variabler IDB-Nummer aufzurufen.

Aber in AWL kann man sich ja dann mit dem Manuellen öffnen von DI und nutzen eines UC weiterhelfen.

Vielleicht wäre ja das einfachste sich einen Hilfs FC zu machen welcher den FB aufruft, und welchem man an einem IN Parameter die gewünschte DB Nummer mitgibt!
 
Aber in AWL kann man sich ja dann mit dem Manuellen öffnen von DI und nutzen eines UC weiterhelfen.
Dann kann man den FB aber nur ohne Parameter aufrufen.
(Die Aufrufparameter könnte man aber notfalls vorher direkt in den IDB schreiben.)

Vielleicht wäre ja das einfachste sich einen Hilfs FC zu machen welcher den FB aufruft, und welchem man an einem IN Parameter die gewünschte DB Nummer mitgibt!
Das hat der TE nach eigener Aussage bereits gemacht. Es gefällt ihm aber nicht.

Harald
 
@PN/DP du hast richtig erkannt.
Es gibt keine Beschränkung wegen dem Aufruf des FB's nur halt immer einen eigenen IDB. Es wird nur der Auftrag nicht abgearbeitet wenn im Kommunikationsbaustein der Speicher voll ist. was aber nichts macht. Da der Auftrag nicht verloren geht, sondern dieser Baustein es nochmals, nochmals... versucht.

In KOP würde es funktionieren, aber auch nicht elegant.
Ich bin jetzt dabei mir zu überlegen ob ich das nicht mit Block_move oder einen indirekten Zuweisung machen kann/soll.
Ich benötige das >50 mal im Programm (für alle Lichter)

Derzeitige Stand, siehe Abbildung.
In dieser Konstellation geht es auch nicht, dass ich eine Hilfs FC mache.
Da ich beim meinem Baustein „dimmen_KL2751“ eine Struktur habe und diese nicht durchreichen kann im Hilfs FC. Ich muss diese Baustein derzeit wie in Abbildung aufrufen.
 

Anhänge

  • Aufruf FC und FB.JPG
    Aufruf FC und FB.JPG
    100 KB · Aufrufe: 24
Zuviel Werbung?
-> Hier kostenlos registrieren
In KOP würde es funktionieren, aber auch nicht elegant.
Was ist daran nicht elegant, wenn man für 50 Objekte 50 mal die zugehörige FB-Instanz voll ausprogrammiert aufruft?
Ich meine, das ist in SPS-Programmen normal. Es muß nicht immer eine Schleife mit indirekter Adressierung sein
oder ein Kapselungs-Baustein, nur um sich das Eintippen von Übergabeparametern zu sparen.
Deine KOP-Variante sieht doch gut aus. Ich würde es genauso machen.

Harald
 
Hallo,
so wie du bin auch ich schon mal über dieses "Feature" gestolpert.
Wenn ich es richtig verstanden habe, dann ist es so, dass du den DB als IN-Parameter an den FC übergeben willst, der seinerseits wiederum diesen Parameter als I-DB an den aufgerufenen FB übergibt.
Das geht in AWL genau so zu machen - in SCL geht es, warum auch immer, NICHT ... :confused:

Gruß
Larry
 
Zurück
Oben