Installazione e Configurazione Schede DL485 con esempi

Le schede hanno bisogno di una alimentazione (8-24Vcc, consigliato 12..24V) su due fili e altri due fili intrecciati per il bus.

Per semplicità si consiglia di utilizzare un cavo ethernet per collegare tutte le schede presenti nell'impianto. Un doppino collegherà i morsetti A e B del BUS RS485 e un altro doppino porterà l'alimentazione a tutte le schede. Le restanti 2 coppie possono essere usate per portare rete eterneth o altra alimentazione.

Ogni scheda dispone di un pulsante e 2 LED per impostare le configurazioni di base:

  • ID del nodo che dovrà essere univoco per ciascuna scheda (da 1 a 127)
  • Velocità del BUS 485 e seriale RS232
  • Abilitazione echo BUS485 in RS232
  • Reset programmazione I/O e set numero massimo di nodi (board) a 63

 Di fabbrica le schede vengono fornite con la seguente configurazione:

  • ID Nodo non impostato, quindi è una impostazione necessaria
  • Comunicazione su BUS 485 e seriale RS232 a 9600 BAUD
  • Max numero di board sul bus uguale a 10

Come funziona la programmazione tramite pulsante e 2 LED

  1. Azionando il pulsante a bordo scheda si ha subito l'eco tramite il LED TX
  2. Premendo il pulsante a bordo scheda per circa 2 secondi si entra in modo programmazione
  3. Il modo programmazione è segnalato dalla accensione del LED RX come descritto sotto
  4. se il LED RX è acceso fisso indica lo stato di programmazione in cui si puo immettere la scelta di una voce di menu
  5. se il LED RX trilla velocemente indica lo stato di programmazione in cui si puo immettere il valore per la voce scelta
  6. Entrando in modo programmazione il LED RX si accende con luce fissa, rilasciare il pulsante per poi scegliere una voce di menu.
  7. Se non si preme piu il pulsante allora dopo circa 3 secondi si esce dalla programmazione altrimenti si sceglie una voce di menu
  8. Premere e rilasciare il tasto un numero di volte corrispondente allla voce (parametro) da impostare o visualizzare
  9. Dopo una breve pausa seguirà un numero di lampi del LED RX pari al valore presente nel parametro selezionato (10=0, 1=1, 2=2, 3=3...9=9)
  10. Finiti i lampeggi il LED RX trillerà velocemente per indicare che eventualmente è possibile impostare un nuovo valore premendo il pulsante il numero di volte corrispondente (10=0, 1=1, 2=2, ecc...), altrimenti aspettare il ritorno del LED RX a luce fissa
  11. Se è stato impostato un nuovo valore il LED RX lo replica con il corrispondente numero di lampi poi ritorna a luce fissa
  12. Con il ritorno a luce fisse del LED RX si puo ripetere la procedura dal punto 6 per visualizzare o impostare un nuovo parametro
  13. Trascorsi circa 3 secondi con il LED RX a luce fissa senza premere il pulsante, si esce dallo stato di programmazione e i due led riprenderanno ad indicare l'attività sul BUS, RX (ricezione) e TX (trasmissione).

Tabella parametri

  • 1 unita ID nodo
  • 2 decine ID nodo
  • 3 centinaia ID nodo
  • 4 velocità bus485 e seriale RS232
    • 1  1200 BAUD
    • 2  2400 BAUD
    • 3  4800 BAUD
    • 4  9600 BAUD
    • 5 14400 BAUD
    • 6 19200 BAUD
    • 7 28800 BAUD
    • 8 38400 BAUD
    • 9 57600 BAUD
    • 0 (10 lampi) 115200 BAUD
  • 5 Abilitazione echo BUS485 in RS232
  • 9 comando reset configurazione nodo

Impostazione dell'ID della scheda

L'ID da inserire è composto da 3 cifre: le unità, le dcine e centinaia.

  • Premere il tasto per circa 2 secondi finchè si entra in programmazione e il LED RX si accende fisso
  • Premere il tasto per selezionare il campo da programmare o visualizzare, 1 volta per le unita, 2 volte per le decine, 3 volte per le centinaia, il numero di lampi del LED RX indicherà il valore attualmente in memoria (10 impulsi per il numero 0)
  • attendere che il LED RX trilli velocemente
  • Premere tante volte il tasto a seconda del numero da impostare, poi Il LED RX mostrerà con i lampeggi il valore inserito, oppure attendere che il LED RX torni a luce fissa.
  • Ripetere eventualmente la procedura dal secondo punto oppure aspettare 5 secondi per l'uscita dalla programmazione con memorizzazione delle impostazioni.

Installazione e configurazione software su RASPBERRY

Su Github.com all'indirizzo https://github.com/lucasub/DL485_BUS è possibile prelevare l'ultima versione del software di test da installare su RASPBERRY PI o su altro sistema LINUX.

Installare i seguenti pacchetti tramite line adi comando:

sudo apt install git pip python3

Prelevare il software da github tramite il comando:

git clone https://github.com/lucasub/DL485_BUS.git

Verrà creata la cartella DL485_BUS dove all'interno sono presenti i file neccessari:

arduinoserial.py
config.json
dl485.py

dove arduinoserial.py si occuoperà di ricevere i dati dalla seriale

config.json contiene tutta la configurazione dei nodi

dl485.py è la libreria per la gestione del BUS e NODI

File di configurazione config.json

(a destra del carattere # sono presenti i commenti alle varie voci)

La sezione GENERAL al primo livello contine le informazioni generali del BUS:

"GENERAL":
    {
        "bus_port": "/dev/ttyUSB0", # Porta seriale Raspberry PI
        "bus_baudrate": 9600, # Velocità per BUS e seriale impostata nel pc (deve corrispondere a quella dei nodi)
        "max_board_address": 24, # Numero massimo di Board presenti sul BUS (deve corrispondere a quella dei nodi)
        "board_address": 2 # ID assegnato a Raspberry. Deve avere l'ID della scheda collegata alla seriale di Raspberry PI +1 e non devono esserci altri nodi con lo stesso ID
    },

Troviamo poi la configurazione generale per ciascuna scheda DL485 (BOARDx) presente nella rete, dove x identifica l'ID della BOARD ed è un numero univoco, in ordine crescente anche non consecutivo col precedente, e va impostato anche su ogni BOARD tramite pulsante e LED.

Ogni sezione "BOARDx" va seguita dall'elenco delle impostazioni dei realtivi I/O, (esempio per id board numero 3):

"BOARD3":
    {       
        "GENERAL": # Configurazione generale della BOARD
        {
            "name": "Caldaia", # Nome della BOARD
            "boardtype": 2, # Tipo di Board: Vedi TYPEB
            "enable": 0 # Abilitazione della BOARD: 0=disabilitata, 1=abilitata
        },

dopo la sezione "BOARDx" Seguono le configurazioni dei vari I/O:

Esempio di configurazione USCITA

"OUT1": # OUT1 è la stessa voce presente SUL PCB / etichetta e fa riferimento al PIN del micro che si vuole programmare
        {
            "io_logic": 7, # Valori interi. IO LOGICO associato a "OUT1" che deve essere UNIVOCO per ciascun IO della stessa BOARD per un MAX di 25 IO logici, questo numero serve ad indentificare numericamente il morsetto in fase di programmazione parametri e funzionamento
            "direction": "output",
            "io_type": "digital",
            "default_startup_value": 1,
            "inverted": 1,
            "filter": 127,
            "time_refresh": 600,
            "n_refresh_on": 1,
            "n_refresh_off": 1,
            "linked_board_id_io_logic": ["3-3", "3-4"],
            "linked_proc": "or",
            "enable": 1,
            "name": "RELE1",
            "description": "Uscita rele1",
            "dtype": "Switch"
        },

 

Comando ValoreDescrizione
direction   Direzione I/O
  input Ingresso
  output Uscita

 

Comando ValoreDescrizione
io_type   Tipo di hardware assegnata all'IO
  digital IO Digitale
  analog IO analogico: 8 bit com uscita - 10 bit come ingresso
  i2c I2C per collegameto sensori. Solo su PIN PC4 per SDA e PC5 per SCL
  onewire Per collegamento dispositivi OneWire
  disable

Per disabilitare la funzionalità dell'IO

 

ComandoValoreDescrizione
pullup   Solo per ingressi digitali. Attiva un PULLUP (resistenza verso il positivo da circa 33Kohm)
  0 Senza pullup
  1 Con pullup

 

ComandoValoreDescrizione
filter   Filtro in lettura per atirimbalzo
  0...127 Più alto è il valore più è alto il filtro e più lenta è la risposta

 

ComandoValoreDescrizione
time_refresh   Tempo in decimi di secondo dopo il quale viene ritrasmesso periodicamente il valore dell'IO sul BUS (rinfresco periodico)
  0 Escluso, non c'è mai rinfresco periodico
  1....16383 Tempo di rinfresco periodico (decimi di secondo), attenzione valori bassi possono saturare la rete
ComandoValoreDescrizione
Rvcc   Solo per ingressi analogici. Valore in OHM della resistenza in ingresso nel partitore di tensione

 

ComandoValoreDescrizione
Rgnd   Solo per ingressi analogici. Valore in OHM della resistenza verso massa nel partitore di tensione

 

ComandoValoreDescrizione
enable   Abilitazione dell' IO
  0 Disabilitato
  1

Abilitato

 

ComandoValoreDescrizione
name   Nome dell'IO che apparirà nell'intefaccia di domoticz

 

ComandoValoreDescrizione
description   Descrizione dell'IO che apparirà nell'interfaccia di domoticz

 

ComandoValoreDescrizione
dtype   Nome del dispositivo del sistema domotico. Di seguito i dispositivi disponibili su Domoticz
  Air Quality -
  Alert -
  Barometer -
  Counter Incremental -
  Current/Ampere -
  Current -
  Custom -
  Distance -
  Gas -
  Humidity -
  Illumination -
  kWh -
  Leaf Wetness -
  Percentage -
  Pressure -
  Rain -
  Selector Switch -
  Soil Moisture -
  Solar Radiation -
  Sound Level -
  Switch Utilizzato per IO difgitali
  Temperature  
  Temp+Hum Utilizzato per sensori di temperatura e unidità
  Temp+Hum+Baro Utilizzato per sensori di temperatura e unidità e pressione
  Text -
  Usage -
  UV -
  Visibility -
  Voltage Utilizzato per misurare la tensione tramite ingressi analogici
  Waterflow -
  Wind -
  Wind+Temp+Chill -

 

ComandoValoreDescrizione
n_refresh_on   Numero di trasmissioni nel passaggio da OFF a ON di un I/O digitale
  0 Disabilitato
  1...7 Numero di trasmissioni dell'evento fronte ON

 

ComandoValoreDescrizione
n_refresh_off   Numero di trasmissioni nel passaggio da ON a OFF di un I/O digitale
  0 Disabilitato
  1...7 Numero di trasmissioni dell'evento fronte OFF

 

ComandoValoreDescrizione
inverted    Inverte lo stato dell'I/O digitale
  0 Non invertiro
  1 Invertito

 

ORGANIZZAZIONE DELLA MEMORIA EEPROM DEL NODO:

0x0000..0x001F 32 byte riservati al nodo

0x0020..0x003F 32 byte riservati a I/O logico 1

0x0040..0x005F 32 byte riservati a I/O logico 2

0x0060..0x007F 32 byte riservati a I/O logico 3

.....

0x0300..0x031F 32 byte riservati a I/O logico 24

0x0320..0x03FF riservati al nodo

Ogni I/O dispone di un'area per il SETUP in EEPROM di 32 Byte e l'indirizzo di partenza decimale di ogni I/O è: 32 * numero I/O.

Es. La configurazione dell' I/O n.5 parte dall'indirizzo in EEPROM di 5 * 32 = 160 decimale

A seguire i seguenti byte di configurazione I/O:

Offset 0: n° io fisico associato (vedere tabella IO FISICI)

Offset 1: Byte con tipo I/O e varie
          b0: 0=IN, 1=OUT
          b1: 0=Digitale / 1=Analogico
          b2: 1=OneWire
          b3: 1=I2C
          b4: riservato al nodo
          b5: riservato al nodo
          b6: ENABLE I/O (se zero ignora lettura ingresso)
          b7: riservato al nodo

Offset 2: 8 bit LS per il valore di default delle uscite Analogico/Digitale o PullUP per gli ingressi allo startup
          b0: Valore di default per l'uscita DIGITALE o Pullup per ingresso DIGITALE
          b1: Valore di preset per OUT filtro digitale ingresso/uscita allo startup (il contatore viene settato opportunamente)
          b4..b7: Riservato al nodo, maschera per fare AND nel PWM (solo se direttiva PWMOUT attiva)

Offset 3: 2 bit MS di valore di default analogico, (valore di setup per PWM solo se direttiva PWMOUT attiva)

Offset 4: rinfreschi rete sui fronti e inversione fisica finale
          b0...b2: 3 bit 0-7 Numero di ritrasmissioni in caso di variazione fronte ON del segnale
          b3...b5: 3 bit 0-7 Numero di ritrasmissioni in caso di variazione fronte OFF del segnale
          b7 1=inversione fisica finale i/o, per scrivere 1 logico si scrive in realta 0 e si leggerà zero ma verrà presentato come 1

Offset 5: 8 bit LS di tempo di rinfresco periodico in rete in decimi di secondo

Offset 6: 8 bit MS di tempo di rinfresco periodico in rete in decimi di secondo

Offset 7: 8 bit Filtro di lettura IN/OUT digitale

Offset 8: numero funzione per PLC se opzione attiva, (mettere 0 se non si vuole funzione associata)

Offset 9: non usato

Offset 10: inizio definizione istruzioni per programma di campionamento periodico per I/O ONEWIRE o I2C che verrà richiamato ed eseguito periodicamente; questo programma rappresenta una serie di istruzioni I/O per 1W o I2C ed ha lo stesso formato dei comandi di lettura e scrittura I/O nei quali però non serve specificare board id e numero I/O. Nel primo byte programma in b0..b3 si indica quanti byte seguenti sono occupati dal programma, (0=programma nullo); se b7=1 si concatena questo programma con il programma seguente,  se b6=1 si interpreta il byte opzioni come comando di lettura, se b5=1 si indica che il byte seguente rappresenta in b0..b6 una pausa da fare in decine di microsecondi e se b7=1 indica di concatenare il valore a 7 bit del tempo con il valore a 8 bit seguente, il primo sarà LS e il secondo MS, per un massimo di 327670 us, poi seguiranno i dati per completare il comando di I/O.

Il byte seguente all'ultimo del programma (o alla serie di programmi concatenati) indica l'ingombro del programma di inizializzazione dispositivo che sarà eseguito all'avvio del nodo e sarà composto con le stesse regole degli altri programmi.

Quindi in caso di dispositivi 1W o I2C che non abbiano dei programmi associati bisognerà impostare il valore 0 all'offset 10 per indicare che non c'è programma di campionamento periodico, e valore 0 all'offset 11 per indicare che non c'è programma di inizializzazione

ESTENSIONE DEFINIZIONI SE PLC ATTIVO:

 offset 8: numero funzione per PLC se opzione attiva, (mettere 0 se non si vuole funzione associata)

poi da offset 31 a scendere si impostano i parametri per le funzioni plc, questo consente di scrivere i programmi di campionamento periodico per I2C e 1W a salire e le funzioni di plc a scendere per uno stesso I/O avendo gli inizi predefiniti in 10 e in 31.

Comandi disponibili

Comandi che le schede possono interpretare quando ricevuto dalla seriale e/o dalla rete

FunzioneValoreDescrizione
Trasferimento sequenza 1  ** NON IMPLEMENTATO **
Funzione DL485    
  
FunzioneValoreDescrizione
Trasporto stringa 2   ** NON IMPLEMENTATO **
Funzione DL485    
 
FunzioneValoreDescrizione
Leggi parametro IO 3  
Funzione DL485    
 
FunzioneValoreDescrizione
Leggi EEPROM 4  L'indirizzo di lettura della EEPROM è formato da 2 BYTE
Funzione DL485
readEE(self, board_id, startaddressLs, startaddressMs, nbyte)
 Parametri: board_id, indirizzo EE (byte 0), indirizzo EE (byte 1), Numero byte da leggere
Esempio readEE(self, 1, 32, 1, 10) La board n. 1 restituirà 10 byte a partire dall'indirizzo 1x256 + 32
 
FunzioneValoreDescrizione
Scrivi parametro IO 5  
Funzione DL485    
 
FunzioneValoreDescrizione
Scrivi EEPROM  6 L'indirizzo di scrittura della EEPROM è formato da 2 BYTE
Funzione DL485
writeEE(self, board_id, startaddressLs, startaddressMs, data)
Parametri: board_id, indirizzo EE (byte 0), indirizzo EE (byte 1), byte da scrivere
Esempio writeEE(self, 5, 64, 2, [0x23, 0x33, x045]) Scrittura dei byte 0x23, 0x33, x045 a partire dalla locazione 2x256 + 64 della board 5

 

FunzioneValoreDescrizione
Leggi Ingresso  7  Legge il valore di un ingresso
Funzione DL485
readIO(self, board_id, io_logic)
 
Esempio readIO(self, 3, 5) Legge il valore dell' IO logico n.5 della scheda con ID 3

 

FunzioneValoreDescrizione
 Scrivi uscita 8  Imposta il valore di un'uscita
Funzione DL485
writeIO(self, board_id, io_logic, data, ms=0)
 
Esempio IO digitali writeIO(self, 2, 11, 1, ms=0) Setta l'uscita con IO logico 11 della board 2 a 1
Esempio IO analogici writeIO(self, 2, 11, 100, ms=0) Setta l'uscita di un PWM al valore 100

 

FunzioneValoreDescrizione
Init singolo IO  10

 Riinizializza la configurazione dell'IO prendendo i dati dalla EEPROM

Necessario quando viene scritta la configurazione in EEPROM. Oppure fare il reboot della board

Funzione DL485
initIO(self, board_id, io_logic)
 
Esempio initIO(self, 6, 3) Inizializza l'IO n. 3 della board n. 6
 
FunzioneValoreDescrizione
Reboot  11 Comando per fare il reboot della scheda
Funzione DL485 boardReboot(self, board_id) board_id è il numero della board che deve riavviarsi. Nel caso board_id = 0, tutte le schede del BUS si riavvieranno

 

FunzioneValoreDescrizione
GetTipo Board  12 Ritorna il tipo di scheda, la versione della scheda, giorno, mese, anno della versione del software e la configurazione software interna da 0 a 15
Funzione DL485
getTypeBoard(self, board_id)
 
     

 

FunzioneValoreDescrizione
Comando errore  13  
Funzione DL485    

 

FunzioneValoreDescrizione
Comunica IO  14  
Funzione DL485    

 

FunzioneValoreDescrizione
Comunica ACK I2C  15  
Funzione DL485    

 

resetEE
getBME280
setPCA9535
setBusBaudrate
setSerialBaudrate
enableSerial
readI2C
writeI2C
readOneWire
writeOneWire

 

 
 

Stampa   Email