Vai al contenuto
PLC Forum


Cp1L-M Scrivere In Modbus


gianff

Messaggi consigliati

duvrei comandare delle schede di uscita generiche (overdigit ) in modbus CP1L

comadi modbus descritti dal costruttore

indirizzo codici fun. descrizione

discrete inputs

0-15 2 bit ingressi 0-15

ciols

0-7 1,5,15 bit uscite 0-7

input register

0 4 word ingressi 0-15

holding register

0 3,6,16,23 word uscite 0-7

1 3,6,16,23 filtro ingressi 0-10 x10ms

2 3,6,16,23 led monitor

partendo da questo in lettura ingressi funzionate porta 2 cp1l

D32200 #0001 (indirizzo periferica)
D32201 #0004 (funzione 0004 - leggi registri)
D32202 #0004 (numero di bytes del comando, una word per l'indirizzo del registro e una per il numero di registri da leggere)
D32203 #0000 (indirizzo del registro da leggere)
D32204 #0001 (leggeremo 1 registri)

non riesco a comandare le uscite

funziona la comunicazione ma mando tutto a zero (poi resetto con software originale di configurazione)

dove riesco a comandarle manualmente con la stessa seriale 485 in parallelo a CP1L

prova eseguita in scrittura

D32200 #0001 (indirizzo periferica)
D32201 #0006 (funzione 0006 - scrivi registri)
D32202 #0004 (numero di bytes del comando, una word per l'indirizzo del registro e una per il numero di registri da leggere)
D32203 #0000 .....????
D32204 #0000 .....????

Modificato: da gianff
Link al commento
Condividi su altri siti


In teoria deve funzionare. Ma sulla porta 1. Le D322xx sono per la porta 1, mentre i le D323xx sono per la 2 (o la 1 sulle CPU con una sola porta).

In D32203 metti l'indirizzo del registro su cui scrivere e in D32204 il valore da scrivere.

Alcuni dispositivi slave non implementano la funzione #06, ma implementano la #10 (Write Multiple Register)

Controlla i flag A640.01 e A640.02 (il primo è ON se esecuzione ok, il secondo è ON se c'è un errore).

Se c'è stato errore, verifica la risposta per capire che errore hai avuto (byte basso di D32252), che ti permetterà di individuare meglio cosa sta succedendo.

Link al commento
Condividi su altri siti

ok cosi funziona

D32200 #0001 (indirizzo periferica)
D32201 #0006 (funzione 0006 - scrivi registri)
D32202 #0004 (numero di bytes del comando, una word per l'indirizzo del registro e una per il numero di registri da leggere)
D32203 #0000
D32204 #0001---8 mando alti 8 bit della scheda uscite remota

pero'

come faccio a leggere/scrivere piu schede ( nodi ) continuamente e velocemente

debbo cambiare velocemente i dati di queste dm ( indirizzo e vari codici )

ma e' rischioso e macchinoso

Link al commento
Condividi su altri siti

Devi usare la tecnica del polling.

Io faccio un loop che incrementa l'indirizzo dello slave, e uso dei buffer puntati per l'indirizzo del registro (a meno che non sia sempre lo stesso) e il valore da scrivere.

Il loop passa al passo successivo non appena la comunicazione precedente riceve il bit di comunicazione conclusa. Ci implemento anche un minimo di analisi degli errori e relativa segnalazione e ripristino.

Rischioso? E perchè? Io mando pacchetti anche a 5 inverter e leggo e scrivo qualche I/O non velocissimo, e a 38400baud non è malaccio (più forte non posso, alcuni dispositivi sono limitati in velocità).

Per la tempistica dipende dalla velocità di comunicazione e bisogna considerare che tra una trasmissione e l'altra va lasciato il tempo di 3 caratteri senza trasmissione, per garantire che gli slave non interessati si "sgancino" e si preparino per l pacchetto successivo. Considera anche che la comunicazione è sempre composta da un messaggio trasmesso dal master e una risposta dallo slave, entro un certo tempo, che comunica l'esito o i valori letti.

Link al commento
Condividi su altri siti

e come in HMI NS indicizzato

cambio il puntatore con i vari nodi

e eseguo dei mov contemporaneamente nelle dm di parcheggio (buffer )

i mov e' meglio ritardarli

-----------------

altro problema debbo leggere schede analogiche/temperatura overdigit EX08AI

la comunicazione modbus ok funziona

ma mi danno valori interi con segno

riordino le dm come dicevi tu tempo fa

Pertanto, leggeremo il registro con due MOVD in modo da ricostruire la word del registro letto; supponendo di metterla in D100:
MOVD D32254 #0210 D100
MOVD D32255 #0012 D100

ma ottengo valori circa +65200 -65200 ( diciamo ) credo

con che funzione posso renderle BCD oppure BINARIO

IL costruttore mi dice

Tutti i valori restituiti dai canali analogici sono interi con segno e
non word senza segno.
Quindi i valori vanno da -32768 a +32767 anche se non tutto il range è
utilizzato. Per esempio per le tensioni e correnti si va nel range
+/-20000 ma per le temperature esse sono espresse in decimi di grado.
Quindi, per esempio, per una termocoppia che va da -200°C a 1200°
otteniamo valori da -2000 a 12000.
Se lei legge 65200 ciò può essere giusto visto che l'Omron non conosce
il significato di quel valore e lo restituice come word secca.
Se l'Omron dispone di una funzione di conversione da intero senza segno
(come la generica word) a intero con segno usi quella.
Altrimenti deve interpretarlo come intero con segno:

if (word > 32767)
int = word - 65536;
else
int = word;

In tal caso si ottiene:

65535 ---> -1 (-0.1°C)
65200 ---> -336 (-33.6°C la sua temperatura)
1000 ---> 1000 (-100.0°C)

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