Attribut : no_assign, no_assign_warning
Le pragma 'no_assign'
entraîne l'affichage d'erreurs de compilation si une instance du bloc fonction est affectée à une autre instance du même bloc fonction. De telles affectations sont souvent à éviter si le bloc fonctionnel contient des pointeurs et que les pointeurs posent des problèmes, car ils sont également copiés lors de l'affectation de la valeur.
Le pragma 'no_assign_warning'
donne le même résultat que pour le pragma 'no_assign'
avec des avertissements du compilateur au lieu d'erreurs du compilateur.
Syntaxe:
{attribute 'no_assign'}
Emplacement d'insertion : première ligne dans la partie déclaration d'un bloc fonction.
Affectation d'instances de bloc fonction contenant des pointeurs.
Dans cet exemple, l'affectation de valeur des instances de bloc fonction entraînera des problèmes lors de l'exécution de fb_exit
:
VAR_GLOBAL inst1 : TestFB; awsBufferLogFile : ARRAY [0..9] OF WSTRING(66);(* Area: 0, Offset: 0x1304 (4868)*) LogFile : SEDL.LogRecord := (sFileName := 'LogFile.log', pBuffer := ADR(awsBufferLogFile), udiMaxEntriesFile := UDINT#10000, udiMaxBuffered := UDINT#10, uiLineSize := UINT#64, wsSep := " ", xCircular := TRUE, siDateFormat := SINT#0, siTimeFormat := SINT#0); END_VAR PROGRAM PLC_PRG VAR inst2 : TestFB := inst1; LogFileNew END_VAR
Dans ce cas LogRecord
gère une liste de pointeurs, pour lesquels différentes actions sont exécutées en cas de fb_exit
. Des problèmes résultent de l'affectation, car fb_exit
sera exécuté deux fois. Vous devriez empêcher cela en ajoutant l'attribut 'no_assign'
dans la déclaration du bloc fonction TestFB:
{attribute 'no_assign'} FUNCTION_BLOCK TestFB VAR_INPUT ...
Les erreurs de compilation suivantes sont alors affichées :
C0328: Assignment not allowed for type TestFB C0328: Assignment not allowed for type LogRecord
Si le pragma no_assign_warning
est utilisé à la place du pragma no_assign
pour le bloc fonction TestFB, puis le C0328
message est émis en tant qu'avertissement du compilateur, et non en tant qu'erreur du compilateur.