La funzione MID estrae una sottostringa da una stringa di partenza, indicando la lunghezza della sottostringa e la posizione nella stringa di partenza. Il suo prototipo è:
ANY_STRING MID(IN:=ANY_STRING, L:=UINT, P:=UINT)
Quindi non puoi appoggiare il ritorno di MID in una variabile INT. Come ho già detto in altri topic con le nuove versioni LogicLab introduce sempre correzioni e nuovi controlli sintattici. Per estrarre un numero da una stringa puoi usare la funzione SysVsscanf. Vediamo nel tuo esempio:
VAR
MsgID : INT;
AStr : STRING[ 16 ];
RxMessage : STRING[ 32 ];
END_VAR
RxMessage:='Message ID:12, This is a message';
AStr:=MID(IN:=RxMessage, L:=2, P:=12);
eTO_JUNK(SysVsscanf(ADR(AStr), ADR('%d'), INT_TYPE, ADR(MsgID)));
eTO_JUNK(SysVsscanf(SysStrFind(ADR(RxMessage), ADR('ID:'), FIND_GET_END), ADR('%d'), INT_TYPE, ADR(MsgID)));
Come vedi ho fatto due esempi, nel primo estraggo la sottostringa con i due numeri asccii “12” e poi eseguo la SysVsscanf sulla sottostringa, nel secondo in una sola riga di programma cerco nella stringa il riferimaento “ID;” ed estraggo il valore.
Il secondo esempio ha molti vantaggi, intanto cerca il riferimento e quindi se cambia la testa del messaggio comunque individua sempre il campo che lo segue, inoltre converte il numero qualunque sia il numero di cifre che lo compongono.
Se controlli il ritorno di SysVsscanf puoi verificare se è stato acquisito correttamente il numero e gestire di conseguenza eventuali errori, inoltre nella acquisizione del numero puoi utilizzare anche le regular expressions (Vedi topic).