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 :
[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 -X POST http://localhost:9000/api/design-spec/load \ -H "Content-Type: multipart/form-data" \ -F "file=@design-spec.csv"
{
"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 :
# 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
{
"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 -X POST http://localhost:9000/api/design-spec/generate \
-H "Content-Type: application/json" \
-d '{ "phase": "Fill" }'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 -X POST http://localhost:9000/api/design-spec/generate-and-import \
-H "Content-Type: application/json" \
-d '{ "phase": "Fill", "device": "PLC_1" }'{
"phase": "Fill",
"blockName": "FB_Fill",
"imported": true,
"compiled": true,
"errors": [],
"warnings": 0
}