gianff Inserito: 26 luglio 2014 Segnala Share Inserito: 26 luglio 2014 (modificato) 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: 26 luglio 2014 da gianff Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 28 luglio 2014 Segnala Share Inserita: 28 luglio 2014 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 More sharing options...
gianff Inserita: 28 luglio 2014 Autore Segnala Share Inserita: 28 luglio 2014 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 More sharing options...
Ctec Inserita: 29 luglio 2014 Segnala Share Inserita: 29 luglio 2014 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 More sharing options...
gianff Inserita: 29 luglio 2014 Autore Segnala Share Inserita: 29 luglio 2014 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 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