Caros,
Antes de tudo, parabens pelo desenvolvimento desta solução. Como desenvolvedor de plataformas de hardware e software, é sempre bom ver produtos “in BR” sendo desenvolvidos e utilizados. Uma solução SCADA Open Source é realmente um desafio, e espero colaborar com voces (se assim permitirem) nos futuros desenvolvimentos e testes. Minha especialidade é desenvolvimento de soluções com protocolo DNP3 e MODBUS, e gostaria de ajuda-los a testar a soluçao com estes protocolos.
Estou montando uma aplicação para monitoramento e comando de um concentrador DNP3, e verifiquei aqui alguns problemas:
a) Quando se configura um DATA_POINT como BINARY OUTPUT e comando de controle CLOSE/TRIP, os seguintes comandos sao enviados a partir do SCADABR, na escrita de comando do DATA_POINT:
Para comando = true (CLOSE): Codigo de comando DNP3 = 0x80
Para comando = false (TRIP), Codigo de comando DNP3 = 0x40
Segundo a norma DNP3, o comando de close e trip deve ser acompanhado de um comando PULSE_ON (0x01), logo, o SCADABR deveria mandar:
Para comando = true (CLOSE): Codigo de comando DNP3 = 0x81
Para comando = false (TRIP), Codigo de comando DNP3 = 0x41
Vi que o codigo de comando é passado na funcao
“public Buffer buildBinaryControlCommand(byte operateMode, int index, byte controlCode, int timeOn, int timeOff)”
contida no arquivo User.java, no byte controlCode. Nao achei aonde esta funcao é chamada para modificar e testar.
b) Para qualquer comando binario que se envia para um DATA_POINT como BINARY OUTPUT, o parametro de COUNT do controle DNP3 é setado para zero. A maioria das implementaçoes DNP3 nao aceita COUNT=0, ou se aceita, é somente para testes.
Identifiquei o problema na funçao:
“public Buffer buildBinaryControlCommand(byte operateMode, int index, byte controlCode, int timeOn, int timeOff)”
"…
int previous_marker = commandFrame.length();
commandFrame.setMarker(7);
commandFrame.writeByte(controlCode);
commandFrame.setMarker(previous_marker);
// insira as duas linhas abaixo para corrigir o problema (coloca COUNT=1).
commandFrame.setMarker(8);
commandFrame.writeByte(1);
byte[] timeOnBytes = toBytes(timeOn, 4);
commandFrame.setMarker(9);
…"
Ainda estou testando as outras funcoes do DNP3, e reporto quaisquer problemas que possam aparecer.
[]s,
Douglas