Uscita ModBus verso Arduino..

Sezione dedicata a Mach3
Rispondi
Avatar utente
huliofane
Senior
Senior
Messaggi: 1105
Iscritto il: mercoledì 29 ottobre 2008, 15:18
Località: Prov. Verona
Contatta:

Uscita ModBus verso Arduino..

Messaggio da huliofane » sabato 30 novembre 2024, 14:32

Salve a tutti...
Come potete immaginare,ho un piccolo problemino...

Con brain su mach3 riesco a gestire le varie funzioni di mach3 tramite Arduino,questo almeno per quanto riguarda Start,Stop,Emergenza e robe simile,il problema mi sorge nel senso opposto,ad esempio creo una macro,con Brain la associo al Modbus ma poi' ??
In arduino cosa carico in modo da fargli eseguire un determinato flusso logico se gli arriva il segnale "tot" da Mach3 ??
Vorrei creare una Macro in modo che Arduino porti ad un determiato valore un'uscita ,ad es M203 ,e se scrivo M205 la porti a zero
il flusso logico in Brain con VB riesco a costruirlo,mi manca la parte di Arduino in ricezione...

Un semplice On/Off per accendere e spegnere un led con i comandi M203 = Led On e M205 = Led Off

grazie mille a chi mi aiuterà
Quando smonto una cosa,per quel piccolo lasso di tempo,entro nella testa di chi l'ha creata

Avatar utente
hellfire39
God
God
Messaggi: 3920
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Uscita ModBus verso Arduino..

Messaggio da hellfire39 » sabato 30 novembre 2024, 16:50

Se non sei pratico di Arduino (e del funzionamento del Modbus), potrebbe non essere così banale.
Inizia studiando la seguente libreria:

https://docs.arduino.cc/libraries/modbusrtuslave/

Avatar utente
huliofane
Senior
Senior
Messaggi: 1105
Iscritto il: mercoledì 29 ottobre 2008, 15:18
Località: Prov. Verona
Contatta:

Re: Uscita ModBus verso Arduino..

Messaggio da huliofane » sabato 30 novembre 2024, 18:36

essere pratico di arduino è tutto un dire,non si puo sapere tutto...dirò che non ho mai avuto esperienza approfondita con modbus,ho soltanto fatto partire e spegnere mach3 con arduino tramite modbus ...

tu puoi aiutarmi nella realizzazione del mio progetto ??

fin'ora ho capito il discorso che ogni "utenza" ha un'indirizzo e vari canali,chi "manda" un segnale dirà "utenza" 1 canale ....valore....
e quello risponde in base a com'è programmato,una sorta di DMX o di bus di antifurti...ma sicuramente avrò detto anche qualche castroneria...
il punto è che voglio arrivare almeno a capire come fare a mettere in attesa arduino riguardo dei segnali o codici provenienti dal modbus o tramite modbus,poi se arriva quel segnale gli farò fare questo,se arriva quel segnale gli farò fare quell'altro....
spero di essere riuscito a spiegarmi..
Quando smonto una cosa,per quel piccolo lasso di tempo,entro nella testa di chi l'ha creata

Avatar utente
hellfire39
God
God
Messaggi: 3920
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Uscita ModBus verso Arduino..

Messaggio da hellfire39 » sabato 30 novembre 2024, 19:34

Quello che vuoi fare è, al tempo stesso, facile e difficile.
Di per sé, è una operazione banale, ma è necessaria una conoscenza minima dei concetti del modus.

Ogni periferica ha un indirizzo, hai detto bene. E già qui potrebbe esserci il primo problema, perché, in base alle implementazioni, potrebbe esserci una differenza di uno tra il valore che imposti e quello che viene inviato sulla seriale.

Come funziona la comunicazione?
Ci sono sostanzialmente due tipi di messaggi:
- read/write coils
- read/write registers
I differenti tipi di messaggi vengono chiamati FC.

Con coils si intende segnali digitali. Con registers si intende segnali analogici, ovvero degli interi a 16 bit.

Penso che a te basti utilizzare la FC che implementa il comando write single coil.

Sapendo questo, puoi studiarti la libreria e i suoi esempi e vedere come può essere gestita la ricezione di tale messaggio.

Aggiungo che, per debuggare velocemente una comunicazione seriale, è consigliatissimo un oscilloscopio o un analizzatore di stati logici che abbia la decodifica dei segnali seriali. Meglio ancora se ha la decodifica del modus.

Avatar utente
huliofane
Senior
Senior
Messaggi: 1105
Iscritto il: mercoledì 29 ottobre 2008, 15:18
Località: Prov. Verona
Contatta:

Re: Uscita ModBus verso Arduino..

Messaggio da huliofane » sabato 30 novembre 2024, 21:35

Per te che è una cosa banale,ti va di aiutarmi ??
Quando smonto una cosa,per quel piccolo lasso di tempo,entro nella testa di chi l'ha creata

Avatar utente
hellfire39
God
God
Messaggi: 3920
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Uscita ModBus verso Arduino..

Messaggio da hellfire39 » sabato 30 novembre 2024, 21:56

L'esempio della libreria ModbusRTUSlave è abbastanza chiaro e semplice.
Ti basta utilizzare i coils o gli holdingregister (non so mach3 quali FC utilizza).

Magari domani lo ripulisco, si tratta solo di togliere cose inutili.

P.s. che tipo di seriale hai in uscita a mach3? RS232? RS485?

Avatar utente
huliofane
Senior
Senior
Messaggi: 1105
Iscritto il: mercoledì 29 ottobre 2008, 15:18
Località: Prov. Verona
Contatta:

Re: Uscita ModBus verso Arduino..

Messaggio da huliofane » sabato 30 novembre 2024, 22:13

Grazie mille...
uso ardunio collegato alla sua usb

fin'ora sto facendo prove con

Modbus-Arduino Example - Lamp (Modbus Serial)
Copyright by André Sarmento Barbosa

scaricato da GitHub
La mia "missione" se così si puo definire è arrivare a comandare un motore brushless con il suo esc collegato ad un'uscita di arduino in pwm,con un semplice Map fare un piu o meno "alla carlona" una sorta di rapporto pwm/giri anche se non saranno mai fedeli,ma almeno avere un 255 a manetta,un 120 circa metà e 60 circa 1/4 e via così...
Tutto questo partendo da una macro con Brain in modo che da programma trova un S10000 M203 e gira a manetta,un S5000 M203 e gira alla metà
un M205 e ferma ..questo sarebbe circa quello che ho in mente,che poi a dire la verità,tutta la verità, sarebbero 3 i motori ausiliari che dovrò gestire,ma un passo alla volta,penso che per aggiungerne un'altro basta cambiare degli indirizzi e dei pin e fare una sorta di copia incolla....almeno è questa è l'idea che mi sono fatto provando a studiare un po il modbus e aggiungendo ciò che so su arduino..
Beh,ora che ti ho esposto tutto il quadro ,mi manca solo da aggiungere il fatto che tutto questo andà montato su una sorta di tornio a fantina mobile che sto costruendo,e che per necessita su dei pezzi che devo costruire devo per forza di cose aggiungere almeno due motorizzati e queste sono le uniche alternative che ho stando a dimensioni di ingombro e materiale che posso utilizzare.....
Ti ringrazio anticipatamente un sacco per la pazienza e spero per l'aiuto che vorrai darmi,intanto continuo a studiare e pfare prove finchè i bimbi dormono...o quasi :D
Quando smonto una cosa,per quel piccolo lasso di tempo,entro nella testa di chi l'ha creata

Avatar utente
hellfire39
God
God
Messaggi: 3920
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Uscita ModBus verso Arduino..

Messaggio da hellfire39 » domenica 1 dicembre 2024, 18:59

Allora, non so se ho capito bene le tue esigenze.
Tu vuoi comunicare ad arduino uno o più valori analogici.

Questo viene fatto con la funzione di scrittura degli holding registers (FC06 oppure FC16).
Se prendi l'esempio ModbusRTUSlaveExample, devi fare riferimento alle righe che contengono la scritt HoldingRegisters.
Hai:
- la definizione del numero di registri da gestire (ogni registro è un valore a 16 bit)
- l'array che conterrà la definizione
- il setup della libreria, dove indichi l'array
- la chiamata periodica a modbus.poll()
- l'utilizzo dei valori letti.
- l'identificativo dello slave modbus, in questo caso "1": #define MODBUS_UNIT_ID 1


Nell'esempio, due valori vengono utilizzati per variare la luminosità del led, comandato in analogico in PWM.



Qui ti riporto l'esempio in cui ho cancellato le altre funzioni (ingressi uscite digitali e ingressi analogici).
Ti ho lasciato solamente le uscite analogiche.
Per essere sicuro del funzionamento, ho testato il programma con un master modbus generico.

Codice: Seleziona tutto

/*
  ModbusRTUSlaveExample

  This example demonstrates how to setup and use the ModbusRTUSlave library (https://github.com/CMB27/ModbusRTUSlave).
  See README.md (https://github.com/CMB27/ModbusRTUMaster/blob/main/examples/ModbusRTUSlaveExample/README.md) for hardware setup details.
  
  Created: 2023-07-22
  By: C. M. Bulliner
  Last Modified: 2024-10-26
  By: C. M. Bulliner
  
*/

#include <ModbusRTUSlave.h>

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) || defined(ARDUINO_SAM_DUE)
  // The ATmega328P and ATmega168 are used in the Ardunino UNO and similar boards.
  // The ATmega2560 and ATmega1280 are used in the Arduino Mega and similar.
  #define MODBUS_SERIAL Serial
#elif defined(ARDUINO_NANO_ESP32)
  // On the Arduino Nano ESP32, the HardwareSerial port on pins 0 and 1 is Serial0.
  #define MODBUS_SERIAL Serial0
#else
  // On the majority of Arduino boards, the HardwareSerial port on pins 0 and 1 is Serial1.
  // On the Arduino Mega and Adruino Due, Serial1 is on pins 18 and 19.
  #define MODBUS_SERIAL Serial1
#endif
// You can change the baud, config, and unit id values if you like.
// Just make sure they match the settings you use in ModbusRTUMasterExample.
#define MODBUS_BAUD 38400
#define MODBUS_CONFIG SERIAL_8N1
#define MODBUS_UNIT_ID 1

#if (defined(ARDUINO_NANO_RP2040_CONNECT) && !defined(ARDUINO_ARCH_MBED)) || defined(ARDUINO_NANO_ESP32)
  // These boards operate unsing GPIO numbers that don't correspond to the numbers on the boards.
  // However they do have D# values #defined to correct this.
  const int8_t buttonPins[2] = {D2, D3};
  const int8_t ledPins[4] = {D5, D6, D7, D8};
  const int8_t dePin = D13;
#else
  // Other boards do not have D# values, and will throw an error if you try to use them.
  const int8_t buttonPins[2] = {2, 3};
  const int8_t ledPins[4] = {5, 6, 7, 8};
  const int8_t dePin = 13;
#endif
const int8_t knobPins[2] = {A0, A1};

ModbusRTUSlave modbus(MODBUS_SERIAL, dePin);


const uint8_t numHoldingRegisters = 4;


uint16_t holdingRegisters[numHoldingRegisters];

void setup() {
  pinMode(knobPins[0], INPUT);
  pinMode(knobPins[1], INPUT);
  pinMode(buttonPins[0], INPUT_PULLUP);
  pinMode(buttonPins[1], INPUT_PULLUP);
  pinMode(ledPins[0], OUTPUT);
  pinMode(ledPins[1], OUTPUT);
  pinMode(ledPins[2], OUTPUT);
  pinMode(ledPins[3], OUTPUT);

  #if defined(ARDUINO_NANO_ESP32)
    analogReadResolution(10);
  #endif


  modbus.configureHoldingRegisters(holdingRegisters, numHoldingRegisters);


  MODBUS_SERIAL.begin(MODBUS_BAUD, MODBUS_CONFIG);
  modbus.begin(MODBUS_UNIT_ID, MODBUS_BAUD, MODBUS_CONFIG);
}

void loop() {
  
  modbus.poll();

  analogWrite(ledPins[0], holdingRegisters[0]);
  analogWrite(ledPins[1], holdingRegisters[1]);
}

Avatar utente
huliofane
Senior
Senior
Messaggi: 1105
Iscritto il: mercoledì 29 ottobre 2008, 15:18
Località: Prov. Verona
Contatta:

Re: Uscita ModBus verso Arduino..

Messaggio da huliofane » domenica 1 dicembre 2024, 20:46

Grazie mille,mi ci devo mettere sopra e provare....

Dalla parte di mach3 come lo imposto per far partire da una macro tipo M203 s10000 (s10000 sarà il 100% ) e M205 per spegnere

Perche mi riesce da aruino a mach3 ma ormai a forza di provare e fare file nuovi non so piu che infilarci dentro e che brain usare di quelli che funzionano e no....

Grazie mille
Quando smonto una cosa,per quel piccolo lasso di tempo,entro nella testa di chi l'ha creata

Avatar utente
hellfire39
God
God
Messaggi: 3920
Iscritto il: domenica 16 dicembre 2012, 9:04
Località: AN

Re: Uscita ModBus verso Arduino..

Messaggio da hellfire39 » lunedì 2 dicembre 2024, 8:12

Con la programmazione di Mach3 non ti so aiutare

Rispondi

Torna a “Mach3”