Ecup Inserito: 18 dicembre 2007 Segnala Share Inserito: 18 dicembre 2007 Premessa: fino a qualche mese fa ho utilizzato sempre e solo SLC500, ma è giunta ora di passare a ControlLogix e mi trovo alle prese con la conversione di alcune parti di programma che considero standard e basilari per tutti i miei lavori (tant'è che sono fatte pressoché nello stesso modo su tutti i PLC).Il problema risiede nell'indirizzamento indiretto: dal mio supervisore mandavo all'SLC un comando tipo: -scrivi [$valore] nel file [$nr_file] alla word [$nr_word]-e nell'SLC (dopo i dovuti controlli) facevo un bel "MOV [$valore] N[$nr_file]:[$nr_word]"Ora i file N non ci sono più, e vabbé, sotto certi aspetti è anche meglio, ma per motivi di compatibilità nello scambio dati col supervisore (non uso OPC server) mi sono comunque mappato degli array come SLC Mapping sui rispettivi files (per intenderci, il vecchio file N7 è diventato un array N7[256])Il problema è che l'indirizzamento come prima non lo posso più fare!!! Cioé, posso accedere indirettamente all'indice dell'array, ma ma se ho bene capito (spero di aver capito male...) non c'è modo di accedere indirettamente alla variabile!!!Onestamente mi pare un passo indietro nella programmazione: possibile che non ci sia altro modo? Non c'è un'istruzione che mi restituisce, per esempio, la locazione di memoria di una determinata variabile, in modo tale che ci possa accedere per altre vie? Devo per forza scrivere il nome rininciando a qualsiasi possibilità di puntamento indiretto??? Link al commento Condividi su altri siti More sharing options...
Nazari Luca Inserita: 18 dicembre 2007 Segnala Share Inserita: 18 dicembre 2007 (modificato) Ciao.Se vuoi indirizzare una parola nel tuo arry puoi faro utilizando N[$nr_word]Se invece vuoi puntare come nell'esempio che hai riportato devi avere una matrice bidimensionale INT[10,10]. Per l'esempio che hai ripotato puoi farl nel seguente modo. MOV [$valore] N[$nr_file,$nr_word]Spero di essere stato chiaro.... Modificato: 18 dicembre 2007 da Nazari Luca Link al commento Condividi su altri siti More sharing options...
Henon Inserita: 19 dicembre 2007 Segnala Share Inserita: 19 dicembre 2007 Volevi dire questo forse ?Tu intendi accedere al indice di eventuali Data-File Per esempio: N7, N9,N10,N11, e quindi gli indici che tu intendi sono rispettivamente 7,9,10,11 (Questa è la Domanda )? (Ti serviva come un dataBase interno nel SLC ?)e Poi accedere al singolo elemento Word ad esempio N9:10 N9:100 etc ?e Possibilmente anche al SubElemento Boolean N9:10/1 oppure N9:100/15 ?Come ho letto, tu giustamente hai mappato in "Logic/Map PLC/SLC Messages...." il tuo Array N7[256] questo va benissimo (Quando vuoi accedere esternamente a tali elementi come valore N7 (tipo PanelView o interfacciarti con un SLC o PLC5))A cosa ti serve Mappare questi Array ?Forse per poterli accedere con PanelView300 o qualche altro modello, oppure perScambiarti dei dati con un SLC500, e quindi ti serve questa mappatura Logica ? In definitiva Per intenderci una cosa come questa (in SLC) ?XIC B3:1/2 OTE N[N200:0]:[N200:1]/[N200:2]Oppure cosi ?MOV N200:0 N[b3:1]: [b3:2] Potresti crearti un Array a 2 Dimensioni ad esempio N di INT[10,256]N[indice_File, Indice_Word] Dove : Indice_File (per N7 sarà Indice_File =7 ; per N9 sarà Indice_File =9 ) Indice_Word (l'indice esprime gli elementi da 0 a 256) Ecco una cosa che puoi fare:MOV N200[0] N[index_Elem,indexW] equivale MOV N200:0 N[b3:1]: [b3:2] nel SLC XIC B3[1].2 OTE N[index_Elem,indexW].[index_Bool]Equivale a XIC B3:1/2 OTE N[N200:0]:[N200:1]/[N200:2] nel SLC Ora ti sorgerà questo dilemma.Come faccio a metterli nella Mappatura Logica per interscambio dati con un SLC o PLC5 ? Per Leggere dagli elementi Mappati N7,N9 e poi trascriverli del Array usa:COP N7[0] N[0,0] 256 COP N9[0] N[9,0] 256 Per Scriverli negli elementi Mappati N7 e N9 usa :COP N[0,0] N7[0] 256 COP N[9,0] N9[0] 256 Ecco in questa maniera quando esternamente di serve aggiornare gli N7 oppure i N9,e nel contempo andare anche a leggere questi elementi, la procedura è la seguente:In Breve un esempio Rung 00 := COP N7[0] N[0,0] 256 COP N9[0] N[9,0] 256 ' Qui aggiorni Array da esternoRung 01 := MOV N9[0] N[index_Elem,indexW] ' Qui Operi un TrasferimentoRung 02 := XIC B3[1].2 OTE N[index_Elem,indexW].[index_Bool] ' Operazione BoolRung 03 := COP N[0,0] N7[0] 256 COP N[9,0] N9[0] 256 ' Qui Leggi esternamenti dal Array Una Curiosità a cosa ti deve servire, questa cosa qua ? Non Potevi gestire la stessa cosa in maniera più semplice, perché ti devi complicareLe cose in questa maniera?A volte è più conveniente rivedere la conversione, e rifarla in maniera più semplice usandoLe nuove potenzialità che il sistema ti offre. Se non ti serviva una mappatura Logica, poteva diventare cosi:Rung 00 := MOV N9[0] N[index_Elem,indexW] ' Qui Operi un TrasferimentoRung 01 := XIC B3[1].2 OTE N[index_Elem,indexW].[index_Bool] ' Operazione Bool Ciao e buon divertimento. Link al commento Condividi su altri siti More sharing options...
Ecup Inserita: 19 dicembre 2007 Autore Segnala Share Inserita: 19 dicembre 2007 Link al commento Condividi su altri siti More sharing options...
Henon Inserita: 19 dicembre 2007 Segnala Share Inserita: 19 dicembre 2007 Ho letto che utilizzi la medessima modalità di accesso, per SLC e S7.I quanto punti un Elemento in Memoria PLC : N X:Y dove X= Elemento DataBase (N7) e Y Elemento Word (N:10] == N7:10 DB X,Y dove X= Elemento DataBase (DB7) e Y Elemento Word (DBW10] == DB7:DBW10Bene nella Famiglia Logix è lo stesso N [X,Y] dove X= Elemento DataBase ( N[7,Y] ) e Y Elemento Word ( N[Y,10] ) == N[7,10]In pratica è la medesima Cosa.Se poi vuoi per forza usare la Mappatura Logica come SLC, non è conveniente, e a nulla ti Serve.Se hai Già scritto il Codice anche per S7, ti conviene Modificare semplicemente la Sintassi per per X..LogixUsi il Protocollo CIP oppure usi un OPC Server ? (Come RsLinx o KepServer o altri ? )Se usi RsLinx la Sintassi è facilissima, e non devi inventarti di usare i data-File Mappati come un SLC.Se ho un attimo di tempo cercerò di scoprire, se c'è qualche altra Via.Forse chiedendo alla Rockwell e spiegando questo problema, la prossima volta ti sistemerano il problema(Nella Prossima Release del RsLogix5000, chiedere e lecito) Link al commento Condividi su altri siti More sharing options...
Henon Inserita: 19 dicembre 2007 Segnala Share Inserita: 19 dicembre 2007 Puoi fare cosi :Ecco un esempio in cui ho creato solamenti 10 tags da N10 a N20 definite INT[256] e Mappate come Logica SLCN10N11N12N13N14N15N16N17N18N19N20Perciò puoi vedere questi dati tramite il Tuo Programma in C++Poi io ho fatto una piccola SubRoutine di Esempio per poter leggere o Scrive un Singolo Elemento in uno di QuestiTag da N10 a N20.ecco la SubRoutine in ST:(* Example for Read & Write Element to Matrix Matrix N10...N20 Whit N def INT[256] *) Sbr(Index1,Index2,Element_Inp,Write_Int,Read_Int); Error :=0;// Write data Element (Integer) to Matrixif Write_Int then case Index1 Of 10: N10[index2]:= Element_Inp; 11: N11[index2]:= Element_Inp; 12: N12[index2]:= Element_Inp; 13: N13[index2]:= Element_Inp; 14: N14[index2]:= Element_Inp; 15: N15[index2]:= Element_Inp; 16: N16[index2]:= Element_Inp; 17: N17[index2]:= Element_Inp; 18: N18[index2]:= Element_Inp; 19: N19[index2]:= Element_Inp; 20: N20[index2]:= Element_Inp; Else Error [:=]1; end_case; End_if;// Read data Element (Integer) from Matrixif Read_Int then case Index1 Of 10: Element_Out:= N10[index2]; 11: Element_Out:= N11[index2]; 12: Element_Out:= N12[index2]; 13: Element_Out:= N13[index2]; 14: Element_Out:= N14[index2]; 15: Element_Out:= N15[index2]; 16: Element_Out:= N16[index2]; 17: Element_Out:= N17[index2]; 18: Element_Out:= N18[index2]; 19: Element_Out:= N19[index2]; 20: Element_Out:= N20[index2]; Else Error [:=]2; end_case; End_if;Ret(Element_Out,Error); // Return the Element Output from MatrixTi Basta richiamare questa SubRoutine che sfrutta in CASE per poter eseguire le tue Operazioni di Lettura oppure di Scrittura.Richiamo SubRoutine in Ladder :JSR ArraytoMatrix 5 Index1 Index2 Element_Inp Write_Int Read_Int Element_Out Error Index1,Index2 : IntegerWrite_Int,Read_Int : BoolElement_Out, Element_Inp : IntegerError : IntegerSe ti fai anche una SubRoutine con una Lista di File N da 10 a 256 (Cioè molto Lunga)Il Risultanto è OK ed inoltre con istruzione Case non perdi velocità di elaborazione (Invece se lo facessi in Ladder SI)Richiamo della Stessa SubRoutine fatta in ST:JSR(ArraytoMatrix,5,Index1,Index2,Element_Inp,Write_Int,Read_Int,Element_Out,Errr); Se richiami questa SubRoutine anche da più parti eviti le Operazioni di Scrittura in Contemporanea"Race Condiction"Ciao. Link al commento Condividi su altri siti More sharing options...
Ecup Inserita: 20 dicembre 2007 Autore Segnala Share Inserita: 20 dicembre 2007 Ti ringrazio per l'impegno, comunque avevo già risolto anch'io facendo un CASE, solo che è una cosa "stupida": in SLC avevo la possibilità di fare un doppio indirizzamento indiretto e qui non posso... (cioè, posso ma solo con una matrice bidimensionale, il che non mi va bene per la modalità con cui accedo ai dati col supervisore)Per inciso, il problema non è tanto come accedo al PLC da supervisore... il problema è che sono solito, da supervisore, mandare istruzioni tipo:-scrivi [$valore] nel file [$nr_file] alla word [$nr_word]o al limite:-scrivi [$valore] all'indirizzo di memoria [$nr_%M]Cn RSLogix5000 il primo non lo posso fare perché non esiste [$nr_file] (ho risolto con un CASE ma non mi fa impazzire), e il secondo non mi risulta si possa fare perché non c'è (se c'è non l'ho ancora trovata) modo di ricavare un indirizzo di memoria della variabile.Ora vedo se affrontare il problema per altre vie, tipo riorganizzare tutti i dati su matrice bidimensionale, e accedere dal supervisore in un altro modo (devo interpellare il mio collaboratore esperto della parte Visual C / comunicazione)grazie ancora e ciao 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