Tutoriels

Générer du code SCL depuis un CSV

Décrivez vos équipements et vos séquences dans un tableur — T-IA Connect génère les Function Blocks automatiquement.

T
Équipe T-IA Connect
12 min de lecture
Mis à jour le 11 mars 2026

Du tableur au code automate

Coder manuellement des machines d'état ISA-88 dans TIA Portal est fastidieux et source d'erreurs. Le module FDS (Functional Design Specification) vous permet de décrire vos équipements (Control Modules) et vos séquences de phases dans un simple fichier CSV, puis génère automatiquement des Function Blocks SCL prêts pour la production — avec gestion HOLD/ABORT, logique de machine d'état et déclarations d'E/S typées.

Prérequis

  • T-IA Connect installé et en cours d'exécution
  • Un projet TIA Portal ouvert (V16–V21)
  • Un fichier CSV avec votre spécification (ou utilisez l'exemple ci-dessous)

Étape 1 : Préparer le fichier CSV

Le CSV suit la norme ISA-88 avec deux sections : [CmTypes] pour les définitions d'équipements (vannes, pompes, capteurs) et [Phases] pour la logique de séquences (machines d'état). Voici un exemple minimal :

design-spec.csv
[CmTypes]
CmType;Variable;Direction;DataType;Description
Valve;Cmd_Open;Out;Bool;Open command
Valve;Sts_Opened;In;Bool;Opened feedback
Valve;Sts_Closed;In;Bool;Closed feedback
Pump;Cmd_Run;Out;Bool;Run command
Pump;Sts_Running;In;Bool;Running feedback
Pump;Speed_SP;Out;Real;Speed setpoint
TempSensor;Value;In;Real;Temperature value
TempSensor;Sts_Fault;In;Bool;Sensor fault

[Phases]
PhaseType;Step;StepName;IsInitial;IsFinal;EntryAction;Condition;NextStep
Fill;10;Init;TRUE;;;"Execute=TRUE";20
Fill;20;OpenValve;;;"Valve.Cmd_Open:=TRUE";"Valve.Sts_Opened=TRUE";30
Fill;30;StartPump;;;"Pump.Cmd_Run:=TRUE";"TempSensor.Value>=80.0";40
Fill;40;StopPump;;;"Pump.Cmd_Run:=FALSE";"TRUE";50
Fill;50;CloseValve;;;"Valve.Cmd_Open:=FALSE";"Valve.Sts_Closed=TRUE";60
Fill;60;Done;;TRUE;"Pump.Cmd_Run:=FALSE";"TRUE";

Le CSV utilise des points-virgules comme séparateurs. Chaque CmType définit l'interface d'E/S d'un module d'équipement, et chaque Phase définit une machine d'état avec des étapes, des actions d'entrée et des conditions de transition.

Étape 2 : Charger la spécification

Vous pouvez charger le CSV de trois façons : via la page FDS dans la barre latérale de l'application, via l'API REST, ou via les outils MCP du copilote IA. Voici la méthode API :

curl — POST /api/design-spec/load
curl -X POST http://localhost:9000/api/design-spec/load \
  -H "Content-Type: multipart/form-data" \
  -F "file=@design-spec.csv"
Response
{
  "success": true,
  "areas": 1,
  "processCells": 1,
  "unitTypes": 1,
  "cmTypes": 3,
  "phases": 1
}

Une fois chargé, le CSV est sauvegardé dans le dossier .tia-connect/cdc/ à côté de votre projet TIA et sera rechargé automatiquement à la prochaine ouverture.

Étape 3 : Explorer le modèle parsé

Après le chargement, T-IA Connect parse le CSV en une hiérarchie ISA-88 : Area → ProcessCell → UnitType → Control Modules + Phases. Vous pouvez inspecter le résultat :

curl — GET /api/design-spec/model
# Get the full ISA-88 hierarchy
curl http://localhost:9000/api/design-spec/model

# List all phases
curl http://localhost:9000/api/design-spec/phases
Response
{
  "areas": [{
    "name": "Area1",
    "processCells": [{
      "name": "PC1",
      "unitTypes": [{
        "name": "Unit1",
        "cmTypes": [
          { "name": "Valve", "variables": 3 },
          { "name": "Pump", "variables": 3 },
          { "name": "TempSensor", "variables": 2 }
        ],
        "phases": [
          { "name": "Fill", "steps": 6 }
        ]
      }]
    }]
  }]
}

// GET /api/design-spec/phases
[
  {
    "name": "Fill",
    "steps": ["Init", "OpenValve", "StartPump",
              "StopPump", "CloseValve", "Done"]
  }
]

Étape 4 : Générer le code SCL

Générez le Function Block SCL pour n'importe quelle phase. Le générateur crée une machine d'état complète avec VAR_INPUT (Execute, Abort, Hold + variables custom), VAR_OUTPUT (Done, Active, Held, Error), et un CASE avec toutes les étapes.

curl — POST /api/design-spec/generate
curl -X POST http://localhost:9000/api/design-spec/generate \
  -H "Content-Type: application/json" \
  -d '{ "phase": "Fill" }'
Response
FUNCTION_BLOCK "FB_Fill"

VAR_INPUT
    Execute : Bool;
    Abort   : Bool;
    Hold    : Bool;
    Valve   : "UDT_Valve";
    Pump    : "UDT_Pump";
    TempSensor : "UDT_TempSensor";
END_VAR

VAR_OUTPUT
    Done   : Bool;
    Active : Bool;
    Held   : Bool;
    Error  : Bool;
END_VAR

VAR
    _Step      : Int;
    _StepEntry : Bool;
END_VAR

BEGIN
CASE #_Step OF
    0:  // IDLE
        IF #Execute THEN
            #Active := TRUE;
            #_Step := 10;
        END_IF;

    10: // Init
        IF Execute = TRUE THEN
            #_Step := 20;
        END_IF;

    20: // OpenValve
        IF #_StepEntry THEN
            #Valve.Cmd_Open := TRUE;
        END_IF;
        IF #Valve.Sts_Opened = TRUE THEN
            #_Step := 30;
        END_IF;

    30: // StartPump
        IF #_StepEntry THEN
            #Pump.Cmd_Run := TRUE;
        END_IF;
        IF #TempSensor.Value >= 80.0 THEN
            #_Step := 40;
        END_IF;

    40: // StopPump
        IF #_StepEntry THEN
            #Pump.Cmd_Run := FALSE;
        END_IF;
        IF TRUE THEN
            #_Step := 50;
        END_IF;

    50: // CloseValve
        IF #_StepEntry THEN
            #Valve.Cmd_Open := FALSE;
        END_IF;
        IF #Valve.Sts_Closed = TRUE THEN
            #_Step := 60;
        END_IF;

    60: // Done
        IF #_StepEntry THEN
            #Pump.Cmd_Run := FALSE;
        END_IF;
        #Done := TRUE;
        #Active := FALSE;
        #_Step := 0;
END_CASE;

// HOLD management
IF #Hold AND #Active THEN
    #Held := TRUE;
END_IF;

// ABORT management
IF #Abort AND #Active THEN
    #Active := FALSE;
    #_Step := 0;
END_IF;

END_FUNCTION_BLOCK

Étape 5 : Importer dans TIA Portal

La dernière étape génère le SCL, l'encapsule en XML SimaticML, l'importe dans TIA Portal et lance une compilation automatique pour valider. Le tout en un seul appel API :

curl — POST /api/design-spec/generate-and-import
curl -X POST http://localhost:9000/api/design-spec/generate-and-import \
  -H "Content-Type: application/json" \
  -d '{ "phase": "Fill", "device": "PLC_1" }'
Response
{
  "phase": "Fill",
  "blockName": "FB_Fill",
  "imported": true,
  "compiled": true,
  "errors": [],
  "warnings": 0
}

Ce que vous obtenez

Un Function Block ISA-88 complet avec machine d'état, logique HOLD/ABORT et E/S typées — généré en quelques secondes depuis un simple tableur. Fini le codage manuel de logiques de contrôle répétitives.

Essayez maintenant avec vos propres spécifications grâce à T-IA Connect.