scl-syntax

Assistenza sintassi SCL per programmazione PLC Siemens TIA Portal V20+. SCL syntax assistance for Siemens TIA Portal V20+ PLC programming.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "scl-syntax" with this command: npx skills add deluale/framework_parser/deluale-framework-parser-scl-syntax

SCL Syntax Skill

Assistenza sintassi SCL per programmazione PLC Siemens TIA Portal V20+. SCL syntax assistance for Siemens TIA Portal V20+ PLC programming.

🚨 REGOLE CRITICHE NON NEGOZIABILI / CRITICAL NON-NEGOTIABLE RULES

R1: Parametri Nominati SEMPRE / Named Parameters ALWAYS

IT: Tutti i parametri di funzioni native DEVONO usare sintassi nominata con := per input e => per output.

EN: All native function parameters MUST use named parameter syntax with := for inputs and => for outputs.

// ✅ CORRETTO / CORRECT result := LIMIT(MN := 0, IN := value, MX := 100); #Motor1(Start := signal, Running => output);

// ❌ SBAGLIATO / WRONG - ERRORE COMPILAZIONE! result := LIMIT(0, value, 100); #Motor1(signal, output);

R2: Istanze Statiche per Timer/Counter/Trigger / Persistent Storage

IT: Timer, Counter, Trigger DEVONO essere dichiarati in VAR (FB) o VAR_STAT , MAI in VAR_TEMP . VAR_TEMP si resetta ogni ciclo PLC!

EN: Timer, Counter, Trigger MUST be declared in VAR (FB) or VAR_STAT , NEVER in VAR_TEMP . VAR_TEMP resets every PLC cycle!

// ❌ SBAGLIATO / WRONG VAR_TEMP myTimer : TON; // ERRORE: timer si resetta ogni ciclo! END_VAR

// ✅ CORRETTO / CORRECT VAR myTimer : TON; // OK: memoria persistente tra cicli END_VAR

R3: ELSIF non ELSEIF / Use ELSIF Not ELSEIF

IT: In SCL si usa ELSIF , non ELSEIF come in altri linguaggi.

EN: In SCL use ELSIF , not ELSEIF .

// ✅ CORRETTO / CORRECT IF temp < 0 THEN state := 'FROZEN'; ELSIF temp < 100 THEN // ELSIF! state := 'LIQUID'; ELSE state := 'GAS'; END_IF;

R4: Assegnazione := vs Output =>

IT: Usa := per input, => per output quando chiami Function Block.

EN: Use := for inputs, => for outputs when calling Function Block.

// ✅ CORRETTO / CORRECT #Motor1( Start := startButton, // IN: usa := Speed := speedValue, // IN: usa := Running => motorStatus, // OUT: usa => Error => errorFlag // OUT: usa => );

R5: FC vs FB / Functions vs Function Blocks

IT:

  • FC (Function): Per logica stateless (calcoli, trasformazioni)

  • FB (Function Block): Per logica stateful con memoria persistente (motori, valvole, sequenze)

EN:

  • FC (Function): For stateless logic (calculations, transformations)

  • FB (Function Block): For stateful logic with persistent memory (motors, valves, sequences)

Decision Tree: FC vs FB

Hai bisogno di memoria persistente? / Need persistent memory? ├─ NO → Usa FC / Use FC │ └─ Esempi: calcoli, conversioni, media, controlli │ Examples: calculations, conversions, averaging, validations │ └─ SI → Usa FB / Use FB └─ Esempi: motori, timer, sequenze, state machine Examples: motors, timers, sequences, state machines

Workflow in 3 Passi / 3-Step Workflow

STEP 1: Identifica tipo blocco / Identify block type

  • Logica ciclica senza stato → FC (Function) / Stateless logic → FC

  • Controllo con memoria (motori, valvole, sequenze) → FB (Function Block) / Stateful control → FB

  • Dati globali → DB (Data Block) o PLC Tags

STEP 2: Consulta funzioni native / Check native functions

  • Core Functions: Per funzioni comuni (LIMIT, MIN, MAX, TON, CONCAT, ecc.), consulta scl-reference/core-functions.md

  • Extended Functions: Per 192 funzioni aggiuntive, Claude legge automaticamente JSON database in scl-reference/functions/

  • Usage Examples: Vedi scl-reference/USAGE_EXAMPLE.md per esempi pratici

STEP 3: Valida con checklist / Validate with checklist

  • Parametri nominati ✓

  • Timer in VAR (non VAR_TEMP) ✓

  • ELSIF (non ELSEIF) ✓

  • Consulta scl-reference/anti-patterns.md per errori comuni da evitare

📋 Template Blocchi Standard / Standard Block Templates

Template FC (Function)

FUNCTION "Calculate_Average" : REAL { S7_Optimized_Access := 'TRUE' } VERSION : 0.1

VAR_INPUT values : Array[0..9] of Real; // Array di valori count : Int; // Numero elementi END_VAR

VAR_TEMP sum : Real; // Somma temporanea i : Int; // Indice loop END_VAR

BEGIN // Validazione input / Input validation IF count <= 0 OR count > 10 THEN #Calculate_Average := 0.0; RETURN; END_IF;

// Calcolo media / Calculate average
sum := 0.0;
FOR i := 0 TO count - 1 DO
    sum := sum + values[i];
END_FOR;

// Ritorna risultato / Return result
#Calculate_Average := sum / TO_REAL(count);

END_FUNCTION

Template FB (Function Block - State Machine)

FUNCTION_BLOCK "Motor_Control" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1

VAR_INPUT Start : Bool; // Segnale avvio Stop : Bool; // Segnale stop SpeedSetpoint : Real; // Velocità richiesta END_VAR

VAR_OUTPUT Running : Bool; // Motore in marcia ActualSpeed : Real; // Velocità attuale Alarm : Bool; // Flag allarme END_VAR

VAR State : Int; // 0=Idle, 1=Starting, 2=Running StartTimer : TON; // Timer avvio (DEVE essere in VAR!) ErrorCount : Int; END_VAR

VAR_TEMP tempSpeed : Real; // Variabile di lavoro temporanea END_VAR

BEGIN // State machine CASE State OF 0: // Idle IF Start AND NOT Stop THEN State := 1; #StartTimer(IN := FALSE, PT := T#0ms); // Reset timer END_IF; Running := FALSE;

    1: // Starting
        #StartTimer(IN := TRUE, PT := T#2s);
        IF #StartTimer.Q THEN
            State := 2;
            Running := TRUE;
        END_IF;
        IF Stop THEN
            State := 0;
        END_IF;

    2: // Running
        Running := TRUE;
        // Limita velocità tra 0 e 3000 RPM
        ActualSpeed := LIMIT(
            MN := 0.0,
            IN := SpeedSetpoint,
            MX := 3000.0
        );
        IF Stop THEN
            State := 0;
            Running := FALSE;
        END_IF;
END_CASE;

// Gestione allarmi / Alarm handling
IF ActualSpeed > 3000.0 * 1.1 THEN
    Alarm := TRUE;
    ErrorCount := ErrorCount + 1;
END_IF;

END_FUNCTION_BLOCK

🔄 Control Structures / Strutture di Controllo

IF-ELSIF-ELSE Conditional

// Condizionale semplice / Simple conditional IF temperature > 100.0 THEN alarm := TRUE; shutdownHeater(); END_IF;

// Condizionale completo / Full conditional IF pressure < 1.0 THEN status := 'LOW'; ELSIF pressure > 10.0 THEN status := 'HIGH'; ELSE status := 'NORMAL'; END_IF;

// Condizioni combinate / Combined conditions IF (temp > 80.0) AND (pressure > 5.0) OR emergencyStop THEN shutdown := TRUE; END_IF;

CASE Statement (per State Machine)

// Ottimo per state machine e selezione multi-valore CASE state OF 0: // Idle Running := FALSE; IF StartCommand THEN state := 1; END_IF;

1: // Starting
    Running := TRUE;
    IF startupComplete THEN
        state := 2;
    END_IF;

2: // Running
    processControl();
    IF StopCommand THEN
        state := 3;
    END_IF;

3: // Stopping
    IF shutdownComplete THEN
        state := 0;
    END_IF;

ELSE
    // Stato invalido - vai in error
    state := 99;
    errorFlag := TRUE;

END_CASE;

FOR Loop

// Loop con contatore crescente / Ascending counter loop FOR i := 0 TO 9 DO temperatures[i] := readSensor(i); END_FOR;

// Loop con contatore decrescente / Descending counter loop FOR i := 10 DOWNTO 0 DO buffer[i] := 0; END_FOR;

// Loop con incremento custom / Custom increment FOR i := 0 TO 100 BY 5 DO // i = 0, 5, 10, 15, ..., 100 processValue(i); END_FOR;

// EXIT per uscita anticipata / Early exit FOR i := 0 TO 99 DO IF data[i] = targetValue THEN foundIndex := i; EXIT; // Esce dal loop END_IF; END_FOR;

// CONTINUE per saltare iterazione / Skip iteration FOR i := 0 TO 99 DO IF data[i] < 0 THEN CONTINUE; // Salta al prossimo i END_IF; processPositiveValue(data[i]); END_FOR;

WHILE Loop

// Pre-test (condizione prima esecuzione) WHILE counter < 100 DO counter := counter + 1; process(counter); END_WHILE;

// Con EXIT WHILE TRUE DO data := readData(); IF data = STOP_MARKER THEN EXIT; END_IF; processData(data); END_WHILE;

REPEAT Loop

// Post-test (esegue almeno una volta) REPEAT counter := counter + 1; value := readSensor(); UNTIL (value > threshold) OR (counter >= maxRetries) END_REPEAT;

// ⚠️ ATTENZIONE / WARNING: REPEAT termina quando condizione è TRUE // (opposto di WHILE che continua quando TRUE)

📚 Reference Files / File di Riferimento

Quando Consultare i File / When to Consult Files

Per funzioni native comuni (LIMIT, MIN, MAX, TON, CONCAT, ecc.): → Leggi scl-reference/core-functions.md

  • Contiene le 30 funzioni più usate con esempi pratici

  • Firme complete, parametri, use cases

Per errori comuni da evitare: → Leggi scl-reference/anti-patterns.md

  • Catalogo di 15+ anti-pattern con soluzioni

  • Errori di performance e correttezza

  • Comparazioni corretto vs sbagliato

Per tipi di dati (Int, Real, String, Array, Struct, ecc.): → Leggi scl-reference/data-types.md

  • Reference completa tipi elementari e complessi

  • Conversioni di tipo

  • Best practices allocazione memoria

Per funzioni oltre le Core 30: → Claude consulta automaticamente i JSON database in scl-reference/functions/

  • 192 funzioni aggiuntive organizzate per categoria

  • Math, Comparison, Conversion, String, Move, Bitwise, Timers, Counters, Triggers

  • Lookup automatico via index.json

Per esempi pratici d'uso: → Leggi scl-reference/USAGE_EXAMPLE.md

  • Esempi completi di FC e FB

  • Pattern comuni implementati correttamente

Database Funzioni / Function Database

Struttura Database:

scl-reference/functions/ ├── index.json # Indice completo 222 funzioni ├── math.json # Funzioni matematiche avanzate ├── comparison.json # Comparazioni e selezioni ├── conversion.json # Conversioni di tipo ├── string.json # Manipolazione stringhe ├── move.json # Trasferimento dati ├── bitwise.json # Operazioni bitwise ├── timers.json # Timer avanzati ├── counters.json # Contatori └── triggers.json # Trigger eventi

Processo Lookup Automatico:

  • Claude legge index.json per identificare categoria funzione

  • Legge il file JSON specifico della categoria

  • Estrae definizione completa con parametri ed esempi

  • Formatta risposta seguendo stile Core Functions

✅ Self-Check Pre-Commit / Checklist Validazione

Prima di finalizzare il codice SCL, verifica tutti questi punti:

  • Parametri Nominati: Tutti i parametri funzioni native usano := (IN) e => (OUT)

  • Storage Timer: Timer/Counter/Trigger sono in VAR (FB) o VAR_STAT , MAI in VAR_TEMP

  • ELSIF Syntax: Usato ELSIF (non ELSEIF ) nelle condizioni

  • Funzioni Native: Consultate core-functions.md, nessuna reimplementazione di LIMIT, MIN, MAX, ecc.

  • Edge Detection: Usato R_TRIG/F_TRIG (non fronte manuale)

  • Array Operations: Usato MOVE_BLK/FILL_BLK (non loop FOR per copia/riempimento)

  • String Operations: Usato CONCAT (non operatore +)

  • Input Validation: Controlli su range input e valori validi

  • Error Handling: Gestione allarmi/errori appropriata

  • Naming: Variabili con nomi descrittivi (non i , x , temp come nomi finali)

  • Comments: Commenti su logica complessa o non ovvia

  • Block Type: FC per logica stateless, FB per logica stateful

  • Anti-Patterns: Controllato anti-patterns.md per evitare errori comuni

📝 Quick Reference / Riferimento Rapido

Keywords SCL:

  • FUNCTION / FUNCTION_BLOCK

  • Definisci blocco

  • VAR / VAR_INPUT / VAR_OUTPUT / VAR_TEMP

  • Sezioni dichiarazione

  • BEGIN / END_FUNCTION / END_FUNCTION_BLOCK

  • Delimitatori

  • IF / ELSIF / ELSE / END_IF

  • Condizionali

  • CASE / OF / END_CASE

  • Switch statement

  • FOR / TO / DOWNTO / BY / END_FOR

  • Loop enumerativo

  • WHILE / END_WHILE

  • Loop pre-test

  • REPEAT / UNTIL / END_REPEAT

  • Loop post-test

  • EXIT / CONTINUE

  • Controllo loop

  • RETURN

  • Uscita funzione

Operators:

  • :=

  • Assignment / Assegnazione input

  • =>

  • Output parameter / Parametro output

  • =

  • Comparison / Confronto

  • <>

  • Not equal / Diverso

  • AND / OR / NOT

  • Logical operators

  • & / | / XOR

  • Bitwise operators

Versione Skill / Skill Version: 2.0

Target: TIA Portal V20+ / S7-1500 / S7-1200

Standard: IEC 61131-3 SCL

Linguaggio / Language: Bilingual (Italian + English)

Architettura / Architecture: Progressive Disclosure (Core in SKILL.md, Details in references/)

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

Podfetcher Tools

Search podcasts, browse episodes, and fetch podcast transcripts from Podfetcher using the bundled Node.js CLI, SDK, or MCP server.

Registry SourceRecently Updated
Coding

Code Reviewer Cn

代码审查、重构建议、安全漏洞检查、命名规范、复杂度分析、注释文档生成. Use when you need code reviewer cn capabilities. Triggers on: code reviewer cn, 圈复杂度估算, 嵌套深度检测, 命名风格一致性, 注释率计算与评级, 重复行检测.

Registry SourceRecently Updated
Coding

Encode

Encode - command-line tool for everyday use

Registry SourceRecently Updated
Coding

Melies

AI image and video generation CLI. Generate images, videos, and movie posters using 50+ models including Flux, Kling, Veo, Wan, and more. Text-to-image, text...

Registry SourceRecently Updated