Ho realizzato un semplice programma di esempio dove per estrare la descrizione ho utilizzato le regular expressions, poi ho estratto tutti gli altri campi eseguendo la funzione SysStrFind per la ricerca ricorsiva dei separatori “;”.
PROGRAM FieldsExtract
VAR
i : UDINT; (* Auxiliary variable *)
APtr : @STRING; (* Auxiliary pointer *)
Title : @STRING; (* Title field *)
Record : @STRING; (* Record field *)
Description : STRING[ 32 ]; (* Description *)
Node : USINT; (* Node *)
Type : USINT; (* Type *)
Value : USINT; (* Value *)
Name : STRING[ 32 ]; (* Name *)
END_VAR
Title:=ADR('Description;Node;Type;Value;Name'); //Title field
Record:=ADR('InputCard; 1; 2; 3; Card name'); //Record field
i:=SysVsscanf(Record, ADR('%32[^;]'), STRING_TYPE, ADR(Description));
APtr:=SysStrFind(Record, ADR(';'), FIND_GET_END);
IF (APtr = eNULL) THEN RETURN; END_IF; //Error
i:=SysVsscanf(APtr, ADR('%d'), USINT_TYPE, ADR(Node));
APtr:=SysStrFind(APtr, ADR(';'), FIND_GET_END);
IF (APtr = eNULL) THEN RETURN; END_IF; //Error
i:=SysVsscanf(APtr, ADR('%d'), USINT_TYPE, ADR(Type));
APtr:=SysStrFind(APtr, ADR(';'), FIND_GET_END);
IF (APtr = eNULL) THEN RETURN; END_IF; //Error
i:=SysVsscanf(APtr, ADR('%d'), USINT_TYPE, ADR(Value));
APtr:=SysStrFind(APtr, ADR(';'), FIND_GET_END);
IF (APtr = eNULL) THEN RETURN; END_IF; //Error
i:=SysVsscanf(APtr, ADR('%32[ a-zA-Z]'), STRING_TYPE, ADR(Name));
Come si vede nella acquisizione delle variabili stringa ho utilizzato la sintassi %nn dove si indica la dimensione della variabile di appoggio del risultato per evitare di sforarne la dimensione. SE la stringa è più lunga verrà troncata al valore indicato.