Siemens SCL Programming Versão atualizada: 12 casos práticos industriais
2025-07-03
12 Casos práticos industriais (1-6)
Caso 1: Controle de arranque-parada do motor
- Não.
FUNÇÃO_BLOCO FB_MotorControl
VAR_INPUT
StartButton: BOOL;
StopButton: BOOL;
Sinalização de sobrecarga: BOOL;
END_VAR
VAR_OUTPUT
Execução Status: BOOL;
Indicador de falha: BOOL
END_VAR
Começar.
// Logic de Paragem e Iniciação
Se o botão de arranque e não o botão de parada e não o sinal de sobrecarga, então
RunningStatus:= TRUE;
ELSIF StopButton OR OverloadSignal THEN
RunningStatus:= FALSO;
END_IF;
Indicação de falha.
Indicador de falha: = sinal de sobrecarga;
END_FUNCTION_BLOCK
Caso 2: Aplicação de temporizadores
- Não.
FUNÇÃO_BLOCO FB_DelayStart
VAR_INPUT
StartSignal: BOOL;
Tempo de atraso: TEMPO: = T#5S;
END_VAR
VAR_OUTPUT
OutputSignal: BOOL;
END_VAR
VAR
Tempo de atraso: TON;
END_VAR
Começar.
O número de horas de funcionamento é o seguinte:
OutputSignal := DelayTimer.Q;
END_FUNCTION_BLOCK
Caso 3: Controle de temperatura PID
- Não.
FUNCTION_BLOCK FB_TempControl
VAR_INPUT
Ponto de referência: 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;
Temporiador: TON;
END_VAR
Começar.
// Execute periodicamente (100ms)
A duração do tempo de ensaio deve ser determinada em conformidade com o ponto 6.1.
Se o Timer.Q Então
Erro VAR:= Ponto de fixação - ProcessValue;
IntegralTerm:= IntegralTerm + Erro;
VAR DerivativeTerm := Erro - LastError;
LastError:= Erro;
ControlOutput := Kp * Error + Ki * IntegralTerm + Kd * DerivativeTerm;
ControlOutput:= LIMIT(0.0, ControlOutput, 100.0);
Aponta-tempo ((IN):= FALSO);
END_IF;
END_FUNCTION_BLOCK
Caso 4: Gestão de filas de produção
- Não.
FUNÇÃO_BLOCO FB_Cue de produção
VAR_INPUT
NewOrder: BOOL;
OrderID: INT;
CompleteSignal: BOOL;
END_VAR
VAR_OUTPUT
CurrentOrder: INT;
Duração da fila: INT;
END_VAR
VAR
Lista de ordem: ARRAY[1..50] OF INT;
Cabeça de fila: INT:= 1;
QueueTail: INT:= 1;
END_VAR
Começar.
- Nova fila de encomendas.
IF NewOrder AND QueueLength < 50 THEN
OrderQueue[QueueTail] := OrderID;
QueueTail:= QueueTail MOD 50 + 1;
QueueLength := QueueLength + 1;
END_IF;
// Completada a fila de encomendas
Se CompleteSignal AND QueueLength > 0 THEN
Cabeça de fila:= Cabeça de fila MOD 50 + 1;
Duração da fila: = Duração da fila - 1;
END_IF;
- Ordem atual.
IF QueueLength > 0 THEN
CurrentOrder := OrderQueue[QueueHead];
Outro.
Ordem corrente: = 0;
END_IF;
END_FUNCTION_BLOCK
Caso 5: Controle de bloqueio do portão de segurança
- Não.
FUNÇÃO_BLOCO FB_SafetyGate
VAR_INPUT
Portão 1 fechado, Portão 2 fechado: BOOL;
EStopButton: BOOL;
ResetButton: BOOL;
END_VAR
VAR_OUTPUT
Estado de segurança: BOOL;
END_VAR
VAR
LockoutStatus: BOOL:= FALSO;
Tempo de bloqueio: TON;
END_VAR
Começar.
- Condição de segurança.
VAR AllGatesClosed:= Gate1Closed AND Gate2Closed;
Paragem de emergência, prioridade máxima.
Se EStopButton então
Estado de segurança: = FALSO;
LockoutStatus:= Verdadeiro;
LockingTimer ((IN):= TRUE, PT:= T#10S);
RETORNO;
END_IF;
- Desbloqueia a lógica.
Se ResetButton E LocalizaçãoStatus E LocalizaçãoTimer.Q THEN
LockoutStatus:= FALSO;
END_IF;
- Função normal.
Se NÃO, LOCKOUT, então.
Estado de Segurança:
END_IF;