VAR xEnable : BOOL := FALSE; // x : Boolean (1 bit) bByteVal : BYTE := 16#FF; // b : Byte (8 bits, masques) iCounter : INT := -120; // i : Integer signatif (16 bits) uiCount : UINT := 40000; // ui : Unsigned Int (16 bits) diEncoder : DINT := 100000; // di : Double Int (32 bits) rTemp : REAL := 23.5; // r : Float simple précision (32 bits) lrPrecision : LREAL := 3.14159; // lr : Float double précision (64 bits) tDelay : TIME := T#2s500ms;// t : Durée (TIME) sDevName : STRING[30] := 'Pump_1'; // s : Chaîne ASCIIEND_VAR// TYPE ENUM (eState)TYPE eAxisState : (INIT, STOPPED, MOVING, ERROR); END_TYPE// TYPE STRUCT (stConfig)TYPE stAxisConfig :STRUCT rMaxSpeed : REAL := 1000.0; rAccel : REAL := 100.0; xReversed : BOOL := FALSE;END_STRUCTEND_TYPE// DeclarationVAR eState : eAxisState := eAxisState.INIT; stCfg : stAxisConfig; aSpeed : ARRAY[1..5] OF REAL := [10.0, 20.0, 30.0, 40.0, 50.0];END_VAR// FUNCTION (Sans état interne)FUNCTION F_CelsiusToFahrenheit : REALVAR_INPUT rCelsius : REAL;END_VAR F_CelsiusToFahrenheit := (rCelsius * 9.0 / 5.0) + 32.0;END_FUNCTION// Utilisation dans un PRGPROGRAM PLC_PRGVAR rAmbTempC : REAL := 21.5; rAmbTempF : REAL;END_VAR rAmbTempF := F_CelsiusToFahrenheit(rAmbTempC);END_PROGRAMFUNCTION_BLOCK FB_BlinkerVAR_INPUT tToggleTime : TIME := T#1s;END_VARVAR_OUTPUT xOut : BOOL;END_VARVAR tonTimer : TON; // Bloc temporisateur standard IECEND_VARtonTimer(IN := NOT tonTimer.Q, PT := tToggleTime);IF tonTimer.Q THEN xOut := NOT xOut;END_IFFUNCTION_BLOCK FB_ValveVAR_OUTPUT xIsOpen : BOOL; // Visible depuis l'extérieurEND_VARVAR PRIVATE iErrorID : INT := 0; // Masqué pour les accès externes directEND_VAR// METHOD PUBLIC : Action exécutable sur l'objetMETHOD PUBLIC Open : BOOL xIsOpen := TRUE; Open := TRUE;END_METHOD// PROPERTY Speed : REAL (Contrôle d'accès à rInternalSpeed)PROPERTY PUBLIC Speed : REAL// Getter (Lecture)GET Speed := rInternalSpeed;// Setter (Écriture avec validation)SET IF Speed > 100.0 THEN rInternalSpeed := 100.0; ELSE rInternalSpeed := Speed; END_IF// FB ParentFUNCTION_BLOCK FB_SensorVAR rRawValue : REAL;END_VARMETHOD PUBLIC Read : REAL Read := rRawValue;END_METHOD// FB Enfant (Extension)FUNCTION_BLOCK FB_CalibratedSensor EXTENDS FB_SensorVAR rOffset : REAL := 1.5;END_VAR// Surcharge de la méthode ReadMETHOD PUBLIC OVERRIDE Read : REAL Read := SUPER^.Read() + rOffset; // Appel du parent via SUPER^END_METHOD// INTERFACE I_ActuatorINTERFACE I_ActuatorMETHOD Run : BOOLEND_METHODMETHOD Stop : BOOLEND_METHODEND_INTERFACE// FB Implémentant l'InterfaceFUNCTION_BLOCK FB_Conveyor IMPLEMENTS I_ActuatorMETHOD Run : BOOL // Implémentation spécifique au convoyeur Run := TRUE;END_METHODMETHOD Stop : BOOL Stop := TRUE;END_METHODVAR stData : stAxisConfig; pData : POINTER TO stAxisConfig; // Adresse mémoire explicit (ADR) refData: REFERENCE TO stAxisConfig; // Alias sécurisé (REF=)END_VAR// PointeurpData := ADR(stData);IF pData <> 0 THEN pData^.rMaxSpeed := 500.0; // Déférencement obligatoire (^)END_IF// RéférencerefData REF= stData;IF __ISVALIDREF(refData) THEN refData.rMaxSpeed := 500.0; // Accès direct transparentEND_IFMETHOD PUBLIC SetSelfParam : BOOLVAR_INPUT rMaxSpeed : REAL;END_VAR // Ambiguïté levée grâce à THIS^ THIS^.rMaxSpeed := rMaxSpeed;END_METHOD// PREFIXES D'OBJETS ET TYPESPRG_ : Program (ex: PRG_MotionControl)FB_ : Function Block (ex: FB_AxisServo)F_ : Function (ex: F_MathCalc)I_ : Interface (ex: I_MotorControl)ST_ : Structure (ex: ST_AlarmData)E_ : Enumeration (ex: E_MachineMode)GVL_ : Global Variable List (ex: GVL_IO)// PREFIXES DE VARIABLES & SCOPEg_ : Variable Globale (ex: g_xEmergencyStop)i_ : Entrée de FB/FUN (ex: i_rSetPoint)q_ : Sortie de FB/FUN (ex: q_xDriveReady)iq_ : InOut de FB/FUN (ex: iq_stStatus)1. ZÉRO VARIABLE GLOBALE EN ÉCRITURE : Les GVL doivent être en lecture seule. Utiliser des méthodes / interfaces pour échanger des données.2. UN FB = UNE RESPONSABILITÉ : Ne pas créer un FB monolithique 'Tout-en-un'.3. DÉCOUPAGE PAR TÂCHES : - Task_Fast (1-2ms) : Régulation, Fast IO, Safety - Task_Main (10ms) : Sequencier, Logique Métier, POO - Task_HMI (50-100ms) : Traitement IHM, Alarmes, Gateway4. VÉRIFICATION DES RÉFÉRENCES : Toujours valider les pointeurs (ADR != 0) et références (__ISVALIDREF) avant toute lecture/écriture.