sctdev Inserito: 11 maggio 2012 Segnala Share Inserito: 11 maggio 2012 Ciao a tutti, nei diversi tutorial che ho letto non ho trovato molto riguardo operazioni su stringhe. Quello che vorrei fare io è utilizzare una stringa come simbolo per accedere ad un indirizzo fisico. Esempio: ho il simbolo "bit0" per l'indirizzo M0.0 tramite una stringa che memorizza "bit0" posso accedere a M0.0??? Link al commento Condividi su altri siti More sharing options...
batta Inserita: 12 maggio 2012 Segnala Share Inserita: 12 maggio 2012 Ci si può riuscire, ma la strada è molto lunga. Non ne capisco però l'utilità. Link al commento Condividi su altri siti More sharing options...
sctdev Inserita: 22 giugno 2012 Autore Segnala Share Inserita: 22 giugno 2012 Innanzi tutto grazie per la risposta... avevo quasi perso la speranza visto che mi sono messo in contatto con tecnici della siemens i quali mi hanno riferito che attualmente non è possibile. L'utilità più o meno è la seguente. Supponiamo che io debba gestire un impianto costituito da un insieme di macchine: -a macchine uguali associo strutture dati uguali ==> macchine diverse avranno struttura dati diversa di lunghezza diversa -creo quindi una db costituita da una variabile per ogni macchina. tale variabile avrà come tipo la struttura di cui sopra e il nome della macchina. -accedo ai dati tramite db.macchina.campo dove db,macchina e campo sono stringhe. quello che voglio è fare un ciclo per iterare su tutte le macchine, ad esempio per controllare un bit (campo) comune a tutte. chiaramente solo il nome (simbolo) sarà comune, in quanto se le strutture hanno lunghezza differente, campi comuni avranno offset differente all'interno della struttura. sono stato abbastanza chiaro? ti viene in mente un modo per ottenere quello che vorrei? Grazie di nuovo Saluti Link al commento Condividi su altri siti More sharing options...
jake Inserita: 26 giugno 2012 Segnala Share Inserita: 26 giugno 2012 Ciao sctdev, quello che voglio è fare un ciclo per iterare su tutte le macchine, ad esempio per controllare un bit (campo) comune a tutte. Secondo me, invece che usare le stringhe è meglio se usi una variabile numerica di tipo intero o double con la quale puoi semplicemente fare l'iterazione che dici; se poi hai bisogno di visualizzare a pannello operatore o scada la stringa relativa alla macchina, sempre usando l'indice ti puoi fare una lista con i nomi delle macchine. Good Luck, Jake Link al commento Condividi su altri siti More sharing options...
sctdev Inserita: 27 giugno 2012 Autore Segnala Share Inserita: 27 giugno 2012 scusa ma non ho capito quello che intendi...come dovrei utilizzare la variabile numerica? Link al commento Condividi su altri siti More sharing options...
jake Inserita: 27 giugno 2012 Segnala Share Inserita: 27 giugno 2012 Se ho capito bene, la tua intenzione è quella di avere delle stringhe contenenti voci del tipo: macchina 1, macchina 2 ecc ; dopo vorresti fare dei controlli sulle stringhe per capire a quale elemnto ti riferisci es. IF stringa1=='macchina 1' THEN istruzioni...... giusto? Bene, quello che intendo io è: variabile numerica 1 ---> macchina 1 2 --->macchina 2 n --> macchina n In questo caso potresti usare un'istruzione CASE, oppure un ciclo FOR o quello che vuoi tu occupando molto meno spazio in memoria di una stringa e lavorando in modo più semplice e pulito. Poi magari non ho capito quello che devi fare e allora ti stò dando dei consigli sbagliati... non so, prova a descrivere meglio ciò che devi fare. Good Luck, Jake Link al commento Condividi su altri siti More sharing options...
sctdev Inserita: 2 luglio 2012 Autore Segnala Share Inserita: 2 luglio 2012 Ringrazio per la disponibilità mostrata e in effetti mi rendo conto di non essere stato chiarissimo. Ii modi in cui potrei usare l'indirizzamento tramite stringa sono molteplici.... procediamo con ordine. Il seguente è il primo caso da cui trarrei beneficio: Ho n macchine uguali: macchina1,...macchinan. Supponiamo che per ogni macchina mi interessi monitorare se è alimentata elettricamente e lo stato di funzionamento (marcia/arresto). Per ogni macchina ho 2 ingressi digitali che mi danno questa informazione a cui associo i simboli macchinax_alimentata e macchinax_inmarcia. Voglio memorizzare tali dati in una struttura i cui campi sono per l'appunto: alimentata e inmarcia. Di conseguenza avrò una db 'macchine' composta da n istanze di struttura (macchina1,...,macchinan) e ad esempio, per la prima macchina, potrò accedere in un secondo momento allo stato degli ingressi, tramite macchina1.alimentata e macchina1.inmarcia. Adesso, quello che voglio, è scrivere una funzione che: -una volta definiti i simboli per gli ingressi (macchina1_alimentata,macchina1_inmarca,....,macchinan_alimentata,macchinan_inmarcia) e -una volta definita la db con le istanze di struttura (macchina1,...,macchinan) mi memorizzi gli ingressi nella db in maniera automatica, senza specificare gli indirizzi per ogni macchina. Link al commento Condividi su altri siti More sharing options...
Federico Milan Inserita: 3 luglio 2012 Segnala Share Inserita: 3 luglio 2012 (modificato) Se comprendo bene la tua struttura, quanto vuoi realizzare è fattibile, ovviamente è necessario un compromesso, in quanto le stringhe non son proprio il miglior dei modi. Le stringhe le puoi usare per identificare il tuo oggetto, magari lato supervisione ... sebbene poi per la ricerca indicizzata, lato PLC, convenga usare dei numeri - interi - ... Per i puntamenti, parlando di Siemens, a mio avviso conviene utilizzare il formato di Siemens ossia gli Any ! ovvio si possono usare anche i puntatori, dipende sempre fino a che punto ci si vuole spingere. Nulla toglie che puoi usare una stringa per identificare il tag in modo simbolico, ma questo lato PLC non è certo conveniente, ... considera poi il fatto che non si conosce la tua struttura, stiamo tutti ipotizando una soluzione. ciao Modificato: 3 luglio 2012 da Federico Milan Link al commento Condividi su altri siti More sharing options...
jake Inserita: 3 luglio 2012 Segnala Share Inserita: 3 luglio 2012 è necessario un compromesso, in quanto le stringhe non son proprio il miglior dei modi. Le stringhe le puoi usare per identificare il tuo oggetto, magari lato supervisione ... sebbene poi per la ricerca indicizzata, lato PLC, convenga usare dei numeri - interi - ... Questo spiega ciò che volevo esprimere nel mio vecchio post. Per la ricerca indicizzata è meglio utilizzare una variabile di tipo intera piuttosto che una stringa. Good Luck, Jake Link al commento Condividi su altri siti More sharing options...
sctdev Inserita: 6 agosto 2012 Autore Segnala Share Inserita: 6 agosto 2012 macchine DB 1 DB 1 var1_macchina1 E 0.0 BOOL var2_macchina1 E 0.1 BOOL var3_macchina1 E 0.2 BOOL var1_macchina2 E 0.3 BOOL var2_macchina2 E 0.4 BOOL var3_macchina2 E 0.5 BOOL var1_macchina3 E 0.6 BOOL var2_macchina3 E 0.7 BOOL var3_macchina3 E 1.0 BOOL var1_macchina4 E 1.1 BOOL var3_macchina4 E 1.2 BOOL var1_macchina5 E 1.3 BOOL var3_macchina5 E 1.4 BOOL var1_macchina6 E 1.5 BOOL var3_macchina6 E 1.6 BOOL var2_macchina7 E 1.7 BOOL var4_macchina7 E 2.0 BOOL var2_macchina8 E 2.1 BOOL var4_macchina8 E 2.2 BOOL Link al commento Condividi su altri siti More sharing options...
sctdev Inserita: 6 agosto 2012 Autore Segnala Share Inserita: 6 agosto 2012 in allegato alcuni screen shot di un programma di esempio (molto semplificato) di quello che vorrei ottenere. abbiamo 3 strutture che definiscono 3 tipi di macchina differenti. una tabella dei simboli per gli ingressi. una db che contiene tutte le macchine. nel FC1 abbiamo istruzioni che assegnano ai campi delle strutture delle macchine memorizzate nella db gli ingressi (simboli), e in particolare sono presenti solo le istruzioni per l'assegnamento a macchine di tipo struct1. Io quello che vorrei ottenere è assegnare i valori automaticamente (tramite un ciclo per esempio) e non scrivendo le stesse istruzioni per le 3 macchine. Ad esempio, mettendo tutte le macchine dello stesso tipo su una db dedicata, come potrei effettuare gli assegnamenti in maniera automatica? NB: non è detto che gli indirizzi degli ingressi siano consecutivi in memoria come da esempio, di qui l'idea di utilizzare stringhe... Potete farmi degli esempi che spieghino quanto da voi consigliato? Scusate ma non credo di averlo capito.... Grazie Saluti Link al commento Condividi su altri siti More sharing options...
LudB Inserita: 9 agosto 2012 Segnala Share Inserita: 9 agosto 2012 (modificato) Devo essere sincero non ho ben capito la tua domanda, nel senso che stento a capire perché si debba ricorrere a delle stringhe che simbolicamente individuano delle aree di memoria... visto che esiste la tabella simboli per quello... Ti faccio un esempio di un progettino da me fatto per gestire quattro apparati concettualmente e funzionalmente identici (stessi ingressi, uscite, set point, e parametri funzionali vari). L'apparato generico ha: - due input digitali; - due output digitali; - in input analogico; - vari parametri di gestione da scada (set point, ora di avvio, durata della marcia...). Ogni input e output verrà cablato ad un ingresso X.Y a me ignoto... Tutti i parametri gestiti da scada vanno in una bella DB di indirizzo variabile che però ha la stessa identica struttura dati per ogni apparato. Ho creato una FC che gestisce il generico apparato. La FC ha degli input/output, per cui ad esempio internamente alla FC ho un parametro chiamato #SetPoint, una #DB_Gestione... e poi bisogna lavorare coi puntatori ove necessita... quando nell'OB1 richiamo la FC gli passo il valore che voglio: ad es.: SetPoint := IngressoAnalogicoApparato1 DB_Gestione := DB_Apparato1 e poi nella tabella simboli l'IngressoAnalogicoApparato1 è EWXY... Perché bisogna dire che Step7 ti dà la possibilità di effettuare il cosidetto ricablaggio, ovvero mantenere i simboli e cambiare gli indirizzi ingressi/uscite corrispondenti... Per cui esemplificando alla buona, cosiderando il tuo caso: Tu hai: U "var1_macchina1" ="macchina".macchina1.var1 U "var2_macchina1" ="macchina".macchina1.var2 U "var3_macchina1" ="macchina".macchina1.var3 U "var1_macchina2" ="macchina".macchina2.var1 U "var2_macchina2" ="macchina".macchina2.var2 U "var3_macchina2" ="macchina".macchina2.var3 U "var1_macchina3" ="macchina".macchina3.var1 U "var2_macchina3" ="macchina".macchina3.var2 U "var3_macchina3" ="macchina".macchina3.var3 Per me potresti fare supposto di creare un DB per ogni macchina e inizializzare: Macchina1 = DB1 Macchina2 = DB2 Macchina3 = DB9 Creare una FC detta FC1 come la seguente (sappi che lavoro in AWL e i parametri in ingresso vanno settati in alto, per cui gli input non sono in awl... e in STL non so programmare... // parte di dichiarazione pseudo-codice... input #var1 type bool input #var2 type bool input #var3 type bool input #DB type int // codice in AWL vero e proprio AUF DB [#N_DB] L P#DBX 0.0 LAR1 U #var1 = DBX[Ar1,P#0.0] U #var2 = DBX[Ar1,P#0.1] U #var3 = DBX[Ar1,P#0.2] poi in OB1 //chiamo la fc1 per la macchina1 Call FC1 var1 := var1.macchina1 var2 := var2.macchina1 var3 := var3.macchina1 db := 1 //poi chiamo per la macchina 2 Call FC1 var1 := var1.macchina2 var2 := var2.macchina2 var3 := var3.macchina2 db := 2 //poi chiamo per la macchina 3 // notare che la macchina3 ha db9 perché così l'ho deciso io.... Call FC1 var1 := var1.macchina3 var2 := var2.macchina3 var3 := var3.macchina3 db := 9 Ah e una cosa simile la posso fare benissimo sui merker, passando alla funzione un puntatore all'area merker dove lavorare... Non so se sono stato chiaro... Modificato: 9 agosto 2012 da LudB Link al commento Condividi su altri siti More sharing options...
LudB Inserita: 9 agosto 2012 Segnala Share Inserita: 9 agosto 2012 Ah una piccola nota a margine che forse quì stiamo dando per scontato, ma il neofita sctdev magari non comprende... In Step7 c'è la tabella simboli. Ok. La tabella simboli è un artificio di Step7 per aiutare il programmatore... per il PLC non esiste alcun simbolo! Il PLC vede solo indirizzi di aree di memoria, che siano Merker, DB, o immagini degli ingresso e delle uscite poco cambia... Il simbolo rimane sempre e solo sul PC del programmatore che ha la tabella simboli; prendendo un altro PC di programmazione il cosidetto PG (ProgrammierGerät) senza tabella simboli... si vedono solo aree di memoria... e vattelapesca cosa siano, cosa indichino e a cosa servano... Mai successo di dover intervenire su un PLC programmato da altri in totale assenza di ogni supporto (documentazione, sorgenti...) ??? No?? Allora conviene fare questo semplice test: - caricare un bel programma dotato di tabella simboli sul plc. - chiudere il progetto. - aprire un nuovo progetto vergine. - scaricare il PLC sul PG. - cercare di capire che diavolo fa il programma. - dopo aver preso un bel malditesta, importare la tabella simboli dal progetto originario... Questo per dire che non vorrei che la domanda di sctdev, nascesse da un confusione concettuale sulla relazione tra il simbolo e sua rappresentazione mediante stringa di caratteri... per cui il simbolo 'indicizzato', ed es.: motore1, motore2, motore3, ha senso solo per il programmatore, ma non ha alcun senso sequnziale nè per il PLC nè per Step7... per cui una relazione sequenziale si può ottenere solo come associazione (nella mente del programmatore) di simboli sequanziali ad aree di memoria sequanziali... Cioè: motore1 = DB1, motore2 = DB2, ... allora la cosa diventa gestibile dal punto di vista della programmazione di un PLC siemens... Per quello sctdev tutti quì ti consigliano indici numerici... l'indice numerico individua l'area di memoria... Non è forse questo che tutti i precedenti interventi sotto-sotto intendevano dire? Correggetemi se mi sbaglio. Spero di aver centrato il vero problema... Link al commento Condividi su altri siti More sharing options...
sctdev Inserita: 27 agosto 2012 Autore Segnala Share Inserita: 27 agosto 2012 poi in OB1 //chiamo la fc1 per la macchina1 Call FC1 var1 := var1.macchina1 var2 := var2.macchina1 var3 := var3.macchina1 db := 1 //poi chiamo per la macchina 2 Call FC1 var1 := var1.macchina2 var2 := var2.macchina2 var3 := var3.macchina2 db := 2 //poi chiamo per la macchina 3 // notare che la macchina3 ha db9 perché così l'ho deciso io.... Call FC1 var1 := var1.macchina3 var2 := var2.macchina3 var3 := var3.macchina3 db := 9 Ah e una cosa simile la posso fare benissimo sui merker, passando alla funzione un puntatore all'area merker dove lavorare... Non so se sono stato chiaro... Sei stato chiarissimo, quello che vorrei ottenere io è però evitare di scrivere manualmente le stesse istruzioni per tutte le macchine (che potrebbero essere più di 100). per questo mi sembra che un approccio a funzione non viene incontro alle mie esigenze. In realtà quello che servirebbe a me è risolvere gli indirizzi assegnati ai simboli a runtime. In questo modo potrei scrivere una funzione per ogni tipo di macchina che prende in input solo il nome della macchina. All'interno della funzione potrei assegnare alle aree di memoria delle db i simboli degli ingressi, accedendo a questultimi con una concatenzione di stringhe del tipo: U nome_macchina + ".var1" ="db1." + nome_macchina + ".var1" dove + rappresenterebbe la concatenazione tra stringhe. in questo modo, per leggere tutti gli ingressi e memorizzarli in un formato a me comodo per la programmazione (all'interno di db strutturate) mi basterebbe scrivere una funzione per ogni tipo di macchina, e richiamare tali funzioni in sole due righe di codice... Dall'ultima tua risposta però mi sembra di capire che questo non si può fare, vero? Link al commento Condividi su altri siti More sharing options...
LudB Inserita: 29 agosto 2012 Segnala Share Inserita: 29 agosto 2012 Dall'esperienza che ho io risolvere gli indirizzi assegnati ai simboli a runtime è una cosa impensabile. Sottolineo di nuovo che secondo me, anche in Step7 (cioè nella semplice interfaccia di programmazione) non viene "risolto il simbolo in un indirizzo" al momento del salvataggio del codice sorgente, ma istantaneamente tradotto l'indirizzo in un simbolo attingendo alla tabella simboli (al momento dell'apertura del blocco di codice). Step7 sotto sotto lavora sempre e solo con gli indirizzi, anche quando uno lo configura per vedere i simboli... Figuramoci poi dentro la memoria del PLC, lì i simboli non esistono proprio. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora