Elipse E3 - Arduino - Modbus RTU

Hi, The playlist below shows a communication between a supervisory on E3 with Arduino.

The tutorials were based on the page:
“Comunicando o Arduino com Elipse E3 e/ou Elipse SCADA.” - Elipse Knowledgebase

1 Like

Tenho uma dúvida, utilizei como base sua aplicação, apenas para acionar duas saídas pwm do Arduino, via Elipse E3, modbus RTU também e alterar o valor de pwm de ambas as saídas, mas com efeito fade, piscar ambas as saídas pwm com o pwm desejado via supervisório, a comunicação ficou ok, mas o acionamento via supervisório não acontece com alguns valores, por exemplo, utilizei um delay de ms para efeito fade e com base nisso piscar de acordo com a intensidade desejada via tela, mas para alguns valores ele não pisca, apenas fica ligado, o que poderia ser isso e como posso resolver? Pois não estou compreendendo esse comportamento.

Segue o código no Arduino ao qual utilizei:

// 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();  

}

OBS.: Se testo o código acima sem o elipse e apenas no Arduino, ele pisca em qualquer valor de pwm utilizado!

Poderia me ajudar a solucionar essa dúvida?

Oi, Willian, tudo bem? Analisar o code de outra pessoa é dificil. Mas, na sua situação, como já estive muitas vezes, ou seja, debugando um software. Eu costumo, isolar os dois. Nos meus tutorias, no meu canal:


eu explico como usar o TeraTerm (envia e recebe dados seriais) e o VSPE (cria porta serial virtual), com estes dois, você consegue ver e testar se os dados entre o Arduino e o Elipse, estão OK e pode simular valores.
Agora, o Arduino via TCP, pode ser mais indicado para vc:
https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqbnEtSUtUTEFXVU9ZUUc3ZlQ3ZWNteHF6ajFaUXxBQ3Jtc0tsT29iSzZJSlU4X0xFYlR0SWpaR21ZNjltTmR0RzEwWmljVVB4NVlneWxLSUhnWmhzbG03ZkZndExUTDV4VGdiRjFsNHE2SHJuMjZfY3IwZ2lTWGdBRHJtb2JGZksycDhzT1pYYkpkMVJCRlNaQ09FWQ&q=https%3A%2F%2Fforum.elipse.com.br%2Ft%2Felipse-e3-arduino-modbus-tcp%2F4368%2F2

1 Like