Elipse + Arduino (Modbus RTU)

Boa tarde

Possuo uma aplicação que comunica entre Elipse E3 e Arduino em Modbus RTU, onde a ideia é comandar diferentes valores PWM para acionar duas saídas PWM do Arduino, a comunicação está ok, mas a parte que não está ok é de valores PWM para acionar as saídas com diferentes valores de PWM, por exemplo se eu uso apenas o Arduino sem o supervisório, os valores de PWM oscilam de a 0 a 255 com efeito fade (piscar leds em intensidades diferentes a cada 1ms) para qualquer valor de PWM, mas se faço isso via Elipse, ele só altera os valores de PWM para o fade com PWM superior a 220, valores menores que esse os leds apenas ficam ligados sem piscar (não deveria funcionar assim, deveria ser igual a quando não

tem o Elipse e que comentei acima), o que poderia ser essa discrepância?

Segui esse tutorial: https://kb.elipse.com.br/comunicando-o-arduino-com-elipse-e3-eou-elipse-scada/


Segue o código no Arduino:

// Bibliotecas para Modbus Arduino e Elipse E3
#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

modbusDevice regBank;
modbusSlave slave;

byte Bomba = 9; // DO09 = Bomba
int Led = 11; // DO11 = Leds
int PWM_led; // Para PWM nos leds
int PWM_bomba; // Para PWM na bomba
int Fade_led = 16; // Quantidade de pontos de brilho no led
int Fade_bomba = 5; // Quantidade de pontos de acionamento na bomba
int Max_PWM_led; // Valor máximo vindo do elipse para led
int Max_PWM_bomba; // Valor máximo vindo do elipse para bomba

void setup()
{
//ID do escravo
regBank.setId(1);

//Habilita registradores das saídas DO09 e DO11
regBank.add(9);
regBank.add(11);

//Registrador para PWM DO09 e DO11
regBank.add(40009);
regBank.add(40011);

slave._device = &regBank;

//BaudRate
slave.setBaud(9600);

//Configura pinos 9 e 11 como saídas
pinMode(Bomba,OUTPUT);
pinMode(Led, OUTPUT);
}

void loop()
{
// Muda a intensidade de acionamentos na bomba peristáltica
PWM_bomba = PWM_bomba + Fade_bomba;

  // Setpoints mínimo e máximo de PWM para a bomba peristáltica
  if (PWM_bomba <= 0 || PWM_bomba >= Max_PWM_bomba) 
    {
      Fade_bomba = -Fade_bomba;
    }   

  // Valor de PWM vindo do elipse para a bomba peristáltica
  Max_PWM_bomba = regBank.get(40009);
  analogWrite(Bomba,PWM_bomba);
  
  // Muda a intensidade de brilho dos leds
  PWM_led = PWM_led + Fade_led;

  // Setpoints mínimo e máximo de PWM para os leds
  if (PWM_led <= 0 || PWM_led >= Max_PWM_led) 
    {
      Fade_led = -Fade_led;
    }   
    
  // Valor de PWM vindo do elipse para led
  Max_PWM_led = regBank.get(40011);
  analogWrite(Led,PWM_led);
  delay(1);
   
  slave.run();  

}


Boa tarde @willian_nsl,

Sugiro que você procure um fórum sobre arduino para sanar suas demais dúvidas, haja visto que a comunicação com o E3 já foi realizada de forma satisfatória.

Minha última contribuição para o seu código, você precisa tratar melhor a mudança de direção de acordo com os limites:

unsigned long prevMillis = millis();
 void loop() {
   slave.run();
   Max_PWM_led = regBank.get(40011);
   if ((millis() - prevMillis) >= 10) {
      prevMillis = millis();
      if ((PWM_led + Fade_led) <= 0) {
        Fade_led = -Fade_led;
        PWM_led = 0;
      }
      if ((PWM_led + Fade_led) >= Max_PWM_led) {
        Fade_led = -Fade_led;
        PWM_led = Max_PWM_led;
      }
      PWM_led = PWM_led + Fade_led;
      analogWrite(Led, PWM_led);
   }
}
2 Likes