Estoy usando un viejo sensor Draeger PAC III para medir las concentraciones de gas, con el objetivo de transmitir los datos de forma remota a través de Arduino. En consecuencia, no puedo usar el software propietario para generar información/datos del sistema. Aunque el sistema ha sido "retirado" por la empresa y ya no se vende/distribuye, sus técnicos no proporcionarán la hoja de datos para la comunicación en el dispositivo.
Para eludir esto, intento usar un monitor de puerto serie para leer la comunicación entre el dispositivo y la PC. La PC se comunica a través de un puerto RS-232, pero usa solo conexión a tierra y una línea Tx/Rx combinada para obtener datos del dispositivo. Para activar las comunicaciones, todos los datos escritos comienzan con un alto (01). Todos los datos leídos duplican los datos escritos y luego se agregan a los datos del dispositivo. El primer comando siempre es "iniciar comunicaciones por identificación", también conocido como los primeros 4 fragmentos de datos. Solo puedo suponer que los datos restantes comunican el tiempo, pero no entiendo cómo descifrarlo. Si se usa/necesita endian, ¿cómo puedo hacer esto? ¡Gracias de antemano!
Según los valores informados del programa propietario:
[03/08/2019 16:44:22] Written data (COM4)
01 01 01 02 00 05 ......
[03/08/2019 16:44:22] Read data (COM4)
01 01 01 02 00 05 01 01 01 26 02 34 35 33 30 30 .........&.45300
31 31 20 20 20 45 52 58 4c 2d 30 31 36 32 20 20 11 ERXL-0162
20 20 34 35 33 30 32 37 30 76 33 2e 35 30 07 3b 4530270v3.50.;
[03/08/2019 16:44:23] Written data (COM4)
01 01 01 02 00 05 ......
[03/08/2019 16:44:23] Read data (COM4)
01 01 01 02 00 05 01 01 01 26 02 34 35 33 30 30 .........&.45300
31 31 20 20 20 45 52 58 4c 2d 30 31 36 32 20 20 11 ERXL-0162
20 20 34 35 33 30 32 37 30 76 33 2e 35 30 07 3b 4530270v3.50.;
[03/08/2019 16:44:23] Written data (COM4)
01 01 02 02 00 06 ......
[03/08/2019 16:44:23] Read data (COM4)
01 01 02 02 00 06 01 01 02 07 89 28 01 0d 38 01 ..........‰(..8.
02 .
[03/08/2019 16:44:23] - Close port COM4
Editar: dos marcas de tiempo más según lo solicitado
Time: 1:02 4/9/2008
[03/08/2019 20:04:30] Read data (COM4)
01 01 02 02 00 06 01 01 02 07 89 28 01 02 28 00 ..........‰(..(.
e7 ç
Time: 1:04 4/9/2008
[03/08/2019 20:05:50] Read data (COM4)
01 01 02 02 00 06 01 01 02 07 89 28 01 04 00 00 ..........‰(....
c1 Á
Aquí hay una hipótesis de la parte de tiempo de los datos:
De la captura de datos original:01 0d 38 01 02
Sabemos que la hora se mostró como 01:13. Ese es el 01 0d
y creo que el siguiente byte 38
es probablemente el valor de los segundos, pero eso no se muestra.
Estoy considerando que los últimos 2 bytes en cada "paquete" enviado desde el dispositivo pueden ser una suma de verificación (es un enfoque común). Eso explica por qué los últimos 2 bytes de los primeros dos paquetes son iguales ( 07 3b
), ya que los datos en ambos paquetes son los mismos. Luego, el siguiente paquete (el primer ejemplo de datos y tiempo) tiene valores diferentes para los últimos 2 bytes.
De una de las capturas adicionales de fecha/hora:01 02 28 00 e7
Siguiendo mi primera interpretación anterior, sabiendo que el tiempo que se muestra es 01:02, eso es (como era de esperar) 01 02
y también 40 segundos (hexadecimal 28
) con una 00 e7
suma de verificación para todo el "paquete".
Aquí hay una hipótesis de alto nivel de la decodificación de paquetes:
Usando el paquete de fecha/hora original como ejemplo:
01 01 02 02 00 06 01 01 02 07 89 28 01 0d 38 01 02
El comando original es el líder 01 01 02 02 00 06
donde está el comando real 01 01 02
, luego el número de bytes que siguen (incluida la suma de verificación) es 02
y luego hay una suma de verificación para ese "comando" - 00 06
.
La respuesta comienza con los siguientes bytes: 01 01 02
(quizás nos dice a qué comando responde, para que el maestro/PC verifique la cordura). Luego están 07
los siguientes bytes (incluida la suma de comprobación) - 89 28 01 0d 38 01 02
.
Como ya sugerí, sospecho que los valores 01 0d 38
son hh mm ss
en hexadecimal. El seguimiento 01 02
es una suma de comprobación.
Eso significa que la fecha real solo se puede codificar en los dos bytes restantes 89 28
en ese paquete de datos.
Mi hipótesis en esta etapa es que esos dos bytes 89 28
pueden ser un valor de contador de días little-endian, lo que significa que realmente podría ser 28 89
(hex), es decir, 10377 días (decimales). Si eso fuera cierto, entonces el 9 de abril de 2008 - 10377 días parece ser el 11 de noviembre de 1979. No es una "época" irrazonable.
(Eso es mucho más razonable que si trato los bytes como big-endian, convierto 89 28
hexadecimal a decimal (35112) y resto esa cantidad de días desde el 9 de abril de 2008, lo que parece sugerir un inicio de contador de días (época) del 21 de febrero de 1912, eso es mucho menos sensato para una pieza de equipo moderno.)
Si puede esperar a que la fecha (es decir, el día) cambie en el reloj interno del dispositivo, entonces podemos ver si el valor de la fecha realmente cambia en esos bytes de respuesta de a , lo que confirmaría que es 89 28
un 8a 28
contador de días little-endian. valor enviado desde el dispositivo, e interpretado para convertirse en una fecha de visualización en formato normal, por el software de PC.
O podría intentar alimentar un conjunto modificado de datos al software de la PC y cambiar esos dos bytes que creo que codifican la fecha, y ver qué muestra el software de la PC. El problema es la suma de comprobación (lo que creo que es) en cada paquete. Eso hace que sea difícil (probablemente imposible) enviar datos modificados al software de la PC, hasta que tenga el algoritmo de suma de verificación y pueda modificar correctamente los bytes de suma de verificación, cuando modifique los bytes de datos.
Encontrar el algoritmo de suma de comprobación resultó más fácil de lo que esperaba.
Los últimos 2 bytes de cada paquete, tanto los paquetes de datos "enviados" de 6 bytes como los paquetes de datos "recibidos" más largos (pero solo los datos reales "recibidos", que comienzan con el 7.º byte en esa captura de datos mixtos enviados + recibidos ) son de hecho una suma de comprobación .
Es literalmente la suma de todos los bytes (pero excluyendo la suma de comprobación, obviamente) en formato big-endian (es decir, MSB y luego LSB).
(Todos los ejemplos a continuación están en hexadecimal).
Por ejemplo, en los paquetes de datos enviados, es fácil ver esto:
01 01 01 02 00 05
=> 01
+ 01
+ 01
+ 02
= 0005
01 01 02 02 00 06
=> 01
+ 01
+ 02
+ 02
=0006
En el primer paquete de fecha y hora (ignorando los 6 bytes de "datos enviados" al principio):
01 01 02 07 89 28 01 0d 38 01 02
=> 01
+ 01
+ 02
+ 07
+ 89
+ 28
+ 01
+ 0d
+ 38
=0102
Con esta información, ahora es posible crear un paquete de datos modificado y enviarlo al software de la PC, con una suma de verificación válida, para ver cómo se muestran esos datos. Como se mencionó anteriormente, los bytes que se deben concentrar en cambiar (para ayudarlo a comprender su significado y confirmar o negar mi hipótesis de que son un contador de días) son los que contienen 89 28
los paquetes de fecha y hora reales.
Ron Beyer
Janka
Investigación8472
chris stratton
Investigación8472
Investigación8472
chris stratton
Investigación8472