system
September 16, 2014, 4:26pm
1
Ciao,
vorrei chiedervi consiglio su come interfacciare arduino tramite max485 sul contatore monofase dzt-6001 tramite protocollo modbus rtu.
per i collegamenti ok prendo lo schema riportato in allegato, ma non so come interrogare i registri per prelevare i dati.
in allegato ho anche il file con i dati forniti dal costruttore.
So che devo usare il protocollo modbus con la libreria SimpleModbusMaster con la funzione 0x03 - Read Holding Registers
ma non so come scrivere il codice per interrogare il contatore come da specifiche del costruttore.
Help me !!!! =( =( =( =(
MODBUS Protocol DZT 6001.pdf (51.6 KB)
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
PaoloP
September 17, 2014, 8:52am
3
Hai provato l'esempio della libreria?
system
September 25, 2014, 8:25am
5
ciao,
ho provato questo codice ma ottengo solo sporcizia di output
#include <SimpleModbusMaster.h>
#define baud 9600
#define timeout 1000
#define polling 200 // the scan rate
#define retry_count 10
#define TxEnablePin 2
#define LED 13
enum
{
PACKET1,
PACKET2,
TOTAL_NO_OF_PACKETS // leave this last entry
};
Packet packets[TOTAL_NO_OF_PACKETS];
packetPointer packet1 = &packets[PACKET1];
unsigned int readRegs[1];
void setup()
{
modbus_construct(packet1, 1, READ_HOLDING_REGISTERS, 1, 1, readRegs);
modbus_configure(&Serial, baud, SERIAL_8E1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS);
pinMode(LED, OUTPUT);
}
void loop()
{
modbus_update();
analogWrite(LED, readRegs[0]>>2); // constrain adc value from the arduino slave to 255
Serial.println(readRegs[0]);
Serial.println(readRegs[1]);
Serial.println(readRegs[2]);
Serial.println(readRegs[3]);
Serial.println(readRegs[4]);
Serial.println(packet1->requests);
Serial.println(packet1->successful_requests);
Serial.println(packet1->failed_requests);
Serial.println(packet1->exception_errors);
}
cyberhs
September 25, 2014, 9:34am
6
Dallo schema che hai fornito sembra che il TX_ENABLE sia sul pin 3 di Arduino, mentre nello sketch usi il pin 2.
system
September 25, 2014, 9:40am
7
si scusa,
non ho corretto lo schema ma in realtà è collegato al pin 2
system
September 25, 2014, 9:44am
8
il contatore dzt-6001 collegato ad un usb to rs485 converter, e usando il software in dotazione o modpool riesco a leggere i dati tranquillamente.
modpoll -b 9600 -p even -t 4:int -m rtu -a 1 -r 1 -d 8 -1 -c 1 COM6
Protocol configuration: Modbus RTU
Slave configuration...: address = 1, start reference = 1, count = 1
Communication.........: COM6, 9600, 8, 1, even, t/o 1.00 s, poll rate 1000 ms
Data type.............: 32-bit integer, output (holding) register table
-- Polling slave...
[1]: 2294 // sono 229,4 volt
cyberhs
September 25, 2014, 10:11am
9
Prova a mettere un resistore da 10k come pullup a +5V sulla linea TX_ENABLE.
system
September 25, 2014, 12:43pm
10
ciao,
intendi come nello schema allegato?
cyberhs
September 25, 2014, 5:02pm
11
Sì, anche se non inserirei quei resistori di pullup/pulldown da 20k in uscita
system
November 20, 2014, 5:52am
12
Salve a tutti ecco il progetto realizzato.
cablaggio progetto
LCD
SDA -> A4
SLC -> A5
DH11
SIGNAL -> D7
RS485_TTL
RO -> RX
DI -> TX
RE -> D2
PULSANTE
ARANCIO -> D8 -> RESTISTENZA -> GND
BIANCO -> VCC
STRIPE LED
BLU -> D9
VERDE -> D6
ROSSO -> D5
DZT6001
B -> 25
A -> 24
collegamento striscia led (img allegata)
codice (file allegato .ino)
Video youtube
Sono aperto a suggerimenti e nuove idee per migliorare il tutto.
Nel caso i moderatori del forum volessero inserire il progetto come guida mi rendo disponibile a fornire una documentazione più dettagliata.
DZT6001_emoncms.ino (9.5 KB)
Bello....
Nello sketch scrivici anche il link alle librerie non standard
system
November 20, 2014, 8:31am
14