FB_CTRL_MULTIPLE_PWM_OUT

FB_CTRL_MULTIPLE_PWM_OUT 1:

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):

FB_CTRL_MULTIPLE_PWM_OUT 2:

Beschreibung des Ausgangsverhaltens (2):

FB_CTRL_MULTIPLE_PWM_OUT 3:

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;

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken

TwinCAT v2.8

PC (i386)

TcControllerToolbox.lib

TwinCAT v2.9 ab Build 947

BC

TcControllerToolbox.lb6

TwinCAT v2.9 ab Build 956

BX

TcControllerToolbox.lbx