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 !!!!
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por