Var_in_out
Hallo Lupo,
wenn die Funktion FC_1() in MAIN aufgerufen wird sollen paar Input-Parameter von FB_1 aktualisiert werden. Das Problem ist das ich den 'FB_1' innerhalb der Funktion 'FC_1' nicht aufrufen kann (da bei TwinCat
Rekursionen nicht erlaubt sind )
deswegen war die Frage wie kann ich die Inputs von 'FB_1' aktualisieren ohne den gesamten FB aufzurufen, und die Lösung war :
MEMCPY(adr(main.FB_1.Input), adr(xx),4);
und so kann ich die Input Parameter von FB_1 innerhalb FC_1 aktualisieren ohne FB_1 aufzurufen.
Mein erster Kommentar war wohl etwas zu spontan, aber ich bin gelegentlich schon erschrocken, wie hier gehandwerkelt werden soll, wenn dahinter ggf reale Anlagen mit Kraft und Energie zu Werke gehen.
Also zurück zum speziellen Fall etwas ausführlicher:
Einem FB gibt man Parameter als Input mit, DAMIT sie lokal im FB nur gelesen oder ggf. auch geändert werden können. Die Parameter sind WERTE, also Kopien von Daten, die aus Quellen ausserhalb des FB stammen, die Ursprungsdaten bleiben unberührt von allem, was im FB gemacht wird.
Will man die Daten (sozusagen synchron) von aussen und von innen manipulieren können, gibt es eigentlich nur einen sicheren Weg: beide "Partner" manipulieren das gleiche Daten Objekt.
Das machen viele SPS Leute mit Globalen Daten aus der Tradition der AWL, wo man sogar oft wusste, an welcher Stelle im Memory dieses oder jenes Merkerchen sich befindet.
Unter Software Leuten ist dies aus vielen Gründen eine Sünde und führt in der Praxis immer wieder zu ewigen Suchen nach Fehlern, da an Globalen Daten JEDER drehen kann.
Die IEC bietet für den Fall, den Sablitos hat, die Möglichkeit, dem FB die Parameter als VAR_IN_OUT zu übergeben, der Softwerker nennt so etwas "per Referenz". Hier bekommt der FB nicht eine Kopie des Wertes übergeben, sondern die ADRESSE genannt, an der die gewünschten Daten stehen. Für den Entwickler des Programms sieht es aus, als ob er mit dem Wert des übergebenen Parameters arbeitet, real arbeitet er aber mit dem Wert, der an der Adresse steht, die er übergeben bekommt. Den Unterschied sieht nur der IEC Compiler, die Syntax für den Programmschreiber ist die Gleiche.
Da Sablitos hier das Wort Main statt PLC_PRG benutzt, vermute ich, dass er die Sprache C kennt, ein const Pointer kommt der VAR_IN_OUT recht nahe, eine Referenz aus C++ entspricht dem besser und unter .NET und C# wird sowieso jedes übergebene Objekt eine Referenz. Zwischen IEC ST und .NET C# von heute liegen 30 Jahre Erfahrung in der Industrie, die leider an der SPS vorbei gegangen sind. (Wer AWL schreibt, ist 50 Jahre hinter dem Mond!)
Jetzt habe ich wohl ein paar Feinde hier im Forum, aber nochmals der Hinweis, Programmieren ist etwas mehr als Try and Error und Hurrah, es läuft.
Ein Buch und Kurse sind notwendig, wenn es über das Hobby Programmieren hinausgeht.