La funzione funzione esegue il calcolo del pattern di controllo su di un'area dati. Il calcolo è effettuato secondo l'algoritmo indicato nel parametro Type.

Occorre passare alla funzione l'indirizzo del buffer di memoria Buf ed il numero di bytes ByteNr su cui eseguire il calcolo. Occorre anche indicare un valore di inizializzazione del calcolo Init che cambia in funzione del tipo di algoritmo di calcolo definito.

Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

Buf (@BYTE) Indirizzo dell'area di memoria su cui eseguire il calcolo.

ByteNr (UDINT) Numero di bytes su cui eseguire il calcolo a partire dall'indirizzo definito in Buf.

Init (UDINT) Valore di inizializzazione del calcolo.

Type (CHECK_FRAME_TYPE) Definizione algoritmo di calcolo da eseguire (Vedi tabella).

La funzione ritorna una variabile (UDINT) con il valore di pattern calcolato.

Esempi

Come utilizzare gli esempi.
Viene calcolato il CRC di un frame Modbus RTU per il comando di lettura registri Read holding registers. Il valore del CRC calcolato è 17466 (16#443A).

LogicLab (Ptp116)
PROGRAM ST_SysGetCheck
VAR
    RegsAddress : UINT; (* Registers address *)
    NrOfRegs : USINT; (* Number of registers *)
    CRCValue : UDINT; (* CRC value *)
    Frame : ARRAY[0..9] OF USINT; (* Frame array *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysGetCheck"
// *****************************************************************************
// This program calculate CRC of a modbus RTU frame for command "Read holding
// registers". Here the command frame.
// +--+--+--+--+--+--+-+-+
// |Nd|03|Addr |Regs |CRC|
// +--+--+--+--+--+--+-+-+
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // CRC CALCULATION
    // -------------------------------------------------------------------------
    // Define the registers address and the number of registers to read.

    RegsAddress:=16#0120; // Registers address
    NrOfRegs:=8; // Number of registers

    // Prepare the command frame.

    Frame[0]:=1; //Node address
    Frame[1]:=3; //Function code (16#03)
    Frame[2]:=TO_USINT(RegsAddress/256); //MSB registers address
    Frame[3]:=TO_USINT(RegsAddress&255); //LSB registers address
    Frame[4]:=0; //MSB number of registers to read
    Frame[5]:=NrOfRegs; //LSB number of registers to read

    // Calculate the frame CRC.

    CRCValue:=SysGetCheck(Buf:=ADR(Frame[0]), ByteNr:=6, Init:=16#FFFF, Type:=CRC_16_MODBUS);
    Frame[6]:=TO_USINT(CRCValue/256); //MSB of CRC value
    Frame[7]:=TO_USINT(CRCValue&255); //LSB of CRC value 

// [End of file]

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 10 Dicembre 2019