A biblioteca LCTSfunctions é um conjunto de módulos Python desenvolvido para facilitar a comunicação serial com transdutores de torque rotativos, especificamente o modelo T25 da Interface Inc. Esta biblioteca de alto nível abstrai as complexidades do protocolo de comunicação proprietário do fabricante, permitindo que pesquisadores e engenheiros interajam com o dispositivo de forma eficiente para aquisição e controle de dados.
No âmbito do projeto de pesquisa "BANCADA DE EMULAÇÃO DE TURBINA EÓLICA INTEGRADA EM MICRORREDE", a biblioteca LCTSfunctions desempenha um papel crucial na interface com o transdutor de torque T25, um componente essencial do emulador eólico. Desenvolvida em Python e aderindo ao protocolo de comunicação serial proprietário do fabricante, esta biblioteca permite a leitura precisa e em tempo real dos valores de torque e RPM gerados pelo sistema motor-gerador. Ao abstrair a complexidade da comunicação por telegramas de bytes, a LCTSfunctions viabiliza a coleta contínua de dados, fundamental para o sistema de controle que ajusta o motor emulador eólico, garantindo que ele reproduza fielmente o comportamento de uma turbina real sob diversas condições de vento. Em última análise, a confiabilidade e agilidade proporcionadas por esta biblioteca são pilares para o desenvolvimento do gêmeo digital da microrrede e para a validação de algoritmos avançados de controle e gestão de energia em um ambiente de laboratório multiusuário.
- 8 bits de dados
- 1 bit de parada
- sem paridade
- 230400 de baudrate
- timeout 3 ms
- 10μs de silêncio entre mensagens(importante para definir tempo de amostragem)
O processo de comunicação com o torquímetro através desta biblioteca segue o seguinte fluxo:
- Inicialização do Torquímetro: Criação de uma instância da classe
Torquimeter. - Chamada de Método: Invocação de um método do
Torquimeter(e.g.,ReadRaw). - Envio de Telegrama: O comando é convertido em um telegrama de bytes e enviado via serial.
- Aguardando Resposta: A biblioteca entra em um loop, aguardando dados da porta serial.
- Leitura e Processamento: Os dados recebidos são lidos, limpos e a integridade é verificada (checksums).
- Extração de Dados: Em caso de sucesso, os parâmetros são extraídos e transformados.
- Atualização de Atributos: Os atributos do objeto
Torquimetersão atualizados com os novos valores. - Retorno: O método retorna os dados processados ou
Noneem caso de falha.
Os telegramas de comunicação seguem um formato de bytes padrão:
STX(0x02): Byte de início de texto (repetido duas vezes).- Command byte: Define a operação a ser realizada.
- Receiver (RX) address: Endereço do dispositivo de destino.
- Transmitter (TX) address: Endereço do dispositivo de origem.
- Number of parameter bytes: Quantidade de bytes nos parâmetros.
- Parameters (optional): Dados específicos do comando.
- Checksum: Soma de verificação simples.
- Weighted checksum: Soma de verificação ponderada.
A biblioteca implementa os seguintes comandos, representados por constantes hexadecimais:
STX = 0x02SCMD_ACK = 0x06SCMD_NACK = 0x15SCMD_Hello = 0x40SCMD_ReadRaw = 0x41SCMD_ReadStatus = 0x42SCMD_ReadStatusShort = 0x43SCMD_ReadConfig = 0x44SCMD_WriteFullStroke = 0x45SCMD_WriteConfig = 0x46SCMD_RestartDevice = 0x4BSCMD_GotoSpecialMode = 0x5a
Para utilizar esta biblioteca, você precisará ter o Python instalado e a biblioteca pyserial.
- Clone o repositório:
git clone https://github.com/seu-usuario/LCTSfunctions.git cd LCTSfunctions - Instale as dependências:
pip install pyserial
Esta classe gerencia a conexão serial e as operações de alto nível com o transdutor.
__init__(self, Port:str, Tm_max:float, Rpm_max:float, Baudrate = 230400, Timeout = 0.003, byte_resolution = 25000)
Inicializa a comunicação com o torquímetro.
Port(string): Nome da porta serial (ex: 'COM1' no Windows, '/dev/ttyUSB0' no Linux).Tm_max(float): Torque máximo que o dispositivo pode medir.Rpm_max(float): RPM máximo que o dispositivo pode medir.Baudrate(int, opcional): Taxa de transmissão. Padrão:230400.Timeout(float, opcional): Tempo limite para leitura serial em segundos. Padrão:0.003.byte_resolution(int, opcional): Valor máximo em bytes que representa a resolução do sensor. Padrão:25000.
ReadRaw(): Obtém os valores de medição brutos e calibrados (torque e RPM).- Retorna:
list(MesurementChannel_0, MesurementChannel_1, Torque_calibrated, RPM_calibrated, FullstrokeFlag, Overloadflag) ouNone.
- Retorna:
Hello(): Envia um comando "Hello" e recebe a resposta do sensor.- Retorna:
listcom os dados de resposta ouNone.
- Retorna:
ReadStatus(): Solicita um relatório de status detalhado.- Retorna:
listcom os dados do status ouNone.
- Retorna:
ReadStatusShort(): Solicita um relatório de status resumido.- Retorna:
listcom os dados do status curto ouNone.
- Retorna:
ReadConfig(parameter: int): Lê um bloco de configuração específico.parameter(int): Número do bloco de configuração.- Retorna:
listcom os dados do bloco ouNone.
WriteConfig(parameters: list[int]): Escreve um bloco de configuração.parameters(list[int]): Lista com o número do bloco e 32 bytes de dados.- Retorna:
listcom a resposta do sensor ouNone.
WriteFullStroke(parameter: bool): Ativa/desativa o modo de sinal de fundo de escala.parameter(bool):True(On) ouFalse(Off).- Retorna:
listcom a resposta do sensor ouNone.
RestartDevice(): Reinicia o dispositivo.- Retorna:
listcom a resposta do sensor ouNone.
- Retorna:
from LCTSfunctions import Torquimeter
# Configurações da porta serial e do torquímetro
PORTA_SERIAL = 'COM3' # Altere para a porta correta do seu sistema
TORQUE_MAX = 100.0 # N.m (Exemplo: 100 N.m para o T25)
RPM_MAX = 3000.0 # RPM (Exemplo: 3000 RPM)
try:
# Inicializa o objeto Torquimeter
torquimetro = Torquimeter(Port=PORTA_SERIAL, Tm_max=TORQUE_MAX, Rpm_max=RPM_MAX)
print(f"Torquímetro conectado na porta {PORTA_SERIAL}.")
# Exemplo: Ler dados brutos
print("Tentando ler dados brutos...")
dados_brutos = torquimetro.ReadRaw()
if dados_brutos:
print("\nDados Brutos Recebidos:")
print(f" Canal 0 (Não Calibrado): {dados_brutos[0]}")
print(f" Canal 1 (Não Calibrado): {dados_brutos[1]}")
print(f" Torque Calibrado (N.m): {dados_brutos[2]:.2f}")
print(f" RPM Calibrado: {dados_brutos[3]:.2f}")
print(f" Fullstroke Flag: {dados_brutos[4]}")
print(f" Overload Flag: {dados_brutos[5]}")
else:
print("Falha ao ler dados brutos ou sem dados disponíveis.")
# Exemplo: Enviar comando Hello
print("\nEnviando comando 'Hello'...")
resposta_hello = torquimetro.Hello()
if resposta_hello:
print(f"Resposta 'Hello' recebida: {resposta_hello}")
else:
print("Nenhuma resposta ao comando 'Hello'.")
except serial.SerialException as e:
print(f"Erro de comunicação serial: {e}. Verifique se a porta está correta e disponível.")
except Exception as e:
print(f"Ocorreu um erro: {e}")
finally:
# Sempre feche a porta serial ao finalizar
if 'torquimetro' in locals() and torquimetro.serialport.is_open:
torquimetro.serialport.close()
print("\nPorta serial fechada.")Contribuições são bem-vindas! Se você encontrar bugs, tiver sugestões de melhorias ou quiser adicionar novas funcionalidades, sinta-se à vontade para abrir uma issue ou enviar um pull request.
- Isaque Verona - GitHub Profile
- https://github.com/Duckle29/LorenzTelegram/tree/main
- http://www.shintron.com.tw/proimages/a3-2/Protocol.pdf
- https://www.mb-naklo.si/files/catalogs/avtomatizacija/lorenz-messtechnik/senzorji-momenta-in-sile-lorenz.pdf
- https://www.sensor.com.tw/upload/files/lorenz/operation%20manual/090302i_DR_3000_VS.pdf
- https://www.sensor.com.tw/upload/files/lorenz/operation%20manual/090231e_DR-2112_2212_2412_2512.pdf
- https://forum.dewesoft.com/software-discussions/dewesoft-software/reading-torque-data-from-lorenz-dr-3000-in-dewesoft-using-serial-com-plugin
Key-words: Lorenz, communication, serial, pyserial, torque sensor, Interface, transducer.
Updates:
- update 0 24/set/24: early code, it lacks of testing, when I get a sucessifull try, i'll write it here.
- update 1 26/set/24: it workedddddd! I send the command and it respond some of the commands.
- update 2 o3/out/24: now the communication are really fast, and we got the readigns already in N.m probably.
- update 3 11/jul/25: damn time flies, the code looks professional now, object oriented, all documented, works good in production, my masterpiece until now in this engenniering course.