Ola pessoa tudo bem???? esse eh o meu primeiro post aqui no LDG...to aprendendo scadabr + modbus + arduino e estou com uma duvida..

O que gostaria de fazer é definir um valor na representação grafica do scadabr e esse valor fosse passado para o arduino que iria ativar um rele pelo tempo que eu definir na representação grafica ( ou no watchlist)

Ja sei fazer um led (ou rele) acender via modbus pelo scadabr definindo valor de escrita 1 e apagando definindo valor 0 pelo watchlist e pela representação grafica pelo codigo:

switch(regs[MB_PINO_13]) {
case 1:

 
digitalWrite(ledPin13, HIGH);
break;

default: /* apagado */
digitalWrite(ledPin13, LOW);

}

O que tentei essemcodigo e nao funcionou, to fazendo alguma coisa errada, pode ser o tipo de dados:

if(regs[MB_PINO_13] == 3){

digitalWrite(ledPin13, HIGH);

delay(3000); //espera 3 segundo e desliga o led

digitalWrite(ledPin13, LOW);

}else if(regs[MB_PINO_13] == 5){

digitalWrite(ledPin13, HIGH);

delay(5000); //espera 5 segundo e desliga o led

digitalWrite(ledPin13, LOW);

}else{

digitalWrite(ledPin13, LOW);

}

E que tipo de dados eu uso?? to usando do tipo binario....nao sei qual outro usar??

A rezão disso é controlar a vazao de ração pelo tempo que eu definir na representação grafica( o tempo que ficara aberto e a ração caindo)...ele tbem le a temperatura(mais esta certo ja)

espero ter sido claro...abraçosss e obrigado !!!!

Exibições: 1867

Anexos

Responder esta

Respostas a este tópico

Vagner,

se vc fez as mudanças que te informei, mande uma imagem do datasource e datpoint.Para ver sefaltamais alguma coisa.

eai fera fmz...então em vez de postar prints resolvi fazer um video da configuração...resumo do video:

se utilizar o codigo:

switch(regs[MB_PINO_13]) {
case 1:
digitalWrite(ledPin13, HIGH);
break;
default: /* apagado */
digitalWrite(ledPin13, LOW);
}

Funciona com 1 e 0

com o codigo:

if(regs[MB_PINO_13] == 3){
digitalWrite(ledPin13, HIGH);
delay(3000);
digitalWrite(ledPin13, LOW);
}else if(regs[MB_PINO_13] == 5){
digitalWrite(ledPin13, HIGH);
delay(5000);
digitalWrite(ledPin13, LOW);
}else{
digitalWrite(ledPin13, LOW);
}

Não funciona, fica acesso e da o erro.

LINK DO VIDEO DO SEGUNDO CODIGO:

https://www.youtube.com/watch?v=JYATUVCiRs4&feature=youtu.be

VLW T++++

Vagner,

já me inscrevi no seu canal para toda vez que publicar videos eu ficar sabendo.

To tentando também resolver esse problema. Estou tentando escrever na porta com o PWM usando o switch mas nao deu certo. agora vou tentar escrever direto.

maravilha..vou tentando aqui tbem , qualquer luz no fim do tunel posto o video...abraçoss amigo

Acredito que vc vai ter que ir pela tentativa e erro, a biblioteca usada no scadabr e mdbus4J, uma otima e confiavel biblioteca,recomendada até pelo grupo que organiza o protocolo modbus, entao acredito que o problema não está no scadabr, vi que na leitura do modbus deu o resultado endereço ilegal, coloque lá offset igual a 1. Cada datapoint criado vc utiliza um valor de offset:

lm35--->offset 0

led --->offset 1

e assim por diante...

lá em leitura de modbus - não deve aparecer ilegal data address, deve aparecer outro coisa para dizer que está ok.

feito essa parte teste e veja o que dá como resultado continando o problema continuaremos o troubleshooting

EH NA LEITURA DO LED DA ILEGAL DO LM35 DA OK, TENHO Q CONSERTAR ISSO, VOU MEXER E POSTO O RESULTADO SE OK..

ABRAÇOSSS

O problema no codigo sao os seus delays, eles impedem que o scada leia os dados pois o programa esta parado, por isso da erro de comuicação, ao inves de usar um delay de 3 segundos por exemplo, use:

int tempo;

if(regs[MB_PINO_13] == 3){
     digitalWrite(ledPin13, HIGH);

     for(tempo=0;tempo<3000;tempo++)
     {
          update_mb_slave(MB_SLAVE, regs, MB_REGS);
          regs[MB_PINO_13];
          delay(1);

     }

     digitalWrite(ledPin13, LOW);

}

acho que o delay total aumenta um pouco fazendo assim, mas é so ajustar, e nao vai dar erro de comunicaçao com o scadabr

O Luiz Carlos tem razão.

Tive vários problemas com as bibliotecas e após muita investigação constatei que não podemos ter delay no código. Como o scadabr é o mestre ele quer que a informação esteja disponivel na hora que ele quer e não admite o arduino decidir nada, quanto mais deixar ele esperando.

Temos que ter estes artifícios para o código não ficar paralizado.

Como que eu tirei a prova? limpei o código e deixei só as leituras das analógicas e escritas das saidas digitais.

Funcionou perfeito.

pois é, no meu tive que usar o for para funcionar, assim ele fica um milésimo de segundo parado por vez, assim sempre o scada tentar ler o codigo ele vai conseguir, pois a leitura demora mais que isso, e eu consigo manter o programa "parado" pelo tempo que preciso.

E outra, da para fazer o codigo assim:

int tempo, parada=0;
update_mb_slave(MB_SLAVE, regs, MB_REGS);
parada=regs[MB_PINO_13]*1000; // le o valor e multiplica por 1000 para gravar em segundos
if (parada>0)  // para qualquer de entrada acima de 0
{
digitalWrite(ledPin13, HIGH); //acende o led
for(tempo=0;tempo<parada;tempo++)   // mantem  aceso pelo tempo em segundos setado na entrada
{
update_mb_slave(MB_SLAVE, regs, MB_REGS);
regs[MB_PINO_13]=0; //zera o registrador para leituras posteriores
delay(1);
}
digitalWrite(ledPin13, LOW); // apaga o led
}

este codigo le a entrada e mantem o led aceso pelo tempo digitado no scada, assim vc pode acender o led por qualquer periodo de tempo sem a necessidade de ficar usando varios if ou switch case.

EH SIDNEY REALMENTE, SEM OS DELAYS  E COM O CODIGO LIMPO FUNCIONA MESMO , SO COLOCAR UM DELAY AI PIFA KKKKK

EAI IRMÃO TUDO BEM...BEM PENSADO, VOU TENTAR AQUI E INFORMO SOBRE O RESULTADO..TO FAZENDO UM PROTÓTIPO E ESTOU USANDO O ATMEGA DO ARDUINO, ASSIM Q FINALIZAR AQUI EU TESTO E E POSTO O RESULTADOS..OBRIGADO PELA AJUDA..ABRAÇOOSSS

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço