Página 1 de 1

modbus com hitech

MensagemEnviado: 18 Nov 2006 16:30
por eagle_good
pessoal......to fazendo um projeto com modbus RTU mas me deparei
no seguinte problema.......o frame inicia e terminas com 3,5 *time-bytes..
na net encontrei isto que aparentemente e a rotina que cuida disso, mas num entendi nada....

if(Comm1.Baud==3)
{ set_uart_speed(19200,COMM_1);
if(((16.5*Xtal_Freq)/19200)<65536)
{ Comm1.Three_Half_Byte_Periods=65536-((18*Xtal_Freq)/19200);
}
else
{ Comm1.Three_Half_Byte_Periods=0;
}
}
alguem podia nos esclarecer :: :cry:

MensagemEnviado: 18 Nov 2006 16:57
por eletroinf
Bueno, parece que esse código calcula o tempo correspondente a 3.5 x o tempo de transmissão (ou recepção) de um byte, mas tá meio sombrio pra mim...
Sobre Modbus RTU eu fiz um projeto baseado numa rede RS485, com Zilog e o SN75176, funciona bem e é fácil de implementar. A dica que eu posso te dar é a seguinte: Te baseia no manual dos inversores da Weg, por exemplo no manual do CFW 08, na versão 4.1x, lá na página 183 em diante tem a descrição do protocolo pro inversor, de forma bem explicativa.
Link pro manual do CFW08:

http://catalogo.weg.com.br/FILES/Artigos/1-577.pdf

MensagemEnviado: 18 Nov 2006 17:29
por eagle_good
tenho o arquivo modbus.c para pic ....mas nao encontrei nele nada que fizesse este 3,5 time byte......que diz a especificacao do modus
O modbus e protocolo aberto portanto se alguem souber como executa-lo em rtu ...tenho varrios exemplos mas quero compreender e ter um exemplo de como realizar este time na hora de enviar e aguardar por este time qdo receber........

manual...manual......ja havia visto este da weg assim como outros.....de nada serve se nao tiver exemplo deste timer loco......

MensagemEnviado: 18 Nov 2006 18:11
por eletroinf
Esse tempo é a sinalização de início/fim das mensagens, está bem explicado no manual da Weg. Cada mensagem é composta por uma sequência de bytes e a separação entre elas é através de temporização. Ex: Para receber dados, crie um contador e resete-o a cada byte recebido. Se após a recepção do último byte o contador ultrapassar o tempo de transmissão de um byte x 3.5 sem que tu receba nada, é a indicação de fim da mensagem. Olhe na página 187 do manual que está no link que postei, tem até um gráfico explicando isso.

MensagemEnviado: 18 Nov 2006 19:31
por eagle_good
.....a duvida e o seguinte......
Qdo saber o inicio do frame ( 3.5 bits),.... ja que qdo a interrupcao ocorre ja e tarde porque chegou um byte inclusive os (3,5 bits) concatenado.....
apartir do momento que se imagina no meio do frame , o timer Ok, mas no inicio....num entendo...posta o exemplo em c de sua ideia para debatermos....

MensagemEnviado: 18 Nov 2006 19:52
por eletroinf
Bueno, parece que tu não leu mesmo os manuais...
Não existe 3.5 bits concatenado.
Quando tu receber um byte (use interrupção), comece a contar o tempo até receber o próximo byte. Se o tempo superar o tempo de transmissão de um byte multiplicado por 3.5, indica que este byte recebido é o último de uma mensagem (ou Telegrama). Aí tu verifica a integridade da mensagem pelo CRC. Por exemplo, com a serial a 19200 bps, um byte demora 573us para ser transmitido. Multiplicando isso por 3.5 dá 2.005ms. Se tu receber um byte e por um período de 2.005 ms não receber nada, este byte era o último de um telegrama. Daí é só tratá-lo.
Não posso postar o código que desenvolvi porquê é parte de um produto comercial. Além do mais, tu não vai conseguir adaptar um código se não entender como o sistema funciona.
Não adianta, tem que estudar e entender os manuais. E nem é tão ruim, documentação sobre Modbus além de farta, tem até em português.