Provo a buttare giù un’idea utilizzando lo funzioni SysStrFind e SysVsscanf. Ecco il programma StringParse, spero possa servire come base di partenza.
PROGRAM StringParse
VAR
Pos : @BYTE; (* Position *)
Error : USINT; (* Error number *)
SString : @STRING; (* Source string *)
Value : ARRAY[0..3] OF USINT; (* Valiue *)
END_VAR
// *****************************************************************************
// PROGRAM "StringParse"
// *****************************************************************************
// 01G01$1,0002,0,0,0,0,0,0#1,0001,0,0,0,0,0,0#1,000E,5,5,5,5,0,0#1,0004,0,0,0,0,0,0$71
//
// Quello che dovrei ottenere è una cosa del tipo
// 1,0002,0,0,0,0,0,0
// 1,0001,0,0,0,0,0,0
// 1,000E,5,5,5,5,0,0
// 1,0004,0,0,0,0,0,0
//
// Per poi estrapolare
// 0002 e 0 per memorizzarli come 2 e 0
// 0001 e 0 per memorizzarli come 1 e 0
// 000E e 5 per memorizzarli come 14 e 5
// 0004 e 0 per memorizzarli come 4 e 0
// -----------------------------------------------------------------------------
SString:=ADR('01G01$1,0002,0,0,0,0,0,0#1,0001,0,0,0,0,0,0#1,000E,5,5,5,5,0,0#1,0004,0,0,0,0,0,0$71'); //Source string
// Cerco "$1,"
Pos:=SysStrFind(SString, ADR('$1,'), FIND_MODE#FIND_GET_END); //Position
IF (Pos = eNULL) THEN Error:=10; RETURN; END_IF;
IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[0]))) THEN Error:=11; RETURN; END_IF;
// Cerco successiva ","
Pos:=SysStrFind(Pos, ADR(','), FIND_MODE#FIND_GET_END); //Position
IF (Pos = eNULL) THEN Error:=20; RETURN; END_IF;
IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[1]))) THEN Error:=21; RETURN; END_IF;
// Cerco "#1,"
Pos:=SysStrFind(SString, ADR('#1,'), FIND_MODE#FIND_GET_END); //Position
IF (Pos = eNULL) THEN Error:=30; RETURN; END_IF;
IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[2]))) THEN Error:=31; RETURN; END_IF;
// Cerco successiva ","
Pos:=SysStrFind(Pos, ADR(','), FIND_MODE#FIND_GET_END); //Position
IF (Pos = eNULL) THEN Error:=40; RETURN; END_IF;
IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[3]))) THEN Error:=41; RETURN; END_IF;
// ... Eccetera
// [End of file]