Seleção dias da Semana - Arduino/Scadabr

Olá amigos,

Estou com um projeto em desenvolvimento utilizando o arduino, pretendo pelo supervisório realizar a seleção dos dias da semana e horas de inicio e fim para o funcionamento de um determinado equipamento, por exemplo de seg a sex o equipamento ira trabalhar das 6 as 22, sábado das 06 as 12.

Também gostaria de contabilizar as horas de funcionamento, fazer um somatório de horas trabalhadas contanto apenas no acionamento, e indicar isso no supervisório, por exemplo de seg a sex o funcionamento dele esta liberado, no entanto ele vai funcionar apenas quando acionado, e nesses acionamentos as horas serão somadas.

Sou novo nessa área, gostaria de sugestões para o desenvolvimento desse projeto.

Bom, vamos por partes:

1. Agendar funcionamento de um equipamento

Se você puder implementar um data point binário para ligar/desligar seu equipamento, agendar o funcionamento do mesmo fica fácil. O ScadaBR fornece uma página de Eventos Agendados para criar eventos baseados no tempo. Nessa página, você pode escolher um Tempo de atividade (quando o evento será ativado) e um Tempo de inatividade (quando o evento será desativado. O melhor jeito de criar um agendamento apenas para os dias da semana é usando um padrão cron. Para saber mais sobre padrão cron, veja esta resposta.

Uma coisa importante a saber é que os eventos não geram nenhuma ação por si só, para fazer que o disparo do evento seja o gatilho para ligar/desligar seu equipamento, você deve usar as opções da página de Tratadores de Eventos. Nessa página, você deve selecionar na lista o evento agendado que você criou e configurar um tratador para aquele evento. Para escrever no data point que vai ligar/desligar seu equipamento, o tratador deve ser do tipo Set point, e as ações ativa (o evento foi ativado) e inativa (o evento foi desativado) devem ser configuradas para Setar para um valor estático, cujo valor a setar pode ser 0 ou 1, dependendo se você quer ligar ou desligar o equipamento.

2. Contar horas de funcionamento dos equipamentos (horímetro)

Você pode tentar implementar um horímetro de várias formas, tanto pelo ScadaBR como pela própria programação do Arduino. Se você quiser fazer isso pelo ScadaBR, indico ler o seguinte tópico: Configuração de Data Source Meta

1 curtida

Showww, bacana vou executar essas sugestões e em breve retorno com os resultados.
Obirgado Celso!

Celso, estou criando o agendamento pelo padrão cron, para criar um alarme ativo de seg a sex das 6 as 23.

0 0 6,23 ? * MON,TUE,WED,THU,FRI *

e desativado de seg a sex das 23 ás 6.

0 0 23,6 ? * MON,TUE,WED,THU,FRI *

ao inserir o padrão cron nos campo de atividade/inatividade ocorre o seguinte erro:

**PreparedStatementCallback; SQL [insert into scheduledEvents ( xid, alarmLevel, alias, scheduleType, returnToNormal, disabled, activeYear, activeMonth, activeDay, activeHour, activeMinute, activeSecond, activeCron, inactiveYear, inactiveMonth, inactiveDay, inactiveHour, inactiveMinute, inactiveSecond, inactiveCron ) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)]; A truncation error was encountered trying to shrink VARCHAR '0 0 6,22 ? * MON,TUE,WED,THU,FRI ’ to length 25.; nested exception is java.sql.SQLDataException: A truncation error was encountered trying to shrink VARCHAR '0 0 6,22 ? * MON,TUE,WED,THU,FRI ’ to length 25.

Como posso corrigir?

Vamos lá: pela sua mensagem o que aparentemente ocorre é que o tamanho dos caracteres da expressão cron ultrapassa a quantidade permitida para armazenar no banco de dados. O ScadaBR, assim como muitos outros programas, utiliza-se de um banco de dados para armazenar as informações que são necessárias para sua execução. Neste caso, ao que tudo indica, quando “dimensionaram” o banco de dados, deixaram uma quantidade de caracteres muito pequena (apenas 25 caracteres) para armazenar as expressões cron. Mas não se preocupe, dá para contornar esse problema!

Antes de tudo, vou tentar explicar melhor o funcionamento de um padrão cron porque acho que você ainda não entendeu completamente (o que é normal, eu mesmo demorei para me familiarizar com esse tipo de notação): em suma, padrões cron servem para “casar” com uma ou mais datas específicas, porém, um padrão cron nunca define intervalo entre datas. Quando você deu o exemplo 0 0 6,23 ? * MON,TUE,WED,THU,FRI *, você provavelmente achou que a parte 6,23 significava “das 6 às 23 horas”. Na verdade, ao escrever assim, você na verdade está dizendo “ou às 6 ou às 23 horas”, porque não há intervalo de datas num padrão cron.

É justamente para suprir este problema do intervalo de datas que o ScadaBR fornece os campos Tempo de atividade e Tempo de inatividade. Pense no tempo de atividade como um botão de “ligar”, que vai ativar o seu evento quando a expressão cron for disparada e mantê-lo ativo até que o tempo de inatividade, que funcionaria como um botão “desligar”, desative o tal evento. Assim sendo, a expressão cron para o horário ativo deve conter apenas o horário das 6h (ligar), e para o horário inativo apenas o das 23h (desligar), como nos exemplos abaixo:

0 0 6 ? * MON,TUE,WED,THU,FRI * <- Ligar de segunda a sexta, às 6h 0min 0s

0 0 23 ? * MON,TUE,WED,THU,FRI * <- Desligar de segunda a sexta, às 23h 0min 0s

Porém, aqui voltamos ao problema dos 25 caracteres. Para resolver isso, sugiro que você divida seu evento agendado em dois: um para ligar segunda e terça-feira, e outro para ligar quarta, quinta e sexta-feira. Assim você consegue fazer as expressões “caberem” dentro de 25 caracteres. Exemplo:

EVENTO 1
Horário ativo: 0 0 6 ? * MON,TUE * (19 caracteres)
Horário inativo: 0 0 23 ? * MON,TUE * (20 caracteres)

EVENTO 2
Horário ativo: 0 0 6 ? * WED,THU,FRI * (23 caracteres)
Horário inativo: 0 0 23 ? * WED,THU,FRI * (24 caracteres)

Desculpe se a resposta ficou muito longa, mas achei que era necessário uma explicação mais detalhada para entender melhor os padrões cron.

Boa sorte!

1 curtida

Celso,

1. Agendar funcionamento de um equipamento:

Segui os proceimentos no entanto estou com um alarme aqui:

Criei o evento e o tratei como SETPOINT, setando os valores em 0 e 1.

EVT
TEV

Vinculei o evento com o data point HABILITA_FUNCIONAMENTO.

Com a informação 0 e 1 vou habilitar o funcionamento dos equiamentos conforme a programação.

2. Contar horas de funcionamento dos equipamentos (horímetro):
Nesse comentei no tópico sugerido: Configuração de Data Source Meta

Alguma sugestão para resolver o alarme? Agradeço pelo seu tempo e atenção!

Boa tarde,
Você consegue escrever esses valores 0/1 manualmente, para testar?

Sim, manualmente no watch list consigo enviar os valores 0 e 1.
Criei um novo evento para testes, conforme a figura abaixo, no entanto o valor no watch list fica estatico.

Boa noite. Acho que uma das coisas que podem estar causando esse comportamento é o padrão cron, como eu já disse numa resposta acima:

Então, a expressão que você deu de exemplo (0 0 17,23 * SUN *) na verdade deve ser lida como: “Casar com um horário que tenha o dia da semana como DOMINGO, a hora como 17h OU 23h, e o minuto e o segundo iguais a 0”. Para fazer isso ser um intervalo, o horário ativo tem que conter apenas o horário para ligar o data point e o horário inativo apenas o horário para desligar o data point.

Se precisar de mais informações sobre cron, o @WagnerdeQueiroz criou um tutorial muito bom explicando cada parte de uma expressão cron.

Sobre os eventos na semana, resumo:

Segunda a Sexta das 6h a 22h
Sabado das 6 ate 12h

o padrao cron, para dias da semana, voce pode fazer de duas formas

0 0 6 ? * MON,TUE,WED,THU,FRI * <- Ligar de segunda a sexta, às 6h 0min 0s

0 0 23 ? * MON,TUE,WED,THU,FRI * <- Desligar de segunda a sexta, às 23h 0min 0s

como o Celso disse acima, mas como sabemos estoura o limite de caracteres… ou

0 0 6 ? * MON-FRI * <- Ligar de segunda a sexta, às 6h 0min 0s

0 0 23 ? * MON-FRI * <- Desligar de segunda a sexta, às 23h 0min 0s

Se quer encurtar mais ainda… faça assim:

0 0 6 ? * 2-6 * <- Ligar de segunda a sexta, às 6h 0min 0s

0 0 23 ? * 2-6 * <- Desligar de segunda a sexta, às 23h 0min 0s

Como expliquei no tutorial já citado acima sobre os padrões CRON.
em Dias da Semana, podemos usar SUN,MON,TUE,WED,THU,FRI,SAT
ou 1 até 7 1 = Domingo (SUN,SUNDAY) até 7 = (SAT, SATURDAY).

Para o Sabado... fica fácil né?

_Vejamos:_

0 0 6 ? * SAT * <- Liga no Sábado às 6h 0min 0s

0 0 12 ? * 7 * <- Desliga ao meio-dia.

Tanto faz usar 7 ou SAT, Deixei dos dois jeitos pq funciona.

Testa e conta pra nós.

(Aqui entre nós, esse tópico ta muito bão né?)

Showwww, agora entendo 100% o funcionamento dos eventos agendados e o padrão CRON. Muito obrigado pela atenção @WagnerdeQueiroz e @Celso, a ajuda de vocês foi de grande importância! :fist_right:t2::fist_left:t2: