Vai al contenuto

Programmare dispositivi Compact su rete RS485

Home Forum Controllori SlimLine e Netsyst (LogicLab) Programmare dispositivi Compact su rete RS485

Stai visualizzando 10 post - dal 1 a 10 (di 10 totali)
  • Autore
    Post
  • #35477
    Andrea
    Partecipante

    Stò realizzando un progetto domotico costituito da uno SlimLine ARM7 master e tanti nodi remoti SlimLine Compact che parlano tra loro tramite una connessione seriale RS485. Ho letto che il modbus RTU è intrinseco nello SlimLine ma come faccio ad impostare il numero del nodo degli slave ?

    Inoltre, posso programmare gli slaves tramite la connessione RS485 ?

    #37960
    Sergio Bertana
    Amministratore del forum

    Tutti i dispositivi SlimLine hanno la gestione del protocollo Modbus (RTU, Ascii, TCP/IP) slave nativo. Nel tuo caso dovendo gestire una rete di dispositivi dovrai utilizzare per la gestione del master Modbus sul modulo CPU ARM7 il blocco funzione ModbusMaster passando come stream di I/O la porta seriale RS485 (COM2). Dovendo comunicare con tanti nodi slaves dovrai sequenziare l’esecuzione delle chiamate alla FB indicando per ognuna i parametri necessari (Indirizzo di nodo, indirizzo registri, codice funzione). Se poi per ogni nodo slave devi sia leggere registri che scrivere registri saranno necessarie due chiamate alla FB per ogni nodo slave.E’ evidente che sul nodo master non vi è un indirizzo di nodo, ma i vari slaves andranno configurati con indirizzi di nodo diversi. Per fare questo occorre accedere alla pagina web di configurazione del modulo Compact (Vedi post). Dal menù Hardware Setup è possibile impostare tutti i parametri di comunicazione compreso il tipo di Modbus ed il nodo definendo per ogni slave il proprio indirizzo (Screenshot).

    #37961
    Sergio Bertana
    Amministratore del forum

    Con la soluzione vista nel post precedente, per effettuare la programmazione dei nodi slaves puoi scollegare la rete RS485 dal nodo master e collegarla tramite un convertitore USB-Seriale al PC (Il protocollo Modbus accetta un solo master e per programmare i dispositivi il PC diventa master Modbus). Ora configurando LogicLab per una connessione seriale ed impostando il numero di nodo dello slave che vuoi programmare è possibile eseguirne la programmazione direttamente in rete RS485 (Screenshot).

    #37962
    Sergio Bertana
    Amministratore del forum

    Ma come nel tuo caso dove il nodo master è un modulo SlimLine ARM7 con interfaccia Ethernet, ti consiglio di utilizzare  come protocollo di comunicazione il Modbus OverIP. Dal menù Hardware Setup è possibile impostare tutti i parametri di comunicazione compreso il tipo di Modbus ed il nodo definendo per ogni slave il proprio indirizzo (Screenshot).

    Vediamo di spiegare il perchè di questa configurazione, in questo modo sarà possibile effettuare la programmazione da rete Ethernet semplicemente accedendo allo SlimLine master e senza sconnettere nulla. In pratica il modulo SlimLine ARM7 tramite la FB DataStreamExch diventa un convertitore Ethernet/Seriale (Vedi post) facendo passare i dati dalla rete Ethernet verso la rete RS485. Si sceglie il protocollo OverIP perché dovendo configurare in LogicLab una connessione TCP/IP viene utilizzato automaticamente questo protocollo. Per programmare i vari slaves occorrerà impostare in LogicLab l’indirizzo IP dello SlimLine ARM7 e la porta definita nel programma (Nel mio esempio utilizzo la porta 2000) cambiando indirizzo di nodo in base allo slave da programmare (Screenshot).

    Ecco un progetto in cui evidenzio come realizzare il programma sullo SlimLine ARM7, come si vede dalla stampa del programma, nel program MasterModbus oltre alla comunicazione con i vari nodi slaves viene gestito un socket TCP/IP su porta 2000. Quando viene rilevata una connessione sul socket la comunicazione modbus con i nodi slaves viene abortita e la rete RS485 è connessa al socket (Download programma sorgente).

    #37963
    Andrea
    Partecipante

    Grazie, mi procuro il cavo seriale per l’aggiornamento del firmware e provo ad utilizzare il progetto suggerito. Lo Slimline MPS046B acquistato ha XTarget 10.0 e compilando il progetto (realizzato con XTarget 11.0) si ha l’errore:

    modulo MAIN(264) – error A4097:  SPY_BINARY => Object not found

    In realtà devo collegare in rete MODBUS RTU anche altri dispositivi quali termostati RS485 o contatori di sottrazione ORBIS “BUS”, questa soluzione “over ip” è valida anche lasciando collegati gli altri dispositivi ? Ovvero, continuo a comunicare con questi dispositivi che fanno parte della rete MODBUS RTU anche con questa impostazione del protocollo di comunicazione fra dispositivi SlimLine ?

    #37964
    Sergio Bertana
    Amministratore del forum

    A partire dalla versione SFW184A800 del sistema operativo è stata introdotta la funzione SysSpyData che permette se abilitata di spiare da connessione Telnet dati di programma utente, è utilizzata in alcuni FB e funzioni. Nel tuo caso specifico è utilizzata nel FB ModbusMaster per spiare i dati in transito sullo stream di comunicazione. Quindi per eliminare l’errore devi eseguire l’upgrade del sistema operativo ed anche del LogicLab eseguendo il download dell’ultima versione 2.2.0 (Codice  PCK033H200).Per quanto riguarda la compatibilità di comunicazione sulla stessa rete Modbus utilizzando sia il protocollo RTU che OverIP, non dovrebbero esserci problemi, entrambi i protocolli sono binari. Il protocollo OverIP inizia con un campo a 16 bits definito Transaction identifier. proprio per permettere questa coesistenza il FB ModbusMaster invia l’MSB del campo Transaction identifier con il valore 16#00. Siccome questo è il primo dato inviato dopo la pausa di interframe viene considerato dai dispositivi slaves come indirizzo di nodo 0, quindi basterà non avere nella rete nessun dispositivo slave RTU mappato ad indirizzo 0.Chiaramente nel programma SlimLine Master dovrai definire nel FB ModbusMaster il parametro Type:=0 quando comunichi con i dispositivi RTU e Type:=2 quando comunichi con gli SlimLine.

    #37981
    Andrea
    Partecipante

    Ho risolto il problema di impostare correttamente la comunicazione fra SlimLine ARM7 e SlimLine Comact usando l’esempio suggerito. L’array Slaves è costituito da 16 WORD sia per la parte di read che per quella di write. Nel programma che ho realizzato ho usato le funzioni BitToByte e ByteToWord per scrivere nell’array Slaves[i].Wr[i] e correttamente quindi invio un numero che varia da 0 a 2^16-1.

    Il problema stà nella lettura dell’array Slaves[i].Rd[i]: in particolare, ho realizzato un semplice programma sugli slave che scrivono su MX100.32 a seguire 6 bit in sequenza in funzione dello stato degli ingressi, quello che accade è illustrato in questa tabella:

    Bit su slave 00000001 –> Slave[i].Rd[0]=16#0001
    Bit su slave 00000010 –> Slave[i].Rd[0]=16#0100
    Bit su slave 00000100 –> Slave[i].Rd[1]=16#0001
    Bit su slave 00001000 –> Slave[i].Rd[1]=16#0100
    Bit su slave 00010000 –> Slave[i].Rd[2]=16#0001
    Bit su slave 00100000 –> Slave[i].Rd[2]=16#0100
    Ecc…

    Mi aspettavo invece di vedere incrementare sempre la prima word Slave[i].Rd[0] con valori tipo 1, 2, 3…. ecc, dove stò sbagliando ?

    #37982
    Sergio Bertana
    Amministratore del forum

    Mi dici che stai appoggiando gli ingressi sui moduli slaves a partire da MX100.32 quindi deduco che nel programma RS485Network postato nel post precedente hai modificato l’indirizzo di lettura dai nodi slaves, nel case 0 del programma hai scritto MMdb.Address:=40016; (* Variable address *).

    Siccome il comando Modbus per la lettura è il 16#04 (Andava bene anche 16#03) i due comandi sono uno l’alias dell’altro, sono letti registri a 16 bits quindi l’indirizzo Modbus deve essere l’indirizzo memoria diviso 2 (MX100.32 -> 40032, diviso 2 diventa 40016).

    Ma se tu leggi registri word ed appoggi gli ingressi su bytes avrai quello che stai vedendo, ogni word è 2 bytes ed il byte sarà 16#00 se l’input non è attivo e 16#01 se l’input è attivo. Per avere quello che desideri ossia tutti gli ingressi compressi nei 16 bits della word devi usare come hai fatto nel programma master le funzioni di appoggio bits su word.

    Facendo riferimento al programma master che ho postato precedentemente ecco la stampa del programma SlaveNode che è il suo complementare programma da trasferire sui nodi slave. Come vedi ho definito la struttura MODBUSDATA esattamente uguale a quella del master, poi ho allocato la variabile MdbCm di tipo MODBUSDATA ad indirizzo MX100.0 in modo da potervi accedere da Modbus.

    Utilizzando le FB di appoggio bit ho appoggiato gli ingressi nella prima delle 16 WORD MdbCm.Rd[0] che sarà letta dal sistema master. Mentre la WORD scritta dal master MdbCm.Wr[0] viene appoggiata sulle uscite. Allego il programma per il download.

    #38021
    Fabio
    Partecipante

    Sono nella fase di programmazione su SlimLine  per la gestione ingresso/uscita di Trycom TRP C28M in Modbus su RS485, premesso che ho già provato con successo la lettura degli ingressi e la forzatura delle uscite relè, attraverso la seriale del computer; usando il blocco funzione sModbusRTUmaster ed il blocco Sysfopen, secondo le indicazioni del manuale di programmazione, ho solo condizioni di errore, è possibile avere un esempio di lettura e scrittura che funzioni correttamente, grazie.

    #38022
    Sergio Bertana
    Amministratore del forum

    In questo topic si parla di rete con CPU compact utilizzate come moduli di I/O in alternativa ai moduli TRP C28M anche perché il costo è di qualche pochi superiore ma si tratta di prodotti programmabili.

    Se tu sei già riuscito a leggere/scrivere gli I/O del TRP da PC in Modbus non dovresti avere problemi a gestirli con i blocco funzione Modbus. Ti ricordo che abbiamo fatto diversi upgrade del FB ora l’ultimo livello è il ModbusMaster. In questo topic puoi trovare il programma sorgente di una FB creata appositamente per la gestione dei TRPC28M.

Stai visualizzando 10 post - dal 1 a 10 (di 10 totali)
  • Devi essere connesso per rispondere a questo topic.