Skip to main content

POU: CheckRangeSigned

Funzione per il monitoraggio dei limiti di campo di un tipo di sottocampo di tipo DINT

Limiti dell'intervallo di monitoraggio

Questo funzione di monitoraggio è responsabile della gestione appropriata delle violazioni dei limiti di portata. Esempi di reazioni alle violazioni includono l'impostazione di flag di errore e la modifica dei valori. Le funzioni vengono chiamate implicitamente quando un valore viene assegnato a una variabile di tipo sottointervallo.

Attenzione

Per ottenere la funzionalità per le funzioni di monitoraggio, non modificare la parte della dichiarazione. Tuttavia, è consentito aggiungere variabili locali.

. Quando la funzione viene chiamata, riceve i seguenti parametri di input:
  • value: Valore che deve essere assegnato alle variabili di tipo sottointervallo

  • lower: Limite di portata inferiore

  • upper: Limite superiore dell'intervallo

Il valore restituito è il valore di assegnazione purché sia compreso nell'intervallo valido. In caso contrario, viene restituito il limite superiore o inferiore, a seconda della soglia violata.

Ad esempio, l'incarico i := 10*y è sostituito implicitamente da i := CheckRangeSigned(10*y, -4095, 4095);

Se y è "1000", quindi "10*1000=10000" non è assegnato a i come nel codice originale. Viene invece assegnato il limite di intervallo superiore di "4095".

Lo stesso vale per CheckRangeUnsigned funzione.

Importante

Se le funzioni non sono disponibili, il sottointervallo non viene verificato per le rispettive variabili in fase di esecuzione. In questo caso è possibile assegnare qualsiasi valore compreso tra -2147483648 e +2147483648 (o tra 0 e 4294967295) ad una variabile di tipo di sottointervallo DINT/UDINT. È possibile assegnare qualsiasi valore compreso tra -9223372036854775808 e +9223372036854775807 (o compreso tra 0 e 18446744073709551615) a una variabile di un tipo di sottointervallo LINT/ULINT.

Attenzione

Il collegamento delle funzioni di monitoraggio dell'area può portare a loop infiniti. Ad esempio, un ciclo infinito può verificarsi se la variabile contatore di un ciclo FOR è un tipo di sottointervallo e l'intervallo di conteggio per il ciclo esce dal sottointervallo definito.

Esempio 533. Esempio di ciclo infinito:
VAR
        ui : UINT (0..10000);
 ...
END_VAR
FOR ui:=0 TO 10000 DO
        ...
END_FOR

Il programma non esce mai dal ciclo FOR perché il CheckRangeSigned la funzione di monitoraggio impedisce ui dall'essere impostato su un valore maggiore di 10000.



Esempio 534. Esempio per CheckRangeSigned

L'assegnazione di un valore a una variabile DINT di un tipo di sottointervallo con segno è una condizione per la chiamata automatica di CheckRangeSigned. La funzione limita il valore di assegnazione al sottointervallo definito nella dichiarazione delle variabili. L'implementazione predefinita della funzione in ST è la seguente:

Parte della dichiarazione:

// Automatisch erzeugter Code : NICHT EDITIEREN
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
        value, lower, upper: DINT;
END_VAR

Implementazione:

// Automatisch erzeugter Code : Es handelt sich hierbei um einen Implementierungsvorschlag.
IF (value < lower) THEN
        CheckRangeSigned := lower;
        ELSEIF(value > upper) THEN
        CheckRangeSigned := upper;
ELSE
        CheckRangeSigned := value;
END_VAR