Programmation API : Bonnes Pratiques
Méthodes éprouvées pour des programmes API maintenables : conventions de nommage, structuration et gestion des erreurs avec Siemens TIA Portal selon IEC 61131-3.

1.Introduction
La programmation API, c'est bien plus que l'assemblage de blocs logiques. En plus de 10 ans en tant qu'ingénieur en automatisation, j'ai vu d'innombrables projets API – beaucoup avec des problèmes typiques :
- Noms de variables illisibles comme
M0.0,DB1.DBX0.0ou%MW100 - Mélange incohérent de langages de programmation – LD, FBD, IL et SCL mélangés dans le même projet
- Absence de documentation – le programmeur original a quitté l'entreprise depuis longtemps
Dans cet article, je partage les bonnes pratiques essentielles pour des programmes API maintenables avec Siemens TIA Portal.
Public cible
Cet article s'adresse aux programmeurs API ayant des connaissances de base de TIA Portal. Pour les débutants, je recommande d'abord un cours sur les fondamentaux IEC 61131-3.
2.Pourquoi des bonnes pratiques en programmation API ?
2.1.Le problème : le code legacy
Scénario typique de ma pratique :
Un constructeur de machines appelle : "Notre installation est à l'arrêt. Pouvez-vous nous aider ?"
Sur place, la désillusion :
- Noms de variables comme
M0.0,DB1.DBX0.0,%MW100– personne ne sait ce qu'ils représentent - LD, FBD, IL et SCL mélangés dans le même projet
- Pas de commentaires, pas de structure
- Le programmeur original a quitté l'entreprise il y a des années
La recherche de pannes prend beaucoup trop de temps car personne ne s'y retrouve dans le code.
2.2.La solution : une programmation professionnelle
Des programmes API structurés et maintenables apportent des avantages clairs :
- Recherche de pannes plus rapide grâce à des noms de variables explicites
- Temps d'intégration réduit pour les nouveaux programmeurs
- Moins d'arrêts machine grâce à une meilleure gestion des erreurs
3.Bonne pratique 1 : Utiliser systématiquement les standards IEC 61131-3
L'IEC 61131-3 est la norme internationale pour la programmation API et obligatoire pour les machines certifiées CE.
3.1.Aperçu des 5 langages de programmation
| Langage | Utilisation | Avantages | Inconvénients |
|---|---|---|---|
| SCL (Structured Control Language) | Algorithmes complexes, calculs | Clair, lisible, typage fort | Pas adapté au temps réel strict |
| LAD (Ladder Diagram) | Logique simple, adapté aux électriciens | Intuitif pour les électriciens | Illisible au-delà de 50 échelons |
| FBD (Function Block Diagram) | Régulation, logique de flux de données | Compréhensible graphiquement | Difficile à maintenir pour les grands programmes |
| ST (Structured Text) | Comme SCL, standard IEC 61131-3 | Compact, rapide | Courbe d'apprentissage raide |
| SFC (Sequential Function Chart) | Commandes séquentielles (GRAFCET) | Machines d'état visualisées | Surcharge pour la logique simple |
Ma recommandation
Utilisez SCL/ST pour 80% du code (logique, calculs, commandes séquentielles) et LAD uniquement pour les verrouillages simples (ex. logique d'arrêt d'urgence). FBD pour les boucles de régulation, SFC pour les machines d'état complexes.
3.2.Programmation structurée : la pyramide

OB1 (Main)
└── FC_SystemControl (Modes de fonctionnement)
├── FB_PackMLStateMachine (Commande séquentielle)
│ ├── FB_MotorControl (Partie d'installation)
│ ├── FB_ValveControl (Partie d'installation)
│ └── FB_ConveyorControl (Partie d'installation)
└── FC_AlarmHandler (Utilitaire)
Règle : Chaque niveau a exactement UNE responsabilité claire.
4.Bonne pratique 2 : Établir des conventions de nommage
4.1.Le problème : le chaos des noms de variables
Exemple négatif (de la pratique) :
// ❌ MAUVAIS
M0.0 // Qu'est-ce que c'est ?
DB1.DBX0.0 // Quel moteur ?
%MW100 // Température ? Pression ?
Exemple positif :
// ✅ BON
bMotorPumpMainRun : BOOL; // Moteur pompe principale en marche
iTemperatureTank1 : INT; // Température réservoir 1 en °C
rPressureSetpoint : REAL; // Consigne de pression en bar
4.2.Préfixes standardisés (Notation hongroise)
| Préfixe | Type de données | Exemple |
|---|---|---|
b | BOOL | bMotorRun, bAlarmActive |
i | INT | iCounter, iTemperature |
r | REAL | rSpeed, rPressure |
s | STRING | sAlarmText, sRecipeName |
dt | DATE_TIME | dtStartTime, dtLastMaintenance |
t | TIME | tDelayStart, tCycleTime |
udi | UDINT | udiPartCounter, udiTotalProduction |
4.3.Entrées/Sorties avec préfixe
// Entrées : ix (Input X)
ixMotorFeedbackRun : BOOL AT %I0.0; // "x" = Bool
iwTemperatureSensor : WORD AT %IW0; // "w" = Word
// Sorties : qx (Output X)
qxMotorStart : BOOL AT %Q0.0;
qwValvePosition : WORD AT %QW0;
La cohérence est reine : Décidez en équipe d'UNE convention et documentez-la.
Outils
Siemens TIA Portal v18+ offre le Code Quality Check, qui vérifie automatiquement les conventions de nommage.
5.Bonne pratique 3 : Utiliser correctement les blocs fonctionnels vs fonctions
5.1.Blocs fonctionnels (FB) - Avec état
Quand les utiliser ?
- Parties d'installation avec état (moteur, vanne, convoyeur)
- Gestionnaires d'alarmes
- Machines d'état
Exemple : Commande de moteur
FUNCTION_BLOCK FB_MotorControl
VAR_INPUT
bStart : BOOL; // Commande de démarrage
bStop : BOOL; // Commande d'arrêt
bFeedback : BOOL; // Retour moteur en marche
END_VAR
VAR_OUTPUT
qxStart : BOOL; // Sortie démarrage moteur
bRunning : BOOL; // État : moteur en marche
bAlarm : BOOL; // Défaut actif
END_VAR
VAR
tDelayStart : TON; // Temporisation au démarrage
tTimeoutFeedback : TON; // Timeout pour le retour
bAlarmLatched : BOOL; // Défaut mémorisé
END_VAR
// Logique du programme ici...
END_FUNCTION_BLOCK
Appel :
// Dans OB1 ou FC
dbMotorPumpMain(
bStart := bSystemRun AND NOT bEmergencyStop,
bStop := bSystemStop OR bEmergencyStop,
bFeedback := ixMotorPumpMainFeedback
);
qxMotorPumpMainStart := dbMotorPumpMain.qxStart;
5.2.Fonctions (FC) - Sans état
Quand les utiliser ?
- Calculs sans état
- Mises à l'échelle
- Opérations mathématiques
- Fonctions utilitaires
Exemple : Mise à l'échelle de température
FUNCTION FC_ScaleTemperature : REAL
VAR_INPUT
iwRawValue : INT; // Valeur brute du capteur (0-27648)
rMinTemp : REAL; // Température minimale (ex. -50°C)
rMaxTemp : REAL; // Température maximale (ex. +150°C)
END_VAR
// Mise à l'échelle 0-27648 → rMinTemp à rMaxTemp
FC_ScaleTemperature := rMinTemp +
(REAL#iwRawValue / 27648.0) * (rMaxTemp - rMinTemp);
END_FUNCTION
Appel :
rTemperatureTank1 := FC_ScaleTemperature(
iwRawValue := iwTempSensor1,
rMinTemp := -50.0,
rMaxTemp := 150.0
);
Règle d'or
A-t-il un état (mémoire entre les appels) ? → FB Est-ce un calcul ou une fonction utilitaire ? → FC
6.Bonne pratique 4 : Gestion des erreurs selon NAMUR NE 107
NAMUR NE 107 est le standard industriel pour l'auto-surveillance et le diagnostic dans l'industrie de process. Il s'est également établi dans la construction mécanique.
6.1.Les 4 états

6.2.Implémentation avec FB_AlarmHandler
FUNCTION_BLOCK FB_AlarmHandler
VAR_INPUT
bTrigger : BOOL; // Déclencheur d'alarme
eAlarmLevel : INT; // 1=Info, 2=Warning, 3=Error, 4=Critical
sAlarmText : STRING[80]; // Texte d'alarme
END_VAR
VAR_OUTPUT
bAlarmActive : BOOL; // Alarme active
bAckRequired : BOOL; // Acquittement requis
END_VAR
VAR
bAlarmLatched : BOOL; // Alarme mémorisée
dtTimestamp : DATE_TIME; // Horodatage de l'alarme
END_VAR
// Logique : Mémoriser l'alarme, définir l'horodatage, acquitter si nécessaire
IF bTrigger AND NOT bAlarmLatched THEN
bAlarmLatched := TRUE;
dtTimestamp := CURRENT_TIMESTAMP();
bAlarmActive := TRUE;
// Logging vers IHM/SCADA
// ...
END_IF;
bAckRequired := bAlarmLatched AND eAlarmLevel >= 3;
END_FUNCTION_BLOCK
Bonne pratique : Un gestionnaire d'alarmes central collecte toutes les alarmes et les communique de manière groupée à l'IHM.
Important
Chaque alarme nécessite un ID unique (ex. ALM-001) et une description dans la documentation. Pour les installations réglementées FDA, c'est obligatoire.
7.Bonne pratique 5 : Versionnage avec Git
Oui, Git fonctionne aussi pour le code API ! Depuis TIA Portal v18, l'intégration est devenue nettement plus simple.
7.1.Configuration : TIA Portal avec Git
1. Activer le Multiuser Engineering
TIA Portal → Projet → Propriétés → Multiuser Engineering → Activer
2. Enregistrer le projet au format compatible Git
# .gitignore pour TIA Portal
*.ap18
*.zap18
__OPNB*
*.bak
3. Initialiser le dépôt Git
git init
git add .
git commit -m "Initial commit: TIA Portal project setup"
7.2.Stratégie de branchement pour les projets API
main (Code de production)
├── develop (Développement)
│ ├── feature/motor-control-update
│ ├── feature/add-safety-logic
│ └── bugfix/alarm-text-typo
└── hotfix/critical-emergency-stop-bug
Workflow :
- Créer une branche feature :
git checkout -b feature/new-conveyor-logic - Committer les modifications :
git commit -m "Add conveyor start delay 2s" - Créer une Pull Request (GitHub, GitLab)
- Revue de code par un second programmeur
- Merge dans
develop - Tests sur l'API de développement
- Branche release →
main
Avantages
- Collaboration d'équipe sans perte de données
- Versions historiques accessibles à tout moment
- Travail parallèle sur différentes fonctionnalités
- Sauvegardes automatiques (GitHub, GitLab Cloud)
8.Bonne pratique 6 : Commentaires et documentation
8.1.Commentaires de code : la règle des 3 lignes
Mauvais :
// ❌ Évident, n'apporte rien
bMotorRun := TRUE; // Démarrer le moteur
Bon :
// ✅ Explique POURQUOI, pas QUOI
// Temporisation 2s pour la montée en pression du circuit hydraulique
// (Voir exigence REQ-HYD-012)
tDelayStart(IN := bStartRequest, PT := T#2S);
qxMotorStart := tDelayStart.Q;
8.2.Standards de documentation
Pour chaque FB/FC :
(*
Nom : FB_MotorControl
Version : 1.2.0
Auteur : David Prybisch
Date : 2025-11-22
Description :
Commande de moteur standardisée avec temporisation de démarrage,
surveillance du retour et mémorisation des défauts.
Historique des modifications :
v1.2.0 - 2025-11-22 - Ajout de la surveillance de timeout
v1.1.0 - 2025-10-15 - Intégration des alarmes NAMUR
v1.0.0 - 2025-09-01 - Première version
*)
FUNCTION_BLOCK FB_MotorControl
// ...
END_FUNCTION_BLOCK
Diagrammes UML pour l'architecture système :
Utilisez des outils comme PlantUML ou Microsoft Visio pour visualiser l'architecture globale.
9.Bonne pratique 7 : Tests et simulation
9.1.Simulation avec PLCSIM
Siemens PLCSIM Advanced permet de tester les programmes API sans matériel physique :
Workflow :
- Développer le programme API dans TIA Portal
- Démarrer PLCSIM Advanced et charger le projet
- Définir et vérifier les variables via la table de surveillance
- Tester systématiquement les commandes séquentielles
Avantages :
- Détecter les erreurs tôt – au bureau plutôt que chez le client
- Les nouveaux programmeurs peuvent tester sans risque
- Valider les modifications avant la mise en service
Conseil
Utilisez les tables de surveillance dans TIA Portal pour forcer systématiquement les entrées et sorties et vérifier le comportement du programme.
10.Bonne pratique 8 : Optimisation des performances
10.1.Surveiller la charge CPU
Tueurs de performance fréquents :
- Trop de temporisateurs/compteurs → Utilisez des tableaux au lieu de variables individuelles
- Opérations sur les chaînes dans les cycles temps réel → Déplacez-les vers des tâches de priorité inférieure
- Calculs complexes dans OB1 → Utilisez des interruptions cycliques (OB35)
Exemple : Gestion des temporisateurs par tableau
// ❌ MAUVAIS : 100 temporisateurs individuels
VAR
tMotor1 : TON;
tMotor2 : TON;
// ... 98 autres temporisateurs
END_VAR
// ✅ BON : Tableau de temporisateurs
VAR
atMotorTimers : ARRAY[1..100] OF TON;
END_VAR
// Appel en boucle
FOR i := 1 TO 100 DO
atMotorTimers[i](IN := abMotorStart[i], PT := T#2S);
aqxMotorStart[i] := atMotorTimers[i].Q;
END_FOR;
10.2.Optimisation mémoire avec les multi-instances
Problème : Chaque instance FB consomme son propre DB (DB d'instance).
Solution : Multi-instances pour les blocs récurrents.
// FB_ConveyorLine contient 10x FB_MotorControl en multi-instance
FUNCTION_BLOCK FB_ConveyorLine
VAR
Motor1 : FB_MotorControl; // Multi-instance
Motor2 : FB_MotorControl;
// ...
END_VAR
// Créer UNE SEULE instance de FB_ConveyorLine
dbConveyorLine : FB_ConveyorLine; // Économise 90% de mémoire vs 10 FB séparés
11.Conclusion : La programmation API professionnelle est rentable
L'investissement dans des programmes API structurés et maintenables est rentable à plusieurs niveaux :
- Recherche de pannes plus rapide grâce à des noms de variables explicites et une structure claire
- Temps d'intégration réduit pour les nouveaux programmeurs
- Moins d'arrêts machine grâce à une meilleure gestion des erreurs
- Maintenance simplifiée sur toute la durée de vie de l'installation
11.1.Checklist pour votre prochain projet API
- Conventions de nommage convenues et documentées avec l'équipe
- Structure de programme hiérarchique planifiée (diagramme UML)
- Standards IEC 61131-3 respectés
- Gestion des alarmes selon NAMUR NE 107 implémentée
- Dépôt Git créé et
.gitignoreconfiguré - Simulation avec PLCSIM préparée
- Processus de revue de code établi
- Documentation (en-têtes FB, architecture système) créée
Prochaine étape
Commencez petit : prenez un projet existant et refactorisez UN FB selon ces bonnes pratiques. Le temps investi (2-4 heures) sera amorti lors du prochain dépannage.
12.Infographie : Bonnes pratiques API en un coup d'œil

13.Ressources complémentaires
- Standard IEC 61131-3 : PLCopen.org
- Bonnes pratiques Siemens TIA Portal : Siemens Support
- NAMUR NE 107 : NAMUR.net
- Git pour API : PlcGit Documentation
À propos de l'auteur : David Prybisch est programmeur API depuis plus de 10 ans. Il accompagne les constructeurs de machines dans la programmation structurée avec Siemens TIA Portal, les revues de code et la mise en service.
Des questions sur votre projet d'automatisation ?
En tant qu'ingénieur en automatisation basé à Stadtbredimus, Luxembourg, j'offre des consultations initiales gratuites pour les entreprises de la Grande Région Saar-Lor-Lux.
David Prybisch · API · IHM · Mise en service
Related Articles

WinCC Unified et React : Synergies pour le développement IHM moderne
Vous connaissez React ou JavaScript ? Alors vous pouvez apprendre WinCC Unified plus rapidement. Synergies concrètes, exemples de code et conseils pratiques d'un expert.
Read more: WinCC Unified et React : Synergies pour le développement IHM moderne
Automatisation au Luxembourg 2025 : Tendances qui façonnent la Grande Région
Programmation API et automatisation industrielle au Luxembourg : 6 tendances pour 2025, projets concrets chez Goodyear, Husky & Co. + programmes de soutien pour les PME.
Read more: Automatisation au Luxembourg 2025 : Tendances qui façonnent la Grande Région
Mises en service mondiales : Retour d'expérience de 30+ projets
Expériences pratiques de mises en service internationales : De la préparation aux tests fonctionnels jusqu'à la réception – avec checklists et leçons apprises.
Read more: Mises en service mondiales : Retour d'expérience de 30+ projets