Partilhar: WhatsApp
aulify
UC UC02953 · T. Mecatrónica

Ficha de Trabalho 1 — Programação PLC Avançada e Comunicação Modbus TCP

Versão · Aluno
Tempo · 45 minutos
Aluno(a)
Turma
Data

Ficha de Trabalho 1 — UC02953

ST, SFC e Comunicação Modbus TCP

Duração: 90 minutos | Consulta: Sebenta e referência IEC 61131-3 | Calculadora: Permitida


Grupo I — Verdadeiro / Falso (20 pontos)

  1. O IEC 61131-3 define 5 linguagens de programação para PLCs: LD, FBD, ST, IL e SFC. ___
  2. No Structured Text (ST), o bloco TON é um temporizador de atraso na descida (off-delay). ___
  3. O diagrama SFC (Sequential Function Chart) é baseado nas Redes de Petri e é ideal para controlo sequencial de estados. ___
  4. O Modbus TCP usa o protocolo UDP (User Datagram Protocol) como transporte de rede. ___
  5. Na tabela Modbus, os Holding Registers têm endereços entre 40001–49999 e permitem leitura e escrita. ___
  6. O OPC UA é um standard de comunicação que inclui segurança integrada (autenticação e encriptação) ao contrário do OPC DA. ___
  7. Um programa Function Block (FB) em IEC 61131-3 tem memória interna (variáveis de instância) que persiste entre chamadas. ___
  8. O PROFINET IRT (Isochronous Real-Time) é adequado para controlo de servos com ciclos de 250 µs. ___
  9. No SFC, uma acção do tipo 'N' (Non-stored) permanece activa mesmo após o passo ficar inactivo. ___
  10. A cibersegurança industrial segundo a IEC 62443 define 4 níveis de segurança (SL 1 a SL 4), onde SL 4 representa a maior protecção. ___

Soluções — Grupo I

  1. V — As 5 linguagens são: LD (Ladder Diagram), FBD (Function Block Diagram), ST (Structured Text), IL (Instruction List) e SFC (Sequential Function Chart).
  2. F — TON é um temporizador de atraso na subida (on-delay): Q=1 um tempo PT após IN=1. O temporizador de atraso na descida é o TOF.
  3. V — O SFC é baseado nas Redes de Petri de Grafcet; é a linguagem natural para descrever sequências de estados com condições de transição bem definidas.
  4. F — O Modbus TCP usa TCP/IP (não UDP) como transporte. A porta padrão é 502. O UDP não garante entrega e não é adequado para controlo.
  5. V — Holding Registers (Function 3/6/16) estão no endereço 40001–49999 e são os registos de leitura/escrita mais usados para parâmetros e setpoints.
  6. V — OPC UA inclui segurança end-to-end (TLS 1.2+, autenticação por certificado, autorização por roles), enquanto o OPC DA (baseado em DCOM) não tinha segurança robusta por design.
  7. V — Ao contrário da Function (FC), o Function Block tem uma instância de dados (Data Block em Siemens) onde as variáveis internas são preservadas entre chamadas do bloco.
  8. V — PROFINET IRT usa hardware especializado (switch ASIC dedicado) para garantir ciclos de 250 µs com jitter < 1 µs — adequado para controlo de servos e CNC.
  9. F — Uma acção 'N' (Non-stored / Continuous) está activa apenas enquanto o passo está activo. Quando o passo fica inactivo, a acção desactiva. Para acções persistentes, usar 'S' (Set/stored).
  10. V — SL1 = protecção contra erros acidentais; SL2 = contra ataques simples intencionais; SL3 = ataques sofisticados; SL4 = ataques de nível estado-nação/APT.

Grupo II — Programação ST para Controlo de Temperatura (40 pontos)

Problema — Controlo de Forno Industrial

Um forno industrial de tratamento térmico deve ser controlado por um PLC com as seguintes especificações: - Temperatura actual: temp_actual (REAL, ºC, entrada analógica) - Saída de aquecedor: heater_output (REAL, 0–100%, saída analógica) - Setpoint: setpoint (REAL, ºC, configurável pelo operador) - Alarme alto: alarm_high (BOOL) → temp > setpoint + 10°C - Alarme baixo: alarm_low (BOOL) → temp < setpoint - 5°C - Parâmetros PID: Kp=3.0, Ti=20s, Td=1s, ciclo=0.5s

a) Escreva um bloco de programa ST completo para o controlo proporcional puro (apenas P) do aquecedor, com os alarmes.

b) Adicione as componentes integral e derivativa ao bloco P para completar o controlador PID.

c) Adicione protecção anti-windup na integral (limitar a integral entre -50 e +50).

d) Escreva um SFC (em texto estruturado de transições) para um ciclo de tratamento térmico com os estados: FRIO → AQUECIMENTO → TEMPERATURA_TRABALHO → ARREFECIMENTO → FIM.

Soluções — Grupo II

a) Controlo Proporcional com Alarmes:

(* BLOCO ST — Controlo P + Alarmes de Temperatura *)
VAR
  error: REAL;
  Kp: REAL := 3.0;
END_VAR

(* Calcular erro *)
error := setpoint - temp_actual;

(* Controlo proporcional *)
heater_output := Kp * error;

(* Limitar saída entre 0 e 100% *)
heater_output := MIN(100.0, MAX(0.0, heater_output));

(* Alarmes *)
alarm_high := (temp_actual > setpoint + 10.0);
alarm_low := (temp_actual < setpoint - 5.0);

b) PID Completo:

VAR
  error, integral, derivative: REAL;
  last_error: REAL := 0.0;
  Kp: REAL := 3.0;
  Ti: REAL := 20.0;
  Td: REAL := 1.0;
  dt: REAL := 0.5; (* ciclo 500ms *)
END_VAR

(* Calcular erro *)
error := setpoint - temp_actual;

(* Componente integral *)
integral := integral + error * dt;

(* Componente derivativa *)
derivative := (error - last_error) / dt;

(* Saída PID *)
heater_output := Kp * (error + (1.0/Ti)*integral + Td*derivative);

(* Limitar saída *)
heater_output := MIN(100.0, MAX(0.0, heater_output));

(* Guardar erro anterior *)
last_error := error;

(* Alarmes *)
alarm_high := (temp_actual > setpoint + 10.0);
alarm_low := (temp_actual < setpoint - 5.0);

c) Anti-Windup:

(* Após calcular integral: *)
integral := integral + error * dt;

(* Anti-windup: limitar a integral *)
integral := MIN(50.0, MAX(-50.0, integral));

(* Resto do PID igual... *)

O anti-windup evita que a integral acumule valores excessivos quando o sistema está saturado (saída em 0% ou 100%), o que causaria uma recuperação lenta ao voltar à zona de controlo normal.

d) SFC em texto — Ciclo de Tratamento Térmico:

ESTADOS:
S0: FRIO        - acções: heater_output := 0.0; state_signal := 'FRIO';
S1: AQUECIMENTO - acções: setpoint := target_temp; enable_PID := TRUE;
S2: TEMP_TRABALHO - acções: enable_PID := TRUE; timer_hold.IN := TRUE;
S3: ARREFECIMENTO - acções: enable_PID := FALSE; heater_output := 0.0; enable_fan := TRUE;
S4: FIM          - acções: enable_fan := FALSE; cycle_complete := TRUE;

TRANSIÇÕES:
T0 (S0S1): start_cycle = TRUE AND temp_actual < 50.0
T1 (S1S2): temp_actual >= target_temp AND ABS(error) < 2.0
T2 (S2S3): timer_hold.Q = TRUE (tempo de permanência atingido)
T3 (S3S4): temp_actual < 60.0
T4 (S4S0): reset_cycle = TRUE (reinicialização manual)

Grupo III — Configuração Modbus TCP PLC-Inversor (40 pontos)

Exercício — Comunicação Modbus TCP entre S7-1200 e Inversor Schneider ATV320

Um PLC Siemens S7-1200 deve controlar um inversor Schneider ATV320 via Modbus TCP. Os registos Modbus do ATV320 usados são: - 8501 (Holding Register): Command Register (palavra de comando — 0x0006 = marcha; 0x0007 = paragem) - 8502 (Holding Register): Speed Reference (0–10000 = 0–50Hz) - 8603 (Input Register): Motor Current (valor inteiro, ampères × 10) - 8604 (Input Register): Drive Fault Code

a) Defina os parâmetros de comunicação Modbus TCP necessários no PLC (IP, porta, Unit ID, Function Codes).

b) Escreva o bloco ST para enviar a palavra de comando "marcha" ao inversor.

c) Escreva o bloco ST para definir uma referência de velocidade de 30 Hz no inversor.

d) Escreva o bloco ST para ler a corrente do motor do inversor e converter para ampères (dividir por 10).

Soluções — Grupo III

a) Parâmetros de comunicação Modbus TCP:

Parâmetro Valor Justificação
IP do inversor 192.168.1.20 (exemplo) Configurar no ATV320
Porta TCP 502 Porta standard Modbus TCP
Unit ID 255 (ou 1) ATV320: por defeito 255
FC de escrita single register 06 Write Single Holding Register
FC de escrita múltiplos 16 Write Multiple Holding Registers
FC de leitura HReg 03 Read Holding Registers
FC de leitura IReg 04 Read Input Registers

b) Bloco ST — Envio de palavra de comando (Marcha):

(* Enviar palavra de comando: MARCHA = 0x0006 *)
VAR
  mb_write_req: BOOL;
  mb_done, mb_busy, mb_error: BOOL;
  mb_status: WORD;
END_VAR

(* Usar FB de comunicação Modbus TCP do TIA Portal:
   MB_CLIENT para S7-1200 *)
mb_write_req := drive_start_command; (* sinal booleano de arranque *)

(* Na chamada do FB MB_CLIENT:
   REQ = mb_write_req
   MB_DATA_ADDR = 8501 (Command Register)
   MB_DATA_LEN = 1 (1 registo)
   MB_DATA_PTR = Pointer para DB_Modbus.command_word
   DATA = 16#0006 (comando de marcha) *)

IF drive_start_command THEN
  command_word := 16#0006; (* MARCHA *)
ELSIF drive_stop_command THEN
  command_word := 16#0007; (* PARAGEM *)
END_IF;
(* MB_CLIENT escreve command_word em registo 8501 *)

c) Bloco ST — Referência de velocidade 30 Hz:

(* Referência de velocidade: 30 Hz → valor = 30/50 × 10000 = 6000 *)
VAR
  speed_ref_hz: REAL := 30.0;
  speed_ref_raw: INT;
END_VAR

speed_ref_raw := REAL_TO_INT(speed_ref_hz / 50.0 * 10000.0);
(* speed_ref_raw = 6000 *)

(* MB_CLIENT escreve speed_ref_raw em registo 8502 *)

d) Bloco ST — Leitura de corrente:

(* Ler registo 8603 (Input Register) — Corrente × 10 *)
VAR
  motor_current_raw: INT;
  motor_current_A: REAL;
END_VAR

(* MB_CLIENT lê registo 8603 (FC04) para motor_current_raw *)

motor_current_A := INT_TO_REAL(motor_current_raw) / 10.0;
(* Exemplo: raw = 154 → 15,4 A *)

(* Usar o valor para monitorização ou alarmes *)
IF motor_current_A > motor_rated_current * 1.2 THEN
    alarm_overcurrent := TRUE;
END_IF;

Ficha de Trabalho 1 — UC02953 — TMIM — Aulify