Vai al contenuto

Connessione con I/O distribuiti TRP via modbus RTU

Home Forum Controllori SlimLine e Netsyst (LogicLab) Connessione con I/O distribuiti TRP via modbus RTU

Stai visualizzando 10 post - dal 1 a 10 (di 10 totali)
  • Autore
    Post
  • #34931
    Anonimo
    Inattivo

    Ho acquistato dei moduli di I/O distribuito della Trycom, volevo utilizzarli per realizzare un impianto domotico. In pratica vorrei collegare ai 16 ingressi digitali del modulo TRPC26 gli interruttori, mentre alle 16 uscite del modulo TRPC24 vorrei collegare le uscite di comando utilizzatori (Lampade, elettrodomestici, ecc.).

    Pensavo di utilizzare il vostro modulo CPU SLine per la gestione logica dell’impianto, è possibile gestire questi moduli di I/O distribuiti tramite il protocollo Modbus dalla vostra CPU ?

    #36594
    Sergio Bertana
    Amministratore del forum

    Il modulo TRPC26 utilizza il comando modbus 01 Read Coil Status per la lettura dello stato dei 16 ingressi digitali, mentre il modulo TRPC24 utilizza il comando modbus 15 Force Multiple Coils per la scrittura delle 16 uscite digitali. Utilizzando il blocco funzione ModbusRTUMaster (Estratto manuale), è possibile eseguire la lettura degli ingressi dal modulo TRPC26 e la scrittura delle uscite sul modulo TRPC24.

    Ho realizzato un programma su SLine che effettua ciclicamente la lettura dei 16 ingressi del modulo di ingressi e li appoggia in 16 variabili BOOL (TRPC26Input[0..15]), copia 16 variabili BOOL (TRPC24Output[0..15]) sulle 16 uscite logiche del modulo di uscita. I due moduli sono stati connessi in rete RS485, occorre definire al modulo di ingressi logici indirizzo 0x01 (Default), al modulo uscite logiche indirizzo 0x02, vedi post.

    Nel programma troverai un programma ladder Logic, che appoggia l’ingresso DI0 del moduli di ingressi sull’uscita DO0 del modulo di uscita. Potrai aggiungere tutte le logiche che ti servono aggiungendo linee a questo file e/o aggiungendo altri programmi al progetto.

    Il programma TRPComm esegue la letura e scrittura ciclica dei moduli di I/O, i programmi InputRead e OuputWrite, eseguono lo swap dei bits letti e da scrivere verso i moduli TRP per poter avere le variabili BOOL ordinate in funzione degli I/O sul modulo. Stampa programma, download programma.

    #36598
    Sergio Bertana
    Amministratore del forum

    Trattandosi di impianto per domotica, ti consiglio nei files InputRead ed OutputWrite di rinominare le variabili di appoggio degli I/O distribuiti utilizzando dei nomi che siano mnemonici per il tuo impianto.

    Per gli ingressi TRPC26Input[0] potrà diventare PlsLuceSaloneTRPC26Input[1] potrà diventare PlsLuceCucina, ecc.
    Per le uscite TRPC24Output[0] potrà diventare CdoLuceSaloneTRPC24Output[1] potrà diventare CdoLuceCucina, ecc.

    #36794
    Raffaele
    Partecipante

    Chiedo delucidazioni in merito all’esempio IOOverTRP che provato con successo su differenti produttori di IO modbus.

    Sto attualmente eseguendo test di comunicazione con un Siemens S7-200 usato come slave modbus dello collegato allo SlimLine. L’unica modifica che ho fatto per poter leggere il succitato slave modbus è stato quello di impostare FCode=16#03 e impostare il parametro Address in modo opportuno.

    Ho riscontrato la situazione che può dedurre dalla figura, ovvero che l’array TRPC26Read non si valorizza correttamente. Infatti dalla finestra Watch si valorizza correttamente solo il bit meno significativo dell’array mentre la visualizzazione di %MW100.0 dimostra che la comunicazione avviene correttamente.

    #36795
    Sergio Bertana
    Amministratore del forum

    Occorre capire la differenza tra FCode 16#01 (Read coil status) e 16#03 (Read holding register).

    Il comando 16#01 esegue la lettura dello stato di contatti logici, cioè variabili booleane, quindi eseguendo la lettura di 16 variabili Points=16, come nel mio programma TRPCom, si valorizzano i 16 valori BOOL consecutivi dell’array TRPC26Read.

    Il comando 16#03 esegue la lettura di words (16 bits) di memoria, quindi eseguendo la lettura di 1 variabile Points=1 come nel tuo esempio viene valorizzata una sola variabile USINT di programma. Come si vede la %MW100.0 è valorizzata con il valore 16#0005 che è il valore presente nel PLC Siemens.

    Se il tuo problema è suddividere una variabile USINT in 16 variabili BOOL, puoi utilizzare i blocchi funzione WordToByte e ByteToBit (Estratto manuale).

    #36796
    Sergio Bertana
    Amministratore del forum

    Aggiungo un Tip che può essere utile a capire l’indirizzamento dei sistemi SlimLine. SlimLine è basato su di un procesore ARM che utilizza la memorizzazione dei dati nel formato little-endian, inizia dal byte meno significativo per finire col più significativo.

    Quindi come puoi vedere dall’esempio la %MW100.0 è valorizzata con il valore 16#0005, quindi alla locazione con offset 0 dell’array TRPC26Read allocato allo stesso indiirizzo di %MW100.0 corrisponde LSB del valore della word, mentre alla locazione con offset 1 corrisponde MSB.

    Essendo il valore della word 16#0005 il suo LSB sarà diverso da zero, cioè TRUE, mentre il suo MSB sarà uguale a o cioè FALSE. Se il valore della word fosse stato 16#0101 avremmo avuto sia MSB che LSB al valore TRUE.

    #36804
    Raffaele
    Partecipante

    Desideravo delucidazioni in merito alla codifica utilizzata dallo SlimLine per i dati REAL. Devo in pratica trattare come real un numero in virgola mobile (32bit) acquisito via MODBUS-RTU da un plc S7-200 FCode=16#03 e Points=2.

    Dal manuale di LogicLab l’unica specifica riguardo al tipo real è che ha range -3.4E38 – +3.4E38 mentre il formato utilizzato dal S7-200 è “REAL 32 bit Numero in virgola mobile a 32 bit IEEE   da +1,175495E-38 a +3,402823E+38 da -1,175495E-38 a -3,402823E+38”

    Mi aspettavo che la codifica fosse identica ma non riesco a memorizzare il valore acquisito in una variabile REAL, allego screenshots, spero siano chiare le prove effettuate.

    #36805
    Sergio Bertana
    Amministratore del forum

    Il formato utilizzato per le variabili REAL è IEEE 754 come detto in questo post, dai tuoi screenshots si evince che è lo stesso formato usato dal S7-200. Infatti in questo formato di rappresentazione, il valore REAL 2.0 vale in esadecimale 16#40000000 (Come si vede dalla finestra di debug su S7-200).

    Attenzione! Nella lettura di variabili a 32 bits tramite modbus occorre prestare attenzione all’endianness dei dati, il protocollo modbus infatti non specifica in che ordine devono essere ritornate le due parti a 16 bits del dato a 32 bits. Quindi è possibile che in alcuni sistema venga ritornata la parte più significativa prima della parte meno significativa o viceversa.

    Su SlimLine come già detto in altri posts si utilizza la little-endian che inizia dal byte meno significativo per finire col più significativo, e da quanto vedo è lo stesso tipo di rappresentazione che utilizza Siemens nel S7-200 (Probabilmente utilizza un processore ARM). Infatti se noti nella %MW100.16 che è il primo registro letto da modbus si trova la parte meno significativa del numero e nella %MW100.18 la parte più significativa.

    Il tuo errore quindi è solo nella inversione delle word nella conversione WordToDouble.

    #36806
    Sergio Bertana
    Amministratore del forum

    Aggiungo un consiglio, visto che il formato di rappresentazione del S7-200 è uguale a quello dello SlimLine, per avere il valore in REAL basta che tu definisca una variabile REAL all’indirizzo DB100.16 dove FB modbus appoggia i registri letti dal S7-200 per poterla utilizare nel tuo programma senza dover usare la WordToDouble.

    MiaVariabile AT %MD100.16 : REAL; { DE:”Variabile REAL letta da S7-200″ }

    #37636
    Sergio Bertana
    Amministratore del forum

    Si certo la soluzione che hai prospettato è realizzabile, in questo post puoi trovare un esempio di come gestire da SlimLine i moduli di I/O distribuito tramite Modbus. Acquisiti i moduli appoggerai gli I/O su variabili di memoria dello SlimLine accessibili da Modbus. Il PC può essere connesso in Ethernet e lo stato degli ingressi acquisito tramite modbus TCP, utilizzando ad esempio un software SCADA (Vedi post), un applicativo sviluppato con ProfilabExpert (Vedi post) oppure un applicativo sviluppato ad Hoc con il linguaggio di programmazione da te conosciuto. Se lo sviluppo del protocollo modbus TCP è troppo complesso puoi sviluppare un protocollo di comunicazione calibrato sulle tue esigenze (Vedi post). Se devi solo visualizzare lo stato dei campanelli, in alternativa al PC ti consiglio l’utilizzo di un pannello operatore touch screen che ha già nativa la gestione del protocollo modbus TCP, inoltre volendo puoi gestire il suono del buzzer ed anche visualizzare lo storico di intervento dei campanelli. Il pannello può gestire anche storici su file permettendo di avere un report degli interventi dei campanelli relazionato con data/ora.

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