Módulo de cálculo "math"
INFORMACIÓN PREVIA IMPORTANTE
Este módulo se proporciona sin garantías expresas ni implícitas de ningún tipo, incluida, entre otras, la garantía implícita de idoneidad del módulo para un fin determinado.
En ningún caso serán optiMEAS GmbH ni los colaboradores de este módulo responsables de daños directos, indirectos, incidentales, especiales, ejemplares o consecuentes (entre otros, la adquisición de bienes o servicios sustitutivos, la limitación y/o pérdida de la capacidad de uso, de datos, de beneficios o la interrupción de la actividad), cualquiera que sea su causa y bajo cualquier obligación, ya sea contractual, de responsabilidad objetiva o extracontractual (incluida la negligencia), y de cualquier modo en que se hayan producido por el uso de este módulo, incluso si se les hubiera advertido de la posibilidad de tales daños.
Debe partirse de la base de que la funcionalidad relativa al catálogo de funciones, las interfaces, la parametrización o aspectos similares es incompleta y de que en versiones futuras puede proporcionarse modificada. Por ello, el funcionamiento se realiza bajo la propia responsabilidad.
Agradecemos enormemente cualquier sugerencia de mejora y consejo que resulte del uso de este módulo y animamos a los usuarios a ponerse en contacto con nosotros al respecto.
Descripción
Mediante el módulo de cálculo "math", un conjunto de fórmulas definido por el usuario, que emplea funciones muy diversas, puede aplicarse a datos de distinto tipo.
Entre los datos (argumentos, expresiones) se cuentan, por un lado, los datos de canal del smartCORE, en general variables en el tiempo, a los que se puede acceder mediante nombres de canal y, por otro lado, expresiones constantes, recursos, datos persistentes y datos proporcionados o preparados con ayuda de decodificadores.
Además de datos unidimensionales, también se admiten datos multidimensionales en forma de vectores y matrices; los componentes de estos datos pueden tener tipos de datos distintos y, si es necesario, se realiza una conversión automática de tipos.
La descripción del alcance del lenguaje puede consultarse en
Entre las funciones admitidas se cuentan, entre otras:
- operadores aritmético-lógicos, incluidos su precedencia y su asociatividad
- funciones matemático-trigonométricas
- funciones de filtrado temporal (como p. ej. la derivación e integración de funciones)
- algoritmos numéricos (p. ej. FFT, descomposición de matrices, interpolación, predicción)
- muestreo (sampling) de datos de medición
- funciones de conteo y temporizadores
- funciones de selección, funciones orientadas a bits y funciones de conversión de tipos (type casts)
- secuenciación de expresiones y asignaciones
- funciones que operan sobre cadenas de caracteres
Ejemplos
En general, en el marco de la configuración resulta útil considerar un ejemplo mínimo y adaptarlo a las propias necesidades.
A continuación se presenta un ejemplo mínimo que calcula los canales de salida Leistung y Energie a partir de dos canales de entrada ficticios del smartCORE, Spannung y Strom, con ayuda de la ecuación de magnitudes físicas
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": [
"Leistung = Spannung * Strom * 1e-3; // Strom in mA!",
"Energie = 1/(3600 * 1e3) * integrate(Leistung); // Energie in kWh!"
],
"outputs": [
{
"datatype": "double",
"name": "Leistung",
"physicalUnit": "W"
},
{
"datatype": "double",
"name": "Energie",
"physicalUnit": "kWh"
}
]
}
}
Para cálculos cuya complejidad en tiempo de ejecución supera los requisitos de tiempo real, resulta recomendable el uso de una Lookup Table (LUT). En el siguiente ejemplo, el volumen de combustible de un depósito se determina de forma interpolada a partir de la Lookup Table en función de la presión existente en el fondo de dicho depósito; el contenido de esta LUT se proporciona mediante resources desde un archivo del sistema de archivos
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": [
"Volumen = lookup(Druck, {$ref:'Tank_LUT'});"
],
"outputs": [
{
"datatype": "double",
"name": "Volumen",
"physicalUnit": "l"
}
],
"resources": {
"Tank_LUT": {
"decoder": [
"file"
],
"value": "Tank_LUT.lut"
}
}
}
}
El contenido del archivo Tank_LUT.lut sería entonces, según la descripción de la función lookup(), el siguiente (donde aquí no se enumeran los 161 puntos de apoyo):
IN kPa 0.0 0.167751 161
OUT l
0
42.942
87.924
134.946
184.008
235.11
288.252
343.434
400.656
459.918
521.22
584.562
649.944
... usw
Motivación
El uso del módulo de cálculo mathmodule permite, entre otras cosas, lo siguiente
- Diagnóstico y análisis de estados de proceso directamente en el dispositivo
- Reducción del volumen de datos que debe transmitirse mediante la concentración en valores característicos o tendencias
- Mediciones virtuales sobre señales de medición, p. ej. duración del movimiento de una puerta, amplitud de una señal, etc.
- Contadores de eventos, contadores de horas de funcionamiento, integrales
- Clasificaciones (tiempo de permanencia, pasos por encima, Rainflow, ...)
- Procesamiento de magnitudes de medición multicomponente (galgas extensométricas en roseta)
- Implementación rápida de PoC para el (pre)desarrollo de plugins
- Funciones de control sencillas
Configuración JSON
Una configuración mínima necesaria del módulo de cálculo tiene esencialmente la siguiente estructura
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": [
< MATH >
],
"outputs": [
< OUTPUTS >
]
}
}
Una configuración completa del módulo de cálculo, en cambio, tiene esencialmente la siguiente estructura
{
"module":"math1",
"factory":"mathmodule",
"config": {
"packages": [
"some function package",
"another function package",
...
],
"evaluationTimeMs": 1000,
"inputTimeoutS": 15,
"discreteSampleTimeMs": 100,
"math": [
< MATH >
],
"outputs": [
< OUTPUTS >
],
"resources": {
"someTextResource": [
< LINES OF TEXT >
],
"someObjectResource": {
< JSON STYLE Config >
},
"someDecodableResource": {
"decoder": [
< DECODERS >
],
"value": "someInitialStringValue"
},
...
}
}
}
Parámetros globales del módulo
En el marco de la configuración del módulo pueden utilizarse los siguientes parámetros
| Nombre del parámetro | Obligatorio | Tipo de datos | Rango de valores razonable | Valor por defecto | Descripción |
|---|---|---|---|---|---|
| packages | No | JSON Array of STRING | EMPTY JSON Array | Lista que contiene paquetes de funciones opcionales | |
| evaluationTimeMs | No | INT | 100 - | 1000 (1 s) | Intervalo de llamada del cálculo (Polling Interval) en ms |
| inputTimeoutS | No | INT | 10 - | 15 (15 s) | Timeout tras el cual ya no se espera a los datos de canal, sino que el cálculo continúa con ayuda del último valor del canal, en s |
| discreteSampleTimeMs | No | INT | 1 - | 100 (100 ms) | Tiempo de muestreo (paso de la malla temporal subyacente) para el cálculo/evaluación en tiempo discreto de las partes recursivas de las fórmulas, en ms |
| math | SÍ | JSON Array of STRING o STRING | Cadena, o lista de cadenas concatenadas en una única cadena, que representa el conjunto de fórmulas del cálculo (véase más abajo) | ||
| outputs | SÍ | JSON Array of JSON Object for Channel Configuration | Lista de todos los canales de salida y, además, también de todos los canales de entrada persistentes (véase más abajo) | ||
| resources | No | JSON Object for Resource Configuration | Objeto que configura los recursos utilizados (véase más abajo) | ||
| minLogLevel | No | ENUM | OFF, DEBUG, INFO, WARNING, ERROR, FATAL | INFO | Filtro de salida para los mensajes del módulo math; solo se escriben en el archivo de registro los mensajes con al menos la gravedad indicada. |
Configuración del conjunto de fórmulas "math"
El conjunto de fórmulas del cálculo que debe ejecutarse periódicamente puede especificarse, según la complejidad, bien como una única cadena, bien como una lista de cadenas (en forma de JSON Array). Si se especifica una lista, todos los elementos de la lista se encadenan como líneas del conjunto de fórmulas con el carácter de unión \n.
Puede encontrar más información en las páginas siguientes:
- Descripción de la función general
- Semántica y sintaxis, operadores
- Referencia de funciones
- Uso de recursos
- así como diversos ejemplos de aplicación
A continuación se muestran ejemplos de conjuntos de fórmulas
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": "y = 42;"
}
}
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": [
"c = 42;",
"y = c;"
]
}
}
En esta documentación el foco se sitúa en el conjunto de fórmulas propiamente dicho, de varias líneas. Por ello, al trasladar el conjunto de fórmulas a la configuración JSON, las líneas individuales del conjunto de fórmulas deben encerrarse entre " ... ". Esto implica que todos los caracteres " y de ESCAPE \ del texto de la fórmula deben volver a ocultarse al analizador JSON mediante el carácter de ESCAPE \.
Este formato adicional no se tiene en cuenta en los ejemplos de esta referencia de funciones, ya que por lo general lo aplica automáticamente el editor utilizado, p. ej. en optiCONTROL.
A partir del siguiente texto de fórmula con diversos elementos de texto y una configuración
s1a = '17" (inch)';
s1b = "17\" (inch)";
s2a = "Hat's funktioniert?\t[ja/nein]";
s2b = 'Hat\'s funktioniert?\t[ja/nein]';
fnc = myParameterFunction(x, {"property":"value"});
en la configuración JSON del módulo Math resulta
"math": [
"s1a = '17\" (inch)';",
"s1b = \"17\\\" (inch)\";",
"s2a = \"Hat's funktioniert?\\t[ja/nein]\";",
"s2b= 'Hat\\'s funktioniert?\\t[ja/nein]';",
"fnc = myParameterFunction(x, {\"property\":\"value\"});"
], ...
Configuración de los canales de salida "outputs"
En general, el módulo de cálculo sirve para calcular valores de salida que se producen en canales del smartCORE.
Para estos canales debe haber en el conjunto de fórmulas exactamente una asignación en cada caso, y deben configurarse en "outputs" según los estándares habituales del smartCORE.
Las asignaciones que no se publican en el ámbito de "outputs" se consideran variables internas y locales del conjunto de fórmulas.
Por consiguiente, el siguiente ejemplo mínimo exporta el canal speed
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": [
"c = 42;",
"speed = c;"
],
"outputs": [
{
"dataType": "double",
"name": "speed",
"physicalUnit": "m/s"
}
]
}
}
Una configuración algo más flexible, que describe además características adicionales del canal y una cadena de filtros de producción de una etapa, tendría el siguiente aspecto
{
"module":"math1",
"factory":"mathmodule",
"config": {
"math": [
"c = 42;",
"speed = c;"
],
"outputs": [
{
"dataType": "double",
"name": "speed",
"physicalUnit": "m/s",
"bufferSize": 1024,
"channelType": "timestamped",
"filter": [
{
"name": "datareduction",
"absTolerance": 0.0,
"timeoutMs": 60000
}
]
}
]
}
}
Configuración de recursos "resources"
La puesta a disposición de recursos es una parte importante del módulo Math para realizar también configuraciones y funcionalidades complejas. La descripción correspondiente se encuentra aquí.