Vai al contenuto
PLC Forum


Problema operatore LEFT su stringa: la stringa risulta vuota.


Maverick85vr

Messaggi consigliati

Buongiorno a tutti ragazzi 🙂

Ho un problema riguardante il trattamento di una stringa in Tia Portal 14.
Sostanzialmente, ho necessità di verificare che i primi tre caratteri di una stringa che mi viene scritta da uno scada Movicon, corrispondando ad una stringa predefinita (ES: i primi tre caratteri siano uguali ad 'ABC'). Io ho dichiarato una stringa di nome: codiceRicetta, di tipo stringa, che se vado a vedere locazione per locazione (codiceRicetta) contiene effettivamente il codice scritto da Movicon.
Se però vado applicare alla stessa l'operatore LEFT per ottenere i primi tre caratteri e poi, in sequenza, un S_COMP sul risultato ottenuto dal LEFT per verificare l'uguaglianza o meno con il pattern stabilito, vedo che la stringa appare come se fosse vuota (valore attuale: ''). Non riesco a capirne il motivo. All'operatore LEFT ho passato il puntatore alla stringa, visto che è l'unico valore che mi accetta, eppure pare che non riesca a vedere la stringa. Se la stringa, anziché lasciarla gestire da Movicon, la valorizzo io con "comanda operatore", allora il tutto funziona correttamente.
Come mai? Sto sbagliando io a utilizzare l'operatore? La stringa è definita in maniera sbagliata?

Spero possiate aiutarmi.
Grazie anticipatamente a tutti!
Buona giornata

Modificato: da Maverick85vr
Link al commento
Condividi su altri siti


Ciao,

 

Quote

LEFT: Leggi caratteri sulla sinistra della stringa
Descrizione
L'istruzione "LEFT" consente di estrarre una parte della stringa di caratteri nel parametro di ingresso IN. Il numero di caratteri da estrarre va definito nel parametro L. I caratteri estratti vengono emessi nel parametro di uscita OUT in formato (W)STRING.
Se il numero di caratteri da estrarre supera la lunghezza attuale della stringa, il parametro di uscita OUT restituisce come risultato la stringa di ingresso.

Se il parametro L ha valore "0" o se il valore di ingresso è una stringa vuota, viene restituita una stringa vuota.

Se il parametro L ha un valore negativo, viene restituita una stringa vuota.

 

Hai verificato che il testo in ingresso a LEFT contenga dei caratteri ? Sicuro che il parametro L abbia il valore corretto ?

Io eliminerei per il momento S_COMP, proverei a passargli diversi testi per verificare che LEFT estragga sempre i 3 caratteri che vuoi.

 

Link al commento
Condividi su altri siti

2 ore fa, drugo66 scrisse:

Ciao,

 

 

Hai verificato che il testo in ingresso a LEFT contenga dei caratteri ? Sicuro che il parametro L abbia il valore corretto ?

Io eliminerei per il momento S_COMP, proverei a passargli diversi testi per verificare che LEFT estragga sempre i 3 caratteri che vuoi.

 

Ciao Drugo, grazie della risposta!

Forse non ho capito bene cosa intendi e probabilmente non ho esposto bene io il problema che incontro;
sostanzialmente, quella stringa che ho dichiarato e che viene popolata dallo SCADA, pare essere sempre vuota, a prescindere dall'operatore a cui la passo in ingresso (ad es al LEFT che è quello che serve a me)... la cosa strana è che se vado a vederla in una VAT, scrivendo riga per riga i vari: nome_stringa, effettivamente vedo dentro i caratteri corretti.

Ora non so se sono io a sbagliare, ma al LEFT passo in ingresso il puntatore alla stringa e non ho errori strani di incompatibilità tra parametri attuali e formali, sembra tutto corretto...solo che se poi vado online sul blocco di programma, vedo che il valore corrente in ingresso al LEFT, quindi il valore corrispondente al puntatore alla stringa, è: '' (la stringa vuota).
E non capisco il perché. NOn capisco dove sta l'errore. Perché se anziché farla scrivere allo SCADA, provo a comandargli io un valore, allora la vedo correttamente valorizzata.

Sapresti aiutarmi?

Modificato: da Maverick85vr
Link al commento
Condividi su altri siti

In Siemens una variabile di tipo STRING è strutturata come segue:
byte 0: lunghezza massima della stringa

byte 1: lunghezza attuale della stringa

byte 2..n: caratteri della stringa.

 

Con un pannello operatore Siemens una variabile STRING verrebbe gestita nella stessa identica maniera.

Usando uno SCADA di terze parti, la stringa viene considerata come un array di caratteri, quindi non vengono gestiti i primi due byte come vorrebbe Siemens, e come vorrebbe la funzione LEFT.
 

Link al commento
Condividi su altri siti

Non avevo pensato a quello che sostiene Batta, che, facilmente, è quello che accade.

Ti converrebbe, allora, utilizzare un array di Char della dimensione corretta come interfaccia con lo SCADA, poi usare l'istruzione CharToString (mi sembra sia questo il nome) per convertirla in String; a questo punto dovresti essere a posto.

Link al commento
Condividi su altri siti

Per verificare si possono leggere i due byte per vedere il loro contenuto. Lo scarso in questione potrebbe mettere un byte a fine stringa di End of string.

Link al commento
Condividi su altri siti

Buongiorno!
Intanto, grazie mille a tutti delle risposte e del supporto.

Direi che quello che ha scritto Batta potrebbe proprio aver senso e potrebbe essere la causa;
in effetti, se quella stringa la scrivo io dalla VAT, il tutto funziona correttamente.

Per quanto riguarda il verificare i byte, come dicevate, io ho ho avuto modo di verificare le locazioni della stringa (quindi i singoli char, a partire dalla posizione 1) e vedevo i caratteri nelle posizioni corrette, però non so se è questo che intendete. In sostanza, per esempio, supponiamo che:
la mia stringa sia: nome_stringa e il suo valore sia: 'CIAO',

se aggiunto alla VAT:

nome_stringa[1]
nome_stringa[2]
nome_stringa[3]

io vedo nell'ordine: 'C', 'I', 'A',
come se la stringa fosse valorizzata correttamente dallo SCADA. Non so però se ciò non basti a verificarne la effettiva correttezza di formato o se non sia esplicativa di tutto quanto sta dietro nel sistema di codifica usato da Siemens; però, essendo ogni char un byte, non capisco dove dovrei trovare quei "byte di servizio" di cui mi parlate.

Grazie ancora.

Modificato: da Maverick85vr
Link al commento
Condividi su altri siti

Rettifico, ho capito cosa intendete;
aldilà dei caratteri che sono scritti dal terzo byte in poi, verificherò i primi due byte come avete detto, e proverò a confrontare i valori in essi contenuti quando la stringa è scritta da Movicon e quando invece la stringa la forzo io da VAT, vedendo le differenze.

Appena ho notizie vedo di aggiornarvi.
Intanto grazie mille ancora!

Buona giornata e buon lavoro a tutti!
 

Link al commento
Condividi su altri siti

I primi due byte devi leggerlo in decimale.

Con alcuni pannelli trovo la stringa corretta come carattere ma non aggiornata la lunghezza.

In quel caso devi fare una macro nel pannello che conta e scrive il valore del secondo byte.

Modificato: da max.bocca
Link al commento
Condividi su altri siti

 

15 minuti fa, max.bocca scrisse:

I primi due byte devi leggerlo in decimale.

Con alcuni pannelli trovo la stringa corretta come carattere ma non aggiornata la lunghezza.

In quel caso devi fare una macro nel pannello che conta e scrive il valore del secondo byte.


Sì sì, infatti è quello che ho appena fatto, però da VAT. 😉

In effetti, con la stringa forzata da me tramite VAT, vedo nel secondo byte la lunghezza effettiva della stringa (ES: forzando il contenuto a 'CIAO', vedo nel secondo byte, in decimale, 4).
Se invece lascio che la stringa sia scritta dallo SCADA, vedo che il secondo byte in decimale mi mostra 0.
Quindi pare proprio centrata l'osservazione fatta da Batta:

 

20 ore fa, batta scrisse:

In Siemens una variabile di tipo STRING è strutturata come segue:
byte 0: lunghezza massima della stringa

byte 1: lunghezza attuale della stringa

byte 2..n: caratteri della stringa.

 

Con un pannello operatore Siemens una variabile STRING verrebbe gestita nella stessa identica maniera.

Usando uno SCADA di terze parti, la stringa viene considerata come un array di caratteri, quindi non vengono gestiti i primi due byte come vorrebbe Siemens, e come vorrebbe la funzione LEFT.
 


Credo davvero la soluzione possa essere quella di non passare da una stringa ma da un array di char, che credo non abbiano byte riservati.

Modificato: da Maverick85vr
Link al commento
Condividi su altri siti

Se tu dichiari una stringa da 10 caratteri e ci scrivi dentro 'CIAO' nel formato che si aspetta Siemens, la variabile sarà lunga 12 byte, e il contenuto di ogni singolo byte sarà il seguente:
byte 0: 16#0A (lunghezza totale della stringa - 10 caratteri)

byte 1: 16#04 (lunghezza attuale della stringa - 4 caratteri)

byte 2: 'C'

byte 3: 'I'

byte 4 'A'

byte 5 'O'

byte da 6 a 11: 16#00

 

E questo verrebbe interpretato correttamente dalle istruzioni che lavorano sulle stringhe.
Ma se tu scrivi 'CIAO' in una stringa da 10 caratteri dal Movicon (o da altri scada/hmi), la situazione sarà la seguente:

byte 0: 'C'

byte 1: 'I'

byte 2: 'A'

byte 3: 'O'

byte da 4 a 9: 16#00

 

In questo caso, le istruzioni sulle stringhe non lavorano correttamente.

 

La soluzione più semplice è sicuramente quella proposta da "Drugo66": dichiari la variabile collegata al Movicon come un array di caratteri, trasfrormi l'array di caratteri in stringa (il nome esatto dell'istruzione è "Chars_TO_Strg"), e poi utilizzi l'istruzione LEFT.

 

Link al commento
Condividi su altri siti

2 minuti fa, batta scrisse:

Se tu dichiari una stringa da 10 caratteri e ci scrivi dentro 'CIAO' nel formato che si aspetta Siemens, la variabile sarà lunga 12 byte, e il contenuto di ogni singolo byte sarà il seguente:
byte 0: 16#0A (lunghezza totale della stringa - 10 caratteri)

byte 1: 16#04 (lunghezza attuale della stringa - 4 caratteri)

byte 2: 'C'

byte 3: 'I'

byte 4 'A'

byte 5 'O'

 byte da 6 a 11: 16#00

 

E questo verrebbe interpretato correttamente dalle istruzioni che lavorano sulle stringhe.
Ma se tu scrivi 'CIAO' in una stringa da 10 caratteri dal Movicon (o da altri scada/hmi), la situazione sarà la seguente:

byte 0: 'C'

byte 1: 'I'

byte 2: 'A'

 byte 3: 'O'

byte da 4 a 9: 16#00

 

In questo caso, le istruzioni sulle stringhe non lavorano correttamente.

 

La soluzione più semplice è sicuramente quella proposta da "Drugo66": dichiari la variabile collegata al Movicon come un array di caratteri, trasfrormi l'array di caratteri in stringa (il nome esatto dell'istruzione è "Chars_TO_Strg"), e poi utilizzi l'istruzione LEFT.

 


Si, avevo risposto appena sopra.
In realtà, se io aggiunto ad una VAT la stringa scritta da Movicon, mi trovo con la seguente situazione:

Byte 1 = 254 (massima lunghezza della stringa in decimale)

Byte 2 = 0 (lunghezza effettiva della stringa in decimale)

Byte 3 = nome_stringa[1] = 'C'
Byte 4 = nome_stringa[2] = 'I'
Byte 5 = nome_stringa[3] = 'A'
Byte 6 = nome_stringa[4] = 'O'

Quindi pare che Movicon non riesca a scrivere correttamente verso il PLC la lunghezza effettiva del contenuto della stringa, proprio perché il formato è evidentemente diverso o non è gestito correttamente il terminatore.

Come ho scritto anch'io nel precedente messaggio, credo sì che la soluzione di Drugo sia quella corretta.

Modificato: da Maverick85vr
Link al commento
Condividi su altri siti

io le uso normalmente le stringhe da movicon 11 con plc siemens, però su movicon punto sempre a +2 byte rispetto al plc. per esempio se la stringa é sul db 20 dal byte 0, in movicon punto l'indirizzo db20.dbb2 byte 18.

a me così é sempre andata

Link al commento
Condividi su altri siti

7 minuti fa, 84paolo scrisse:

io le uso normalmente le stringhe da movicon 11 con plc siemens, però su movicon punto sempre a +2 byte rispetto al plc. per esempio se la stringa é sul db 20 dal byte 0, in movicon punto l'indirizzo db20.dbb2 byte 18.

a me così é sempre andata


Ti ringrazio molto del suggerimento!
Proverò senz'altro.

Modificato: da Maverick85vr
Link al commento
Condividi su altri siti

20 minuti fa, 84paolo scrisse:

io le uso normalmente le stringhe da movicon 11 con plc siemens, però su movicon punto sempre a +2 byte rispetto al plc. per esempio se la stringa é sul db 20 dal byte 0, in movicon punto l'indirizzo db20.dbb2 byte 18.

a me così é sempre andata


Paolo, soltanto una precisazione:
se la mia stringa ha come indirizzo: %DB113.DBB2 (puntatore: P#DB113.DBX2.0)
tu intendi dirmi che l'indirizzo fisico della corrispondente variabile Movicon lo fai puntare a: %DB113.DBB4, dico bene?
Te lo chiedo perché non ho capito quel "byte 18" cosa significhi o se sottintendi che Movicon esegua qualche SWAP...

Grazie.

Link al commento
Condividi su altri siti

33 minuti fa, 84paolo scrisse:

io le uso normalmente le stringhe da movicon 11 con plc siemens, però su movicon punto sempre a +2 byte rispetto al plc. per esempio se la stringa é sul db 20 dal byte 0, in movicon punto l'indirizzo db20.dbb2 byte 18.

a me così é sempre andata

 Probabilmente non utilizzi l'operando LEFT sulla stringa letta che è il problema riscontrato da Maverick85vr , in quanto che Movicon non ti aggiornerebbe la lunghezza della stringa

Link al commento
Condividi su altri siti

Ciao a tutti.
Dunque, il problema è RISOLTO!
Condivido qui la soluzione applicata...magari può essere utile a qualcun altro in futuro.

Sostanzialmente, il problema era effettivamente tutto lato Movicon 11.6: mancava un segno di spunta nelle impostazioni del drive di comunicazione con il PLC, un flag che è necessario impostare a TRUE affinché il driver gestisca in maniera autonoma e corretta la lunghezza del contenuto della stringa.
Abilitato quello, il byte relativo al numero di caratteri attualmente contenuti nella stringa si è popolato con il valore corretto e tutto funziona come deve.

Grazie ancora a tutti per il supporto.
Siete stati gentilissimi. 😉

Modificato: da Maverick85vr
Link al commento
Condividi su altri siti

il 18/2/2019 at 19:50 , max.bocca scrisse:

Come lo identifica quell'opzione , magari c'è anche il altri scada e pannelli da tenere presente.


Ciao!

La dicitura dell'opzione ora come ora non sono in grado di scriverla in quanto al momento non ho lo SCADA disponibile, a ogni modo era un opzione che richiamava proprio il "management string", la gestione della stringa. Quest'opzione è all'interno delle proprietà del drive nel momento in cui lo si definisce e dall'. si fa proprio menzione del fatto che occorre settarla a TRUE affinché il sistema gestisca autonomamente in maniera corretta la lunghezza attuale della stringa.
Quando avrò modo di vederla, scriverò la dicitura corretta.

Grazie ancora a tutti.

Link al commento
Condividi su altri siti

Ciao a tutti.
Ho appena avuto modo di controllare: l'opzione in questione, in Movicon 11.6, è "manage stringh length"...da settare a TRUE se si vuole che sia gestita autonomamente dal sistema, in conformità col formato Siemens.

Link al commento
Condividi su altri siti

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...