FB_CTRL_MULTIPLE_PWM_OUT
Dieser Baustein erzeugt aus mehreren Eingangssignalen PWM modulierte Ausgangssignale, wobei die Ausgangssignale zeitlich zueinander so angeordnet werden, dass möglichst wenige Ausgänge zeitgleich eingeschaltet sind. Durch dieses zeitliche Anordnung wird das für die Stellglieder benötigte Leistungsmaximum reduziert.
Bei diesem erweiterten Baustein kann neben dem Puls-Pausen-Verhältnis auch die minimale Einschaltdauer und die minimale Ausschaltdauer parametriert werden.
Beschreibung des Ausgangsverhaltens (1):
Beschreibung des Ausgangsverhaltens (2):
Um diesen Funktionsbaustein nutzen zu können, müssen vom Programmierer in der SPS die folgenden Arrays angelegt werden:
ar_fPwmInput :
ARRAY[1..nNumberOfPwmOutputs] OF FLOAT;
ar_stWaitTimesConfig : ARRAY[1..nNumberOfPwmOutputs] OF
ST_CTRL_MULTIPLE_PWM_OUT_TIMES;
ar_stPwmOutputs : ARRAY[1..nNumberOfPwmOutputs] OF
ST_CTRL_MULTIPLE_PWM_OUT_OUTPUTS;
ar_stPwmDataVars : ARRAY[1..nNumberOfPwmOutputs] OF
ST_CTRL_MULTIPLE_PWM_OUT_DATA;
In das Array ar_fPwmInput werden die Eingangsgrößen für die einzelnen Kanäle des PWM-Bausteins geschrieben. In dem Array ar_stWaitTimesConfig kann der Programmierer die parametrierbaren Zeiten für die einzelnen Kanäle ablegen. Die Ausgangsbits werden von dem Funktionsbaustein in das Array ar_stPwmOutputs geschrieben. Die internen Daten, die der Baustein benötigt, werden in dem Array ar_stPwmDataVars abgelegt. Die in dem letzt genannten Array enthaltenen Strukturen dürfen innerhalb des SPS-Programms keinesfalls geändert werden. Diese Vorgehensweise wird auch in dem unten aufgeführten Beispielprogramm dargestellt.
VAR_INPUT
VAR_INPUT
eMode : E_CTRL_MODE;
END_VAR
eMode : Eingang, der die Betriebsart des Bausteins festlegt.
VAR_OUTPUT
VAR_OUTPUT
eState : E_CTRL_STATE;
bError : BOOL;
eErrorId : E_CTRL_ERRORCODES;
END_VAR
eState : State des Funktionsbausteins.
eErrorId : Liefert bei einem gesetzten bError-Ausgang die Fehlernummer.
bError : Wird TRUE, sobald ein Fehler eintritt.
VAR_IN_OUT
VAR_IN_OUT
stParams : ST_CTRL_PWM_OUT_EXT_PARAMS;
END_VAR
stParams : Parameterstruktur des PWM-Glieds. Diese besteht aus den folgenden Elementen:
TYPE
ST_CTRL_MULTIPLE_PWM_OUT_PARAMS :
STRUCT
tTaskCycleTime : TIME; (* PLC/PWM cycle time in
seconds *)
tPWMPeriod : TIME; (* controller cycle time
in seconds *)
nNumberOfPwmOutputs : USINT;
pPwmInputArray_ADR : POINTER TO FLOAT := 0;
nPwmInputArray_SIZEOF : UINT;
pPwmTimesConfig_ADR : POINTER TO
ST_CTRL_MULTIPLE_PWM_OUT_TIMES;
nPwmTimesConfig_SIZEOF : UINT;
pPwmOutputArray_ADR : POINTER TO
ST_CTRL_MULTIPLE_PWM_OUT_OUTPUTS;
nPwmOutputArray_SIZEOF : UINT;
pPwmData_ADR : POINTER TO
ST_CTRL_MULTIPLE_PWM_OUT_DATA;
nPwmData_SIZEOF : UINT;
END_STRUCT
END_TYPE
tTaskCycleTime : Zykluszeit, mit der der Funktionsbaustein aufgerufen wird. Diese entspricht der Task-Zykluszeit der aufrufenden Task, wenn der Baustein in jedem Zyklus aufgerufen wird.
tPWMPeriod : Periodendauer des PWM-Signals.
nNumberOfPwmOutputs : Anzahl der PWM-Ausgänge. [1...n]
pPwmInputArray_ADR : Adresse des PWM-Input-Arrays.
nPwmInputArray_SIZEOF : Größe des PWM-Input-Arrays in Bytes.
pPwmTimesConfig_ADR : Adresse des PWM-Times-Arrays.
nPwmTimesConfig_SIZEOF : Größe des PWM-Times-Arrays in Bytes.
pPwmData_ADR : Adresse des internen PWM-Data-Arrays.
pPwmData_SIZEOF : Größe des internen PWM-Data-Arrays in Bytes.
TYPE
ST_CTRL_MULTIPLE_PWM_OUT_TIMES :
STRUCT
tMinOnTime : TIME; (* min. switch on time *)
tMinOffTime : TIME; (* min. switch off time *)
tMinWaitTime : TIME; (* min. waiting time when switching from
pos to neg or vv*)
END_STRUCT
END_TYPE
tMinOnTime : Minimale Einschaltdauer des PWM-Ausgangs.
tMinOffTime : Minimale Ausschaltdauer des PWM-Ausgangs..
tMinWaitTime : Wartezeit zwischen den Umschaltvorgängen zwischen einem positiven und negativen Ausgangsignal.
TYPE
ST_CTRL_MULTIPLE_PWM_OUT_OUTPUTS :
STRUCT
bPwmOutBitPos : BOOL;
bPwmOutBitNeg : BOOL;
bWaitTimeActive : BOOL;
END_STRUCT
END_TYPE
bPwmOutBitPos : PWM-Signal, wenn fPwmInput > 0.0.
bPwmOutBitNeg : PWM-Signal, wenn fPwmInput < 0.0.
bWaitTimeActive : Ein TRUE an diesem Ausgang signalisiert, dass die Wartezeit zwischen dem Umschalten der Ausgangssignale aktiv ist. Dieser Ausgang kann dazu verwendet werden, einen eventuell vorhandenen I-Anteil in dem vorgeschalteten Regler für diese Zeit konstant zu halten.
TYPE
ST_CTRL_MULTIPLE_PWM_OUT_DATA :
STRUCT
Interne Struktur. Auf diese darf nicht schreibend
zugegriffen werden.
END_STRUCT
END_TYPE
Beispiel:
PROGRAM PRG_MULTIPLE_PWM_OUT_TEST
VAR CONSTANT
nNumberOfPwmOutputs : USINT := 3;
END_VAR
VAR
ar_fPwmInput : ARRAY[1..nNumberOfPwmOutputs] OF
FLOAT;
ar_stWaitTimesConfig : ARRAY[1..nNumberOfPwmOutputs] OF
ST_CTRL_MULTIPLE_PWM_OUT_TIMES;
ar_stPwmOutputs : ARRAY[1..nNumberOfPwmOutputs] OF
ST_CTRL_MULTIPLE_PWM_OUT_OUTPUTS;
ar_stPwmDataVars : ARRAY[1..nNumberOfPwmOutputs] OF
ST_CTRL_MULTIPLE_PWM_OUT_DATA;
eMode : E_CTRL_MODE;
stParams :
ST_CTRL_MULTIPLE_PWM_OUT_PARAMS;
eErrorId : E_CTRL_ERRORCODES;
bError : BOOL;
fbPwm_Out : FB_CTRL_MULTIPLE_PWM_OUT;
bInit : BOOL := TRUE;
fIn1 : FLOAT;
fIn2 : FLOAT;
fIn3 : FLOAT;
bOut1_pos : BOOL;
bOut1_neg : BOOL;
bOut2_pos : BOOL;
bOut2_neg : BOOL;
bOut3_pos : BOOL;
bOut3_neg : BOOL;
END_VAR
IF bInit
THEN
(* set values in the local arrays *)
ar_stWaitTimesConfig[1].tMinOnTime := T#500ms;
ar_stWaitTimesConfig[1].tMinOffTime := T#300ms;
ar_stWaitTimesConfig[1].tMinWaitTime := T#3.5s;
ar_stWaitTimesConfig[2].tMinOnTime := T#400ms;
ar_stWaitTimesConfig[2].tMinOffTime := T#250ms;
ar_stWaitTimesConfig[2].tMinWaitTime := T#4.5s;
ar_stWaitTimesConfig[3].tMinOnTime := T#400ms;
ar_stWaitTimesConfig[3].tMinOffTime := T#200ms;
ar_stWaitTimesConfig[3].tMinWaitTime := T#5.5s;
(* set values in the parameter struct *)
stParams.tTaskCycleTime := T#2ms;
stParams.tPWMPeriod := T#2s;
stParams.nNumberOfPwmOutputs := nNumberOfPwmOutputs;
(* set the ctrl-mode *)
eMode := eCTRL_MODE_ACTIVE;
bInit := FALSE;
END_IF
(* set the addresses *)
stParams.pPwmTimesConfig_ADR := ADR(
ar_stWaitTimesConfig);
stParams.nPwmTimesConfig_SIZEOF := SIZEOF(
ar_stWaitTimesConfig);
stParams.pPwmInputArray_ADR := ADR( ar_fPwmInput );
stParams.nPwmInputArray_SIZEOF := SIZEOF( ar_fPwmInput );
stParams.pPwmOutputArray_ADR := ADR( ar_stPwmOutputs );
stParams.nPwmOutputArray_SIZEOF := SIZEOF( ar_stPwmOutputs );
stParams.pPwmData_ADR := ADR( ar_stPwmDataVars );
stParams.nPwmData_SIZEOF := SIZEOF( ar_stPwmDataVars
);
ar_fPwmInput[1] := fIn1;
ar_fPwmInput[2] := fIn2;
ar_fPwmInput[3] := fIn3;
fbPwm_Out( eMode := eMode,
stParams := stParams,
bError => bError,
eErrorId => eErrorId);
bOut1_pos := ar_stPwmOutputs[1].bPwmOutBitPos;
bOut1_neg := ar_stPwmOutputs[1].bPwmOutBitNeg;
bOut2_pos := ar_stPwmOutputs[2].bPwmOutBitPos;
bOut2_neg := ar_stPwmOutputs[2].bPwmOutBitNeg;
bOut3_pos := ar_stPwmOutputs[3].bPwmOutBitPos;
bOut3_neg := ar_stPwmOutputs[3].bPwmOutBitNeg;