SysGetPhrDI, get peripheral digital input

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Il blocco funzione esegue l’acquisizione degli ingressi digitali dai moduli periferici. Viene ritornato lo stato degli ingressi digitali dal modulo indicato in Address in base al comando di Mode definito.

Nota: Per acquisire gli ingressi digitali presenti sul modulo CPU occorre definire Address:=255 e Mode:=DI_MODE#DI_8_LL.

Information Circle

Blocco funzione

CODESYS: eCDSXUnified12Lib

LogicLab: eLLabS8CoreMng, eLLabXUnified12Lib

Descrizione

Address (USINT) Occorre specificare l’indirizzo di modulo da cui eseguire l’acquisizione degli ingressi digitali (Range da 0 a 15). Il valore 0 indica il primo modulo di estensione, 1 il secondo e così di seguito. L’indirizzo 255 indica il modulo CPU.
Mode (DI_MODE) Occorre specificare il modo di acquisizione (Definizione).
Done (BOOL) Dato acquisito, viene attivato se acquisizione terminata.
Fault (BOOL) Errore di acquisizione, viene attivato in caso di errore nella sequenza di acquisizione.
Value (UDINT) Ritorna lo stato degli ingressi digitali acquisiti.

Immagine FB SysGetPhrDI

Esempi

Come utilizzare gli esempi.
Viene acquisito lo stato degli 8 ingressi bassi (Da Inp 0 a Inp 7) del modulo di espansione con indirizzo 0. Se dato valido il valore acquisito nel range da 0x00 a 0xFF è trasferito nella variabile InpValue.

LogicLab (Ptp116, ST_SysGetPhrDI)
PROGRAM ST_SysGetPhrDI
VAR
    InpValue : UDINT; (* Digital input value *)
    DInp : SysGetPhrDI; (* Digital input acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysGetPhrDI"
// *****************************************************************************
// This program acquires digital inputs.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // DIGITAL INPUT ACQUISITION
    // -------------------------------------------------------------------------
    // Acquires digital inputs 0 to 7 on module with address 0.

    DInp.Address:=0; //Module address
    DInp.Mode:=DI_MODE#DI_8_LL; //Acquisition mode
    DInp(); //Digital input acquisition
    IF (DInp.Done) THEN InpValue:=DInp.Value; END_IF;

// [End of file]
CODESYS (Ptp161, ST_SysGetPhrDI)
PROGRAM ST_SysGetPhrDI
VAR
    InpValue : UDINT; (* Digital input value *)
    DInp : SysGetPhrDI; (* Digital input acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysGetPhrDI"
// *****************************************************************************
// This program acquires digital inputs.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // DIGITAL INPUT ACQUISITION
    // -------------------------------------------------------------------------
    // Acquires digital inputs 0 to 7 on module with address 0.

    DInp.Address:=0; //Module address
    DInp.Mode:=DI_MODE.DI_8_LL; //Acquisition mode
    DInp(); //Digital input acquisition
    IF (DInp.Done) THEN InpValue:=DInp.Value; END_IF;

// [End of file]

La possibilità di accedere direttamente all’hardware permette di acquisire gli ingressi digitali in tempo reale senza dover passare dall’immagine di processo I/O. In questo modo possiamo acquisire anche ingressi che si attivano per tempi ridottissimi.

Nell’esempio viene acquisito 2000 volte al secondo l’ingresso collegato alla rotazione di una bobina di carta in svolgitura e ne viene calcolato il diametro. Per il calcolo del diametro si acquisiscono gli impulsi da un generatore cablato sul rullo di traino ed in base al numero di impulsi acquisiti ad ogni giro di bobina è possibile ricavarne il diametro.

Il programma deve essere eseguito nella task Fast di cui viene modificato il tempo di esecuzione standard portandolo da 1mS a 500uS.

Esempio calcolo diametro bobina
LogicLab (Ptp116, ST_DiameterCalc)
PROGRAM ST_DiameterCalc
VAR
    i : UDINT; (* Auxiliary variable *)
    IValue : UDINT; (* Digital input value *)
    CValue : UDINT; (* Counter value *)
    Pulses : UDINT; (* Number of pulses *)
    RDiameter : REAL; (* Reel diameter (mm) *)
    MWRPulses : REAL := 200.0; (* Measuring weel revolution pulses *)
    MWDiameter : REAL := 100.0; (* Measuring weel diameter (mm) *)
    DInp : SysGetPhrDI; (* Digital input acquisition *)
    CInp : SysGetCounter; (* Counter acquisition *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_DiameterCalc"
// *****************************************************************************
// This program calculates a paper reel diameter by acquiring the pulses from a
// pulse generator placed on a web path.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Initialize variables.

    IF (SysFirstLoop) THEN
        i:=SysSetTaskLpTime(ID_TASK_FAST, 500); //Task Fast is executed every 500uS

        // Set digital input module.

        DInp.Address:=255; //Module address
        DInp.Mode:=DI_MODE#DI_8_LL; //Acquisition mode

        // Set counter input module.

        CInp.Address:=255; //Module address
        CInp.Channel:=0; //Module channel
        CInp.Mode:=16#00000000; //Acquisition mode
    END_IF;

    // -------------------------------------------------------------------------
    // DIAMETER CALCULATION
    // -------------------------------------------------------------------------
    // Assuming that a digital signal is generated at every turn of reel, when
    // digital input changes the number of pulses between the changes are read

    DInp(); //Digital input acquisition
    IF NOT TO_BOOL((DInp.Value XOR IValue) AND 16#02) THEN RETURN; END_IF;

    // Digital input has changed, check the raising.

    IValue:=DInp.Value; //Digital input value
    IF NOT TO_BOOL(DInp.Value AND 16#02) THEN RETURN; END_IF;

    // Acquire counter value and calculate pulses difference.

    CInp(); //Counter acquisition
    Pulses:=CInp.Value-CValue; //Number of pulses
    CValue:=CInp.Value; //Counter value

    // Diameter is the number of impulses acquired divided by the number of
    // impulses per revolution of the measuring wheel multiplied by its
    // circumference.

    RDiameter:=(TO_REAL(Pulses)/MWRPulses)*(MWDiameter*3.14); //Reel diameter (mm)

// [End of file]
Was this article helpful?