ModBus RTU com Harbour
Moderador: Moderadores
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
ModBus RTU com Harbour
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
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
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
ModBus RTU com Harbour
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.
Saudações,
Itamar M. Lins Jr.
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
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
ModBus RTU com Harbour
n amigo itamar, neste caso que esta explicitado é uma comunicação comum mesmo, o modbus usa umas coisinhas um pouco mais digamos chatas
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
ModBus RTU com Harbour
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
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
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7928
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
ModBus RTU com Harbour
Ola!
https://www.embarcados.com.br/protocolo-modbus/
Saudações,
Itamar M. Lins Jr.
Eu estou lendo sobe isso e não vi/li onde está a encriptação.o modbus é um tipo de envio encriptado usando um cheksun
https://www.embarcados.com.br/protocolo-modbus/
Tem via TCP tambémprotocolo 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).
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
ModBus RTU com Harbour
Desculpe o Equivoco
é CRC dos dados enviados
é CRC dos dados enviados
CRC (Cyclical Redundancy Checking).
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
ModBus RTU com Harbour
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
vou por o codigo em anexo
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
ModBus RTU com Harbour
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.
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
ModBus RTU com Harbour
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.
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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
ModBus RTU com Harbour
Aqui por exemplo, não faço idéia, quem mexe com binário deve saber.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
ModBus RTU com Harbour
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.
"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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
ModBus RTU com Harbour
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.
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
ModBus RTU com Harbour
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!
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!
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
- Nascimento
- Usuário Nível 4

- Mensagens: 763
- Registrado em: 19 Jul 2008 12:11
- Localização: OLINDA-PE
ModBus RTU com Harbour
JoséQuintas escreveu: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
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
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina
clipper 5.3 /harbour/minigui
