Vai al contenuto
PLC Forum


Comunicazione Modbus


_Chri_

Messaggi consigliati

Salve,

non ho mai utilizzato la comunicazione seriale in un programma PLC, in questo caso della beckoff. Ho semplicemente alcuni ingressi che devono essere letti da un PC esterno e una volta letti il PLC dovrà reagire di conseguenza.

Che FB modbus potrei usare? E inoltre, come? Scusate ma non ne ho idea. Se c'è qualcuno che può darmi una mano sarebbe ottimo!

Grazie mille

Link al commento
Condividi su altri siti


Innanzitutto ti ringrazio della risposta! Devo implementare una comunicazione di tipo TCP/IP. Inoltre per adesso ho usato FB_MBReadCoils e FB_MBWriteCoils. Sto cercando di simulare qualcosa con un programma in parallelo per vedere se riesco a scrivere due variabili. Purtroppo ho l'errore 8002...."invalid address or lenght". Il programma twincat penso di averlo impostato bene ma ho alcune lacune per quanto riguarda gli indirizzi. Posso mettere anche a disposizione il codice che ho scritto nel caso possa servire per capire meglio. Inoltre penso che debba fare da master.

Grazie ancora!

Modificato: da _Chri_
Link al commento
Condividi su altri siti

Aggiungo anche che sto provando a simulare lo slave attraverso un programmino trovato in rete cercando "simulatore modbus slave". Sto andando a tentativi non avendo mai implementato una struttura di questo genere. Sono aperto a consigli

Link al commento
Condividi su altri siti

Vi allego il *.pro! Se volete altre informazioni scrivete pure! Prima di aggiungere altro aspetto domande in modo da poter chiarire ed essere chiarito :D.

Probabilmente faccio qualche errore nella simulazione ?!

Prova_Modbus.zip

Link al commento
Condividi su altri siti

ciao

scusa, ma nel tuo programma non vedo i blocchi FB_MBReadCoils e FB_MBWriteCoils

sbaglio io o non ci sono?

fammi sapere

saluti da Valvolina

Link al commento
Condividi su altri siti

Ciao Valvolina,

ti rispondo alla prima domanda:

i due fb li ho dichiarati localmente nella dichiarazione delle variabili del PRG_Security. Per la precisione sono:

fbReadCoils :FB_MBReadCoils;

fbWriteCoils :FB_MBWriteCoils.

Questi due li ho utilizzati rispettivamente nelle routine Act3_ModBus_BitRead e Act4_ModBus_BitWrite proprio all'inizio delle due. Quando li richiamo inserisco anche i dati. (A mio avviso sbaglio qualche dato di ingresso ma ancora non ci sono venuto a capo). Inoltre attraverso i CASE sempre nelle due routine ho l'attivazione e il controllo di questi FB.

Seconda domanda: Oggi il nome del PLC Beckoff non riesco a dirtelo perchè non sono nell'azienda per cui devo fare questo lavoro. Domani però riesco a postarlo.

Aggiungo anche che per ora non ho messo niente nel PLC ma sto solo provando, simulando nel mio computer utilizzando un programmino che ho trovato in rete per il modbus slave. Spero si riesca a fare, anche se attualmente sono in alto mare!

Grazie Valvolina per la risposta se vuoi altre informazioni o chiarimenti sono a disposizione. Se ci verrò a capo posterò come avrò fatto :D nel frattempo accetto qualsiasi tipo di suggerimento in quanto ho ancora lacune per quanto riguarda la gestione della comunicazione tra PLC ed un target (ne mio caso un PC).

Grazie!

Link al commento
Condividi su altri siti

ciao,

una prima considerazione :

ho visto che leggi e scrivi sullo stesso indirizzo ip, ma con due porte diverse 501 e 505.

tipicamente (a meno cose particolari) con modbus tcp si legge e si scrive sulla porta 502.

io scambio dati in modbus tcp tra plc Beckhoff (client) e Schneider (server) su porta 502 senza problemi.

Pertanto ti direi di fare questo test.

fammi sapere

saluti da Valvolina

Link al commento
Condividi su altri siti

Ciao Valvolina, in realtà inizialmente avevo messo 502 (inoltre come avrai notato sopra c'è un indirizzo IP da mettere in ingresso al FB - ora ho messo quello del mio computer per riuscire a simulare).

Una volta terminato il programma ho utilizzato un simulatore modbus slave che durante la configurazione non mi prendeva la porta 502 (mi dava un errore) e quindi ho messo 505 e di conseguenza l'ho inserito uguale anche nel mio progetto twincat.

Il fatto che siano diversi tra lettura e scrittura è che a forza di fare prove alla fine li ho lasciati erroneamente diversi, errore mio.

Comunque domani farò test di vario tipo.

Ho una domanda: avresti qualche consiglio da darmi per quanto riguarda il simulatore modBus Slave da usare? Ne conosci qualcuno?

Quando li collegherò fisicamente, PC e PLC, (avendoli a disposizione) metterò 502.

Grazie ancora per la partecipazione alla discussione :D

Saluti

Christian

Modificato: da _Chri_
Link al commento
Condividi su altri siti

Ciao Valvolina il modello del Beckoff è CX9000.

Inoltre sto provando ananas e appena lo apro mi da l'errore che poi mi dava anche l'altro simulatore:

"Socket initialisation failed. Possible reason: port 502 already used by other application. Errorcode: 10048"

è uguale se scrivo come porta ad esempio 505? C'è un modo per risolvere questo errore?

PS: Non so se conti qualcosa come informazione ma sto usando un sistema operativo virtualizzato.

Ciao da Christian

Link al commento
Condividi su altri siti

ciao,

vuol dire che la porta 502 è usata da una applicazione che hai installato su quel pc, quindi ananas la rileva come impegnata.

ad esempio su quel pc hai installato il software twincat modbus server?

questo software impegna quella porta.

potresti provare ad arrestare momentaneamente il servizio

io ho una macchina virtuale di windows xp sul mio pc,

faccio qualche prova con ananas e ti faccio sapere

ciao

Link al commento
Condividi su altri siti

ciao

ti confermo che ho fatto dei test questa mattina,

e ananas funziona molto bene sia come client e già lo sapevo,

sia come server (quindi ha risposto correttamente alle richieste fatte da plc)

aspetto tue news

saluti da Valvolina

Link al commento
Condividi su altri siti

Ciao!

Aggiorno il post con le ultime informazioni. Alla fine le direttive erano diverse da come avevo scritto all'inizio (purtroppo il giro delle informazioni a volte non è proprio corretto!! :angry: ) ovvero:

PLC: SLAVE

PC: MASTER

Telefonando alla Beckhoff per chiedere una informazione mi ha detto che non serviva che usassi gli FB_ReadCoils e FB_WriteCoils (non ho capito il perchè ma cercherò di informarmi) quindi ho fatto un programma super semplice scrivendo un word di tipo INT mappata nella memoria merker! Ho usato un testerModbus che mi ha passato il tecnico di Bechoff ma cercherò anche di utilizzare Ananas. La Word è dichiarata in questo modo:

mbo_ComunicazionePC AT%MW0:INT;

Nel simulatore vedo la sua variazione all'indirizzo ModBus 3000(hex) 12288(dec)! A dire il vero non ho capito perchè sarebbe a 3000 e sto cercando di capire a livello personale l'indirizzamento. Nello specifico ho utilizzato una word ma se utilizzassi solo un Booleano del tipo:

mbo_Prova5 AT%MX6.0:BOOL; (*0 - NON IN EMG; 1 - EMG;*)
corrisponde all'indirizzo 3004(hex) di Modbus? e lato PC come fa a leggere solo un Booleano? Forse è una cosa banale ma non l'ho mai vista e quindi la ignoro.
(Valvolina se hai qualche spiegazione tecnica in merito mi farebbe piacere o link di riferimento :D)

A parte le mie lacune ho fatto alcune prove e sembra che il programma di comunicazione funzioni! Lo allego, così si capisce meglio la modifica fatta!

Comunicazione.zip

Modificato: da _Chri_
Link al commento
Condividi su altri siti

ciao,

di seguito un'immagine con le aree di memoria dei plc Beckhoff.

Mapping between Modbus and ADS

The default mapping is shown in the following table:

Modbus areas Modbus address ADS area Digital inputs 0x0000 - 0x7FFF Index group Index offset 0xF021 - process image of the physical inputs (bit access) 0x0 0x8000 - 0x80FF Name of the variables in the PLC program Data type .mb_Input_Coils ARRAY [0..255] OF BOOL Digital outputs (coils) 0x0000 - 0x7FFF Index group Index offset 0xF031 - process image of the physical outputs (bit access) 0x0 0x8000 - 0x80FF Name of the variables in the PLC program Data type .mb_Output_Coils ARRAY [0..255] OF BOOL Input registers 0x0000 - 0x7FFF Index group Index offset 0xF020 - process image of the physical inputs 0x0 0x8000 - 0x80FF Name of the variables in the PLC program Data type .mb_Input_Registers ARRAY [0..255] OF WORD Output registers 0x0000 - 0x2FFF Index group Index offset 0xF030 - process image of the physical outputs 0x0 0x3000 - 0x5FFF 0x4020 - PLC memory area 0x0 0x6000 - 0x7FFF 0x4040 - PLC data area 0x0 0x8000 - 0x80FF Name of the variables in the PLC program Data type .mb_Output_Registers ARRAY [0..255] OF WORD

quello che va tenuto in considerazione è:

se fai una richiesta read o write register in modbus verso un plc Beckhoff, nel parametro indirizzo iniziale

devi mettere 16#3000 in esadecimale o 12288 in decimale che corrisponde alla %MW0 (composta dai byte 0 e 1)

16#3001 corrisponde alla %MW2 (composta dai byte 2 e 3) del plc, 16#3002 corrisponde alla %MW4 (composta dai byte 4 e 5) del plc, 16#3003 corrisponde alla %MW6 (composta dai byte 6 e 7) del plc, e così via.

nel plc Beckhoff non è possibile dichiarare word dispari %mw1 o %mw3 non esistono.

per quanto riguarda il modbus:

se le richieste sono fatte via seriale allaro esistono master (uno solo che fa le richieste) e slave anche più di uno che rispondono alle richieste

se invece le richieste vengono fatte via ethernet non si parla più di master e slave,

ma di server e client

il server (che nel tuo caso è il plc) risponde alle richieste fatte dai client(nel tuo caso il pc) che possono essere anche più di uno

per quanto riguarda i bit delle word :

se dal client (il tuo pc) fai richieste di lettura o scrittura di registri (word da 16 bit), devi penasare sul lato pc a fare qualcosa che possa estrarre i singoli bit.

ci sono vaire soluzioni, bisognerebbe sapere che programma fai girare sul pc.

saluti da Valvolina

Modificato: da valvolina
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...