StructuredTrash
Level-3
- Beiträge
- 1.166
- Reaktionspunkte
- 310
Ich rufe den übergebenen FB auch auf. Wenn ich nur auf seine Daten zugreifen will, was bei anderen FB's meiner Lib der Fall ist, packe ich die benötigten Daten in eine Struct im VAR_OUTPUT-Bereich des FB's und übergebe dann nur diese Struct an andere FB's.du übergibst per Pointer eine Instanz eines FB an einen FB???
Warum?
Greifst du auf die Instanzdaten zu oder was passiert da?
Tue ich auch nicht. Aber wenn ich in einem FB VAR_IN_OUT deklariere, muss ich die bei jedem Aufruf, auch bei dem von Aktionen, übergeben. Die dafür benötigte Rechenzeit stört mich bei einem Beckhoff CX kaum. Die Schreibarbeit schon etwas mehr. Vor allem stört mich aber, dass die Aktionen die VAR_IN_OUT gar nicht benötigen, sondern nur auf die lokalen FB-Daten zugreifen.Die Aktion eines FB greift doch auf den Variablenhaushalt des FB zu. Da muss man doch nichts neues übergeben.
Dein Wort in Beckhoffs Ohr. Aber ich bin mir da nicht so sicher. Ich habe schon Online Changes erlebt, nach denen sich die Werte von Konstanten munter änderten. Einmal wusste der Rechner sogar nicht mal mehr, wo seine Eingänge waren. Daher auch meine eigentliche Frage.Auch wenn du per Pointer auf die Anfangsadresse einer FB Instanz zeigst, sollte sich doch hier nichts verschieben. Die Adresse bleibt die Adresse bleibt die Adresse...
Da gebe ich Dir sogar ein wenig Recht. Was ich da mache, ist eigentlich ein Fall für OOP-Vererbung und die damit verbundene erweiterte Typkompatibilität. Aber ich kann mich derzeit noch nicht zum Umstieg auf TwinCat3 durchringen. Habe zu oft Versuchskaninchen gespielt.Abgesehen davon halte ich deine Vorgehensweise für unsauber was Wartung und Erweiterung deines Codes angeht. Gerade für andere Programmierer die mal auf soetwas stoßen.
Dein Wort in Beckhoffs Ohr. Aber ich bin mir da nicht so sicher. Ich habe schon Online Changes erlebt, nach denen sich die Werte von Konstanten munter änderten. Einmal wusste der Rechner sogar nicht mal mehr, wo seine Eingänge waren. Daher auch meine eigentliche Frage.
Stimmt meistens, aber in diesem Fall hätte das vermutlich mehr Fragen gestellt als beantwortet. Aber gut, meine Texte haben das ja auch getan.Nach einem Beispiel hatte ich gefragt, weil wenige Zeilen abgespeckter Code mehr als 1000 Worte sagt.
Ich habe jahrelang eine eigene Soft-SPS mit Borland Pascal programmiert. Das hat mich sicher mehr in Richtung ereignisorientierte Denk- und Arbeitsweise geschoben als für einen SPS-Programmierer üblich. Der Aufruf einer Init-Methode oder eines Init-Konstruktors für jedes Objekt stammt aus dieser Zeit, das Konzept habe ich dann beim Umstieg auf Beckhoff übernommen. Genauso den intensiven Einsatz von Aktionen als Ersatz für Objekt-Methoden und die Eigenart, nicht unbedingt alle Input-Parameter bei jedem Aufruf zu übergeben.Ein PLC Programm würde ich so nicht programmieren.
Mir auch, und deshalb werde ich wohl dabei bleiben. Die Diskussion mit Dir hat ihren Beitrag zu dieser Entscheidung geleistet, deshalb Dank dafür.Am meisten Sicherheit würde mir bei deinem "Konstrukt" die IN_OUT Variante geben.
Das hatte ich ja vor, aber die fehlende Typüberprüfung macht mir Pointer eben unsympathisch. Vor allem bei dieser Anwendung, bei der der Typ des zu übergebenden Parameters bekannt und konstant ist.Wie wäre es mit einem Input
ADR(FB_Instance)
?
Wie wäre es mit einem Input
ADR(FB_Instance)
?
Auch wenn sich FB_Instance irgendwo im Speicher verschiebt, wird ja die neue Adresse übergeben.
Ich schliesse mich an, aber für Weihnachtswünsche ist es schon ein bisschen spät.Klasse wäre ein Compilerbefehl (Pragma) der definierte Speicherbereiche (bei der Variablendeklaration) von der Neuorganisierung ausschließt.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?