Mais de um arduino no ScadaBR


#1

É possivel usar mais de um arduino no ScadaBR, penso que teria que atribuir um endereço para o arduino e fazer a comunicação serial entre eles, mas não sei como atribuir esse endereço dentro do arduino.
Alguém já fez isso ou sabe como pode ser feito ou até mesmo já possui um exemplo?


#2

Conheço três opções que para fazer o que precisa. Protocolo Modbus TCP/IP, Modbus Serial, Modbus (TCP/IP ou Serial) e depois I2C.
Ainda não fiz por falta do conversor usb para rs-485 que precisa para fazer esta ligação:
https://www.google.com.br/search?q=conversor+usb+rs485&source=lnms&tbm=isch&sa=X&ved=0ahUKEwi6orjUm6rWAhVFQiYKHRw7CJMQ_AUICygC&biw=1440&bih=794
Mas e simples, caso você tenha o adaptador pode utilizar da biblioteca modbus do professor sarmento:


http://www.andresarmento.com/estacio/interfaces/

Dentro da biblioteca tem alguns exemplos de códigos que deixarei um comentário à parte para simplificar:

Se colocar mais que 2 placas por barramento, lembrando que modbus Serial e via barramento neste caso.
Basta no campo mb.setSlaveId(1); colocar de 1 a 247(quantidade de slaves aceito) O zero é do master que só exite 1, o ScadaBR.
Vou pegar um código exemplo que uso para facilitar um entendimento que tive dificuldade no inicio.

#include <Modbus.h>
#include <ModbusSerial.h>

// Define os pinos que você irá trabalhar
#define LED1 31
#define LED2 45
#define JK1 A14
#define JK2 A15

// Modbus Registers Offsets (0-9999)
//Essas constantes precisa ser acrescentadas a cada 1 para cada pino que for utilizar, caso nao tenha lido o funcionamento do protocolo Modbus, a configuração para leitura funciona da seguinte forma.
http://www.ni.com/white-paper/52134/pt/
Vá até a parte: Acesso aos dados no Modbus e o modelo de dados do Modbus
Ou seja, tenho 2 led’s, com tipo de dados boolean com acesso leitura/escrita
const int LED1_VAL = 0; //primeiro led posição 0
const int LED2_VAL = 1; //segundo led posição 1

Aqui eu coloquei 2 joystick com tipo de dados analógicos com acesso apenas para leitura.
const int JK1_VAL = 0;
const int JK2_VAL = 1;

// ModbusSerial object
ModbusSerial mb;

void setup() {
// Configuração da porta Modbus Serial (port, speed, byte format)
mb.config(&Serial, 9600, SERIAL_8N1);
// Set the Slave ID (1-247)
// Se tive mais que 1, coloque o próximo como 2.
mb.setSlaveId(1);

// Tipo do pino, entrada ou saida, com ou sem pull up
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(JK1, INPUT);
pinMode(JK2, INPUT);


//Dentro da biblioteca tem a especificação de como funciona para adicionar cada novo tipo de acesso
//Basicamente adiciona uma nova posição ao registrador que será lido.
//Mas para facilitar deixarei aqui ja:
//Tipo de registrador	Uso	                                      Acesso	                Métodos da biblioteca
//Status Coil	                Sáida digital	                      Leitura/Escrita	          addCoil(), Coil()
//Holding Register	Saída analógica	              Leitura/Escrita	          addHreg(), Hreg()
//Input Status	        Entrada digital	                      Somente Leitura	  addIsts(), Ists()
//Input Register	        Entrada analógica	              Somente Leitura	  addIreg(), Ireg()
mb.addCoil(LED1_VAL);
mb.addCoil(LED2_VAL);

mb.addIreg(JK1_VAL);
mb.addIreg(JK2_VAL);

}

void loop() {
//Faz a leitura do modbus
mb.task();

//Faz a leitura do Joystick de forma analógica e armazena na variável JK1_VAL para ser lido no Modubs
mb.Ireg(JK1_VAL, analogRead(JK1));
mb.Ireg(JK2_VAL, analogRead(JK2));

//Escreve na saída Especificada o valor lido no registrador da posição da memoria
digitalWrite(LED1, mb.Coil(LED1_VAL));
digitalWrite(LED2, mb.Coil(LED2_VAL));
}

Bom, esse é a forma de fazer leitura em 1 placa, para fazer em 2 utilizando diretamente protocolo Modbus, basta você utilizar o conversor e definir outro valor para o slaveId.
Mas caso queira utilizar um Arduino como Getway entre Modbus e i2c eu tenho um bom entendimento de uma comunicação e programação para isso, porém o Arduino que servirá como Gatway recomendo que não tenha outra atividade alem disso, pois se for de 16MHz não teria Clock o suficiente para tanto.


#3

Obrigado pela ajuda, pretendo utilizar dessa forma pois quero montar um sistema utilizando arduino e scadabr para chamar garçom, cada mesa terá um pequeno painel com algumas funcionalidades e no balcão de atendimento um monitor com o sistema a ser operado por um atendente.
Vou usar o scadabr pq quero manter um histórico de avaliação do cliente, que vai ser uma das funções que vai ter.


#4

Parece interessante, vai nos atualizando sobre seu trabalho.


#5

@Juliano_Perotto

Adorei sua participação. Seu reforço no grupo será maravilhoso.

@fernandocsouza

As afirmações do Juliano são muito pertinentes. Eu particularmente uso o MODBUS RTU e MODBUS IP. Mas usei o I2C entre dois arduinos.

Vamos modelar bem esse post, pois pode se tornar um tutorial.


#6

Essa questão dos tutoriais será feita Sidney, não se preocupe. Estou tentando me organizar para fazer o mais breve possível.


#7

Se utilizar a comunicação serial, estou pensando que vai ter muito cabo a ser passado. Mas uma duvida, no scadabr tem como pegar o endereço ip de cada arduino?


#8

Se você utilizar modbusIP tem como sim. Você na verdade precisa declarar o IP que será cada Arduíno.


#9

opa Juliano sou novo aqui, e estou focado em criar uma rede modbus para ter alguns microcontroladores comandados via rs485, pelo que vi acho que to no lugar certo nesse post, mas fiquei na duvida quanto ao esquema de ligação da sugestão do professor Andre, se tiver o esquema eu fico grato.


#10

Bom, como você estará utilizando Arduino. Cabe-se então utilizar conversores rx-tx (rs-232) para RS-485. E um conversor RS-485 USB para criar um barramento para colocar os Arduino em rede.

Existem alguns esquemas / exemplos por ai, um que testei com o @farmsid foi este: http://labdegaragem.com/profiles/blogs/tutorial-como-utilizar-o-shield-rs485-e-o-conversor-usb-rs485-com

Mas existem outros, que não testei.
Uma boa solução também é utilizar Ethernet Shield W5100 para Arduino e utilizar uma rede ethernet. Entretanto, é uma solução mais cara. Mas, tem alguns shields / modulos ethernet mais em conta.