Vai al contenuto

Connessione a piu’ dispositivi in Modbus TCP

Home Forum Programmazione IEC 61131 (LogicLab) Connessione a piu’ dispositivi in Modbus TCP

Stai visualizzando 6 post - dal 1 a 6 (di 6 totali)
  • Autore
    Post
  • #81030
    Paolo
    Partecipante

    Dovrei collegarmi a più dispositivi server tramite Modbus TCP che ovviamente hanno IP diverso e PORTA diversa, quanti SysTCPClient possono essere funzionanti contemporaneamente ?

    Nel programma devo mettere in uscita da SysTCPClient.File metto un ModbusMaster_v3 dove leggo un indirizzo e un ModbusMaster_v3 dove scrivo un indirizzo ma poi per il dispositivo che ha un IP diverso devo mettere un altro SysTCPClient ecc. ecc.

    Devo abilitare i vari SysTCPClient in sequenza o posso lasciarli tutti attivi?

    LocalAdd puo’ essere sempre (‘0.0.0.0’) e la LocalPort (0) in modo che vengano prese in automatico ?

    Ho provato vari modi, programmando un SysTCPClient funziona tutto con due non riesco a farlo funzionare.

    #81033
    Sergio Bertana
    Amministratore del forum

    Come si legge dalla FAQ Quante connessioni TCP/IP simultanee possono essere gestite?, il numero massimo di connessioni TCP/IP gestite è 32. Ora per connetterti a più dispositivi Modbus TCP hai due opzioni.

    Comunicazione in parallelo con tutti i dispositivi: Istanziare un FB SysTCPClient per ogni dispositivo a cui devi connetterti e come dici correttamente colleghi l’uscita File all’ingresso File del FB ModbusMaster o di più FB in cascata. In questo modo puoi lasciare tutte le connessioni attive che lavorano in parallelo.

    Comunicazione multiplexata tra i vari dispositivi: Istanziare un FB SysTCPClient e le relative ModbusMaster poi creare un programma batch in cui ai vari passi esegui:

    1. Connessione all’indirizzo IP del dispositivo.
    2. Esecuzione comandi Modbus con 1 o più FB ModbusMaster in cascata.
    3. Disconnessione dal dispositivo.
    4. Iterazione sul punto 1 cambiando l’indirizzo IP del dispositivo. Raggiunto l’ultimo dispositivo riparto dal primo.

    Con la comunicazione in parallelo hai anche la massima velocità di comunicazione con tutti i dispositivi ma anche il massimo impegno di risorse, tipicamente la memoria RAM utilizzata pere gestire le connessioni e la comunicazione Modbus.

    Con la comunicazione sequenziale minimizzi l’utilizzo di risorse ma la comunicazione sarà molto più lenta.

    LocalAdd deve essere (‘0.0.0.0’) e LocalPort (0) in modo che vengano prese in automatico.

    Il fatto che con 1 istanza di SysTCPClient funzioni e con 2 no è strano… non ci sono assolutamente problemi ad utilizzare più istanze, se mandi il programma alla nostra eMail di supporto vediamo di capire il perchè.

    #81071
    Ufficio Tecnico
    Partecipante

    Sono riuscito a farlo funzionare con 7 dispositivi. Le FB ModbusMaster_v3 devono essere comandate tutte in cascata anche se hanno l’ingresso File da SysTCPClient diverso perchè a volte mi da errore per qualche minuto e poi riprende a funzionare.

    Ho modificato l’ingresso Enable del FB ModbusMaster_v3 che lo prende dal Done del precedente e sembra funzionare meglio. Quindi sembra che più FB ModbusMaster_v3 non possano operare simultaneamente. Però anche in questo modo a volte mi da errore (Screenshot).

    Ho notato che se arresto il PLC e lo faccio ripartire funziona tutto di nuovo.

    #81086
    Sergio Bertana
    Amministratore del forum

    C’è un po di confusione…

    Le FB ModbusMaster collegate allo stesso SysTCPClient.File devono essere gestite in cascata, il Done della prima sull’Enable della successiva e così di seguito fino all’ultima FB il cui Done negato va connesso all’Enable della prima.

    Non c’è nessun legame tra le FB Modbus collegate al File di FB SysTCPClient diverse, ognuna di esse opera dialogando con il proprio dispositivo e non interferisce con le altre. E’ proprio questo il vantaggio di poter operare in parallelo.

    Dal tuo screenshot, vedo un contatto di Done di una FB ModbusMaster sull’Enable della prima, ma non capisco se è il Done dell’ultima FB della cascata di quelle connesse a quel SysTCPClient. Inoltre si tratta di un Done normale, mentre dovrebbe essere un Done negato.

    L’errore che tu vedi è proprio indicativo di più FB Modbus master che sono eseguite contemporaneamente sullo stesso File, in pratica una “Ruba” i dati all’altra che riceve un transaction identifier errato. Credo che i tuoi problemi sono tutti nella errata gestione delle cascate.

    #81093
    Ufficio Tecnico
    Partecipante

    Ho modificato il programma usando MODBUS RTU over TCP e va un po’ meglio ma ogni tanto mi da qualche errore diverso da prima. L’errore è 10007050 Timeout esecuzione.

    Attualmente sto provando con 7 FB SysTCPClient collegati ognuno ad un unico FB Modbusmaster_v3. Gli apparecchi sono configurati come Modbus server tutti alla porta 502 con IP diverso

    1. E’ corretto usare FB Modbusmaster_v3 nel programma plc?
    2. E’ corretto usare per tutti la stessa porta ma su IP diversi?
    3. Il tempo di ritardo (DELAY) e’ a 250ms , devo aumentarlo ancora ?
    4. RxSize e TxSize sono corretti ?
    5. C’e qualche parametro da modificare ?

    Nell’immagine si vede due dei 7 FB SysTCPClient collegato al FB Modbusmaster_v3.

    #81101
    Sergio Bertana
    Amministratore del forum

    Dallo screenshot non vedo dove finisce il segnale di Done, ma a parte questo c’è sicuramente una stranezza nella gestione dell’Enable, ti consiglio di non negare l’ingresso di Enable e di utilizzare in serie al segnale Connected un contatto normale chiuso di Done. In risposta alle tue domande:

    1. L’utilizzo della FB ModbusMaster è corretto, il programma deve essere eseguito in task Back.
    2. Come indirizzo IP e come porta devi definire quella richiesta dal dispositivo che interroghi. La porta 502 è la porta stanndard utilizzata dal protocollo Modbus/TCP. Quindi se così dice la specifica del tuo dispositivo è corretto, anche perchè se l’IP o la porta fossero errati non avresti mai l’uscita di Connected.
    3. Il tempo di delay dipende da quanto è veloce a rispondere il dispositivo che interroghi. 250mS mi sembra già un tempo abbastanza lungo.
    4. RxSize e TxSize vanno dimensionati in base alla lunghezza del frame di comando e del frame di risposta del comando Modbus. Tu leggi 2 registri (4Bytes) a cui aggiungi l’header (6 bytes). In totale meno di 16 bytes.
    5. Visto che hai dei timeout puoi esagerare con il tempo di Timeout (1S), tanto per vedere se è davvero un problema di programma o se è il tuo dispositivo che non riesce a rispondere in 250mS.

    Tieni comunque presente che 28 errori su quasi 19000 pacchetti scambiati, non è molto, anche se in Modbus/TCP solitamente si hanno pochissimi errori.

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