Você está na página 1de 5

FUNCTION_BLOCK MotorCounter

VAR_INPUT

StartButton: BOOL; (* Botão de início do motor *)

StopButton: BOOL; (* Botão de parada do motor *)

ResetButton: BOOL; (* Botão de reset do contador *)

END_VAR

VAR_OUTPUT

MotorRunning: BOOL; (* Indica se o motor está em execução *)

OperatingTime: INT; (* Contador de horas de funcionamento do motor *)

END_VAR

VAR

StartTime: DATE_AND_TIME; (* Hora de início do motor *)

CurrentTime: DATE_AND_TIME; (* Hora atual *)

Running: BOOL := FALSE; (* Indica se o motor está em execução *)

END_VAR

METHOD UpdateTime

(* Atualiza o tempo atual *)

CurrentTime := DATE_AND_TIME();

END_METHOD

METHOD Execute

IF StartButton AND NOT Running THEN

(* Inicia o contador quando o motor é ligado *)

StartTime := DATE_AND_TIME();

Running := TRUE;

END_IF;

IF StopButton AND Running THEN

(* Para o contador quando o motor é desligado *)

Running := FALSE;

END_IF;

IF ResetButton THEN

(* Reseta o contador de horas *)

OperatingTime := 0;

END_IF;

IF Running THEN

(* Atualiza o tempo atual e calcula o tempo de operação *)

UpdateTime();

OperatingTime := TIME_TO_INT(CurrentTime - StartTime) / 3600; (* Em horas *)

END_IF;

MotorRunning := Running;

END_METHOD

END_FUNCTION_BLOCK
FUNCTION_BLOCK MotorCounter

VAR_OUTPUT

MotorRunning: BOOL; (* Indica se o motor está em execução *)

OperatingTime: INT; (* Contador de horas de funcionamento do motor *)

END_VAR

VAR

StartTime: DATE_AND_TIME; (* Hora de início do motor *)

AccumulatedTime: INT := 0; (* Tempo acumulado de funcionamento *)

Running: BOOL := FALSE; (* Indica se o motor está em execução *)

END_VAR

METHOD UpdateTime

(* Atualiza o tempo atual *)

CurrentTime := DATE_AND_TIME();

END_METHOD

METHOD Execute

IF StartButton AND NOT Running THEN

(* Inicia o contador quando o motor é ligado *)

StartTime := DATE_AND_TIME();

Running := TRUE;

END_IF;

IF StopButton AND Running THEN

(* Para o contador quando o motor é desligado *)

UpdateTime();

AccumulatedTime := AccumulatedTime + TIME_TO_INT(CurrentTime - StartTime);

Running := FALSE;

END_IF;

IF Running THEN

(* Atualiza o tempo atual enquanto o motor está em execução *)

UpdateTime();

END_IF;

OperatingTime := AccumulatedTime / 3600; (* Em horas *)

MotorRunning := Running;

END_METHOD

END_FUNCTION_BLOCK
Olá, eu posso te ajudar a criar um horímetro persistente no CLP Siemens S7-400 em SCL. SCL é uma
linguagem de programação estruturada para os controladores lógicos programáveis da Siemens, que permite
criar blocos de funções e dados de forma clara e modular. Para criar um horímetro persistente em SCL, você
pode seguir os seguintes passos:

 Criar um bloco de dados (DB) para armazenar os valores do horímetro, como o tempo total, o tempo
parcial e o estado do equipamento. Você pode usar o tipo de dado TIME para representar os tempos
e o tipo BOOL para o estado. Por exemplo:

DATA_BLOCK DB1
STRUCT
TempoTotal : TIME; // Tempo total de funcionamento do equipamento
TempoParcial : TIME; // Tempo parcial de funcionamento do equipamento
Estado : BOOL; // Estado do equipamento (ligado ou desligado)
END_STRUCT;
END_DATA_BLOCK
Copiar

 Criar um bloco de função (FB) para implementar a lógica do horímetro, que consiste em incrementar
os tempos total e parcial a cada ciclo de varredura quando o equipamento estiver ligado, e zerar o
tempo parcial quando o equipamento for desligado. Você pode usar as instruções IF, THEN, ELSE e
END_IF para controlar o fluxo do programa, e as instruções TADD, T#0S e T#1S para manipular os
valores de tempo. Por exemplo:

FUNCTION_BLOCK FB1
VAR_INPUT
Equipamento : BOOL; // Entrada que indica se o equipamento está ligado ou desligado
END_VAR;
VAR_IN_OUT
Horimetro : DB1; // Bloco de dados que contém os valores do horímetro
END_VAR;
BEGIN
IF Equipamento THEN // Se o equipamento estiver ligado
Horimetro.TempoTotal := TADD(Horimetro.TempoTotal, T#1S); // Incrementa o tempo
total em 1 segundo
Horimetro.TempoParcial := TADD(Horimetro.TempoParcial, T#1S); // Incrementa o tempo
parcial em 1 segundo
ELSE // Se o equipamento estiver desligado
Horimetro.TempoParcial := T#0S; // Zera o tempo parcial
END_IF;
END_FUNCTION_BLOCK
Copiar

 Criar um bloco de organização (OB) para chamar o bloco de função do horímetro e passar os
parâmetros adequados. Você pode usar a instrução CALL para invocar um bloco e associar as
variáveis de entrada e saída. Por exemplo:

ORGANIZATION_BLOCK OB1 : VOID


VAR_TEMP
Equipamento : BOOL; // Variável temporária que representa o estado do equipamento
END_VAR;
BEGIN
Equipamento := I0.0; // Lê a entrada digital I0.0 e atribui à variável Equipamento
CALL FB1 (Equipamento := Equipamento, Horimetro := DB1); // Chama o bloco de função
FB1 e passa os parâmetros Equipamento e DB1
END_ORGANIZATION_BLOCK
Copiar

 Compilar e transferir os blocos para o CLP usando o software STEP 7. Você pode verificar se os
blocos foram criados corretamente usando o simulador integrado ou um CLP real.

Espero que esses passos sejam úteis para você. Se você quiser saber mais sobre a linguagem SCL e seus
recursos, você pode consultar os manuais da Siemens123, que contêm informações detalhadas sobre a sintaxe,
as instruções, os tipos de dados e os exemplos de código. Se você tiver alguma dúvida ou precisar de mais

ajuda, por favor me avise. 😊

Você também pode gostar