FUNCTION FC_Add : INT # Déclaration FCVAR_INPUT a : INT; # Entrée b : INT; # EntréeEND_VARFC_Add := a + b; # Retour de la fonctionEND_FUNCTION// Pas de mémoire interne// Pas de DB d’instance// Idéal pour les calculs// Retour obligatoire (comme une fonction classique)resultat := FC_Add(5, 10); # Appel directFB CompteurFB # Déclaration FBVAR_INPUT reset : Bool; # EntréeEND_VARVAR valeur : Int := 0; # Mémoire interneEND_VARIF reset THEN valeur := 0;ELSE valeur := valeur + 1;END_IF;// Possède une mémoire interne// Nécessite un DB d’instance// Idéal pour les machines à états// Idéal pour les objets technologiques (axes, PID, etc.)CompteurFB(reset := FALSE); # Appel FBvalActuelle := CompteurFB.valeur; # Lecture mémoire interne// Créé automatiquement lors de la création d’un FB// Contient toutes les variables internes du FB// Un FB peut avoir plusieurs DB d’instanceDB_Global.TempMax := 80; # Exemple d’écritureval := DB_Global.Compteur; # Exemple de lecture// Optimized : accès symbolique (recommandé S7-1200/1500)// Non-optimized : accès absolu (DBX0.0, DBW2, etc.)// OB1 = cycle PLC// Appeler ici les FB/FC principauxCompteurFB(reset := FALSE);GestionMoteur();// OB100 = initialisationInitVariables();ResetAlarms();// OB121 = erreur dans un blocLogError();SetErrorFlag();// OB122 = erreur mémoireHandleMemoryFault();// 1. OB100 (démarrage)// 2. OB1 (cycle principal)// 3. OBs d’interruption (temps, communication, erreurs)// 4. OB121/OB122 si erreur// 5. Retour au cycle OB1// Utiliser des FB pour tout ce qui a une mémoire interne// Utiliser des FC pour les calculs ou fonctions simples// Regrouper les données dans des DB globaux ou UDT// Toujours documenter les OB (OB1, OB100, OB121...)// Ne jamais mettre trop de logique dans OB1// Préférer des appels de blocs plutôt que du code direct