Controllo motore passo-passo in Modbus

Attenzione !I messaggi sul forum potrebbero essere modificati dal nostro staff. La data e l'ora dei messaggi potrebbe non essere quella di invio ma quella di moderazione da parte dello staff. Grazie per l'attenzione.

Home Forum Controllori SlimLine e Netsyst (LogicLab) Controllo motore passo-passo in Modbus

Taggato: 

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

    Avrei l’esigenza di leggere e scrivere i registri di un azionamento DS5044 della LAM Technologies per motori stepping (Passo-passo) dotato di connessione RS485 con protocollo modbus RTU.

    Ho scritto un programma che utilizza il FB ModbusRTUMaster_v1 per leggere e scrivere i registri, secondo gli indirizzi indicati nel datasheet del costruttore, ma ottengo soltanto un errore di time out esecuzione (rilevato con SysGetLastError). Vorrei chiedervi se avete dei suggerimenti in merito, anche se le variabili in gioco credo siano parecchie.

    #38454
    Sergio Bertana
    Amministratore del forum

    Intanto inizio con il suggerirti di utilizzare il nuovo FB ModbusMaster (Estratto manuale) di gestione protocollo modbus master, vediamo le nuove ed interessanti caratteristiche di questa FB.

    Può essere gestita in sequenza, puoi cioè definire piu istanze della FB definendo per ogni istanza il comando modbus da eseguire, basta connettere il Done della FB precedente sull’Enable di quella successiva per effettuare tutti i comandi in sequenza (Vedi questo topic). Certo che se i registri da leggere e/o scrivere sono molti e non consecutivi, piuttosto che istanziare in LD o FBD molte FB conviene gestire una sola FB da ST gestendo una macchina a stati con l’operando CASE (Trovi un esempio di programma in questo topic).

    Se poni a TRUE l’ingresso SpyOn ti sarà possibile attivare la procedura di spionaggio da connessione Telnet e vedere i dati trasmessi e ricevuti su porta seriale, questo ti permetterà di capire cosa risponde l’azionamento. Può essere che fai un indirizzamento fuori range, chiedi troppi registri contemporaneamente o utilizzi un comando modbus non supportato.

    Ricordati che il protocollo Modbus ha un offset di 1 quindi se nella FB definisci indirizzo di lettura 100 sul pacchetto Modbus verrà inviato l’indirizzo 99 in quanto il dispositivo Slave dovrebbe in accordo allo standard sommare 1. In molti dispositivi Slave questo non viene fatto, quindi in tal caso devi sommare 1 tu all’indirizzo richiesto.

    #36675
    Paolo
    Partecipante

    Grazie! Con la nuova FB ModbusMaster la comunicazione è andata a buon fine, sia in lettura che in scrittura.

    Volevo chiedere però se esiste un modo per inviare una variabile DINT (32 bits con segno) senza doverla scindere in due word con la FB DoubleToWord e sottrarre 1 dalla prima word nel caso di numero negativo (perchè facendo così funziona, ma durante la compilazione rilevo degli avvertimenti e inoltre ho dei dubbi se sia il modo corretto).

    C’è una funzione per trasformare una DINT in due word ?

    #38457
    Sergio Bertana
    Amministratore del forum

    Le variabili DINT, UDINT, REAL solitamente sono allocate in due registri consecutivi, quindi basterà leggere o scrivere da Modbus 2 registri all’indirizzo della variabile. L’unico problema che ci può essere riguarda l’endianness dei dati siccome Modbus non prevede gestione di variabili a 32 bits non esistono specifiche che trattano l’endianness.

    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 ora se anche il sistema slave usa la stessa endianness non ci sono problemi, se invece il sistema utilizza il formato big-endian devi eseguire uno SWAP della variabile. Ecco il codice in ST

    VarOut:=ROL(VarIn, 16); (* Output variable *)

    Altro discorso per le variabili REAL dove oltre al problema endianness devi fare riferimento al formato del dato, SlimLine utilizza lo standard IEEE 754-1985 in singola precisione a 32 bit (Topic). Questa codifica è la più utilizata e quindi non ci dovrebbero essere problemi.

    #38489
    Mauro
    Partecipante

    Scusa dove trovo il nuovo FB ModbusMaster nella sezione download non lo trovo ?

    #38490
    Sergio Bertana
    Amministratore del forum

    Il blocco funzione ModbusMaster si trova nella libreria ePLCUtyLib_C000.pll che è fornita con l’installazione della versione 2.3.0 di LogicLab. Ti consiglio di eseguiore il download dell’ultima versione di LogicLab dal nostro sito, che è arricchito da altre nuove funzioni e blocchi funzioni.

    #38615
    Armando
    Partecipante

    Ho da scrivere una variabile su DS5x con RS485, sto utilizzando SlimLine ed il programma per la prima volta, ho importato il FB ModbusMaster e seguito l’esempio postato ma non ho trovato il modo di personalizzare i comandi da inviare all’azionamento.

    Ccome posso anche visualizzare il comando inviato ?

    #38616
    Sergio Bertana
    Amministratore del forum

    Il FB ModbusMaster come vedi dall’estratto del manuale postato precedentemente ha in ingresso il parametro FCode, devi definire il tipo di comando da eseguire (Codice modbus). Ad esempio per leggere dei registri il codice  sarà 16#03, per scrivere il codice sarà 16#06 (Scrive un solo registro) oppure 16#10 per scrivere più registri.

    Nel parametro Address dovrai indicare l’indirizzo del registro modbus sul driver mentre in Points dovrai indicare il numero di registri su cui operare.

    Probabilmente dovrai eseguire più operazioni di lettura e scrittura consecutive, quindi dovrai istanziare più FB ModbusMaster ed eseguirle in cascata, segui quanto suggerito in questo topic.

    Per visualizzare i comandi Modbus puoi attivare il parametro SpyOn e visualizzare i dati tramite la console di spionaggio (Topic).

    #38624
    Armando
    Partecipante

    Ciao e grazie della risposta; ho la senzazione di perdermi in un bicchiere d’acqua: Il collegamento tra lo SlimLine ed il DS5044 in RS485 è effettuato con soli 2 fili: L+ e H- su SlimLine e pin 5(-) e 9(+) su DS, il programma ho seguito l’esempio postato, si attiva un loop che incrementa costantemente il valore error e in rxcoil non visualizzo il valore della variabile.

    I codici modbus RTU riportati sul manuale dello slave sono diversi ovvero preceduti da 0x es 0x03 per lettura anzichè 16#03.

    #38625
    Sergio Bertana
    Amministratore del forum

    Parli di programma preso da esempio postato ma non sò esattamente a quale esempio ti riferisci. La connessione RS485 è corretta + con + e – con -. Hai verificato che i parametri di comunicazioni siano corretti (Baud rate, numero di bit, parità), nella impostazione della seriale hai definito il DTRManagement a DTR_AUTO_WO_TIMES (Impostazione di default).

    Nelle comunicazioni in RS485 il segnale DTR è utilizzato per determinare la direzione di comunicazione, il modbus master attiva la trasmissione del frame di comando e poi la disattiva per ricevere la risposta dallo slave.

    In merito alla domanda 0x03 o 16#03 sono in realtà la stessa cosa, nel linguaggio C i numeri esadecimali si identificano con 0x mentre nella IEC61131 si identificano con 16#.

    Se attivi la console di spionaggio e catturi le stringhe di dati che invii e ricevi possiamo capire cosa stà succedendo.

    #38632
    Armando
    Partecipante

    Risolto, intanto ho aggiunto la funzione SetSmode impostando il DTRManagement a DTR_AUTO_WO_TIMES. Il problema in realtà era nel range della variabile da leggere sul DS5044, ad esempio per leggere la 41730 del posizionatore (TargetPos) che è contenuto in 2 word impostando point della funzione ModbusMaster maggiore di 2 ritorna un errore.

    A tal proposito, (al momento è curiosità devo ancora approfondire) noto che leggendo il TargetPos al superamento di un tot valore viene valorizzato anche l’array 0 e fin qui ok ma totale passi dell’array 1 che sino a quel limite rispecchiava il contatore del DSxx mostra altri numeri. Ha dei consigli.

    Complimenti per il prodotto, ha grandi potenzialità.

    #38633
    Sergio Bertana
    Amministratore del forum

    Il protocollo Modbus non specifica l’endiannes dei dati nel caso di lettura di variabili a 32 bits. Cito una risposta già presente in un altro post.

    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.
     
    SlimLine utilizza la rappresentazione in little-endian che inizia dal byte meno significativo per finire col più significativo, ora se il valore del registro da leggere è in formato intero a 32 bits basterà dopo la lettura del registro eseguire uno SWAP tra le due words lette. Dai una occhiata alla FB WordToDouble o al manule al capitolo Swap variabile DWORD.

    #38644
    Armando
    Partecipante

    Esatto, quando il TargetPos del posizionatore supera i 4 caratteri (DWORD in Hex) sono spacchettati in modo opposto, esempio 16#00061B49 viene letto 16#1B490006 e appunto come suggerisci attraverso lo SWAP tra le due word utilizzando la funzione ROL il valore viene esposto in modo corretto, questo per la lettura e Naturalmente idem anche in scrittura, occorre eseguire ROL prima di inviare il valore al posizionatore.

    #58702
    Giovanni
    Partecipante

    Dopo molto tempo ritorno alla frase di Sergio Bertana “per applicazioni così spinte dal punto di vista del controllo motore utilizzerei una coppia motore/driver da un unico fornitore fornendo a loro tutte le specifiche sapranno di certo dare le indicazioni utili”. Dicendo che ho seguito i preziosi consigli di Sergio e il risultato è che la macchina sta funzionando dal 2017 e ha permesso una flessibilità di programmazione che ha stupito i colleghi dell’azienda svedese per cui lavoro.

    Visti gli eccellenti risultati ottenuti ho deciso di usare esattamente la stessa architettura per un’altra linea di produzione che sto progettando adesso, nella quale era inizialmente previsto l’utilizzo di un solo driver per motori passo passo. In questo secondo impianto l’esigenza è di sottoporre ad alcune lavorazioni un laminato plastico avvolto in rulli che deve essere trattato a velocità costante e riavvolto sui rulli di prodotto finito.

    Per questo motivo ho acquistato un Driver della serie DS52 della Lam Technologies (la serie DS52 è equipaggiata con un‘interfaccia hardware di tipo RS232 optoisolata dallo stadio di potenza, ed un protocollo di comunicazione di tipo Modbus-RTU) e un PLC Elsist MPS053B310 equipaggiato con gli articoli CBL057A300 e CBL055A000 in modo da permettere la comunicazione con la interfaccia RS232 del Driver.

    L’intento era quello di utilizzare una ruotina metrica per misurare la velocità del laminato plastico e utilizzare il PID del PLC Elsist per controllarne la velocità del motore passo passo, e la bozza di programma realizzata grazie ad alcuni trucchi di Sergio Bertana funziona in modo impeccabile.

    Ma l’altro ieri il titolare dell’azienda svedese per cui lavoro mi ha inviato una e-mail nella quale mi dice che le forze in gioco nel processo sono molto più alte di quanto atteso, e che di conseguenza io non mi potrò limitare a “tirare” il laminato dai rulli finali di avvolgimento ma dovrò anche motorizzare alcuni stadi intermedi.

    La conseguenza è che dovrò connettere ulteriori driver di motori passo passo allo stesso PLC, ma l’unico connettore che avevo sul PLC ora è occupato dal cavo CBL057A300 che è connesso al driver della Lam Technologies. La Lam Technologies produce altre due serie di Driver con BUS.

    La Serie DS54, USB – Modbus RTU (la serie DS54 è equipaggiata con un’interfaccia hardware di tipo USB Full-Speed optoisolata dallo stadio di potenza, ed un protocollo di comunicazione di tipo Modbus-RTU)

    La Serie DS50, RS485 – Modbus RTU (la serie DS50 è equipaggiata con un‘interfaccia hardware di tipo RS485 optoisolata dallo stadio di potenza, ed un protocollo di comunicazione di tipo Modbus-RTU).

    Come conviene agire in questo caso per collegare ulteriori driver di motori passo passo? Grazie mille per i preziosi consigli

    #58720
    Sergio Bertana
    Amministratore del forum

    Naturalmente avendo la necessità di dover comunicare con più drivers devi forzatamente utilizzare una connessione in RS485. Meglio in questo caso sarebbe stato utilizzare un modulo CPU MPS054B110 che ha già l’interfaccia RS485 isolata ed essendo basato su CPU CortexM7 avresti anche una maggiore velocità di esecuzione ed un maggior spazio di programma. Visto che disponi di un MPS053 puoi eventualmente utilizzare un convertitore RS232/Rs485 con i vari adattatori per RJ45 per lo scopo.

    Certo devi tenere presente quale è la velocità richiesta nella comunicazione, tenendo conto che il massimo baud rate e 115200 (ca 10000 caratteri al secodo) e nel protocollo Modbus oltre ai dati ci sono i controlli ed ad ogni pacchetto vi è un pacchetto di risposta con tutti i tempi relativi per gestirli.

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