Version mise à jour de la programmation SCL Siemens : 12 cas pratiques industriels
2025-07-03
12 Cas pratiques industriels (1-6)
Cas 1 : Contrôle Marche-Arrêt Moteur
scl
FUNCTION_BLOCK FB_MotorControl
VAR_INPUT
StartButton: BOOL;
StopButton: BOOL;
OverloadSignal: BOOL;
END_VAR
VAR_OUTPUT
RunningStatus: BOOL;
FaultIndicator: BOOL;
END_VAR
BEGIN
// Logique Marche-Arrêt
IF StartButton AND NOT StopButton AND NOT OverloadSignal THEN
RunningStatus := TRUE;
ELSIF StopButton OR OverloadSignal THEN
RunningStatus := FALSE;
END_IF;
// Indication de défaut
FaultIndicator := OverloadSignal;
END_FUNCTION_BLOCK
Cas 2 : Application Minuterie
scl
FUNCTION_BLOCK FB_DelayStart
VAR_INPUT
StartSignal: BOOL;
DelayTime: TIME := T#5S;
END_VAR
VAR_OUTPUT
OutputSignal: BOOL;
END_VAR
VAR
DelayTimer: TON;
END_VAR
BEGIN
DelayTimer(IN := StartSignal, PT := DelayTime);
OutputSignal := DelayTimer.Q;
END_FUNCTION_BLOCK
Cas 3 : Contrôle de température PID
scl
FUNCTION_BLOCK FB_TempControl
VAR_INPUT
Setpoint: REAL;
ProcessValue: REAL;
END_VAR
VAR_OUTPUT
ControlOutput: REAL;
END_VAR
VAR
Kp: REAL := 2.0;
Ki: REAL := 0.05;
Kd: REAL := 0.5;
IntegralTerm: REAL := 0;
LastError: REAL := 0;
Timer: TON;
END_VAR
BEGIN
// Exécuter périodiquement (100ms)
Timer(IN := NOT Timer.Q, PT := T#100ms);
IF Timer.Q THEN
VAR Error := Setpoint - ProcessValue;
IntegralTerm := IntegralTerm + Error;
VAR DerivativeTerm := Error - LastError;
LastError := Error;
ControlOutput := Kp * Error + Ki * IntegralTerm + Kd * DerivativeTerm;
ControlOutput := LIMIT(0.0, ControlOutput, 100.0);
Timer(IN := FALSE);
END_IF;
END_FUNCTION_BLOCK
Cas 4 : Gestion de file d'attente de chaîne de production
scl
Cas 5 : Contrôle d'interverrouillage de porte de sécurité
scl
FUNCTION_BLOCK FB_SafetyGate
VAR_INPUT
Gate1Closed, Gate2Closed: BOOL;
EStopButton: BOOL;
ResetButton: BOOL;
END_VAR
VAR_OUTPUT
SafetyStatus: BOOL;
END_VAR
VAR
LockoutStatus: BOOL := FALSE;
LockoutTimer: TON;
END_VAR
BEGIN
// Condition de sécurité
VAR AllGatesClosed := Gate1Closed AND Gate2Closed;
// Arrêt d'urgence priorité la plus élevée
IF EStopButton THEN
SafetyStatus := FALSE;
LockoutStatus := TRUE;
LockoutTimer(IN := TRUE, PT := T#10S);
RETURN;
END_IF;
// Logique de déverrouillage
IF ResetButton AND LockoutStatus AND LockoutTimer.Q THEN
LockoutStatus := FALSE;
END_IF;
// Fonctionnement normal
IF NOT LockoutStatus THEN
SafetyStatus := AllGatesClosed;
END_IF;