ENTRE O GREENWAY
E O BMS
Uma solicitação de garantia levou a um conversor USB-RS485 comum, a um sniffer passivo e ao mapeamento experimental de frames, checksum e comandos de uma bateria de motocicleta elétrica.
Era preciso coletar dados para uma solicitação de garantia.
Recebi uma bateria de motocicleta elétrica com a tarefa de extrair informações que pudessem acompanhar uma análise de garantia. O procedimento do fabricante previa uma ferramenta de comunicação específica, mas nós tínhamos apenas o software de diagnóstico Greenway.
O manual e a interface da bateria indicavam RS485. A pergunta inicial era simples: o adaptador oficial fazia apenas a conversão elétrica ou também traduzia mensagens, executava algum handshake ou encapsulava um protocolo intermediário?
Um conversor USB-RS485 comum foi conectado ao barramento. No equipamento analisado, o software Greenway comunicou diretamente com o BMS e exibiu seus parâmetros.
Com isso, o problema prático estava resolvido: tensão, corrente, SOC, SOH, capacidades, células, temperaturas e histórico de falhas puderam ser consultados e encaminhados ao fabricante. O que veio depois já era curiosidade técnica.
Um segundo transceptor entrou apenas para observar.
Com o Greenway operando pelo primeiro conversor, um segundo transceptor RS485 foi colocado em paralelo ao barramento e ligado a outra porta USB. Ele não participava da conversa: servia como ponto de observação dos bytes trocados entre computador e BMS.
A análise não partiu de uma documentação oficial do protocolo. Ela cruzou frames, valores simultâneos da interface, conversões numéricas e repetição de testes. Inteligência artificial foi usada como apoio para procurar padrões, não como substituta da validação experimental.
Dois marcadores, comandos de 16 bits e um SUM8.
As solicitações observadas começavam em 46 16; as respostas, em 47 16. Depois vinham o comando de 16 bits, o comprimento, o payload quando existente e um checksum de um byte.
46 16 [CMD_H] [CMD_L] [LEN] [DATA…] [SUM8]47 16 [CMD_H] [CMD_L] [LEN] [DATA…] [SUM8]O checksum
O valor final corresponde à soma de todos os bytes anteriores, reduzida aos oito bits menos significativos:
checksum = sum(bytes) & 0xFF
46 + 16 + 01 + 09 + 04 = 6A
46 16 01 09 04 6AO mesmo cálculo validou frames de comandos diferentes. Mais tarde, ele também revelou que uma ferramenta de captura estava omitindo um byte.
RS485 descrevia a camada física, não o protocolo.
O uso de RS485 não transforma automaticamente uma comunicação em Modbus RTU. O protocolo observado não usava o enquadramento, funções e endereçamento de registradores característicos do Modbus.
- Marcadores
46 16e47 16 - Comandos proprietários de 16 bits
- Comprimento explícito
- Checksum SUM8 de um byte
- Endereço do slave
- Código de função
- Registradores e quantidade
- CRC-16
O resultado foi uma comunicação binária proprietária transportada por RS485 a 9600 baud.
Os bytes começaram a coincidir com a tela.
O comando 0x0109 retornava quatro bytes interpretados como inteiro sem sinal little-endian. O payload 12 30 01 00 se torna 0x00013012, ou 77842 mV. O mesmo método aplicado a 0x010A interpretou EC FF FF FF como inteiro sinalizado de −20 mA.
12 30 01 00→0x00013012→77842 mVA ferramenta visual usada nessa conferência foi o Online Hex Converter da SCADACore ↗. Ela auxiliou a leitura, mas a confirmação veio da coincidência repetida entre payload e GUI.
O checksum encontrou um erro na própria captura.
Um frame aparecia repetidamente como 46 16 01 04 6E. Pela estrutura já conhecida, faltava o segundo byte do comando. A soma indicava exatamente qual:
46 16 01 __ 04 6E46 + 16 + 01 + 0D + 04 = 6E46 16 01 0D 04 6EA resposta reconstruída era 47 16 01 0D 04 4E 00 00 00 BD. O payload little-endian resultava em 78, exatamente o SOC mostrado na interface.
Para testar a hipótese, foi transmitida uma sequência controlada contendo todos os valores de 0x00 a 0xFF entre dois transceptores. O 0x0D desapareceu no caminho de visualização. Como esse byte corresponde a Carriage Return, o defeito estava na cadeia de captura, não no protocolo Greenway.
O checksum deixou de ser apenas um teste de integridade dos frames e se tornou uma ferramenta para diagnosticar o próprio instrumento de observação.
Nem todo comando retornava um único número.
Células
0x0124 e 0x0125 retornavam arrays de 16 palavras little-endian, correspondentes às posições 1–16 e 17–32. A bateria observada usava 20 células em série; as posições posteriores apareciam zeradas.
Limites elétricos e térmicos
O payload de 14 bytes de 0x0126 pôde ser dividido em duas correntes INT32, duas tensões de célula UINT16 e duas temperaturas INT8. Os valores coincidiram com os limites mostrados na GUI.
Contadores de falha
0x0127 entregava 32 posições UINT16. A ordem foi comparada com a lista da interface e permitiu correlacionar vários índices, incluindo sobretensão de carga, dois níveis de sobredescarga, falha de soft start e falha do circuito de proteção de descarga. Valores 0xFFFF eram exibidos como zero ou campo não utilizado.
A correspondência de vários índices foi confirmada no caso observado. Isso não substitui documentação oficial nem garante que todas as versões de BMS usem exatamente a mesma tabela.
Alguns campos apareceram; a estrutura completa, não.
O bloco de 128 bytes de 0x0115 parecia consolidar estatísticas de vida útil. Capacidade, throughput, capacidade restante, ciclos e extremos de corrente, tensão e temperatura reapareciam em posições compatíveis, mas vários trechos continuavam sem interpretação.
Os comandos 0x0077 e 0x0178 também mostraram uma relação recorrente: o primeiro antecedia o segundo e o comprimento indicado parecia reaparecer na leitura seguinte.
46 16 00 77 05 02 A1 68 05 1E 06
47 16 00 77 00 D4
46 16 01 78 1E F3
47 16 01 78 1E [30 bytes] ...0x0077 pode selecionar ou configurar um objeto, endereço ou operação; 0x0178 parece ler o resultado. As capturas não demonstram que o primeiro comando faça escrita permanente no BMS.
O que foi confirmado — e o que continua aberto.
| Command | Length | Type | Unit | Description | Confidence |
|---|---|---|---|---|---|
0x0100 | 4 | — | — | Função ainda não determinada | Unknown |
0x0108 | 32 | INT8 array | °C | Sensores de temperatura; atribuição individual ainda parcial | Partial |
0x0109 | 4 | UINT32 LE | mV | Tensão do pack | Confirmed |
0x010A | 4 | INT32 LE | mA | Corrente do pack | Confirmed |
0x010D | 4 | UINT32 LE | % | SOC | Confirmed |
0x010E | 4 | UINT32 LE | % | SOH | Confirmed |
0x010F | 4 | UINT32 LE | mAh | Capacidade restante | Confirmed |
0x0110 | 4 | UINT32 LE | mAh | Capacidade completa | Confirmed |
0x0114 | 4 | 2 × UINT16 LE | mA / ? | Corrente USB confirmada; segundo campo desconhecido | Partial |
0x0115 | 128 | mixed struct | mixed | Estatísticas e acumuladores de vida útil | Partial |
0x0116 | 16 | — | — | Função ainda não determinada | Unknown |
0x0117 | 4 | UINT32 LE | ciclos | Contador de ciclos | Confirmed |
0x0118 | 4 | UINT32 LE | mAh | Capacidade de projeto | Confirmed |
0x0119 | 4 | UINT32 LE | mV | Tensão de projeto | Confirmed |
0x011A | 8 | mixed / ASCII | — | Versões de software/hardware e IDX | Partial |
0x011B | 4 | date fields | — | Data de fabricação: YY MM DD xx | Confirmed |
0x011D | 6 | UINT8 array | — | RTC: YY MM DD hh mm ss | Confirmed |
0x011E | 4 | — | — | Função ainda não determinada | Unknown |
0x0120 | 16 | ASCII | — | Fabricante | Confirmed |
0x0121 | 32 | ASCII | — | Nome da bateria | Confirmed |
0x0122 | 16 | ASCII | — | Nome/modelo da célula | Confirmed |
0x0123 | 32 | ASCII | — | Número de série — payload não publicado | Confirmed |
0x0124 | 32 | UINT16 LE array | mV | Tensões das células 1–16 | Confirmed |
0x0125 | 32 | UINT16 LE array | mV | Tensões das células 17–32 | Confirmed |
0x0126 | 14 | mixed struct | mixed | Limites de corrente, tensão de célula e temperatura | Confirmed |
0x0127 | 64 | UINT16 LE array | contagens | 32 contadores de falha | Partial |
0x01A3 | — | — | — | Função ainda não determinada | Unknown |
0x0077 | variável | — | — | Possível seleção/configuração de objeto ou operação | Partial |
0x0178 | variável | bytes | — | Possível leitura associada ao comando 0x0077 | Partial |
LE = little-endian. “Confirmed” significa correlação repetida com a interface; “Partial”, estrutura ou função reconhecida apenas em parte; “Unknown”, comando observado sem significado atribuído.
Capturar o barramento também capturou dados do equipamento.
- O número de série real não é reproduzido neste artigo.
- O dump bruto e a planilha de trabalho permanecem privados.
- Capturas que continham o serial diretamente ou no payload ASCII foram excluídas.
- Os significados apresentados são interpretações experimentais do equipamento observado.
- Não houve tentativa de apresentar este mapa como documentação oficial da Greenway.
Os testes posteriores também não mostraram comunicação digital entre a bateria e o carregador analisado. Isso separa dois caminhos: Greenway ↔ BMS usava RS485; carregador ↔ bateria não apresentou comunicação digital observável naquele conjunto.
A motocicleta ainda é a parte que falta.
A comunicação entre bateria e motocicleta permanece para uma investigação futura. Ela pode revelar outro protocolo, sinais discretos ou apenas uma lógica de habilitação ainda não observada. Neste ponto, qualquer afirmação seria antecipada.
O protocolo não foi “quebrado”. Ele começou a ser entendido.
O trabalho avançou porque cada interpretação permaneceu ligada a uma evidência: um frame, um cálculo, um valor simultâneo na GUI ou um teste controlado. A parte mais valiosa não foi produzir uma tabela pronta, mas registrar o caminho entre hipótese, captura, correlação e validação.