Contador de impulsos

Viva!

Estou a tentar ler um input mas apenas na transição 0->1, mas sem successo, 

isto para incrementar (Contador)  a variavel r;

em p19 está um byte, do qual apenas quero ler o 1bit;

var r = p21.value;
 
    if( (( (p19.value) & 1) == 1) && ( ( (p19.value) & 1)  !=  (p19.ago(SECOND,0.1))) )
      r ++;
 
return r;
 
a utilização de p19.ago(SECOND,0.1) em vez de p19.ago(SECOND,1), mostrou-se mais rápida quando o script é apenas 
return p19.ago(SECOND, X);
 
Alguém pode dar uma ajuda?
 
Cumprimentos 
Daniel Ferreira

Olá Daniel,

Me explique algumas coisas:

Como está configurado a leitura do ponto? Você afirma que ele está em um byte, mas você pode configurar seu DataPoint para ler o bit também, dependendo do DataSource.

Outra coisa que pode facilitar, é utilizar um evento/alarme e tratadores de eventos para contar as mudanças.

Bom, essa é a minha dica. Abs

PS: We can talk in english =]

 

Boa Noite,

Tal como na sugestão da pelo diegoferreira (ao qual agradeço) através de o evento de mudança e de um datasource virtual para guardar o valor anterior da variavel, consegui resolver o problema.. 
Estou usando o Modbus e , está muito lento mesmo com a baudrate a 115200bps..
 

Será que existe um método mais rápido? pois nesta rede modbus já tenho 26 dispositivos.. e a acção torna-se um bocado lenta..

Não sei se entendi o problema...

O Modbus lento e o contador estão associados?!

Boa Noite,
 
Sim estão associados pois quando activo um script como o que em baixo descreverei através de um botão no interface gráfico, a sua acção é "imediata" (reacção instantanea para o ser humano). mas quando através de um evento de mudança no seu datapoint, tal como me sugeriu, fica com uma reacção na escala de 300, 900 ms.
 
o script usado neste momento no evento é o seguinte
 
var output1= OUT.value; // valor actual da saida
var last1 =LAST.value; // ultimo valor guardado num virtual datasource
var input1 = IN.value; //  valor actual da entrada
 
 
altera os valores conforme as condições
if(input1 > last1)
((output1) ^= ((input1 ^last1)));
 
 
dp.writeDataPoint('DP_114688',output1); //grava no datapoint o seu novo valor
dp.writeDataPoint('DP_751133',IN.value); //grava o valor actual de entrada para o próximo evento saber o estado anterior.

Mais uma vez agradeço muito a sua ajuda DiegoFerreira
 
Cumprimentos 
Daniel Ferreira

Daniel,

Não sei por que este atraso tão grande, quase 1s, possa estar acontecendo... 

Os tratadores de eventos são tratados em fila, e não como interrupções no SW. Assim, podem ocorrer atrasos dependedo da latência do sistema. Uma análise das threads em execução pode indicar o motivo da lentidão na execução dos tratadores de eventos.

Mas não acredito que seja um atraso por fila de tratamento, pois mesmo que sejam muitos tratadores ocorrendo, o tempo de máquina utilizado para processá-los não é alto, visto que a execução por botão na interface é instantânea.

Estes 900ms são críticos? Estás trabalhando com processos rápidos?

Abs

Caro Diego,

Neste momento chegam a estar 32 dispositivos na rede, e sempre que o script é ativado através da interface gráfica, a actuação é "instantanea" e nao ocorre nenhum erro no modbus (pelo menos que seja reportado).
Quando por evento, por vezes ocorrem erros, com um simples teste de script como esse se activar essa entrada com um botão manual em vez da onda quadrada que seria do contador posso garantir que chegamos a carregar 2/3 vezes para que a saida seja activada.
Com o contador nunca notei esse problema pois a entrada era muito mais rápida e mesmo com um delay de cerca de 900ms nunca cheguei a conseguir ver estas falhas no Osciloscopio.

Agora para debug pusemos um simples botao (com garantia que o debounce é feito por parte do dispositivo) e ocorre essa situação da actuação ser lenta, ou se por exemplo carregarmos duas vezes seguidas ele para.. e depois altera o estado duas vezes rapidamente..

Se estiver sendo confuso me diz para eu explicar melhor alguma duvida.. 
(para mim só pode ser no tratador de eventos.. mas se me garante que é um tratamento em fila, tbm não vejo o porque)

Mais uma vez agradeço por tudo! 

Cumprimentos
Daniel Ferreira

Não descarto um problema com o tratador de eventos. Se tivermos um problema de sincronismo, um sintoma é que o erro ocorre "as vezes". 

Teria que investigar o código =/

Bom seria abrir um ticket no TRAC do ScadaBR no Sourceforge, explicando o problema e anexando os logs do momento do evento e o erro.

Isso ajudaria os desenvolvedores.

No momento, o que pode te ajudar? Tens como contornar esse problema?

Abs