Go Down

Topic: Problema com Modbus Slave (Read 5691 times) previous topic - next topic

defende

Boas para todos.

Estou tentando já por vários dias ligar um arduino uno ao meu pc via modbus mas sem sucesso.
Ja usei varios exemplos de Modbus Slave e ate agora nada.

O que acontece é que o meu pc retorna um erro dizendo que nao foi encontrado nenhum dispositivo. Eu fiz um teste de conexao usando um CLP da LS via Modbus e tudo ocorreu sem problemas entao nao é nem o programa nem o cabo e nem o conversor que esta com problema.
O programa de comunicacao fui eu que fiz em VB6 para protocolo Modbus RTU e TCP.
Gostaria da ajuda de vcs com maiores explicacoes sobre esta conexao ou ate mesmo um exemplo que esteja funcionando.

Minha conexao do PC com o Arduino via serial é RS232

Muito grato a todos.

hugo007

#1
Jan 27, 2014, 01:28 pm Last Edit: Jan 27, 2014, 01:31 pm by HugoPT Reason: 1
Quote
O programa de comunicacao fui eu que fiz em VB6 para protocolo Modbus RTU e TCP.

Vb6 uhmm inda se usa isso, nao esta um pouco ultrapassado?
Tu dizes que estas a usar modbus RTU o que quer dizer que usas uma comunicação serie.Configuraste a porta serie no VB corretamente?
Como tens o programa do arduino?
Estas a ler os registros corretamente?
Os registros que tens do lado do VB apontam para os mesmo registros que criaste no arduino?
Que operações tentaste?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

defende

Ola amigo tudo bom.

Eu uso alem de VB6, tenho tambem o protocolo feito em VB.Net. Eu desenvolvo supervisorios nestas duas linguagens para maquinas industriais. Veja algumas maquinas em www.vemax.com.br

A comunicacao com o Arduino esta em serial RS232 e esta tudo configurado certo pois nos Clps funciona perfeitamente.

Acredito que seja alguma coisa no Arduino mesmo, por este motivo gostaria da ajuda do pessoal.

Grato.

hugo007

#3
Jan 27, 2014, 02:15 pm Last Edit: Jan 27, 2014, 02:20 pm by HugoPT Reason: 1
Ok.
Vamos por partes.Primeiro coloca o código que tens no arduino aqui, sem ele tentar ajudar mais vale ir ver na bola de cristal.
O endereço do arduino esta de acordo com o endereço que tentas ler no VB?
Podes colocar a parte do vb onde fazes a leitura dos coils?
Quote
A comunicacao com o Arduino esta em serial RS232 e esta tudo configurado certo pois nos Clps funciona perfeitamente.

Sendo isto verdade para que no arduino funcione, tens de testar com o mesmo endereço de slave que tens configurado no automato e com os mesmos registros.
Isso esta assim?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

defende

Valos la.
O codigo que eu estou usando é este aqui, um exemplo que eu peguei na internet.

Code: [Select]
#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

/* PINS
Add more registers if needed
Digital input pins 2,3,4,5,6,7
Digital output pins 8,9,12,13
Analog output pins 10,11 (PWM)
Analog input pins 0,1,2,3,4,5
*/


modbusDevice regBank;
modbusSlave slave;

int AI0,AI1,AI2,AI3,AI4,AI5;


void setup()
{   
  regBank.setId(1); ///Set Slave ID

//Add Digital Input registers
  regBank.add(10002);
  regBank.add(10003);
  regBank.add(10004);
  regBank.add(10005);
  regBank.add(10006);
  regBank.add(10007);
// Add Digital Output registers
  regBank.add(8);
  regBank.add(9);
  regBank.add(12);
  regBank.add(13);
//Analog input registers
  regBank.add(30001);
  regBank.add(30002);
  regBank.add(30003);
  regBank.add(30004);
  regBank.add(30005);
  regBank.add(30006);
//Analog Output registers
  regBank.add(40010); 
  regBank.add(40011); 

  slave._device = &regBank; 
  slave.setBaud(9600);   
 
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(6,INPUT);
  pinMode(7,INPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
   
}
void loop(){

  while(1){   
  //Digital Input
    byte DI2 = digitalRead(2);
    if (DI2 >= 1)regBank.set(10002,1);
    if (DI2 <= 0)regBank.set(10002,0);
    byte DI3 = digitalRead(3);
    if (DI3 >= 1)regBank.set(10003,1);
    if (DI3 <= 0)regBank.set(10003,0);
    byte DI4 = digitalRead(4);
    if (DI4 >= 1)regBank.set(10004,1);
    if (DI4 <= 0)regBank.set(10004,0);
    byte DI5 = digitalRead(5);
    if (DI5 >= 1)regBank.set(10005,1);
    if (DI5 <= 0)regBank.set(10005,0);
    byte DI6 = digitalRead(6);
    if (DI6 >= 1)regBank.set(10006,1);
    if (DI6 <= 0)regBank.set(10006,0);
    byte DI7 = digitalRead(7);
    if (DI7 >= 1)regBank.set(10007,1);
    if (DI7 <= 0)regBank.set(10007,0);
                               
  //Digital output
    int DO8 = regBank.get(8);
      if (DO8 <= 0 && digitalRead(8) == HIGH)digitalWrite(8,LOW);
      if (DO8 >= 1 && digitalRead(8) == LOW)digitalWrite(8,HIGH);
    int DO9 = regBank.get(9);
      if (DO9 <= 0 && digitalRead(9) == HIGH)digitalWrite(9,LOW);
      if (DO9 >= 1 && digitalRead(9) == LOW)digitalWrite(9,HIGH);
    int DO12 = regBank.get(12);
      if (DO12 <= 0 && digitalRead(12) == HIGH)digitalWrite(12,LOW);
      if (DO12 >= 1 && digitalRead(12) == LOW)digitalWrite(12,HIGH);
    int DO13 = regBank.get(13);
      if (DO13 <= 0 && digitalRead(13) == HIGH)digitalWrite(13,LOW);
      if (DO13 >= 1 && digitalRead(13) == LOW)digitalWrite(13,HIGH);
           
  //Analog input  ***READ Twice deliberately
    AI0 = analogRead(0);
    delay(10);
    AI0 = analogRead(0);
    regBank.set(30001, (word) AI0);
    delay(10);
   
    AI1 = analogRead(1);
    delay(10);
    AI1 = analogRead(1);
    regBank.set(30002, (word) AI1);
    delay(10);
   
    AI2 = analogRead(2);
    delay(10);
    AI2 = analogRead(2);
    regBank.set(30003, (word) AI2);
    delay(10);
   
    AI3 = analogRead(3);
    delay(10);
    AI3 = analogRead(3);
    regBank.set(30004, (word) AI3);
    delay(10);
   
    AI4 = analogRead(4);
    delay(10);
    AI4 = analogRead(4);
    regBank.set(30005, (word) AI4);
    delay(10);
   
    AI5 = analogRead(5);
    delay(10);
    AI5 = analogRead(5);
    regBank.set(30006, (word) AI5);
    delay(10);
       
  //Analog output
    word AO10 = regBank.get(40010);
    analogWrite(10,AO10);
    delay(10);
    word AO11 = regBank.get(40011);
    analogWrite(11,AO11);
    delay(10);
       
  slave.run(); 
  }
}


A velocidade da minha serial no lado do PC esta em 9600, o ID em 1

Estou tentando ler no Arduino o endereço 30001 que é da analogica 1.

Alem deste endereço todos os outros que eu tento nenhum funciona. Eu simulei um teste usando um CLP. Eu inverti o RX e TX do CLP com os do PC. Eu deixei assim

CLP         PC
RX           RX
TX           TX
GND       GND

Assim deu erro de comunicacao.

CLP        PC
RX          TX
TX          RX
GND     GND

Assim funcionou perfeitamente. O erro que acontece no Arduino é exatamente o primeiro erro. Mas eu ja inverti os RX - TX e nada. Eu acho que pode ser alguma no codigo do Arduino, por isso eu queria que se alguem tiver a oportunidade de testar esse codigo ai ver se esta funcionando.


Grato

hugo007

#5
Jan 27, 2014, 02:43 pm Last Edit: Jan 27, 2014, 02:48 pm by HugoPT Reason: 1
A tua funçao setup não inicializa a porta Serie.Claro que isto pode estar a acontecer dentro da lib mas para teres certeza no loop tenta imprimir algum texto para veres se ele é impresso quando abres a comunicação serie na IDE.
Ja tentaste ligar o teu arduino usando só o cabo USB?
Assim desta forma  nao tens de te precoupar com os pinos de TX /RX pra ja.
Tens algum conversor RS232 para RS485 neste momento na comunicação?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

defende

O conversor eu tenho sim RS232 - RS485.

Eu ainda nao fiz este teste de verificar a saida da serial internamente.

Como vc sugere que eu faça isso?

hugo007

#7
Jan 27, 2014, 02:59 pm Last Edit: Jan 27, 2014, 03:02 pm by HugoPT Reason: 1
Sim elimina pra já o conversor RS485 e tenta escrever algo no loop com o Serial.print("Testando porta Serie");
A lib pode ate so estar a usar o printf, mas isso só vendo dentro dela, tenta procurar na documentação
O conversor rs485 é comprado ou tu é que o fizeste com o max485?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

ViniciusTech

Tenho um software que desenvolvi em vb.net que realiza a comunicação diretamente pelo cabo usb com rs232 e funcionou sem problemas

defende

Boas HugoPt.
O meu conversor é comprado mas tambem estou fazendo um com Max485 - fica mais pratico ja na placa.
Vou fazer este teste entao

Viu Vinicius que biblioteca voce usou pra fazer a comunicacao de USB para serial. Isso muito me interessa. A DLL que eu tenho em VB.Net serve tanto pra MODBUS RTU como pra MODBUS TCP. Eu costumo muito fazer software que atraves da rede Ethernet se comunica com IHMs e por ela com o CLP. Para supervisorio e software de controle de producao e monitoramento de maquinas no chao de fabrica fica legal.

Grato

hugo007

Ja fizeste o teste da serial?
Quote
O meu conversor é comprado mas tambem estou fazendo um com Max485 - fica mais pratico ja na placa.

Tem atençao que o RS485 nao e full-duplex logo tens de assegurar que colocas o max485 em modo transmissao e envias todos os dados, e so depois o colocas em modo receiver.
O pino de controlo do max só pode ser comutado quando esvaziares o serial buffer, caso contrario iras perder os dados.
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

defende

Sim sim, tenho noção deste detalhe, mesmo assim valeu mesmo.

Ainda nao fiz o teste da serial. Fazer mais para o fim da tarde. Assim que fizer posto o resultado aqui.

defende

Bom dia a todos.

Fiz os testes de serial no meu pc. Consegui comunicar via Hyperterminal e tambem por um programa feito em VB que envia string via serial. Usei a funcao Serial.read() no Arduino e o mesmo leu perfeitamente, sem problema algum. Os dados chegam no Arduino em Char ASCII.
Agora via Modbus nao vai nem a pau. Baixei um programa para teste de Modbus. Com este programa consegui comunicar com clps LS, WEG, Siemens e Allen-Bradley linha Micrologix sem problema algum. Com o programa que eu ja mencionei que eu fiz em VB tambem comuniquei com  os mesmos CLPs sem problema.
Agora usando o Modbus no lado do Arduino nao consigo. Nao vai.

Alguem tem alguma ideia.

Rodrigo

hugo007

Tens acesso a algum logic analyser?
Podes partilhar esse teu programa em VB  para testar aqui?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

defende

Boas amigo.

Infelismente nao tenho Logic Analyzer.

Com respeito ao software eu te mando sim mas será mais a noite pois no serviço nao tenho ele, esta no meu Notebook pessoal em casa.

Grato.

Go Up