Skip to main content

Définition des variables persistantes

Les variables simples ainsi que les instances de structure et les instances de blocs fonctionnels peuvent être marquées comme « persistantes » à l'aide d'attributs. Lorsqu'une instance est marquée, tous les membres de VAR, VAR_INPUT, et VAR_OUTPUT sera stocké de manière persistante. Dans le cas où des variables dans un VAR PERSISTENT section sont marquées comme « persistantes », un avertissement sera créé.

De plus, il existe des attributs permettant de définir un groupe de stockage par défaut, ainsi que d'exclure des variables particulières du stockage persistant de structures ou d'instances de blocs fonctionnels.

Si la définition des variables persistantes a été modifiée (ajout, suppression, renommage, changement de type de données), aucune nouvelle génération de code composer (commande Generate) ne doit être exécutée. Ces modifications seront automatiquement mises à jour dans les instances de Persistent Manager lors de la compilation.

Pour plus d'informations sur les conversions implicites possibles en cas de définition de type de données modifiée, veuillez consulter : Paramètre

Types de données pris en charge

Les instances avec les types de données suivants ne peuvent pas être stockées de manière persistante :

  • PEU

  • Aiguille

  • Interfaces

  • Constantes

  • Tableaux de types de données non persistants

Tous les autres types de données sont pris en charge. Cela inclut les énumérations, les types de données de sous-gamme, les tableaux de tableaux et les tableaux multidimensionnels :

ARRAY[0..9] OF ARRAY[5..6, 7..8, 9..10] OF INT

Type de données: SYNDICAT

Pour enregistrer l'instance d'une union de manière persistante, l'un de ses champs doit être marqué comme "représentatif". Il y a trois manières possibles :

  • Exactement un champ dans la déclaration de l'union est marqué avec l'attribut ac_persist_union_representant (sans valeur d'attribut). Ce champ « représente » alors le syndicat. Sa valeur sera enregistrée et chargée de manière représentative pour l'union complète.

  • Exactement un champ dans la déclaration de l'union est marqué avec l'attribut ac_persist – cela définit en même temps le représentant.

  • L'instance de l'union est marquée avec l'attribut ac_persist_union_set_representant y compris la valeur de l'attribut. La valeur de l'attribut décrit le nom du champ union qui doit être utilisé comme représentant. Cet attribut écrase un existant ac_persist_union_representant attribut dans la déclaration du syndicat. Les tableaux d'unions peuvent également être marqués et faire référence aux éléments du tableau.

Exemple 2. Exemples

'ac_persist_union_representant'

TYPE UnionWithRep :
UNION
        di : DINT ;
        {attribute 'ac_persist_union_representant'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist'

TYPE UnionWithPersist :
UNION
        di : DINT ;
        {attribute 'ac_persist' := 'TestUnion'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist_union_set_representant'

FUNCTION_BLOCK FBTestUnion
VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        u2 : UnionWithoutRep ;
END_VAR

Tableau d'union

VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aElems ARRAY[0..7] OF SomeUnion ;

        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aaElems ARRAY[0..7] OF ARRAY[0..1] OF SomeUnion ;
END_VAR


. Pour qu'un représentant soit valable, il doit remplir les règles suivantes :
  • Le représentant doit avoir la même taille que l'ensemble du syndicat. Sinon, les données complètes ne seraient pas enregistrées. Le représentant ne doit pas non plus disposer de zones de remplissage (zones de données vides créées par le compilateur pour aligner les données dans le stockage).

  • La décomposition du représentant en types de données primitifs ne doit pas contenir d'instances de type REAL ou LREAL ou instance de type STRING ou WSTRING.

  • De plus, le représentant doit être composé de types pris en charge (voir ci-dessus). Par exemple le représentant peut être du type Structure – cependant, la structure elle-même ne doit pas contenir de pointeur.

Attribut : 'ac_persist'

L'attribut 'ac_persist' peut être utilisé pour

  • Variables

  • Instances de structures

  • Instances de blocs fonctionnels

  • Membres des structures

  • Membres des blocs fonctionnels

{attribute 'ac_persist' [ := '<PERSISTENCE_GROUP>']}

PERSISTENCE_GROUP est le nom du groupe de persistance auquel la déclaration doit être affectée. Il doit s'agir d'un identifiant CEI valide. Si aucun groupe de persistance n'est nommé ici, l'affectation sera effectuée selon l'attribut 'ac_persist_set_default_group', qui dans ce cas doit être défini.

Si une instance de structure ou une instance de bloc fonctionnel est marquée comme « persistante » et qu'au moins un membre de la déclaration est également marqué comme « persistant », un message d'erreur sera créé.

Exemple 3. Exemple pour une instance persistante

La variable t est affecté au groupe de persistance PROCESS. Tous les membres seront stockés de manière persistante.

PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist' := 'PROCESS'}
        t : TON;
END_VAR


Exemple 4. Exemple pour un membre persistant d'un bloc fonctionnel

Le membre iNumIOs est affecté au groupe de persistance CONFIG. Ce membre sera stocké de manière persistante pour toutes les instances du bloc fonction (s'il n'est pas explicitement supprimé par l'attribut 'ac_persist_exclude').

FUNCTION_BLOCK FB
VAR
        {attribute 'ac_persist' := 'CONFIG'}
        iNumIOs : INT := 0;
END_VAR


Attribut : 'ac_persist_set_default_group'

Si le nom du groupe est manquant dans l'attribut 'ac_persist', un groupe par défaut doit être défini dans une instance de bloc fonctionnel ou une instance de structure contenant la variable correspondante directement ou indirectement. Ceci est possible avec l'attribut 'ac_persist_set_default_group'. L'attribut peut également être défini pour un membre du bloc fonctionnel. La définition la plus intime de 'ac_persist_set_default_group' sera utilisé comme groupe par défaut pour la variable.

Il est interdit d'utiliser 'ac_persist_set_default_group' ensemble avec 'ac_persist' ou 'ac_persist_exclude'. Dans ce cas, un message d'erreur sera créé lors de la génération du code.

Exemple 5. Exemple pour un groupe par défaut
FUNCTION_BLOCK FB_Util
VAR
        {attribute 'ac_persist'} // no group
        //'ac_persist_set_default_group‘ and 'ac_persist_exclude' not allowed here
        i : INT := 0;
END_VAR
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_set_default_group' := 'PROCESS'}
        fbu1 : FB_Util;

        {attribute 'ac_persist_set_default_group'´ := 'CONFIG'}
        fbu2 : FB_Util;
END_VAR


Attribut : 'ac_persist_exclude'

L'attribut 'ac_persist_exclude' est utilisé pour exclure une variable du stockage persistant, peu importe si les membres de la structure ou de la déclaration du bloc fonctionnel sont définis comme « persistants ». S'il n'existe aucun membre persistant dans la déclaration, une erreur sera créée lors de la génération du code.

Exemple 6. Exemple d'exclusion de variables
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_exclude'}
        fb1 : FB;
END_VAR