FUNCTION_BLOCK FB_MotorControl
VAR_INPUT
StartButton: BOOL;
StopButton: BOOL;
OverloadSignal: BOOL;
END_VAR
VAR_OUTPUT
RunningStatus: BOOL;
FaultIndicator: BOOL;
END_VAR
BEGIN
// Start-Stop Logic
IF StartButton AND NOT StopButton AND NOT OverloadSignal THEN
RunningStatus := TRUE;
ELSIF StopButton OR OverloadSignal THEN
RunningStatus := FALSE;
END_IF;
// Fault Indication
FaultIndicator := OverloadSignal;
END_FUNCTION_BLOCK
Case 2: Timer Application
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
Case 3: PID Temperature Control
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
// Execute periodically (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
Case 4: Production Line Queue Management
scl
FUNCTION_BLOCK FB_ProductionQueue
VAR_INPUT
NewOrder: BOOL;
OrderID: INT;
CompleteSignal: BOOL;
END_VAR
VAR_OUTPUT
CurrentOrder: INT;
QueueLength: INT;
END_VAR
VAR
OrderQueue: ARRAY[1..50] OF INT;
QueueHead: INT := 1;
QueueTail: INT := 1;
END_VAR
BEGIN
// New order enqueue
IF NewOrder AND QueueLength < 50 THEN
OrderQueue[QueueTail] := OrderID;
QueueTail := QueueTail MOD 50 + 1;
QueueLength := QueueLength + 1;
END_IF;
// Completed order dequeue
IF CompleteSignal AND QueueLength > 0 THEN
QueueHead := QueueHead MOD 50 + 1;
QueueLength := QueueLength - 1;
END_IF;
// Current order
IF QueueLength > 0 THEN
CurrentOrder := OrderQueue[QueueHead];
ELSE
CurrentOrder := 0;
END_IF;
END_FUNCTION_BLOCK
Case 5: Safety Gate Interlock Control
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
// Safety condition
VAR AllGatesClosed := Gate1Closed AND Gate2Closed;
// Emergency stop highest priority
IF EStopButton THEN
SafetyStatus := FALSE;
LockoutStatus := TRUE;
LockoutTimer(IN := TRUE, PT := T#10S);
RETURN;
END_IF;
// Unlock logic
IF ResetButton AND LockoutStatus AND LockoutTimer.Q THEN
LockoutStatus := FALSE;
END_IF;
// Normal operation
IF NOT LockoutStatus THEN
SafetyStatus := AllGatesClosed;
END_IF;