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.
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

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.
vb.png

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