Bem-vindo, Programador C! 🚀
Se você possui experiência em programação C e está explorando o mundo da automação industrial com CLPs (Controladores Lógico Programáveis) Siemens S7-1200, este guia é para você. A SCL (Structured Control Language), também conhecida como Texto Estruturado (ST) pela norma IEC 61131-3, é a linguagem que mais se assemelhará ao seu background em C, C++ ou Pascal.
Diferentemente de linguagens gráficas como Ladder (LAD) ou Diagrama de Blocos de Função (FBD), a SCL permite a implementação de algoritmos complexos, cálculos matemáticos avançados e manipulação eficiente de dados de forma textual e estruturada. Este guia visa facilitar sua transição, abordando desde a configuração inicial no TIA Portal até o uso de blocos funcionais avançados.
🎯 Nosso Objetivo:
Capacitá-lo a aplicar seu conhecimento de programação estruturada no robusto ambiente do TIA Portal, desmistificando a SCL para o S7-1200. Exploraremos a sintaxe, estruturas de dados, acesso a I/O, uso de temporizadores, contadores, PID e muito mais, tudo com exemplos práticos e comparações com C.
O que é SCL (Structured Control Language)?
- Linguagem de alto nível baseada em Pascal (IEC 61131-3 ST).
- Ideal para algoritmos complexos, loops e manipulação de arrays.
- Permite programação estruturada clara e organizada.
- Pode ser chamada dentro de blocos Ladder ou FBD.
🛠️ Primeiros Passos no TIA Portal com SCL
Para começar a programar em SCL para o S7-1200, você usará o TIA Portal. Esta seção detalha o processo de criação.
1. Crie ou Abra um Projeto
No TIA Portal, crie um novo projeto (`Project → New`) ou abra um existente.
2. Adicione um Dispositivo (S7-1200)
Vá em `Add new device`, selecione `Controllers` e escolha sua CPU S7-1200 específica (ex: 1214C). A versão de firmware deve bater com o hardware real.
3. Crie um Bloco de Programa em SCL
Expanda `Program blocks`, clique duas vezes em `Add new block`. Escolha `Function (FC)` ou `Function block (FB)`. Importante: Em `Language`, selecione SCL.
4. Defina a Interface do Bloco (Parâmetros)
Use a área superior do editor para definir `Input`, `Output`, `InOut` e `Static` (variáveis com memória para FBs).
VAR_INPUT EnableProcess : BOOL; SetpointValue : REAL; END_VAR
5. Escreva seu Código SCL
Escreva sua lógica entre `BEGIN` e `END_FUNCTION`.
IF #EnableProcess THEN #ProcessActive := TRUE; ELSE #ProcessActive := FALSE; END_IF;
6. Chame seu Bloco SCL (Ex: do OB1)
Arraste seu bloco SCL para dentro do OB1 (Main). Se for um FB, o TIA Portal pedirá para criar um iDB (Instance Data Block).
7. Compile e Faça o Download
Clique com botão direito no PLC → `Compile` → `Download to device`.
8. Monitore e Depure
Clique no ícone de "óculos" (Monitor on/off) para ver os valores das variáveis em tempo real enquanto o código executa.
📘 Fundamentos da SCL
Visualizador Interativo de Fluxo de Controle
Veja `IF` e `FOR` em ação. Clique nos botões para animar o fluxo. O ponto laranja (🟠) mostra a execução.
Estrutura de Blocos: Organização do Código
OBs
Interface SO-Programa. Acionados por eventos (Ciclo, Startup).
FCs
Funções sem memória. Para cálculos e lógica combinacional.
FBs
Blocos com memória (iDB). Para timers, contadores e máquinas de estado.
DBs
Dados globais ou de instância. "Variáveis Globais" do PLC.
Tipos de Dados: SCL vs. C
| Tipo SCL | Equivalente C | Uso Típico |
|---|---|---|
| BOOL | bool, _Bool | Entradas/Saídas digitais. |
| INT | short, int16_t | -32768 a 32767. |
| DINT | long, int32_t | Inteiros grandes. |
| REAL | float | Valores analógicos. |
| TIME | long (ms) | Duração (T#5s). |
| STRING | char[] | Texto (max 254 chars). |
| UDT | struct | Estruturas personalizadas. |
Estruturas de Controle: Exemplos Comparativos
IF / THEN / ELSIF / ELSE
// SCL IF #Temp > 30.0 THEN ... ELSIF ... ELSE ... END_IF;
// C if (...) { ... } else if (...) { ... } else { ... }
CASE / OF / ELSE (Switch)
// SCL CASE #Modo OF 1: ... ; 2,3: ... ; 10..20: ... ; ELSE ... ; END_CASE;
// C switch (Modo) { case 1: ... break; case 2: case 3: ... break; default: ... break; }
🔣 Operadores Lógicos em SCL
AND (&)
Retorna TRUE apenas se A e B forem verdadeiros.
#Saida := #Entrada1 AND #Entrada2;
OR
Retorna TRUE se pelo menos um for verdadeiro.
#Saida := #Entrada1 OR #Entrada2;
XOR
Retorna TRUE se forem diferentes.
#Saida := #Entrada1 XOR #Entrada2;
NOT
Inverte o valor lógico.
#Saida := NOT #Entrada1;
Tabelas Verdade
AND
| A | B | RES |
|---|---|---|
| FALSE | FALSE | FALSE |
| FALSE | TRUE | FALSE |
| TRUE | FALSE | FALSE |
| TRUE | TRUE | TRUE |
OR
| A | B | RES |
|---|---|---|
| FALSE | FALSE | FALSE |
| FALSE | TRUE | TRUE |
| TRUE | FALSE | TRUE |
| TRUE | TRUE | TRUE |
XOR
| A | B | RES |
|---|---|---|
| FALSE | FALSE | FALSE |
| FALSE | TRUE | TRUE |
| TRUE | FALSE | TRUE |
| TRUE | TRUE | FALSE |
NOT
| A | NOT A |
|---|---|
| FALSE | TRUE |
| TRUE | FALSE |
Simulador Interativo
Resultado:
⚙️ Tópicos Avançados em SCL
Acesso a Entradas e Saídas (I/O) - Detalhado
Interagir com o mundo real é a função primária do CLP. Existem duas maneiras principais:
- Tags Simbólicas (Recomendado): Nomes como "SensorNivel" associados a endereços (%I0.1). Facilita leitura e manutenção.
- Endereços Absolutos: Acesso direto como
%Q0.0. Evite se possível.
Acesso Direto à Periferia (%PE / %PA)
Normalmente, o PLC lê entradas no inicio do ciclo (Imagem de Processo). Para ler o valor instantâneo (bypassando o ciclo), use o sufixo :P.
// Acesso Padrão (Imagem de Processo - Rápido) #Val := "Sensor_Pressao"; // Acesso Direto à Periferia (Lento, mas imediato) #Val_Instantaneo := "Sensor_Pressao":P;
Normalização e Escalonamento (Analógicas)
Módulos analógicos convertem um sinal elétrico (ex: 4-20mA, 0-10V) em um número inteiro dentro do CLP. Para o S7-1200, essa faixa é tipicamente 0 a 27648 para sinais unipolares. Esse número bruto (INT) não significa muito diretamente (o que é 13824?). Precisamos convertê-lo para a unidade que faz sentido na aplicação (ex: °C, Bar, m).
Normalização (NORM_X): Pega o valor bruto e o mapeia para uma escala padrão de 0.0 a 1.0 (REAL). Pense nisso como calcular a "porcentagem" do valor dentro da sua faixa bruta.
- Se o bruto é 0, o normalizado é 0.0.
- Se o bruto é 27648, o normalizado é 1.0.
- Se o bruto é 13824 (metade), o normalizado é 0.5.
Escalonamento (SCALE_X): Pega o valor normalizado (0.0 a 1.0) e o mapeia para a faixa desejada em unidades de engenharia (ex: 0 a 150 °C).
- Se normalizado é 0.0, escalonado será o MÍNIMO da engenharia (ex: 0 °C).
- Se normalizado é 1.0, escalonado será o MÁXIMO da engenharia (ex: 150 °C).
- Se normalizado é 0.5, escalonado será a metade da faixa de engenharia (ex: 75 °C).
VAR "SensorNivel_Raw" AT %IW64 : INT; // Entrada bruta 0..27648 Nivel_Normalizado : REAL; // Resultado intermediário 0.0..1.0 Nivel_Metros : REAL; // Resultado final 0.0..12.0 m END_VAR // 1. Normalizar (INT -> REAL 0.0..1.0) #Nivel_Norm := NORM_X(MIN := 0, VALUE := #Input_Raw, MAX := 27648); // 2. Escalonar (REAL 0.0..1.0 -> Engenharia) #Nivel_Metros := SCALE_X(MIN := 0.0, VALUE := #Nivel_Norm, MAX := 10.0);
Simulador de Temporizador TON
Uso de Blocos de Sistema (TON/CTU) e iDBs
Blocos como TON (Timer) e CTU (Contador) são FBs. Eles precisam de memória (iDB) para lembrar quanto tempo passou ou quantas contagens ocorreram.
VAR_STATIC Timer1 : TON; // Instância do Timer END_VAR #Timer1(IN := #Start, PT := T#5s); #Motor := #Timer1.Q;
Manipulação de Strings em SCL (Acordeão)
Funções para trabalhar com texto. Mais seguro que strings em C.
Retorna o tamanho atual da string.
len := LEN('Teste'); // 5
Concatena duas strings.
res := CONCAT('Ola ', 'Mundo'); // 'Ola Mundo'
Extrai substrings.
s := LEFT('ABCDE', 2); // 'AB' s := MID('ABCDE', 2, 2); // 'BC' (Length, Start)
Procura texto dentro de texto.
pos := FIND('SensorA', 'A'); // 7
🏭 Exemplo Industrial: Controle de Motor
Lógica de Controle
Prioridade de Desligamento com Intertravamento.
IF (NOT #Stop) OR #Fault OR (NOT #Safety) THEN #Motor := FALSE; ELSIF #Start THEN #Motor := TRUE; END_IF;
Painel Local
💧 Exemplo: Tanque (Função com Retorno)
Volume: --
Status: --
🏆 Boas Práticas em SCL
- Nomes Claros: Use
MotorEsteiraem vez deM1. CamelCase é padrão. - FC vs FB: Use FC para lógica pura e FB quando precisar de memória (timers).
- Sem Magic Numbers: Evite
IF Temp > 80. Use constantes:IF Temp > MAX_TEMP. - Use Tags: Nunca use
%I0.0no código. Use a tag simbólica.
🔄 SCL vs. C: Diferenças Conceituais
Modelo de Execução
C: Linear, controlado pelo programador (loops, sleeps).
SCL: Cíclico (Scan Cycle). O código roda inteiro a cada varredura (ex: 10ms). Não use loops infinitos!
Memória
C: malloc/free, ponteiros.
SCL: Estática. Tudo é alocado na compilação. Sem ponteiros "selvagens". Segurança industrial.
Tipagem
C: Flexível (cast implícito).
SCL: Forte. Requer conversão explícita (REAL_TO_INT).