SysMemFind, memory find

List

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

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.

Information Circle

Funzione

CODESYS: Non disponibile

LogicLab: eLLabXUnified12Lib

Descrizione

Haystack (PVOID) Pointer al buffer di memoria dove effettuare la ricerca.
HSize (UDINT) Dimensione del buffer di memoria.
Needle (PVOID) 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 (PVOID) indirizzo di Haystack dove Needle è stata trovata, NULL se non trovata.

Immagine F SysMemFind

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, ST_SysMemFind)
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]:=TO_UDINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_DEFAULT))-TO_UDINT(ADR(Mem));
    Position[1]:=TO_UDINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_GET_END))-TO_UDINT(ADR(Mem));
    Position[2]:=TO_UDINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_FROM_END))-TO_UDINT(ADR(Mem));
    Position[3]:=TO_UDINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_FROM_END OR FIND_GET_END))-TO_UDINT(ADR(Mem));

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