Cómo manejar el evento de la ventana de tiempo en movimiento en un software integrado

1

Edit3: Según lo solicitado, voy a ser más específico acerca de mi problema, la descripción anterior aún está debajo

Un motor no debe activarse más de MAX_TIME horas (20 horas consecutivas o no) durante una ventana de tiempo variable de WINDOW_TIME horas (72 horas). Cada EJEMPLO DE MUESTRA (1 minuto), el software verifica si el motor debe estar encendido o apagado. Mi idea fue crear una marca de tiempo en un evento ascendente / descendente del estado del motor y almacenarlos en un búfer. Este búfer se evaluará cada SAMPLE_TIME para verificar si la suma de la marca de tiempo no es mayor que MAX_TIME . Debido a la ventana deslizante, el búfer también debe actualizarse para eliminar la marca de tiempo que sea demasiado antigua y agregar nuevos.

Tengo memoria limitada (alrededor de 60 bytes). Estoy buscando algún tipo de algoritmo que pueda usarse para manejar este problema (con un enfoque integrado si es posible, al menos para la huella de memoria)

Según los comentarios debo:

  • reduce el período SAMPLE_TIME para reducir la huella de memoria de mis búferes. Si evalúo el estado del motor cada 10 minutos, que es el tiempo máximo para mi aplicación, todavía tengo (72 * 60) / 10 = 432 datos para almacenar si es el peor de los casos y el motor se enciende y se apaga cada vez. 10 minutos. Se puede almacenar como bits (ON u OFF), por lo que son 54 bytes. El problema con esta solución es que cuando el software verifica si el motor está ENCENDIDO, podría ser el caso, incluso si los últimos 9 minutos estuvo APAGADO, y esto contará como 10 minutos de activación del motor

Descripción anterior:

  

Tengo un proyecto de software integrado donde necesito verificar si un motor   no se activó con demasiada frecuencia durante una ventana de tiempo. Cada minuto el   El programa adquiere datos que indican si el motor debe o no debe ser   activado. Durante una ventana de tiempo de 72 horas, el motor no debe ser   activado más de 20 horas en total (no es necesario que sean 20 horas   consecutivo), es por eso que necesito recibir una advertencia cuando esto suceda.

     

Estoy usando un microcontrolador de Renesas (RL78) y no tengo ninguno   OS.

     

Ya que tengo recursos limitados y la ventana de tiempo es enorme, pensé   de usar algún tipo de marca de tiempo. Cuando el sistema active el motor a   la marca de tiempo se guarda y se desactiva se guarda otra marca de tiempo   y sigue Una vez que llegué a las primeras 72 horas puedo calcular cómo   Durante mucho tiempo el motor se activó gracias a las múltiples marcas de tiempo. los   las marcas de tiempo se borran cuando hay fuera de la ventana (ya que es   'en movimiento').

     

Supongo que hay algo más fácil pero no sé por dónde empezar.

     

Edit1: necesito comprobar si el período de 20 horas se alcanza dentro del   72 horas, y si es el caso, establece una bandera.

     

Edit2: tengo un tamaño de RAM realmente limitado, alrededor de 60 bytes disponibles

    
pregunta Asmature

3 respuestas

0

Gracias a @Finbarr, @Chris Stratton y @Dan Mills, esta es la solución que voy a implementar:

  • Cada 10 minutos, el sistema verificará el estado del motor (ENCENDIDO o APAGADO) y escribirá un bit en un búfer circular que almacena el estado del motor en la ventana de 72 h.
  • Una variable hará un seguimiento del número de bits ON en este búfer circular, de modo que en lugar de evaluar el contenido del búfer circular cada vez, una sola variable almacenará el número de 10 minutos de activación del Motor
  • El tamaño del búfer circular debe ser: (72 * 60) / 10 = 432 bits (ON u OFF), es decir, 54 bytes + 2 bytes para almacenar el número de bits ON.

Inconvenientes:

  • No muestrearé el estado del motor cada minuto, para ahorrar memoria (54 bytes en lugar de 540 bytes). Esto significa que cada 10 minutos, el estado del motor que se lee asume el estado del motor durante los últimos 10 minutos. Entonces, si el motor estuvo APAGADO durante 9 minutos, pero cuando el sistema verifique un minuto más tarde y esté encendido, el sistema pensará que el motor estuvo ENCENDIDO durante 10 minutos.

¡Gracias por tu ayuda!

    
respondido por el Asmature
1

Probablemente pueda obtener una funcionalidad equivalente utilizando una media móvil exponencial.

y [n] = αx [n] + (1 − α) y [n − 1]

Donde α es tu ventana.

X es > 1 cuando el motor está encendido y 0 cuando está apagado. Si X es > 1 suficientes muestras en la ventana, Y se volverán verdaderas (> = 1).

Esto se puede calcular en matemáticas de punto fijo usando factores de 2 para α. Más detalles de los vecinos .

Tenga en cuenta que una implementación de punto fijo podría no generar un límite perfecto de 72000 segundos. Pero como has dado horas, hay cierta flexibilidad.

    
respondido por el Jeroen3
0

No tiene sentido mantener el tiempo en bits. En su lugar, cada hora tiene su propio byte y puede muestrear cada minuto (por lo que cada nuestro tiene un valor máximo de 60) o cada 15 segundos (un valor máximo de 240) o en cualquier punto intermedio.

De esa manera necesitas un máximo de 72 bytes. O puede empaquetar más horas en un byte. Como una muestra cada 4 minutos, así que cada byte durante dos horas. .....

    
respondido por el dannyf

Lea otras preguntas en las etiquetas