Vai al contenuto
PLC Forum


Istuzione SPLIT Tia 17


Messaggi consigliati

Inserito: (modificato)

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

Modificato: da STEU
  • 2 weeks later...

Inserita:

Split1.thumb.jpg.280b102db874252a111e158484c1fae6.jpg

Soluzione 1 senza split

Split2.thumb.jpg.f549468fc897276fa10c50d3e851f859.jpg

Soluzione 2 con split array di char

 

Per chi interessa

ifachsoftware
Inserita:

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

Inserita:

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:

image.png.0e2766200b11f135bb266cd36e968896.png

 

Dimenticavo all'interno del FC c'è questa dichiarazione:

image.png.19244e8348136227073636ebb44e05ce.png

 

Che dice quali siano i caratteri che separano i vari campi.

Saluti

Inserita:

 

Interessante anche questa opzione la studierò bene

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...