SCL Reference - TIA Portal V20+
Quando usare questa skill
Usa questa documentazione prima di scrivere codice SCL se devi:
- usare funzioni di sistema (LIMIT, CONCAT, MOVE_BLK, ecc.)
- verificare la sintassi esatta di una funzione TIA
- sostituire logica manuale con una funzione nativa equivalente
- risolvere errori di compilazione legati a funzioni TIA
- usare costrutti di controllo (IF, FOR, CASE, WHILE, REPEAT)
REGOLE OBBLIGATORIE
R1: Usa sempre le funzioni di sistema TIA
NON reimplementare funzioni che esistono native. Usa le funzioni di sistema documentate in questa skill.
Motivazioni tecniche:
- Performance: funzioni TIA sono ottimizzate dal compilatore S7-1500 (esecuzione CPU piu veloce)
- Certificazione: testate e certificate da Siemens
- Leggibilita: codice riconoscibile da altri programmatori PLC
- Manutenibilita: chi legge sa cosa fa LIMIT, non deve interpretare IF/THEN
- Conformita: standard IEC 61131-3
R2: Anti-pattern vietati
| NON SCRIVERE | USA INVECE |
|-----------------|---------------|
| IF val < min THEN val := min; ELSIF val > max THEN val := max; END_IF; | val := LIMIT(MN:=min, IN:=val, MX:=max); |
| IF a < b THEN result := a; ELSE result := b; END_IF; | result := MIN(IN1:=a, IN2:=b); |
| IF a > b THEN result := a; ELSE result := b; END_IF; | result := MAX(IN1:=a, IN2:=b); |
| IF cond THEN result := valTrue; ELSE result := valFalse; END_IF; | result := SEL(G:=cond, IN0:=valFalse, IN1:=valTrue); |
| IF NOT prev AND curr THEN... (fronte salita manuale) | Istanza R_TRIG |
| IF prev AND NOT curr THEN... (fronte discesa manuale) | Istanza F_TRIG |
| Concatenazione stringhe manuale | CONCAT(IN1:=str1, IN2:=str2) |
| Conversioni implicite | Funzioni CONVERT o TO_* esplicite |
| IF val >= min AND val <= max THEN... | IN_RANGE(MIN:=min, VAL:=val, MAX:=max) |
| Calcoli manuali su date/tempi | T_ADD, T_SUB, T_DIFF |
| Scaling manuale (val - rawMin) * (engMax - engMin) / (rawMax - rawMin) + engMin | SCALE_X e NORM_X |
| Loop con indice per copiare array | MOVE_BLK o FILL_BLK |
| val := val * (-1); per negazione | val := NEG(IN:=val); |
R3: Self-check prima di consegnare codice
Prima di finalizzare codice SCL, verifica:
- [ ] Ho usato IF/THEN/ELSE per qualcosa che ha una funzione nativa?
- [ ] Ho reimplementato MIN/MAX/LIMIT/ABS/SEL/IN_RANGE?
- [ ] Ho gestito fronti senza R_TRIG/F_TRIG?
- [ ] Ho fatto conversioni di tipo senza funzioni CONVERT/TO_*?
- [ ] Ho manipolato stringhe senza funzioni STRING native (CONCAT, MID, FIND)?
- [ ] Ho fatto calcoli su date/tempi senza T_ADD/T_SUB/T_DIFF?
- [ ] Ho fatto scaling manuale senza SCALE_X/NORM_X?
- [ ] Ho copiato array con loop invece di MOVE_BLK?
- [ ] Ho usato timer/counter senza istanze IEC (TON, TOF, CTU)?
- [ ] Ho scritto costrutti di controllo con sintassi incerta?
Se anche una sola risposta e' SI, riscrivi usando le funzioni di sistema.
Quick Index
Basic Instructions
| Categoria | File | Funzioni principali | |-----------|------|---------------------| | Math | functions/math.json | LIMIT, MIN, MAX, ABS, NEG, MOD, SQR, SQRT, SIN, COS, ROUND, TRUNC | | Comparison | functions/comparison.json | SEL, IN_RANGE, OUT_RANGE, EQ, NE, LT, GT, LE, GE | | Conversion | functions/conversion.json | CONVERT, SCALE_X, NORM_X, TO_INT, TO_REAL, TO_BOOL | | Move | functions/move.json | MOVE, MOVE_BLK, FILL_BLK, SWAP, CountOfElements, IS_ARRAY | | Bitwise | functions/bitwise.json | AND, OR, XOR, NOT, SHL, SHR, ROL, ROR | | Timers | functions/timers.json | TON, TOF, TP, TONR | | Counters | functions/counters.json | CTU, CTD, CTUD | | Triggers | functions/triggers.json | R_TRIG, F_TRIG, P_TRIG, N_TRIG | | Program Control | functions/program_control.json | IF, CASE, FOR, WHILE, REPEAT, EXIT, CONTINUE, RETURN, GOTO |
Extended Instructions
| Categoria | File | Funzioni principali | |-----------|------|---------------------| | String | functions/string.json | CONCAT, LEN, LEFT, RIGHT, MID, FIND, REPLACE, DELETE, INSERT, S_CONV | | Date and Time | functions/date_time.json | RD_SYS_T, RD_LOC_T, T_ADD, T_SUB, T_DIFF, T_COMBINE | | Alarms & Diag | functions/alarms_diagnostics.json | Program_Alarm, Get_AlarmState, GET_DIAG, LED | | Addressing | functions/data_block_addressing.json | PEEK, POKE, READ_DBL, WRIT_DBL, TypeOf, GetSymbolName | | Distributed I/O| functions/distributed_io.json | RDREC, WRREC, DPRD_DAT, DPWR_DAT | | Communication | functions/communication.json | TSEND_C, TRCV_C, TCON, TDISCON, GET, PUT | | Tech & Safety | functions/technology_safety.json | PID_Compact, CTRL_HSC, ESTOP1, ACK_GL | | Motion Control| functions/motion_control.json | MC_Power, MC_Reset, MC_Home, MC_MoveAbsolute |
Data Types Reference
| Documento | Contenuto | |-----------|-----------| | data_types.json | Tutti i tipi di dati SCL: BOOL, INT, DINT, REAL, STRING, ARRAY, STRUCT, DTL, ecc. |
Programming Fundamentals
| Documento | Contenuto | |-----------|-----------| | code_blocks.json | Blocchi di codice: OB, FC, FB, DB, UDT - quando usarli e come | | block_interface.json | Interfacce blocchi: VAR_INPUT, VAR_OUTPUT, VAR_IN_OUT, VAR_TEMP, VAR, regole dichiarazione | | plc_tags.json | PLC Tags: organizzazione, I/O mapping, retentive, best practices |
Procedura di Consultazione
- Identifica la categoria dalla tabella sopra
- Leggi solo il file .json necessario (risparmio token)
- Se la funzione non e' nell'indice, cercala su support.industry.siemens.com
- Se non esiste funzione nativa, implementa con IF/THEN documentando il motivo
Sintassi Costrutti di Controllo
Per la sintassi completa di tutti i costrutti di controllo (IF, CASE, FOR, WHILE, REPEAT) con tutte le varianti, consulta program_control.json.
Punti chiave:
ELSIF(non ELSEIF) per condizioni multiple in IFCASEsupporta valori singoli, range (min..max), e liste (val1, val2, val3)FOR...TOincrementa,FOR...DOWNTOdecrementaWHILEtesta prima (pre-test),REPEAT...UNTILtesta dopo (post-test)EXITesce dal loop,CONTINUEsalta all'iterazione successivaRETURNesce dalla funzione/FB
Fallback
Se una funzione non e' documentata qui:
- Cerca in
index.json - Se non presente, usa web search su:
site:support.industry.siemens.com SCL <nome_funzione> - Documenta la nuova funzione per uso futuro
Riferimenti
- sources.md - Fonti consultate
- incomplete.md - Funzioni non documentate
- index.json - Lookup rapido funzioni
LINT and Syntax Rules
- LINT rules: lint_rules.json
- Syntax patterns: syntax_rules.json
Expanded coverage: control structures, types, and best-practice lint checks in lint_rules.json; syntax patterns in syntax_rules.json. Expanded coverage includes safety, style, naming, and performance lint rules.
Lint Data Files
- lint_rules.json
- lint_patterns.json
- lint_checks.json
- lint_functions.json
- lint_types.json
Motion Control Data Files
- mc_functions.json
- mc_to_structures.json
- mc_error_codes.json
Motion Control Lint Data
- mc_status_lint.json
- mc_naming_conventions.json
Lint Examples
- lint_examples.json
Motion Control Categories
- mc_move.json
- mc_stop.json
- mc_power.json
- mc_sync.json
- mc_cam.json
- mc_other.json
- mc_params_schema.json
Motion Control Index
- mc_rule_map.json
- mc_index.json
微信扫一扫