Bausteinaufruf in FOR Schleife

PtU_Master

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich versuche gerade in einem kurzen Programm Antriebsdaten mehrerer Motoren auszulesen und diese in einem zuvor definierten Array zu speichern.
Die Zuweisung zum Motor soll dabei über die Schleifen-Index Variable geschehen.

Der Code sieht wie folgt aus:

PROGRAM Antriebsdaten_PRG

VAR
Antriebsdaten: ARRAY[1..8] OF Antriebsdaten;
fbMB_ReadAntriebsdaten : MB_ReadRealParameter;
Enable_fbMB : BOOL := FALSE;
i: INT;

END_VAR

_______________________

FOR i:=1 TO 8 DO

fbMB_ReadAntriebsdaten( Enable := Enable_fbMB,
ParameterNumber := FP_P_0_0043,
Axis := AxisRefs,
Value => Antriebsdaten.Drehmomentbildender_Strom_IstWert );

fbMB_ReadAntriebsdaten( Enable := Enable_fbMB,
ParameterNumber := FP_P_0_0044,
Axis := AxisRefs,
Value => Antriebsdaten.Flussbildender_Strom_IstWert );
END_FOR

Jetzt ist es leider allerdings so, dass alle Einträge im Array immer gleich sind.
Liegt dies ggf. am Zeitbedarf des Bausteins MB_ReadRealParameter oder wieso ändert sich die Parameter Nummer und der Axis Index nicht.

Vielen Dank vorab für ein kurzes Feedback.
 
Ich hätte eine Zuweisung wie die folgende erwartet:
Code:
Value => Antriebsdaten[i].Drehmomentbildender_Strom_IstWert );

Ich denke Du musst auch auf Done warten. Das wird schwierig in einem Schleifendurchlauf.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tatsächlich stimmte wie von dir bemerkt der Aufruf im Post nicht und es fehlte die Zuweisung. Den hatte ich versehentlich beim kopieren im Beitrag raus gelöscht, im PRG ist er da.
Kennt jemand einen elegante Lösung, um für 8 Antriebe jeweils 8 Antriebsdaten zyklisch abzurufen? Oder ist die einfachste Lösung 8 mal den Baustein für unterschiedliche Parameter für jeden Antrieb einzeln abzurufen?
 
Ich könnte mir so etwas vorstellen:

Code:
fbMB_ReadAntriebsdaten();

CASE wState OF
0:
     If xDo then
          i := 1;
          wState := 10;
     END_IF
10:
          CASE i OF
          1:
               fbMB_ReadAntriebsdaten.ParameterNumber := FP_P_0_0043;
          2:
               fbMB_ReadAntriebsdaten.ParameterNumber := FP_P_0_0044;
          3:
               ......
          END_CASE
          fbMB_ReadAntriebsdaten.Enable := TRUE;
          IF fbMB_ReadAntriebsdaten.Done THEN
               fbMB_ReadAntriebsdaten.Enable := FALSE;
               Antriebsdaten[i].Drehmomentbildender_Strom_IstWert := fbMB_ReadAntriebsdaten.Value;
               wState := 20;
          END_IF
     END_IF
20:
     i := i + 1;
     IF i <= 8 then
          wState := 10;
     else
          xDo := FALSE;
          wState := 0;
END_CASE

Der Codeschnipsel ist nur aus dem Kopf geschrieben und ungetestet.
Ich weiß auch nicht wie Dein Funktionsbaustein reagiert und angesprochen werden muss.
 
Wenn du mit der Schleife arbeiten willst, muss der FB auch als Array definiert sein.

Code:
VAR
Antriebsdaten: ARRAY[1..8] OF Antriebsdaten;
fbMB_ReadAntriebsdaten : ARRAY[1..8] OF MB_ReadRealParameter;
Enable_fbMB : BOOL := FALSE;
i: INT;

END_VAR

_______________________

Code:
FOR i:=1 TO 8 DO

fbMB_ReadAntriebsdaten[i]( Enable := Enable_fbMB,
ParameterNumber := FP_P_0_0043,
Axis := AxisRefs,
Value => Antriebsdaten[i].Drehmomentbildender_Strom_IstWert );

fbMB_ReadAntriebsdaten[i]( Enable := Enable_fbMB,
ParameterNumber := FP_P_0_0044,
Axis := AxisRefs,
Value => Antriebsdaten[i].Flussbildender_Strom_IstWert );
END_FOR

Dazu muss aber der "MB_ReadRealParameter" Multiinstanzfähig sein.
 
Zurück
Oben