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
BOOLbool, _BoolEntradas/Saídas digitais.
INTshort, int16_t-32768 a 32767.
DINTlong, int32_tInteiros grandes.
REALfloatValores analógicos.
TIMElong (ms)Duração (T#5s).
STRINGchar[]Texto (max 254 chars).
UDTstructEstruturas 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

ABRES
FALSEFALSEFALSE
FALSETRUEFALSE
TRUEFALSEFALSE
TRUETRUETRUE

OR

ABRES
FALSEFALSEFALSE
FALSETRUETRUE
TRUEFALSETRUE
TRUETRUETRUE

XOR

ABRES
FALSEFALSEFALSE
FALSETRUETRUE
TRUEFALSETRUE
TRUETRUEFALSE

NOT

ANOT A
FALSETRUE
TRUEFALSE

Simulador Interativo

Resultado:

FALSE

⚙️ 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

Saída (Q): FALSE

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

M1

💧 Exemplo: Tanque (Função com Retorno)

Volume: --

Status: --

12m0m

🏆 Boas Práticas em SCL

  • Nomes Claros: Use MotorEsteira em vez de M1. 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.0 no 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).