Proposta de protocolo ASCII para Microcontroladores

Durante algum tempo tentei implementar o protocolo Modbus RTU em microcontrolador, porem devido a uma limitação do compilador que uso não foi possível implementar, o compilador transforma internamente variáveis em hexadecimal ou numerais decimais para codificação ASCII. O protocolo Modbus ASCII também não foi possível, pois o compilador não aceita caracteres alfabéticos em variáveis (A-F ASCII que compõem uma representação de valor hexadecimal).
Acredito ser esta uma limitação de vários compiladores para microcontroladores, pois a transformação interna de numerais decimais para o padrão ASCII e necessária para o LCD o que facilita o uso, a mesma transformação interna e feita para a função SERIAL OUT.

Baseado no conhecimento que tive em tentar aplicar o Protocolo Modbus, desenvolvi um protocolo simples em ASCII para microcontroladores (escravo) já em funcionamento em Hyper terminal com as seguintes características:

1 - Sera de uso livre e gratuito.
2- Método de pergunta (mestre-PC) e resposta (escravo).
3- Trabalha apenas com números.
3 - Suporta 9 escravos, e 98 tags por escravo
4 - Fácil de implementar, acompanhara um codico fonte de exemplo que pode ser transportado para Linguagem C ou Basic.
5- E aplicável na maioria dos compiladores. (Incluindo o LDMicro ladder, embora não sei se todo o protocolo possa ser aplicado, pois conheço pouco esse compilador).
6- Possui 4 funções composta de Leitura de saídas digitais, entradas digitais e analógicas, escrita em saída digital, registradores (setpoints) e PWM.

Devido ao escravo apenas responder quando feita uma pergunta do mestre, não ha possibilidade de congestionamento da rede e as perguntas e respostas endereçadas evitam o truncamento de informações.

Nesta imagem abaixo tem um modelo e 3 exemplos do protocolo:

http://postimage.org/image/pd078vq5l/

O codico HEX gerado da aplicação do protocolo para um microcontrolador teve o tamanho de 1.4K ocupando pouco mais de 16% da memoria total de um PIC 16F877.

O objetivo desse post e desenvolver o protocolo no SCADABR, eu não tenho conhecimento de programação em Java e precisaria de uma colaboração, a implementação no software iria consistir no seguinte.
1-Envio de comandos em atualização por tempo.
2-Interpretar os 3 últimos números ASCII que compõem o valor do PWM, entradas analógicas e setpoint.
3-Data Point com escrita de valor variável (0-255)
4-Data source do tipo Byte, onde seria possível uma leitura múltipla de 8 saídas ou entradas digital (no momento o protocolo esta em leitura unica). Os valores da soma dos Bits de saída sera em numeral (0-255) e não em hexadecimal.
5- Dois alertas de erro, como a cada pergunta deve haver uma resposta, caso não haja resposta a uma pergunta do mestre, o mestre deve enviar um codico (função 0 endereçada) caso haja resposta a função 0, o erro sera codico incorreto, caso não haja resposta, sera mensagem de escravo off-line.

Qualquer duvida estou a disposição para responder,.

Aguardo cometários

Rafael

Olá Rafael,
interessante sua iniciativa, não sei se você já deu uma lida no post do Victor sobre a construção de novos protocolos (http://www.scadabr.org.br/?q=node/202), é interessante seguir os passos ali definidos e a equipe do projeto pode te ajudar nestas etapas conforme sua evolução, primeira coisa é começar a construí-lo em java e conforme surgirem dúvidas específicas podes enviar para o fórum.

Abraço
Pesa

Pesa,
Sim tinha visto o post, minha dificuldade seria em programação Java, mas baixei o Eclipse vou estudar a programação em Java, nos próximos dias.
Dando continuidade ao projeto do protocolo boa parte já esta idealizado, fiz umas pequenas alterações e atualizei a figura do meu primeiro post.
Resumindo a organização das funções ficou da seguinte forma:
//Função 0 - checagem de conexão em caso de falha da leitura de dados dos Tags
Função 1 - Escrita ou leitura múltipla das saídas digitais.
Função 2 - Leitura múltipla das entradas digitais.
Função 3 - Leitura unica da entradas analógicas, escrita ou leitura unica das saídas PWM.
Função 4 - Escrita ou Leitura unica de variáveis (SetPoint).

Leitura múltipla siguinifica que serão atualizadas 8 I/O (um Byte) em apenas um comando, para escrita na pratica sera usada a escrita unica, mas uma escrita múltipla pode ser acionada por meio de script (caso for necessário).
A leitura múltipla neste caso, e implementado de forma simples, um request retorna o estado de um grupo de de 8 I/O deve-se atribuir o valor a cada saída na programação do microcontrolador em decimais (1,2,4,8,16,32,64,128). Evidentemente um numero menor que 8 I/O pode ser usado desde que siga a ordem crescente de valores decimais, explicarei melhor quando terminar de implementar.

Alguns arquivos ja foram feitos que foram o edit JSP que a interface para o usuário do DataSource e DataPoint e os 2 Helps (versão em português e inglês). Vou postando o andamento do projeto nos próximos dias.

Estive acessando os codicos fontes no sourceforge, mas ao que parece alguns arquivos não estão la, onde poderia obter?

Edit: Consegui achar os codicos fontes que estão aqui :
http://scadabr.svn.sourceforge.net/viewvc/scadabr/ScadaBR/src/

Porem surgiu duvidas, onde estão os arquivos de tradução dos edit JSP das opções para o usuário do DataSource e DataPoint (texto e forms)?
Estou tendo como base o Protocolo Alpha2 e Ascii_serial, no arquivo editAlpha2.JSP todos os parâmetros da porta serial os message Key estão como “dsEdit.asciiSerial” , enquanto que no codico fonte do link acima estão como “dsEdit.dnp3Serial” ???
Realmente não consegui entender…

Abraços

Sobre a andamento do projeto do protocolo, foram feitas os arquivos JSP e VO, helps e mensagens que estavam em “ScadaBR\WEB-INF\classes”, basicamente esta faltando a parte dinâmica do RT que estão em andamento.

Me deparei com alguns arquivos “protocolo” 4j que estão em “ScadaBR\WEB-INF\lib”, gostaria de saber qual a sua função e se o arquivo e necessário? Me parece bem extenso não consegui achar em codico fonte, somente compilado.

Obrigado

Gostaria de saber se posso usar essa comunicação com o arduino, queria colocar dois em rede com o supervisório?

São duas maquinas diferentes e preciso que uma se comunique com a outra. A segunda deve ligar ou desligar de acordo com a informação da primeira.

Abraços, José

Ola José
Funciona para qualquer microcontrolador inclusive o Arduino, desde que seja com interface serial (RS232).
O protocolo esta sendo feito para um mestre e vários escravos, onde escravos não se comunicam entre si, avalie quantas entradas e saídas vai usar e se tem a necessidade de duas placas. Caso tenha necessidade de duas placas, uma enviaria um sinal para outra onde você faria uma ligação por fios entre uma saída da primeira na entrada da segunda por exemplo, outra opção é fazer por script no ScadaBR de acordo com uma saída (ou variável interna) habilitaria uma escrita na segunda placa.

Olá pessoal

Sobre o protocolo foram feitas algumas modificações que foram:

Funções
Função 1 - Escrita ou leitura múltipla das saídas digitais.(grupo de 8 tags)
Função 2 - Leitura múltipla das entradas digitais.(grupo de 8 tags)
Função 3 - Leitura unica das entradas analógicas.
Função 4 - Escrita ou leitura unica das saídas PWM.
Função 5 - Escrita ou Leitura unica de variáveis (SetPoint).

Foi adicionado um Checksun (soma dos dígitos/carácter do codico) , bem simples que são opcionais para incluir na programação do microcontrolador. São dois dígitos ao final do codico que contem a soma dos dígitos do codico, tanto no request como response.

Mensagem de erros:

1- Codico incompleto e soma checksun (caso tenha optado) mostrando o codico recebido errado para o usuário.
2- Sem resposta do microcontrolador mostrara qual escravo esta Offline.

Depois da implementação farei um manual explicado mais detalhadamente o protocolo e também o codico fonte pra microcontrolador.

Sobre a implementação no ScadaBR foram feitos todos os arquivos e adicionado um request e um response para processamento da lógica do codico, que rodam de forma parcial no eclipse com script de teste, ainda não foi feita uma compilação no ScadaBR.

Precisaria de uma revisão para os arquivos, principalmente para os metodos doPoll (request e response) e o setPointValue (escrita), sobre a abertura do For each datapoints e update do valor no ScadaBR e mais alguma inicialização da porta serial.
As duvidas são referentes a alguns métodos e variáveis do ScadaBR e não sobre programação em java. Os arquivos feitos não são extensos, para um desenvolvedor do ScadaBR as duvidas podem ser esclarecidas em pouco tempo.
Aguardo o contato para uma colaboração. Obrigado

Alguém?

Olá Rafael,

bom 2012 :slight_smile: apesar de janeiro estar terminando, estamos mais tranquilos pra rever o driver agora.
por favor encaminha tudo anexado para contato@scadabr.org.br que será avaliado nos próximos dias.

não consegui analisar todos os detalhes do teu protocolo, mas desde já agradeço todo o empenho e dedicação, em aprender java para desenvolvê-lo!!! :smiley:

que legal que já existe interesse de ser utilizado também no Arduino, isso pode difundir mais usuários do hardware e do software livre.

parabéns e desculpe pela espera,

um grande abraço.
Victor

Rafael você tem algum exemplo simples para utilizar este protocolo ,preciso um exemplo bem simples que funciona para que eu possa entender estou iniciando com o Scada e quero comunicar com um pic.
Meu l emai é alexsandro_rs@ibest.com.br.Agradeço desde já pela atenção.

Boa tarde.

Alexsandro e Rafael

eu estou com uma dúvida de ASCII nesta outra discussão: http://www.scadabr.com.br/?q=node/349 (último post).
Será que esses códigos que vocês estão propondo resolverão o meu problema? Vocês têm algum exemplo de código (C++ para arduino, AVR, PIC). Qualquer coisa já me ajuda.
Desde jpa grato
Abraços

O que fiz foi uma proposta de protocolo, vou mudar a proposta e torna-lo mais simples possível, esse topico é para discutir o protocolo, a proposta ainda não foi implementado no ScadaBR.

Tiago sobre sua duvida:
Deixe apenas números na resposta do microcontrolador (assim não precisa de REGEX).
Limite o numero de caracteres no Data Source, 1024 (AN de 10bits), configure o buffer em 4.

Hello
Using ASCII Serial data source I need to send initial command finishing with CRLF or /n/r or 0x0D 0x0A
It seems like SCADAbr is not recognizing the escape sequences \r and \n as intended, and it’s treating them as literal characters and send complete command on serial port
expl: command is M047770CLRF or M047770/n/r
Somebody maybe can help?