Ficha de Trabalho 1 — Programação PLC Avançada e Comunicação Modbus TCP
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)
- O IEC 61131-3 define 5 linguagens de programação para PLCs: LD, FBD, ST, IL e SFC. ___
- No Structured Text (ST), o bloco TON é um temporizador de atraso na descida (off-delay). ___
- O diagrama SFC (Sequential Function Chart) é baseado nas Redes de Petri e é ideal para controlo sequencial de estados. ___
- O Modbus TCP usa o protocolo UDP (User Datagram Protocol) como transporte de rede. ___
- Na tabela Modbus, os Holding Registers têm endereços entre 40001–49999 e permitem leitura e escrita. ___
- O OPC UA é um standard de comunicação que inclui segurança integrada (autenticação e encriptação) ao contrário do OPC DA. ___
- Um programa Function Block (FB) em IEC 61131-3 tem memória interna (variáveis de instância) que persiste entre chamadas. ___
- O PROFINET IRT (Isochronous Real-Time) é adequado para controlo de servos com ciclos de 250 µs. ___
- No SFC, uma acção do tipo 'N' (Non-stored) permanece activa mesmo após o passo ficar inactivo. ___
- 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
- V — As 5 linguagens são: LD (Ladder Diagram), FBD (Function Block Diagram), ST (Structured Text), IL (Instruction List) e SFC (Sequential Function Chart).
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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).
- 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 (S0→S1): start_cycle = TRUE AND temp_actual < 50.0
T1 (S1→S2): temp_actual >= target_temp AND ABS(error) < 2.0
T2 (S2→S3): timer_hold.Q = TRUE (tempo de permanência atingido)
T3 (S3→S4): temp_actual < 60.0
T4 (S4→S0): 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