Página 1 de 1
ModBus RTU com Harbour
Enviado: 15 Set 2017 23:41
por Nascimento
Amigos alguem aqui ja pegou algum equipamento que usa o Modbus RTU é um tipo de envio de informaçoes pela com geralmente usado com o RS485 ou mesmo com o RS232
estou precisando de uma aplicação que envie no modo de codificação modbus, e queria saber se algum dos amigos ja fez ou tem alguma luz sobre o assunto, caso não fui claro tentarei explicar melhor
ModBus RTU com Harbour
Enviado: 16 Set 2017 12:51
por Itamar M. Lins Jr.
Ola!
Estive lendo e me parece que é a mesma coisa que usamos para balança. Mandar o sinal e pegar o peso por exemplo.
Basta saber o sinal que ativa, envia, e termina a comunicação ai do dispositivo. É uma comunicação serial como outra qualquer.
Código: Selecionar todos
***************************
Function PegaPeso(oDlgMain)
***************************
*
*
LOCAL cString := chr(5) //"ATE0" + Chr( 13 ) + "ATI3" + Chr( 13 )
LOCAL nTimeOut := 3000 // 3000 miliseconds = 3 sec.
LOCAL nResult
LOCAL nPort := Val(SubStr(pBalanca,4,1))
LOCAL cPortName := pBalanca
LOCAL nPeso:=0
rodape(oDlgMain,3,'Lendo Peso: ' )
Do While .t.
hb_comSetDevice( nPort, cPortName )
If !hb_comOpen( nPort )
Hwg_msgStop("Falha abrindo a porta: "+Str(nPort) )
exit
EndIf
hb_comGetDevice( nPort )
IF !hb_comInit( nPort, 9600, "N", 8, 1 )
Hwg_msgStop("Falha inicializando a porta: "+Str(nPort)+" 9600:N:8:1" )
exit
Else
nResult := hb_comSend( nPort, @cString, len( cString ), nTimeOut )
IF nResult != len( cString )
Hwg_msgStop("SEND Falhou." )
exit
EndIf
Inkey(1)
cString := Space(32)
nTimeOut := 500
nResult := hb_comRecv( nPort, @cString, len( cString ), nTimeOut )
IF nResult == -1
hwg_msgstop("RECV... Falha pegando peso")
exit
ENDIF
EndIf
EXIT
EndDo
nPeso := Val(SubStr(cString,2,5)) / 1000
hb_comClose( nPort )
Return nPeso
Saudações,
Itamar M. Lins Jr.
ModBus RTU com Harbour
Enviado: 24 Set 2017 23:16
por Nascimento
n amigo itamar, neste caso que esta explicitado é uma comunicação comum mesmo, o modbus usa umas coisinhas um pouco mais digamos chatas
ModBus RTU com Harbour
Enviado: 30 Dez 2017 23:39
por jairpinho
vou verificar meus prg, qual tipo vai usar porta serial 232 ou rs485.
ModBus RTU com Harbour
Enviado: 31 Dez 2017 22:29
por Nascimento
485 , mais o modbus pode ser enviado por 232 também
o modbus é um tipo de envio encriptado usando um cheksun
quem recebe faz o tratamento do que recebeu pra ver se é valido , assim é traduzido e efetuado o comando
é um modo de eliminar intermitências ou ruídos em geral
ModBus RTU com Harbour
Enviado: 03 Jan 2018 15:05
por Itamar M. Lins Jr.
Ola!
o modbus é um tipo de envio encriptado usando um cheksun
Eu estou lendo sobe isso e não vi/li onde está a encriptação.
https://www.embarcados.com.br/protocolo-modbus/
protocolo modbus
...
Modos de transmissão
Na especificação do protocolo estão definidos dois modos de transmissão:
ASCII;
RTU.
Modo de transmissão ASCII
Quando os equipamentos são configurados para se comunicarem em uma rede Modbus usando ASCII (American Standard Code for Information Interchange), cada byte em uma mensagem é enviado como dois caracteres ASCII. Apesar de gerar mensagens legíveis pela tabela ASCII esse modo consome mais recursos da rede. A principal vantagem dessa modalidade é que permite que os intervalos de tempo sejam cerca de um segundo para correr entre os caracteres sem causar erro.
Os dispositivos monitoram constantemente a rede para o início de uma mensagem. Quando uma mensagem é iniciada pelo mestre, todos os dispositivos da rede decodificam o campo de endereço para determinar qual escravo deve receber a mensagem. O inicio de uma mensagem é reconhecido pelo caractere (:) "dois pontos".
O formato para cada byte em modo ASCII é:
Codificação do sistema: Hexadecimal, caracteres ASCII 0-9, A-F, um caractere hexadecimal contido em cada caractere ASCII da mensagem;
Bits por Byte:
1 bit de início
7 bits de dados, bit menos significativo primeiro
1 bit para paridade par / ímpar, ou sem bit de paridade
1 bit de parada, se a paridade é usado; 2 bits se sem paridade
16 bits Campo Erro check : Longitudinal Redundancy Check (LRC)
Modo de transmissão RTU (Remote Terminal Unit)
No modo RTU (Remote Terminal Unit), cada mensagem de 8 bits contém dois caracteres hexadecimais de 4 bits. A principal vantagem desse modo é que sua maior densidade de caracteres permite um melhor processamento de dados do que o modo ASCII para o mesmo baudrate (velocidade de comunicação). Cada mensagem deve ser transmitida em um fluxo contínuo de caracteres.
No modo RTU não existe um caractere específico que indique o início ou o fim de um telegrama. A indicação de quando uma nova mensagem começa ou quando ela termina é feita pela ausência de transmissão de dados na rede, por um tempo mínimo de 3,5 vezes o tempo de transmissão de um byte de dados. Sendo assim, caso um telegrama tenha iniciado após a decorrência desse tempo mínimo, os elementos da rede irão assumir que o primeiro caractere recebido representa o início de um novo telegrama. E da mesma forma, os elementos da rede irão assumir que o telegrama chegou ao fim quando, recebidos os bytes do telegrama, este tempo decorra novamente.
Se durante a transmissão de um telegrama o tempo entre os bytes for maior que este tempo mínimo, o telegrama será considerado inválido, pois o controlador irá descartar os bytes já recebidos e montará um novo telegrama com os bytes que estiverem sendo transmitidos. O tempo para transmitir uma palavra do quadro varia de 573us para taxas de comunicação acima de 19200bits/s e 9 ms para a taxa de 1200bits/s.
O campo de checagem de erros é baseado no método CRC (Cyclical Redundancy Checking).
Tem via TCP também
Saudações,
Itamar M. Lins Jr.
ModBus RTU com Harbour
Enviado: 03 Jan 2018 23:41
por Nascimento
Desculpe o Equivoco
é CRC dos dados enviados
CRC (Cyclical Redundancy Checking).
ModBus RTU com Harbour
Enviado: 06 Ago 2019 00:25
por Nascimento
encontrei um codigo em VB sobre este assunto , mais não entendo nada de vb alguem aqui poderia portar para harbour? ou me dar uma orientação de como eu faria isso?
vou por o codigo em anexo
mbus.zip
- comunicação modbus escrito em vb
- (20.15 KiB) Baixado 178 vezes
ModBus RTU com Harbour
Enviado: 06 Ago 2019 23:25
por JoséQuintas
Tem umas rotinas de cálculo/conversão muito doidas aí.
Vai levar bastante tempo pra converter.
De um modo geral, a parte que interessa é parecida com Harbour.
O que poderia ser diferente talvez estes:
Mid() é o mesmo que Substr()
"A" & "B", o símbolo de macro, é apenas pra concatenar, como se estivesse somando as strings
Dim ctcTable(0 TO 511) AS Byte, isso seria um array de Asciii, com o detalhe que os arrays no VB começam no ZERO e não no 1, então seriam 512 elementos. DIM seria a declaração.... compare com LOCAL ou PRIVATE
Clng(n): deve ser conversão pra tipo long, quem mexe com binário deve saber
CInt() idem pra inteiro
2 mod 3, seria o equivalente do Harbour Mod( 2, 3 )
A XOR B ... quem mexe com binário deve saber o equivalente
&H4B... é o número diretamente no fonte em hexadecimal, acho que no Harbour pode ser colocado direto
Val(), Str(), Chr(), Asc() ... mesma coisa, só não sei a saída exata de Str() quando a dígitos/espaço em branco
textn.text - isso é o conteúdo de um "get" (textbox), que é texto
Aliás... o que tem o ponto é como se fosse uma classe/objeto, comum a todas as linguagens, menos no Harbour que é ":"
oClasse:valor no VB é oClasse.Valor
Acho que só... a maioria do fonte é cálculo, ou informação existente na tela, ou enviando/recebendo da COM.
Seria interessante pesquisar se não tem versão em DLL.
Ou talvez, não tenho certeza, usar como VBScript de dentro do Harbour, e usar o fonte do jeito que está.
FRM = formulário, a primeira parte seria o desenho da tela, pula tudo aquilo, o que interessa é onde começa o fonte pra valer
FRX = uma espécie de resource - desenhos que complementam o frm
VBP = é o projeto, que pode ser aberto no VB6
Se for pegar firme mesmo, talvez ajude baixar o Visual Basic 6, abrir o projeto (VBP) e ver em execução, pra ter alguma referência pra comparar o resultado desses cálculos.
Tudo que precisa está nos arquivos FRM, um em cada pasta.
Vai identificar relativamente fácil aonde começa o fonte de verdade.
ModBus RTU com Harbour
Enviado: 06 Ago 2019 23:36
por JoséQuintas
Aqui, por exemplo, trata-se apenas de atribuir valor a cada elemento do array, assim que a janela é aberta.
Ao enviar esse byte array para a com, seria o mesmo que enviar uma string com o Chr() de cada elemento.
Código: Selecionar todos
cTxt := ""
FOR nCont = 1 TO Len( aArray )
cTxt += Chr( aArray[ nCont ] )
NEXT
ModBus RTU com Harbour
Enviado: 06 Ago 2019 23:41
por JoséQuintas
Aqui por exemplo, não faço idéia, quem mexe com binário deve saber.
ModBus RTU com Harbour
Enviado: 06 Ago 2019 23:47
por JoséQuintas
Pensando bem... parece fazer parte de algo como transformar binário em caractere...
"01010101" em "A" (apenas exemplo, sei lá qual é o binário de A)
e vice-versa.
É que em binário, trata-se de usar o AND pra fazer a soma.
E o True/False trata-se de 0 e 1
Mas quem mexe em binário pode confirmar isso.
ModBus RTU com Harbour
Enviado: 06 Ago 2019 23:53
por JoséQuintas
O melhor mesmo vai ser usar a IDE do VB6, e vai poder conferir cada etapa disso.
Considere que sabe, e aí fica fácil. Se considerar que é do outro mundo... aí complica.
O debug do VB6 é parecido com o do Clipper, F9 marcar linha pra parar, e embaixo pode ver o valor de algo.
E o legal... basta colocar o mouse encima da variável e já vê o conteúdo.
Só tem um lado ruim:
Vai ver o que é IDE, o que é desenhar formulário... e vai achar o que tem disponível pra Harbour um lixo.
Vai achar ultramoderno.
Mas quando lembrar que a IDE é de mais de 20 anos atrás... as IDEs pra Harbour vão se tornar mais lixo ainda.
É só esse o lado ruim.
Tirando isso... o Harbour ganha disparado.
ModBus RTU com Harbour
Enviado: 07 Ago 2019 18:33
por Nascimento
o que preciso é portar pra harbour mesmo que em modo console, vou esperar chegar uma apostila com exemplos praticos, mais vem o master em vb tambem
este protocolo vem sendo mais usado que antes, uso em PLC entre outras comunicações seriais ,muito em equipamentos industriais, por conta do ruido e pertubaçoes eletricas, o modbus da mais confiabilidade no envio
com a ajuda do amigo clareou um pouco, vamos que vamos!
ModBus RTU com Harbour
Enviado: 07 Ago 2021 15:03
por Nascimento
JoséQuintas escreveu:Aqui, por exemplo, trata-se apenas de atribuir valor a cada elemento do array, assim que a janela é aberta.
frmload.png
Ao enviar esse byte array para a com, seria o mesmo que enviar uma string com o Chr() de cada elemento.
Código: Selecionar todos
cTxt := ""
FOR nCont = 1 TO Len( aArray )
cTxt += Chr( aArray[ nCont ] )
NEXT
amigo quintas ainda não desisti minha busca e meu empenho para fazer comunicação modbus via harbour , lendo muito vi que trata-se de um crc16
o que não consigo ainda é portar para o harbour todo o codigo, não tenho conhecimento nem 1 em vb