Adresse von Eingängen und Ausgängen an Funktionsbaustein übergeben

funkey

Level-2
Beiträge
359
Reaktionspunkte
108
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe Wago Energiemessklemmen in Betrieb genommen, aber ich habe pro Klemme ein 'Program' verwendet und in der Deklaration jeweils nur die Hardware-Adresse geändert. Es läuft alles wie es soll, aber ich würde gerne einen Funktionsbaustein verwenden und die Adresse als Integer übergeben. Leider habe ich keine Ahnung wie man das macht.

Code:
PROGRAM Energiezaehler_01
VAR
 abProcessImageInput AT %IW0   : ARRAY[0..23] OF BYTE;
 abProcessImageOutput  AT %QW0    : ARRAY[0..23] OF BYTE;
...

Folgender Code ist nur zum Verständnis was ich erreichen will:
Code:
FUNCTION_BLOCK Energiezaehler__494
VAR_INPUT
 iStartAddress : INT;
END_VAR
VAR_OUTPUT
END_VAR
VAR
 abProcessImageInput AT %IW iStartAddress   : ARRAY[0..23] OF BYTE;
 abProcessImageOutput  AT %QW iStartAddress  : ARRAY[0..23] OF BYTE;
...


Kann mir da jemand helfen, wie ich von einem Integer auf die Anfangsadresse komme, und damit das Array initialisieren kann?
Wahrscheinlich gibt es das Thema schon irgendwo, jedoch habe ich nichts dazu gefunden.

Vielen Dank!
 
Ich würde dieses Array als INPUT deklarieren und dann die Deklaration mit der Adresse in den Aufrufenden Baustein legen.
Dann ist dein FB immer gekapselt, und man kann extern die Anpassung vornehmen.

Grüße

Marcel
 
Wago_Energiemessung.PNG

Danke, passt das dann so?
Jetzt ist die Zuweisung des Eingangsbereiches auf das Array außerhalb des Bausteines. Das ist schon sehr gut. Noch besser hätte es mir aber gefallen, wenn ich nur einen Integer übergeben müsste und die Zuweisung im FB erfolgen würde. Wird wahrscheinlich nicht gehen, ist aber auch nicht so wichtig.

Danke!
 
Ich kenne mich nun nicht mit Wago und CodeSys aus ... im Prinzip sollte dein Vorhaben aber umsetzbar sein - nur nicht so, wie in deinem Beitrag #1.
Dort mapst du ja deine Deklaration auf einen Adressbereich - dabei wird der Compiler vermutlich nur eine Konstante akzeptieren.
Was du jetzt machen müßtest wäre anhand der iStartAdress die entsprechenden Eingangsbereiche per indirekter Adressierung in den Variablenbereich ProzessImageInput hineinladen (also eine Schleife) und am Ende den Variablenbereich ProzessImageOutput auf den entsprechenden Ausgangsbereich ebenso zurückschreiben.

"Indirekte Adressierung" wäre hier dein Schlagwort mit dem du in der CodeSys-Hilfe suchen müßtest - und das anschließend ausprobieren ...

Gruß
Larry
 
Die Bibliotheks-Bausteine zu den Energiemessklemmen erwarten diese Arrays mit den Daten aus dem jeweiligen Ein- und Ausgangsbereich. Im Beispielprojekt wurde es so verwendet. Ich habe bis jetzt immer das PROGRAM kopiert und die Adressen ausgetauscht. Finde aber ein FB mit der Adresse als Eingang wäre besser und schöner.
Wago_Energiemessung_02.PNG
 
Ich kenn jetzt das WAGO System nicht, aber bei Beckhoff kann man Hardware-IOs mit AT %I* und AT %Q* deklarieren und die Zuordnung zu den realen IOs erfolgt dann in der Hardwarekonfig.

Von irgendwas mit Internetzugang gesendet.
 
Danke Holger,

also müsste das so jetzt richtig sein?
Code:
UNCTION_BLOCK Energiezaehler_494
VAR_INPUT
 abProcessImageInput  : ARRAY[0..23] OF BYTE;
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
 abProcessImageOutput  : ARRAY[0..23] OF BYTE;
END_VAR
...

und beim Aufruf
Code:
PROGRAM PLC_PRG
VAR
 Energiezaehler_01: Energiezaehler_494;
  abProcessImageInput_01 AT %IW0   : ARRAY[0..23] OF BYTE;
  abProcessImageOutput_01  AT %QW0  : ARRAY[0..23] OF BYTE;
 Energiezaehler_02: Energiezaehler_494;
  abProcessImageInput_02 AT %IW12   : ARRAY[0..23] OF BYTE;
  abProcessImageOutput_02  AT %QW12  : ARRAY[0..23] OF BYTE;

Mit dem AT Befehl wird nun der Adressbereich dem Array zugewiesen, oder? Warum muss abProcessImageOutput ein INOUT sein und nicht nur OUT? Ganz verstehe ich das noch nicht.
 
In dem Fb_750_494_State und dem FB_750_404_Configuration ist er als IN_OUT definiert, Um zu ergründen warum, müsste man in die Bausteine reinschauen. Ich denke mal die State und Control Worte sind so ein Gemisch aus lesen und schreiben.
Holger
 
Zurück
Oben