Vai al contenuto

Comunicazione modbus master con serie di HMI Weintek

Home Forum Controllori SlimLine e Netsyst (LogicLab) Comunicazione modbus master con serie di HMI Weintek

Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Autore
    Post
  • #35352
    Luca
    Partecipante

    Vorrei interconnettere uno SlimLine configurato come master a una serie di pannelli Weintek della serie i (6050) posti quindi in configurazione slave. Ho connesso la linea seriale 485 dalla parte SlimLine sui morsetti “fieldbus” e sul connettore del terminale sui pin 1 e 2 (quindi in COM1).

    Sullo SlimLine ho aperto una Sysfopen con COM2 e mode “rw”. DTR management ho messo 0. Nella FB modbus RTUmaster_v1 ho fatto FC code 16#01 e address 40000 e gli altri parametri come da esempi. Per semplicità adesso ho connesso un solo pannello con un pulsante che fa toggle e quindi deve, quando interrogato dal master (ogni 100ms) leggere scrivere nell’area di memoria uno zero od un uno.

    Ho messo le resistenze di terminazione (per adesso da 100 ohm ma sono in laboratorio a 50 cm e quindi suppongo non siano un problema). All’esecuzione il terminale mi da il messaggio che il plc non risponde e non mi fa apparire neanche l’unico pulsante di prova che ho disegnato.

    Qualche suggerimento per favore? Magari un programmino di prova da cui posso poi attingere per espandere alle mie applicazioni ?

    #37622
    Sergio Bertana
    Amministratore del forum

    In attesa di prepararti un esempio, vedo cha hai definito DTRManagement a 0 (DTR_OFF), è questo è sicuramente un errore, dovendo gestire una comunicazione multidrop in RS485 su 2 fili, il segnale DTR è usato come “Commutatore” della direzione dati.

    In pratica quando il modulo CPU deve trasmettere verso i terminali il segnale DTR deve essere attivo, e poi quando deve ricevere indietro la risposta il segnale DTR deve essere disattivo. Questo scambio sul segnale DTR viene eseguito automaticamente dal driver seriale dello SlimLine ma devi impostare DTR management a 2 (DTR_AUTO_WO_TIMES).

    Credo che sia questo errore la fonte dei tuoi problemi, intanto di rimando anche alla lettura di questi due posts (Post 1) e (Post 2).

    #37623
    Luca
    Partecipante

    Grazie per la celerità.. adesso sembra che HMI e plc comunichino (il led com lampeggia con regolarità seguendo il ritmo di lettura che gli ho cadenzato)… Il problema è che non leggo nulla….

    Ho impostato un semplice pulsante sul terminale con variabile LB0. A questo punto mi sorge il dubbio… come devo interrogarlo da SlimLine ?

    Dal foglio Weintek sembra che devo andarlo a vedere indirizzando a 1 il valore di address. E’ così ? Per leggere un bit è inoltre giusto impostare FCcode 16#01 ?

    #37624
    Sergio Bertana
    Amministratore del forum

    Stavo preparandoti un esempio, ma vengo alla tua domanda il codice 16#01 è corretto ma devi tenere presente che modbus ha come offset 1 quindi per leggere la variabile LB 0 devi indicare indirizzo 1.

    Nel mio esempio (Ecco la stampa del programma PLC) ho gestito la lettura di 16 variabili bit (Da LB 0 a LB 15), nel programma del pannello ho gestito 8 pulsanti toggle da LB 0 a LB 8. Ti allego programmi SlimLine e HMI per il download.

    #37625
    Luca
    Partecipante

    Benissimo, adesso funziona… con un terminale.. adesso proverò ad attaccare gli altri. La cosa che differiva dal tuo programma è che io abilitavo il blocchetto Modbus master con un contatto a fronte positivo ogni 100ms. Come mai ? Che errore concettuale ho commesso ?

    In pratica, se non ho capito male la chiamata del blocchetto è condizionata dal ciclo macchina (che può andare bene). Se io volessi invece fare una chiamata a tempi deterministici come potrei fare ?

    #37626
    Sergio Bertana
    Amministratore del forum

    Il blocco funzione ModbusRTUMaster_v1 come molti altri blocchi funzione è stato pensato per poter essere facilmente eseguito in cascata, per cascata intendo condizionare l’esecuzione di una altra istanza del FB al termine della esecuzione di quella precedente. Come si vede nella stampa di questo programma, 4 istanze della FB sono poste in cascata.

    La prima esegue lettura di 16 coils, terminata l’esecuzione (sia con esito positivo che su errore) viene attivata l’esecuzione della seconda che esegue la scrittura di 16 coils, poi viene eseguita la terza con la lettura di 8 registri e poi la quarta con la scrittura di 8 registri. Terminata la quarta attivando Done[3] si disattiva la prima e di conseguenza cadono tutti i Done facendo ripartire il ciclo. Impostando un tempo nella variabile Delay puoi ritardare l’esecuzione di una FB rispetto all’altra.

    Qui nel mio programma di esempio (Download programma) comunico sempre con lo stesso terminale ma tu puoi mettere tante FB quante te ne servono indicando come indirizzo di nodo l’indirizzo dei vari terminali della tua applicazione.

    Da quanto espresso è evidente perchè non funziona il tuo programma, non puoi utilizzare un fronte per attivare la FB, l’abilitazione deve essere attiva almeno per tutto il tempo di esecuzione comando. Togliendo l’abilitazione la FB termina il suo funzionamento.

    #37627
    Sergio Bertana
    Amministratore del forum

    Concludo la risposta dicendo che se vuoi eseguire la comunicazione a tempi determinati (Esempio ogni 5 Sec) basterà con un timer eseguire il set di una variabile StartCom, la quale attiverà il blocco funzione (O la serie in cascata dei blocchi funzione) e l’uscita Done della FB (O dell’ultima FB della cascata) andrà a resettare la variabile StartCom.

    Naturalmente bisogna che l’intero ciclo di comunicazione duri meno del tempo di attivazione eseguito con il timer.

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