Questa funzione cerca il pattern di byte definito in Needle nel buffer di memoria definita in Haystack, la ricerca è effettuata in base alla definizione di Mode. Se il pattern è trovato viene ritornato il puntatore all'indirizzo di Haystack dove si trova.

In base alla definizione di Mode può essere ritornato l'indirizzo del primo byte coincidente oppure l'indirizzo del byte successivo all'ultimo byte coincidente. Se pattern non trovato o errore viene ritornato NULL.

Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

Haystack (@BYTE) Pointer al buffer di memoria dove effettuare la ricerca.

HSize (UDINT) Dimensione del buffer di memoria.

Needle (@BYTE) Pointer alla stringa da ricercare.

NSize (UDINT) Dimensione del pattern da ricercare.

Mode (FIND_MODE) Definizione modo in cui effettuare la ricerca (Vedi definizione).

La funzione ritorna un (@BYTE) indirizzo di Haystack dove Needle è stata trovata, NULL se non trovata.

Errori

In caso di errore la funzione torna EOF, eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Esempi

Come utilizzare gli esempi.
Viene eseguita la ricerca del pattern 16#04, 16#05, 16#06 nel buffer di memoria definito in Mem con diversi modi di ricerca. Dal pointer ritornato viene sottratto l'indirizzo di allocazione di Mem in modo da ottenere la posizione relativa del pattern nel buffer di memoria. Vediamo i vari risultati.

Position[0]: 3, La ricerca parte dall'inizio e ritorna la posizione di inizio della prima occorrenza.
Position[1]: 6, La ricerca parte dall'inizio e ritorna la posizione successiva alla fine della prima occorrenza.
Position[2]: 3, La ricerca parte dalla fine e ritorna la posizione di inizio della prima occorrenza.
Position[3]: 6, La ricerca parte dalla fine e ritorna la posizione successiva alla fine della prima occorrenza.

LogicLab (Ptp116)
PROGRAM ST_SysMemFind
VAR
    Position : ARRAY[ 0..3 ] OF UDINT; (* Found position *)
    Mem : ARRAY[ 0..15 ] OF BYTE := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; (* Source string *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysMemFind"
// *****************************************************************************
// Some find examples.
// -----------------------------------------------------------------------------

    Position[0]:=SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_DEFAULT)-ADR(Mem);
    Position[1]:=SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_GET_END)-ADR(Mem);
    Position[2]:=SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_FROM_END)-ADR(Mem);
    Position[3]:=SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_FROM_END OR FIND_GET_END)-ADR(Mem);

// [End of file]

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 20 Settembre 2019