STEU Posted June 22, 2022 Report Share Posted June 22, 2022 (edited) Buongiorno Nella configurazione del mio PLC c'è una scheda seriale collegata ad uno strumento che mi da dei dati su una stringa i dati sono distanziati da uno spazio, secondo la seguente formattazione A XXXXXX XXXXXX XXXXX XXXXX XXXXXX XXXXX vorrei splittare utilizzando lo spazio come separatore, con l'istruzione split appunto, la stringa in un array di stringhe, ma non riesco a parametrizzare ( e quindi a capire) l' FC . Qualcuno sa spiegarmi come fare? L' H_elp in linea non è esaustivo Edited June 22, 2022 by STEU Link to comment Share on other sites More sharing options...
STEU Posted July 6, 2022 Author Report Share Posted July 6, 2022 Soluzione 1 senza split Soluzione 2 con split array di char Per chi interessa Link to comment Share on other sites More sharing options...
ifachsoftware Posted July 9, 2022 Report Share Posted July 9, 2022 Non capisco il perchè hai aggiunto nel secondo esempio il CTU ; in teoria essendo un FC dovrebbe essere eseguito il tutto in un unico ciclo Link to comment Share on other sites More sharing options...
TravelMen Posted July 14, 2022 Report Share Posted July 14, 2022 Ciao STEU io il tuo problema l'ho risolto così: FOR #_Char := #RECIVE_FirstElement TO #RECIVE_LastElemet DO // Ciclo for dal primo caratteri all'ultimo carattere ricevuto IF #BARCODE_RECIVED[#_Char] = '$R' OR #BARCODE_RECIVED[#_Char] = '$L' OR #BARCODE_RECIVED[#_Char] = '$r' OR #BARCODE_RECIVED[#_Char] = '$l' THEN // Se il carattere nel barcode è un ritorno a capo esco dal ciclo for #END_DECODE := TRUE; // Esco dal loop se trovo o un cattere di fine come ritorno a CR o LF END_IF; IF #BARCODE_RECIVED[#_Char] <> #Separator1 AND #BARCODE_RECIVED[#_Char] <> #Separator2 AND #BARCODE_RECIVED[#_Char] <> #Separator3 AND NOT(#END_DECODE) THEN #add_Char := Serialize(SRC_VARIABLE := #BARCODE_RECIVED[#_Char], DEST_ARRAY => #CHAR_DECODE, POS := #_CountChar); // Aggiunta del carattere ricevuto per decodificarlo IF #BARCODE_RECIVED[#_Char] = ',' THEN #_FormatOfNumber := w#16#0001; // Numero decimale separato da , (virgola) END_IF; ELSE IF #CONFIGURATION[#_Field].ENABLE AND (#CONFIGURATION[#_Field].LENGHT >= #_CountChar) AND (#_CountChar >= 1) THEN Chars_TO_Strg(Chars := #CHAR_DECODE, pChars := 0, Cnt := #_CountChar, Strg => #DECODE[#_Field]."STRING"); IF #CONFIGURATION[#_Field].IS_NUMBER THEN // Se il campo deve essere interpretato come numero lo converto STRG_VAL(IN := #DECODE[#_Field]."STRING", FORMAT := #_FormatOfNumber, P := 1, OUT => #DECODE[#_Field].NUMBER); END_IF; #_Field += 1; // Incremento il numero del campo da decodificare #_CountChar := 0; // ReInizializzo il numero dei caratteri estrapolati per la decodifica #_FormatOfNumber := w#16#0000; // Usato nella funzione di conversione della stringa in valore reale se il separore delle unità è un punto oppure una virgola IF #_Field > #DECOD_LastElemet OR #END_DECODE THEN // Se il numero del capo eccede il numero massimo di campi nell'array esco dal ciclo for di decodifica EXIT; END_IF; ELSE // <= se c'è stato un errore nella scrittura del campo viene dato errore e la funzione viene terminata #CONFIGURATION_ERROR := TRUE; EXIT; END_IF; END_IF; END_FOR; // <= Fine ciclo for di decodifica Questo FC lo uso per decodificare una array di caratteri ricevuti da un lettore di codici a a barre, mediante un DB di configurazione che dice come quanti suddivisioni ci sono che è questo: Dimenticavo all'interno del FC c'è questa dichiarazione: Che dice quali siano i caratteri che separano i vari campi. Saluti Link to comment Share on other sites More sharing options...
STEU Posted July 14, 2022 Author Report Share Posted July 14, 2022 Interessante anche questa opzione la studierò bene Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now