Jump to content
PLC Forum


Applicazione Visual Studio


Reverendo bit
 Share

Recommended Posts

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:

Ladder

FBD

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?

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'oggetto

BitRead è il comando di lettura

Bit(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

Edited by baltimora
Link to comment
Share on other sites


del_user_56966
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 è 4

Nell'esempio c'è il seguente codice:

Label1(3).Caption = ModbusRTU1.BitRead.Bit(0)

dove

ModbusRTU1 è l'oggetto

BitRead è il comando di lettura

Bit(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

Nel 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 ?

Link to comment
Share on other sites

del_user_56966

Se al contrario vuoi utilizzare un singolo Bit dei 4 registri dello Zelio potresti semplicemente utilizzare

l'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!.. :)

Link to comment
Share on other sites

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 QA

ed il registro 23 che va da QB a QG

Dai un'occiata anche a questo link

registri zelio modbus

Credo 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

Edited by baltimora
Link to comment
Share on other sites

del_user_56966

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ées

03

06

10

2B

Read 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 ASCII

per l'esempio appena posso te lo invio!.. ;)

Link to comment
Share on other sites

del_user_56966

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 15

tutto qui!.. ;)

Link to comment
Share on other sites

Ciao,

Come indentifico la word?

Va bene qualcosa del genere? :huh:

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

Grazie per il tuo aiuto

Edited by baltimora
Link to comment
Share on other sites

del_user_56966

Si penso vada bene, ma è poco leggibile per la manutenzione futura

io 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

Link to comment
Share on other sites

GRANDE ALEN

Funziona 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?

Grazie

P.S. Ma Reverendo bit che fine ha fatto? Ha gettato la spugna?

Edited by baltimora
Link to comment
Share on other sites

del_user_56966
é sufficiente inserire nell'oggetto ModBusRTU un numero maggiore di registri da leggere?

Lo standard prevede la lettura fino a 128 registri contemporanei vedi tu... :)

Link to comment
Share on other sites

Reverendo bit
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 :angry:

Spero di raggiungervi presto e comunque concordo con Baltimora

GRANDE ALEN.

;)

Link to comment
Share on other sites

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, 0

non 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 Long

Grazie

Edited by baltimora
Link to comment
Share on other sites

del_user_56966
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?

Link to comment
Share on other sites

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

Edited by baltimora
Link to comment
Share on other sites

del_user_56966
Poi se un giorno ti dovesse capitare di venire in calabria........La cena è assicurata........

Se mi prendi per la gola non vale... :lol:

Comunque mi sembra di una semplicità estrema,

ModbusRTU1.WriteRegister (Numero registro), (valore da scrivere).....................devi mettere un valore tra 0 è 65535

per scriver un Bit l'istruzione è WriteBit (Numero Coil), (valore da scrivere).........mentre qui devi mettere un valore tra 1 e 0

Link to comment
Share on other sites

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 modbus

Infatti non ho compreso cosa intendi dire.

devi mettere un valore tra 0 è 65535

Come 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

Link to comment
Share on other sites

del_user_56966
Come identifico il bit del registro che voglio scrivere?

Il Bit da scrivere nel caso il prodotto non supporti i comando 05 del protocollo Modbus

va 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... :)

Link to comment
Share on other sites

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 1000101000000001

ora 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

Link to comment
Share on other sites

Reverendo bit

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 bit

Come 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?

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 Zelio

Ma 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 codice

Baltimora 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 vuoi

Ciao Reverendo bit

Link to comment
Share on other sites

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 vuoi

Non 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

Link to comment
Share on other sites

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

Edited by baltimora
Link to comment
Share on other sites

del_user_56966
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... :)

Link to comment
Share on other sites

Grazie, vuol dire che qualcuno ha saputo indicarmi la strada giusta......

P.S. Avanzi sempre la cena..... :lol:

Link to comment
Share on other sites

Reverendo bit

Ciao Ragazzi

Bravo baltimora naturalmente senza togliere merito ad Alen

ho 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 dubbio

ho provato a scrivere il codice del tipo

XComm1.WordDecode(ModbusRTU1.Read.Register(16))

Ma quando cerco di compilare mi da un'errore e mi dice Errore di compilazione Variabile XComm1) non definita

Poi ho provato a dichiararlo come integer e dava un'altro errore di (XComm1) qualificatore nonvalido

come devo dichiarare la variabile per non farmi restituire un'errore?

CODICE

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

Ma 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?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share


×
×
  • Create New...