baltimora Inserita: 16 maggio 2009 Segnala Inserita: 16 maggio 2009 (modificato) Perdonami, ma non riesco proprio a capire,Avevo già visto l' _help, ma nonostante tutto non sono riuscito a schiarirmi le idee, forse mi sfugge qualcosa.I registri dello zelio sono i seguenti:LadderFBDOra ciò che non riesco a comprendere, ipotizzando che ho realizzato il mio soft in ladder, e che voglio leggere lo sato degli ingressi, il registro da utilizzare è il 3XX20 che presuppongo sia il 30020. Questo significa che questo è il primo registro? e l'ultimo è il 4xx35 che presuppongo significa 40035? oppure non è cosi?Pertanto nella configurazione di Xcomm alla voce modbus andress cosa devo inserire il numero 1 che significa che voglio partire dal primo registro? Nel codice in Visual Basic, visto che nell'_help, non ho trovato nulla che spiegasse i comandi dell'oggetto modbusRTU, come devo scrivere il codice per leggere il ad esempio lo stato delle uscite e pertanto il registro 3XX22? che dovrebbe essere 30022?Nell'esempio c'è il seguente codice:Label1(3).Caption = ModbusRTU1.BitRead.Bit(0)dove ModbusRTU1 è l'oggettoBitRead è il comando di letturaBit(0) è il bit da leggere, ma non mi è chiaro come identifica il registro da leggere, in quanto potrebbe essere il primo bit del registro 3xx20 come il primo bit del registro 3xx22.Ciao Modificato: 16 maggio 2009 da baltimora
del_user_56966 Inserita: 16 maggio 2009 Segnala Inserita: 16 maggio 2009 Ora ciò che non riesco a comprendere, ipotizzando che ho realizzato il mio soft in ladder, e che voglio leggere lo sato degli ingressi, il registro da utilizzare è il 3XX20 che presuppongo sia il 30020. Questo significa che questo è il primo registro? e l'ultimo è il 4xx35 che presuppongo significa 40035? oppure non è cosi?Pertanto nella configurazione di Xcomm alla voce modbus andress cosa devo inserire il numero 1 che significa che voglio partire dal primo registro?No, potrebbe essere semplicemente che 3xx sia un suffisso e che il registro sia il 20 quindi lo start address è = 20 mentre il numero di registri da leggere è 4Nell'esempio c'è il seguente codice:Label1(3).Caption = ModbusRTU1.BitRead.Bit(0)doveModbusRTU1 è l'oggettoBitRead è il comando di letturaBit(0) è il bit da leggere,ma non mi è chiaro come identifica il registro da leggere, in quanto potrebbe essere il primo bit del registro 3xx20 come il primo bit del registro 3xx22.CiaoNel demo c'è scritto "Continua fino a 255" quindi penso faccia riferimento alla lettura a Bit, che si può impostare tra i vari comandi selezionabili,in questo caso però devi leggere l'area coil che nello schema dello zelio non vedo ?
del_user_56966 Inserita: 16 maggio 2009 Segnala Inserita: 16 maggio 2009 Se al contrario vuoi utilizzare un singolo Bit dei 4 registri dello Zelio potresti semplicemente utilizzarel'oggetto "Word to Bit" a cui passi il registro letto e ti ritorna il valore di ogni singolo Bit di questo...Oppure lo ricavi direttamente da VB tramite codice!In ogni caso l'oggetto Modbus RTU può essere bypassato andando a scrivere i comandi da codice, ma come ti dicevo è un livello più basso di utilizzo anche se ti svincola dall'oggetto già pronto!..
baltimora Inserita: 16 maggio 2009 Segnala Inserita: 16 maggio 2009 (modificato) in questo caso però devi leggere l'area coil che nello schema dello zelio non vedo ?Se non ho compreso male è il registro 22 a16 bit che va da Q1 a QAed il registro 23 che va da QB a QGDai un'occiata anche a questo linkregistri zelio modbusCredo che 3xx sia un suffisso come da te detto, perchè ho provato ad inserire come registro di partenza 20, ed ora ho ottenuto una risposta dal plc. Solo che la risposta è in word, e non riesco ad ottenere una risposta in bit.Ho creato 4 texbox 1 per ogni registro e vedo in esso variare un valore in base agli ingressi o uscite che attivo.Il valore che vedo nelle texbox "word", è in esadecimale a 16 bit?Se si come si converte matematicamente in bit?E se volessi utilizzare l'oggetto wordtobit come si utilizza?Potresti farmi un piccolo esempio a livello di codice?Grazie Modificato: 16 maggio 2009 da baltimora
del_user_56966 Inserita: 16 maggio 2009 Segnala Inserita: 16 maggio 2009 In effetti sembra che lo zelio non supporti l'area Coil (comandi 1 e 2 del modbus quindi niente da fare!questi sono i soli comandi supportati,Fonctions Modbus supportées0306102BRead multiple registers ® N x 16 bits (Word)Write single register (W) 16 bits (Word)Write multiple registers (W) N x 16 bits (Word)Read device identification ® ASCII string/Chaine ASCIIper l'esempio appena posso te lo invio!..
del_user_56966 Inserita: 17 maggio 2009 Segnala Inserita: 17 maggio 2009 Allora ho dato un occhiata, in effetti l'oggetto Word to bit non è adatto fa la codifica a bit ma solo da Dati letti direttamente da PLC e da SMS... Il comando invece che può essere utile è contenuto nell'oggetto XComm ++ e si chiama WordDecode,XComm1.WordDecode (Word da decodificare).Bit0 ritorna il valore del bit 0''XComm1.WordDecode (Word da decodificare).Bit15 ritorna il valore del bit 15tutto qui!..
baltimora Inserita: 17 maggio 2009 Segnala Inserita: 17 maggio 2009 (modificato) Ciao, Come indentifico la word?Va bene qualcosa del genere? Label1(0).Caption = XComm1.WordDecode(ModbusRTU1.Read.Register(1)).BIT0 Label1(1).Caption = XComm1.WordDecode(ModbusRTU1.Read.Register(1)).BIT1 " " Label1(14).Caption = XComm1.WordDecode(ModbusRTU1.Read.Register(1)).BIT14Grazie per il tuo aiuto Modificato: 17 maggio 2009 da baltimora
del_user_56966 Inserita: 17 maggio 2009 Segnala Inserita: 17 maggio 2009 Si penso vada bene, ma è poco leggibile per la manutenzione futuraio farei cosi...Dim Word(100) as long ' - Creo un array Word(1) = ModbusRTU1.Read.Register(1) ' - leggo la prima word dall'oggetto Modbus RTU Word(2) = ModbusRTU1.Read.Register(2) ' - leggo la seconda word dall'oggetto Modbus RTU Label1(1).Caption = XComm1.WordDecode(Word(1)).BIT0 ' Leggo lo stato del Bit 0 dalla prima Word ' ' Label1(15).Caption = XComm1.WordDecode(Word(1)).BIT15 ' Leggo lo stato del Bit 15 dalla prima Word Label2(1).Caption = XComm1.WordDecode(Word(2)).BIT0 ' Leggo lo stato del Bit 0 dalla seconda Word ' ' Label2(15).Caption = XComm1.WordDecode(Word(2)).BIT15 ' Leggo lo stato del Bit 15 dalla seconda Word
baltimora Inserita: 18 maggio 2009 Segnala Inserita: 18 maggio 2009 (modificato) GRANDE ALENFunziona tutto a meraviglia.....Per leggere ora gli altri registri, il 32,33,34,35 e 48 come si procede?é sufficiente inserire nell'oggetto ModBusRTU un numero maggiore di registri da leggere?Ad esempio ora ho inserito come registro di partenza il 20, e 4 registri da leggere, (20,21,22,23) se voglio leggere il registro 48, inserico nell'oggetto ModBusRTU 16?GrazieP.S. Ma Reverendo bit che fine ha fatto? Ha gettato la spugna? Modificato: 18 maggio 2009 da baltimora
del_user_56966 Inserita: 18 maggio 2009 Segnala Inserita: 18 maggio 2009 é sufficiente inserire nell'oggetto ModBusRTU un numero maggiore di registri da leggere?Lo standard prevede la lettura fino a 128 registri contemporanei vedi tu...
Reverendo bit Inserita: 19 maggio 2009 Autore Segnala Inserita: 19 maggio 2009 P.S. Ma Reverendo bit che fine ha fatto? Ha gettato la spugna?Per niente ragazzi vi seguo sempre, ma per adesso non posso dedicare molto tempo Spero di raggiungervi presto e comunque concordo con Baltimora GRANDE ALEN.
baltimora Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 (modificato) Ora che ho compreso come leggere le word, mi piacerebbe capire anche come scriverle.Nell'esempio che hai postato, ho visto che esiste un'istruzione per scrivere una word.ModbusRTU1.WriteRegister 704, 0non ho ben compreso come utilizzarla.704 cosa significa? è il registro da scrivere? e 0 è il valore del bit da scrivere? ma quale dei 16 bit che compongono il registro?L_help in merito non mi è stato di grande aiuto.WriteRegister dati richiesti: Address = Indirizzo del bit da scrivere Value = Valore da scrivere - dato LongGrazie Modificato: 21 maggio 2009 da baltimora
del_user_56966 Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 704 cosa significa? è il registro da scrivere? e 0 è il valore del bit da scrivere? ma quale dei 16 bit che compongono il registro?Il modbus a comandi separati per la scrittura dei singoli Bit e per la scrittura delle word a 16 Bit...vuoi che veda il demo per capire come usare il comando?
baltimora Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 (modificato) vuoi che veda il demo per capire come usare il comando?Sicuramente non mi dispiacerebbe avere un ulteriore aiutino.......Poi se un giorno ti dovesse capitare di venire in calabria........La cena è assicurata.......... Modificato: 21 maggio 2009 da baltimora
del_user_56966 Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 Poi se un giorno ti dovesse capitare di venire in calabria........La cena è assicurata........Se mi prendi per la gola non vale... Comunque mi sembra di una semplicità estrema, ModbusRTU1.WriteRegister (Numero registro), (valore da scrivere).....................devi mettere un valore tra 0 è 65535per scriver un Bit l'istruzione è WriteBit (Numero Coil), (valore da scrivere).........mentre qui devi mettere un valore tra 1 e 0
del_user_56966 Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 Fai attenzione però perché il Twido non mi sembra che supporti la scrittura a Bit...
baltimora Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 Se mi prendi per la gola non vale...Be, l'invito è fatto come si suol dire "di cuore....." e vale per davvero...... Comunque mi sembra di una semplicità estrema,Il problema è che io non conosco minimamente il protocollo modbusInfatti non ho compreso cosa intendi dire.devi mettere un valore tra 0 è 65535Come identifico il bit del registro che voglio scrivere?Ad esempio se voglio portare ad 1 il primo bit del registro 48 che porta in run il plc come devo fare, tenedo confo che non posso scrivere il singolo bit, visto che non è supportata la scrittura a bit?ciao
del_user_56966 Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 Come identifico il bit del registro che voglio scrivere?Il Bit da scrivere nel caso il prodotto non supporti i comando 05 del protocollo Modbusva gestito prima dell'invio, quindi la procedura è questa, devi leggere il valore contenuto nel registro, agire solo i bit che vuoi modificare e quindi scrivere il nuovo risultato nel registro,per esempio:se leggi il valore 7 significa che i Bit 0 (valore 1), Bit 1 (valore 2) e Bit 2 (valore 4) sono attivi...mettiamo che tu decida di mettere a zero il primo bit dal valore 7 dovrai togliere il valore di questo bit,quindi avrai 7-1= 6 questo è il valore che va scritto nel registro per azzerare il Bit 0 lasciando attivi i Bit 1 e 2...Spero di essere stato chiaro...
baltimora Inserita: 21 maggio 2009 Segnala Inserita: 21 maggio 2009 Quindi se ho capito bene dovrebbe essere così:Se voglio scrivere il registo ad esempio 23 col comando 03 effettuo la lettura del registro che potrebbe darmi ad esempio 1000101000000001ora se voglio portare ad 1 il 6 bit ottengo una word 1000111000000001.Quindi scrivo:ModbusRTU1.WriteRegister "n° registro", "valore da scrivere"dove n° registro è il 23 ed il valore da scrivere sarebbe 1000111000000001 convertito in word. (è corretto)?Ora il mio problema è questo: Come converto il valore binario in word? Posso usare questa istruzione?XComm1.ByteDecode?Quale è la giusta sintassi? Grazie
Reverendo bit Inserita: 22 maggio 2009 Autore Segnala Inserita: 22 maggio 2009 Ciao ragazzi.Finalmente sono riuscito a dedicare un po’ di tempo al discorso MODBUS, innanzi tutto sono riuscito a testare il modulo ed il convertitore verificando l’ottimo funzionamento dell’HW.Il programmino che ho usato (di cui sto preparando una cartella con un esempio esplicativo da inserire nella sezione Up/Download) ti permette di impostare una stringa modbus in esadecimale inviarla e di leggere la stringa di risposta del modulo, che sarà sempre in esadecimale ma facendo una conversione in binario si può risalire allo stato di ogni singolo bitCome identifico il bit del registro che voglio scrivere?Ad esempio se voglio portare ad 1 il primo bit del registro 48 che porta in run il plc come devo fare, tenedo confo che non posso scrivere il singolo bit, visto chenon è supportata la scrittura a bit?Ho verificato inviando il comando al bit di Run (con il modulo in stop) ma non funzione mi restituisce un errore “80”, e lo stesso risultato si ottiene con il procedimento inverso e cioè cercando di mettere in stop lo ZelioMa baltimora sei sicuro di poter mette in Run o in Stop lo Zelio?Adesso devo riprendendo tutti i post arretrati e fare le stesse prove con ABS ho avuto qualche problema nell’impostazione del codiceBaltimora potresti postare il codice che hai usato?Ora il mio problema è questo: Come converto il valore binario in word?Con la cacolatrice scentifica che trovi su Start>Programmi >accessori puoi fare tutte le conversione che vuoiCiao Reverendo bit
baltimora Inserita: 22 maggio 2009 Segnala Inserita: 22 maggio 2009 No, il modulo non puo essere portato in run o stop mediante la modifica dell'apposito registro in quanto è di solo lettura.Il mio era solo un esempio per capire come utilizzare il protocollo.Gli unici registri che possono essere scritti sullo dezlio in modalità ladder, che è quella che ho utilizzato io, sono quelli del datario + ora.Con la cacolatrice scentifica che trovi su Start>Programmi >accessori puoi fare tutte le conversione che vuoiNon mi sebra il massimo come soluzione, ho trovato un modo migliore a livello di codice VB per farlo, ed è davvero efficiente.Appena posso posto tutto il codice. (Forse in serata)Ciao
baltimora Inserita: 24 maggio 2009 Segnala Inserita: 24 maggio 2009 (modificato) Ecco il codice per effettuare le conversioni.I valori della word, come da precedente post di ALEN vanno da 0 a 65535, e pertanto è in numerazione decimale.Per convertire la word in bit:Private Sub Command1_Click(Index As Integer) Dim P As Long p = ModbusRTU1.Read.Register(1) 'leggo il valore della word del primo registro AdvDisplay1(0).Text = (p And 1) 'estraggo il primo bit e lo scrivo in una casella di testo AdvDisplay1(1).Text = (p And 2) / 2 'estraggo il secondo bit AdvDisplay1(2).Text = (p And 4) / 4 AdvDisplay1(3).Text = (p And 8) / 8 AdvDisplay1(4).Text = (p And 16) / 16 AdvDisplay1(5).Text = (p And 32) / 32 AdvDisplay1(6).Text = (p And 64) / 64 AdvDisplay1(7).Text = (p And 128) / 128 AdvDisplay1(8).Text = (p And 256) / 256 AdvDisplay1(9).Text = (p And 512) / 512 AdvDisplay1(10).Text = (p And 1024) / 1024 AdvDisplay1(11).Text = (p And 2048) / 2048 AdvDisplay1(12).Text = (p And 4096) / 4096 AdvDisplay1(13).Text = (p And 8192) / 8192 AdvDisplay1(14).Text = (p And 16384) / 16384 AdvDisplay1(15).Text = (p And 32768) / 32768 'estraggo il sedicesimo bit 'P= è la variabile che contiene il valore della Word letta End Sub Per convertire bit in word: Private Sub Forza1_Click() Dim i As Long Dim n As Long n = 0 For i = 0 To 15 n = n + Check1(i).Value * (2 ^ i) Next Wordrw.Text = n ModbusRTU1.WriteRegister 22, n '22 è il registro da scrivere, n è la word da scrivere. End Sub Il controllo/oggetto "Check1" è l'array che contiene i singoli valori dei bit, che puoi modificarlo con qual'unque altro array in base alle tue esigenze.Se non ti è chiaro qualche cosa scrivi..... Modificato: 24 maggio 2009 da baltimora
del_user_56966 Inserita: 25 maggio 2009 Segnala Inserita: 25 maggio 2009 Il controllo/oggetto "Check1" è l'array che contiene i singoli valori dei bit, che puoi modificarlo con qual'unque altro array in base alle tue esigenze.Vedo che sei pienamente entrato nell'argomento...
baltimora Inserita: 25 maggio 2009 Segnala Inserita: 25 maggio 2009 Grazie, vuol dire che qualcuno ha saputo indicarmi la strada giusta......P.S. Avanzi sempre la cena.....
Reverendo bit Inserita: 25 maggio 2009 Autore Segnala Inserita: 25 maggio 2009 Ciao RagazziBravo baltimora naturalmente senza togliere merito ad Alenho ripreso oggi ma sono rimasto un po indietro apparte le mie lacune di base mi servirebbe qualche delucidazione e spero che la vostra pazienza mi assisterà Domani scriverò il codice postato da baltinora ma vorrei lo stesso porvi qualche mio dubbioho provato a scrivere il codice del tipoXComm1.WordDecode(ModbusRTU1.Read.Register(16))Ma quando cerco di compilare mi da un'errore e mi dice Errore di compilazione Variabile XComm1) non definitaPoi ho provato a dichiararlo come integer e dava un'altro errore di (XComm1) qualificatore nonvalidocome devo dichiarare la variabile per non farmi restituire un'errore?CODICEDim Word(100) as long ' - Creo un arrayWord(1) = ModbusRTU1.Read.Register(1) ' - leggo la prima word dall'oggetto Modbus RTUWord(2) = ModbusRTU1.Read.Register(2) ' - leggo la seconda word dall'oggetto Modbus RTULabel1(1).Caption = XComm1.WordDecode(Word(1)).BIT0 ' Leggo lo stato del Bit 0 dalla prima Word''Label1(15).Caption = XComm1.WordDecode(Word(1)).BIT15 ' Leggo lo stato del Bit 15 dalla prima WordLabel2(1).Caption = XComm1.WordDecode(Word(2)).BIT0 ' Leggo lo stato del Bit 0 dalla seconda Word''Label2(15).Caption = XComm1.WordDecode(Word(2)).BIT15 ' Leggo lo stato del Bit 15 dalla seconda WordMa questo codice dove lo devo scrivere nella parte di codice generale o nella parte di codice del timer?Le label da 1 a 16 le devo aggiungere nella stessa form o ne devo creare un'altra?Guardando nell'. di ABS ho notato che se nel menu gost appare una "S" (lampeggiante) il server e in standby.Ma e normale oppure e propio questo che non mi fa avere la comunicazione tra pc e zelio?
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