Saltar al contenido principal

Módulo Fast Message Producer "fmproducer"

Descripción​

Casi todas las fuentes de datos de la tecnología de procesos transmiten los datos en campos de datos empaquetados de bytes. El contenido y, en su caso, también la longitud de estos paquetes se pueden identificar mediante un messageKey (o también "ID"). En la siguiente tabla se indican ejemplos.

ProtocoloMessage KeyLongitud de la clave
CAN-BusCAN-ID11 o 29 bit
MVB-BusNúmero de puerto12 bit
ProfiBusSlave-Node ID7 bit
ModbusRegister, Coil, Input, Status2 + 16-bit

Diversos plugins de smartCORE (p. ej. fmudp, canbus, smartmvb) realizan la conexión del hardware mediante interfaces dedicadas, reciben o envían paquetes de datos y, con los paquetes recibidos, alimentan el denominado Fast Message Dispatcher (FMD). Este proporciona en smartCORE una tecnología eficiente para extraer, de fuentes de datos arbitrarias y según un esquema siempre recurrente, datos de medición e información de estado y producirlos en canales individuales de smartCORE (de ahí el nombre "fm Producer").

Los módulos de interfaz crean como mínimo una instancia de un FMD bajo su propio nombre. Esta se conecta en el fmProducer mediante la propiedad fmd.

fm Producer

En los paquetes recibidos se encuentran, además del MessageID y de una marca de tiempo, los datos en un campo de datos de bytes. Para un canal, los datos se encuentran en él a partir de un determinado bitOffset con una bitLength establecida. Además influyen la disposición de los bytes byteOrder en el búfer y (por desgracia) la addressSpec(ification), con la que se establece cómo se cuentan los bits en el búfer.

Una vez que los bytes de datos en bruto se han puesto en el orden correcto y el valor se ha desplazado y enmascarado correctamente, se realiza la interpretación mediante el imageType. ¿Tiene el número signo o no? ¿Debe leerse el número como BCD (Binary Coded Decimal) o como valor polar (coma fija)? ¿Entero, coma flotante o incluso texto?

Tras un escalado opcional a una magnitud de medición física (scale, offset, physicalUnit) según

yphys=yraw⋅scale+offsety_{phys} = y_{raw} \cdot \rm{scale} + \rm{offset}

se produce el valor de los datos en el canal de smartCORE con la marca de tiempo (de recepción) transmitida igualmente por el módulo de interfaz.

Interfaces y protocolos utilizados​

  • Fast Message Dispatching

Configuración JSON​

En la siguiente sección se describe la configuración JSON completa del módulo y se explican los distintos parámetros.

Configuración de ejemplo (mínima)​

{
"module":"FmProducer",
"factory":"fmproducer",
"config":{
"fmd":"FastMessageDispatcher",
"channels":[
{
"name":"Channel",
"messageKey":42,
"bitOffset":0,
"bitLength":32,
"imageType":"float"
},

[...]

]
}
}

Configuración de ejemplo (máxima)​

{
"module":"FmProducerSmartMVB",
"factory":"fmproducer",
"config":{
"fmd":"smartmvb0",
"bufferSize":1024,
"namespace":["directory","subDirectory"],
"channelPrefix":"SmartMVB",
"addressSpec": "EN61375_MVB",
"byteOrder": "bigEndian",
"channels":[
{
"name":"SmartMVBmessageData",
"bufferSize":1024,
"scale":3.14,
"offset":2.72,
"physicalDimension":"Length",
"physicalUnit":"m",
"messageKey":10012,
"bitOffset":0,
"bitLength":20,
"imageType":"unsigned",
"addressSpec": "AscendingFirstBit",
"byteOrder": "littleEndian",
"absoluteTolerance":0.5
},

[...]

]
}
}

Parámetros globales del módulo​

Nombre del parámetroObligatorioTipo de datosRango de valores razonableValor predeterminadoDescripción
fmdSÍSTRINGFast Message Dispatcher del módulo de envío
bufferSizeNo1INT1 -1024(predeterminado) Tamaño del búfer de los canales creados
channelPrefixNoSTRINGPrefijo de canal (útil si se utilizan varios módulos fmproducer y las configuraciones tienen nombres de canal solapados)
namespaceNoARRAY [STRING]Prefijo de canal en forma de espacios de nombres encadenados jerárquicamente
addressSpecNoSTRING"EN61375_MVB"Esquema de direccionamiento predeterminado
byteOrderNoSTRING"BigEndian"Orden de bytes predeterminado
channelsSÍJSON ArrayLista de JSON Objects de canales configurados

Configuración de un canal (JSON Object)​

Nombre del parámetroObligatorioTipo de datosRango de valores razonableValor predeterminadoDescripción
Filtro
messageKeyNo2UINTID del mensaje recibido (p. ej. CAN-Bus Message ID, MVB Port, ...)
Process Image
addressSpecNoSTRING(valor de la configuración global)Esquema de direccionamiento, véase la descripción siguiente
byteOrderNoSTRING"BigEndian", "LittleEndian",
"[A-Z]+"
(valor de la configuración global)Orden de bytes del valor almacenado, véase la descripción siguiente
imageTypeSÍSTRINGTipo de datos de origen admitido del valor almacenado (véase más abajo)
bitOffsetSÍUINTDesplazamiento en bits del valor almacenado en el mensaje
bitLengthNo3UINTLongitud en bits del valor almacenado en el mensaje
stringHintNo4STRINGIndicación para determinar la longitud de la cadena (véase más abajo)
stringEncoding5No4STRINGNombre IANA, p. ej. "UTF-8", "windows-1252"6Codificación de caracteres de la cadena en el paquete de datos (véase más abajo)
timeFix5No7STRING"RFC4330", "RFC5905""RFC4330"Tratamiento del desbordamiento de time64 en el año 2036 (véase más abajo)
scaleNo8FLOAT1Factor de escala del valor producido
offsetNo8FLOAT0Desplazamiento aditivo del valor producido
smartCORE
nameSÍSTRINGNombre del canal
dataTypeNo9STRINGTipo de datos del canal
bufferSizeNo1INT1 -1024Tamaño del búfer del canal creado
physicalDimensionNoSTRINGMagnitud física
physicalUnitNoSTRINGUnidad física
noFilterNoBOOLfalseDesactiva el filtro DataReduction
absoluteToleranceNoFLOAT0.0Tolerancia absoluta para el filtro DataReduction
cacheSizeNo10INT0Número de muestras de datos que se almacenan en una caché local del canal antes de publicarse para otros módulos.
Reservado
debugNoBOOLfalseHabilita las salidas de depuración para el canal.
numElementsNoINT1Longitud de un campo de datos en múltiplos del elemento básico

Especificaciones de dirección 'addressSpec'​

¿Por qué hay que establecer un esquema de direccionamiento?​

El fmproducer descompone el paquete de datos recibido de un dispositivo externo. Y la especificación de este dispositivo y de la interfaz utilizada determinan cómo deben localizarse los distintos canales de datos en el flujo de datos. Por desgracia, existen muchas variaciones, porque, a pesar de la estandarización, en determinados ámbitos siguen existiendo suficientes implementaciones propietarias.

La especificación de dirección addressSpec establece con qué forma de contar se indican el MSBit o el LSBit en el bitOffset. Por razones históricas (fmProducer se desarrolló primero para el MVB), el ajuste EN61375_MVB es también el ajuste predeterminado.

Valores configurables​

Salvo indicación en contrario, se direcciona en cada caso la posición del primer bit (Msb/Lsb según el byteOrder). La indicación de la addressSpec no tiene función si como byteOrder se elige un mapeo libre.

EnumAliasDescripción
EN61375_MVBMVB
EN61375
RevNum
ReversedNum
ReversedForMsbNumerics
Sigue estrictamente la EN61375 en lo relativo a ByteOrder, tipos de datos, alineación y recuento de bits.
- El bitOffset es byteOffset * 8 + rightShift
- Las configuraciones no conformes se rechazan.
ReversedForMsbRev
Reversed
11 Para todas las señales, los bits se cuentan en orden inverso (Motorola).
AscendingFirstBitDBCPara todas las señales, los bits se cuentan con valor ascendente.
AscendingLSBitpositionLsbPara todas las señales, los bits se cuentan con valor ascendente.
Se direcciona siempre la posición del LSBit.
AscendingMSBitpositionMsbPara todas las señales, los bits se cuentan con valor ascendente.
Se direcciona siempre la posición del MSBit.

Definición de la posición de la imagen para EN61375_MVB​

En la norma EN 61375-2-1 existen, a partir del §6.4.2, diversas indicaciones sobre cómo deben transmitirse los datos en el MVB. En ellas se excluyen de antemano determinados casos. Los canales con una configuración no conforme se registran en el fmproducer, a partir de smartCORE 2.10.1, como error en el archivo de registro y se bloquean para el procesamiento.

  • bitLength=2k\text{bitLength} = 2^k (suposición y zona gris)12 La norma no define tipos de datos cuya longitud no sea una potencia de 2 exacta. Un valor numérico con otra bitLength se procesa, pero se notifica con una advertencia en el archivo de registro al iniciar. Se exceptúan los imageType cuya longitud la fija el propio tipo (p. ej. timedate48).

  • bitOffset=byteOffset⋅8+rightShift\text{bitOffset}=\text{byteOffset} \cdot 8 + \text{rightShift} Con ello, el bitOffset no apunta de forma coherente al MSBit o al LSBit de una variable, sino bien al primer byte (completo) o al LSbit dentro de un byte para bitLength<8\text{bitLength} < 8

  • La representación es siempre BigEndian. Con ello se excluyen las disposiciones LittleEndian.

  • La posición de la imagen debe estar siempre alineada con un múltiplo de su tamaño en el búfer de datos. Los tipos de datos de 1, 2 o 4 bit de longitud solo pueden, por tanto, estar dentro de un byte. Todos los demás, de 8, 16, 32, 64 bit de longitud, deben estar alineados obligatoriamente con un byte. ¡No se permite desplazar la imagen! => rightShift:=0\text{rightShift} := 0 a partir de bitLength≥8\text{bitLength} \geq 8.

  • Un valor de menos de 8 bit comienza y termina en el mismo byte. Esto también se aplica a una bitLength que no sea potencia de 2: un valor de 3 bit con rightShift=6\text{rightShift} = 6 sobrepasa el límite del byte y se rechaza.

Comportamiento modificado a partir de smartCORE 2.12

Un valor de menos de 8 bit que sobrepase el límite del byte se rechaza. Una bitLength que no sea potencia de 2 se notifica.

consejo

Si no es posible una decodificación con este esquema EN61375_MVB, para un canal individual siempre se puede elegir otro de los esquemas y probar entonces también un desplazamiento y una realineación de los bits y bytes.

Recuento de la posición de los bits​

La distinción más importante para todos los demás esquemas es, en primer lugar, en qué orden se cuentan los bits.

Con los ajustes Ascending*, los bits se cuentan según el valor ascendente. Esto es habitual en las configuraciones de CANbus o Profibus y corresponde también a las implementaciones en lenguajes de programación.

Con el ajuste ReversedForMsb, los bits en el byteOrder BigEndian (Motorola, MSB, Network) se cuentan estrictamente de izquierda a derecha. Esto corresponde a la forma de contar a nivel físico en los protocolos de transmisión de datos serie, como, p. ej., CANbus, SPI o también MVB.

El gráfico muestra la distinta forma de contar para 3 bytes a modo de ejemplo.

Forma de contar los bits

Definición del bit de anclaje para la posición de la imagen​

En los ajustes Ascending* se distingue qué bit del valor de datos se direcciona con bitOffset. Habitualmente es el primer bit (AscendingFirstBit), es decir, con byteOrder bigEndian el MSBit y con littleEndian el LSBit. Sin embargo, también hay excepciones en las que, con independencia del byteOrder, se direcciona siempre el MSBit o el LSBit.

En el siguiente diagrama se extraen de un telegrama de datos con recuento Ascending* dos valores enteros de 18 bit, que se transmiten una vez con byteOrder littleEndian y otra vez con bigEndian.

Decodificación de un valor numérico Ascending

Y este diagrama añade un valor entero de 18 bit con recuento ReversedForMsb:

Decodificación de un valor numérico Reversed

La tabla indica posibles variantes de direccionamiento para los valores int18 mostrados arriba.

addressSpecbyteOrderbitOffsetbitLength
ReversedForMsb
AscendingFirstBit
AscendingLSBit
LittleEndian1118
AscendingMSBitLittleEndian2818
(sin función)"CBA"111318
ReversedForMsbBigEndian1318
AscendingFirstBit
AscendingMSBit
BigEndian3418
AscendingLSBitBigEndian4918
(sin función)"ABC"331418

Señales booleanas​

Por último, en las señales booleanas es exclusivamente el sentido del recuento el que decide el bit seleccionado:

Decodificación de Boolean

addressSpecbyteOrderbitOffsetbitLength
ReversedForMsbBigEndian131
(todos los demás)BigEndian
LittleEndian
101
(sin función)"A"10151

Disposición de los bytes 'byteOrder'​

EnumAliasDescripción
BigEndianBig, MSB, Motorola, NetworkEl byte con el bit más significativo (MSBit) está al principio en el paquete de datos transmitido
LittleEndianLittle, LSB, IntelEl byte con el bit menos significativo (LSBit) está al principio en el paquete de datos transmitido
Secuencia de A-ZSi se utiliza una cadena de mapeo, los bytes de una disposición mezclada arbitrariamente pueden ponerse en el orden correcto.
addressSpec no tiene entonces función.

Uso de una cadena de mapeo​

Los bytes del búfer de recepción se indexan en orden ascendente comenzando con 'A' a partir de bitOffset / 8. El orden de los bytes en valor descendente lo establece la cadena. bitOffset MODULO 8 determina cuántos bits debe desplazarse hacia la derecha el valor extraído para que el bit menos significativo (LSBit) quede en la posición 202^0.

Con este mapeo libre pueden interpretarse, por lo general, todos los telegramas que han recorrido un largo camino desde un borne de medición, pasando por acopladores de bus, controladores, pasarelas, etc., y han sufrido en ese recorrido diversas reordenaciones e interpretaciones del orden de los bytes. Cada sistema ofrece sus propias posibilidades de ajuste y estas se utilizan ampliamente. Podría ser tan sencillo...

Ejemplo:

bytes: 0_______ 1_______ 2_______ 3_______ 4_______ 5_______ 6_______
bits: 76543210 76543210 76543210 76543210 76543210 76543210 76543210
bitOffset: --------------------->|
Indizierung: A B C D E ...

Extraktion für "CDBA"
value = ((((byte[4] << 8) // alias 'C' (bitOffset / 8) + 2
| byte[5] << 8) // alias 'D' (bitOffset / 8) + 3
| byte[3] << 8) // alias 'B' (bitOffset / 8) + 1
| byte[2]) // alias 'A' (bitOffset / 8) + 0
>> (bitOffset % 8);

Tipos de datos de origen 'imageType'​

EnumAliasDescripción
boolbooleanbitLength fija de 1 y dataType Bool.
unsignedEntero sin signo con bitLength 2..64.
Puede combinarse con scale y offset para obtener una magnitud física escalada.
antivalent, antivalent2=> unsigned con bitLength = 2, utilizado sobre todo en el contexto MVB para valores booleanos protegidos:
0: ERROR
1: FALSE
2: TRUE
3: UNDEFINED
signedEntero con signo con bitLength 2..64; el bit más significativo es el bit de signo.
Puede combinarse con scale y offset para obtener una magnitud física escalada.
bcdNúmeros decimales codificados en binario,
4 bits cada uno para representar un dígito 0..9
float16 bitLength fija de 32, IEEE 754
double16 bitLength fija de 64, IEEE 754
timedate48bitLength fija de 48,
EN 61375-2-1 §6.4.6.2 (TCN, WTB, MVB), véase Marcas de tiempo
time64bitLength fija de 64, RFC 1305, véase Marcas de tiempo
bytearrayOtras propiedades establecen cómo se calcula la longitud del array
stringOtras propiedades establecen cómo se calcula la longitud de la cadena
UniPolar<M>.<N>Número de coma fija sin signo con <M> bits enteros y una bitLength fija de <N> bits.
Puede combinarse con scale y offset para obtener una magnitud física escalada.
EN 61375-2-1 §6.4.3.7 (TCN, WTB, MVB)
BiPolar<M>.<N>Número de coma fija con signo con <M> bits enteros (incluido el signo) y una bitLength fija de <N> bits.
Puede combinarse con scale y offset para obtener una magnitud física escalada.
EN 61375-2-1 §6.4.3.8 (TCN, WTB, MVB)

Marcas de tiempo 'timedate48' y 'time64'​

Comportamiento modificado a partir de smartCORE 2.12

time64 se cuenta desde 1900, como establece la RFC 1305; antes, el valor se desviaba 70 años. Una marca de tiempo 0 se transmite como 0.

Ambos imageType se producen en nanosegundos desde el 01.01.1970 (UTC) como dataType int64. La conversión se realiza con números enteros; la fracción de segundo se redondea al nanosegundo más próximo.

imageTypeEstructuraInstante de referenciaválido hasta
timedate4832 bit de segundos (sin signo) + 16 bit de fracción en 2−162^{-16} s01.01.197007.02.2106
time6432 bit de segundos (sin signo) + 32 bit de fracción en 2−322^{-32} s01.01.1900véase timeFix

Una marca de tiempo cuyos bits son todos 0 se transmite como 0 y señala así una marca de tiempo ausente.

Desbordamiento de time64 en el año 2036 'timeFix'​

El contador de segundos de time64 se desborda el 07.02.2036 a las 06:28:16 UTC. timeFix establece a qué época se refiere un valor recibido:

timeFixProcedimiento
RFC4330 (predeterminado)RFC 4330 §3: si el bit más significativo de los segundos está activado, la hora está entre 1968 y 2036; en caso contrario, entre 2036 y 2104. Asignación fija sin relación con la hora del sistema.
RFC5905RFC 5905 §6: se aplica la época más próxima a la marca de tiempo de recepción. Requiere una hora del sistema correcta.

Si una marca de tiempo se desvía en más de 30 años de la marca de tiempo de recepción, esto se notifica una sola vez por canal en el archivo de registro con ambos instantes. La causa habitual es un equipo remoto que envía segundos desde 1970 en lugar de desde 1900.

Indicaciones para determinar la longitud de una cadena 'stringHint' y 'numElements'​

Comportamiento modificado a partir de smartCORE 2.12
  • Toda cadena termina en el primer carácter nulo, independientemente del stringHint.
  • bitOffset y bitLength de string y bytearray deben ser múltiplos de 8; addressSpec y byteOrder no tienen función para ellos.
  • Sin addressSpec (predeterminado EN61375_MVB), las cadenas se leen como ISO-8859-1. "stringEncoding": "UTF-8" restablece el comportamiento anterior.

Las cadenas y los campos de datos (imageType string y bytearray) están siempre byte a byte en el paquete de datos:

  • bitOffset y bitLength deben ser múltiplos de 8. En caso contrario, el canal se bloquea al iniciar con un mensaje en el archivo de registro.

  • bitOffset es la posición del byte × 8. addressSpec y byteOrder no tienen función; byteOrder solo determina el orden de los bytes de un campo de longitud (véase más abajo).

El área reservada para la cadena en el búfer de datos resulta de

  • la bitLength,

  • numElements × bitLength, si se indica numElements. bitLength es entonces la anchura de un carácter (predeterminado 8 bit, 16 bit en U8WLength a U32WLength y S7WLength), o

  • sin ninguna de las dos indicaciones, el resto del mensaje a partir de bitOffset.

Con independencia del stringHint, toda cadena termina en el primer carácter nulo (U+0000) tras la decodificación. Lo que haya a continuación en el área reservada se descarta. Si se necesitan todos los bytes, debe utilizarse el imageType bytearray.

EnumAliasDescripción
FixedLengthInBitsbitLength(Predeterminado) La cadena llena el área reservada.
NullTerminatedEquivalente a FixedLengthInBits, conservado por motivos de compatibilidad
FixedLengthnumElements define el número de caracteres de la cadena.
U8LengthUn uint8 antes del texto indica su longitud en bytes.
U16LengthUn uint16 antes del texto indica su longitud en bytes.
U32LengthUn uint32 antes del texto indica su longitud en bytes.
U8WLength5Un uint8 antes del texto indica su longitud en palabras (2 bytes, p. ej. UTF-16).
U16WLength5Un uint16 antes del texto indica su longitud en palabras.
U32WLength5Un uint32 antes del texto indica su longitud en palabras.
S7Length5SIMATIC STRING, véase más abajo
S7WLength5SIMATIC WSTRING, véase más abajo
EndOfMessageLa cadena llega siempre hasta el final del mensaje.

Cadenas con campo de longitud​

En U8Length a U32WLength hay, a partir de bitOffset, un campo de longitud antes del texto. La anchura reservada según bitLength o numElements se aplica al texto; el campo de longitud se suma a ella. Un campo de longitud de 2 o 4 bytes se lee en little endian con byteOrder LittleEndian y, en caso contrario, en big endian.

Si el campo de longitud indica más de lo que contienen el área reservada o el mensaje, el texto se trunca y esto se notifica una sola vez por canal en el archivo de registro. Si el campo de longitud falta en el mensaje, no se produce ningún valor.

Ejemplo U16Length, byteOrder BigEndian, bitOffset 0:

00 02 41 42 43 → "AB"

Cadenas SIMATIC 'S7Length' y 'S7WLength'​

Los controladores SIMATIC almacenan las cadenas con una cabecera formada por la longitud máxima declarada y la longitud actual. Ambas cuentan caracteres. Solo se leen los caracteres de la longitud actual; lo que haya a continuación en el área reservada carece de importancia.

stringHintTipo de datos SIMATICCabeceraCaracteresstringEncoding predeterminadoLongitud máxima
S7LengthSTRING[n]1 byte de longitud máxima, 1 byte de longitud actual1 bytewindows-1252254
S7WLengthWSTRING[n]2 bytes de longitud máxima, 2 bytes de longitud actual, big endian2 bytesUTF-16BE16382

numElements corresponde a la declaración n y es opcional; sin indicación se aplica el resto del mensaje. La cabecera de S7WLength es siempre big endian, con independencia de byteOrder.

Si la longitud actual es mayor que la longitud máxima, se trunca a la longitud máxima. Esto, así como una longitud máxima por encima del límite o distinta de numElements, se notifica una sola vez por canal en el archivo de registro; el valor se lee de todos modos.

Ejemplo STRING[10] := 'abcdef' con numElements 10:

0A 06 61 62 63 64 65 66 xx xx xx xx → "abcdef"

Codificación de caracteres 'stringEncoding'​

Internamente, smartCORE procesa todas las cadenas como Unicode. stringEncoding indica en qué codificación están los bytes en el paquete de datos. Sin indicación se aplica "windows-1252" para S7Length, "UTF-16BE" para S7WLength, "ISO-8859-1" (Latin-1) para addressSpec EN61375_MVB y, en caso contrario, "UTF-8".

Son válidos los nombres y alias del registro IANA "Character Sets". No se distingue entre mayúsculas y minúsculas. Los alias con prefijo cs (p. ej. csUTF8) no se admiten. Un nombre desconocido se notifica al iniciar en el archivo de registro y el canal se bloquea.

Codificaciones de uso frecuente y los bytes de algunos caracteres:

stringEncodingäÄ߀°µ²
UTF-8C3 A4C3 84C3 9FE2 82 ACC2 B0C2 B5C2 B2
ISO-8859-1 (Latin-1)E4C4DF–B0B5B2
ISO-8859-15 (Latin-9)E4C4DFA4B0B5B2
windows-1252E4C4DF80B0B5B2
IBM437 (cp437)848EE1–F8E6FD
UTF-16BE (MVB UNICODE16)00 E400 C400 DF20 AC00 B000 B500 B2
US-ASCII–––––––

US-ASCII solo conoce los bytes 00 a 7F. Un carácter que no existe en la codificación, o una secuencia de bytes no válida, aparece en el canal como carácter de sustitución „�“ (U+FFFD).

Cada mensaje se decodifica por separado. Una secuencia de bytes truncada al final del área de datos no se une con el siguiente mensaje, sino que también se emite como „�“.

Imágenes de error habituales con un ajuste incorrecto:

Visualización en el canalCausa
ä en lugar de äLos datos son UTF-8; está configurado ISO-8859-1 o windows-1252.
� en lugar de äLos datos son ISO-8859-1 o windows-1252; está configurado UTF-8.
„ en lugar de äLos datos son IBM437; está configurado windows-1252.

Indicaciones para determinar la longitud de un campo de datos 'numElements'​

La alineación en bytes de bitOffset y bitLength (véase más arriba) se aplica también a los campos de datos.

aviso

imageType: ByteArray
¡La función para decodificar campos de datos aún no está verificada. Utilizar únicamente previa consulta!

Tipos de datos de canal (tipos de datos de destino) 'dataType'​

El dataType se determina siempre automáticamente a partir del imageType cuando no se especifica. Con ello se establece un formato de destino con el que se evita la pérdida de información con el menor consumo de memoria posible.

EnumAliasRango de valoresAplicación
Booleanboolfalse/trueSeñales de estado/control
Floathasta 3.40⋅10383.40\cdot10^{38}Datos de medición
Doublehasta 1.80⋅103081.80\cdot10^{308}
Integer8int8−27…27−1-2^{7}\dots2^{7}-1
Integer16int16−215…215−1-2^{15}\dots2^{15}-1
Integer32int32−231…231−1-2^{31}\dots2^{31}-1
Integer64int64−263…263−1-2^{63}\dots2^{63}-1Marcas de tiempo
UnsignedInteger8uint80…28−10\dots2^{8}-1Códigos de estado
UnsignedInteger16uint160…216−10\dots2^{16}-1
UnsignedInteger32uint320…232−10\dots2^{32}-1
UnsignedInteger64uint640…264−10\dots2^{64}-1
ByteArray
StringTexto

Tipos de datos forzados:​

Si la bitLength == 1 o el imageType == bool, el dataType es también siempre automáticamente bool.

Para imageType == string o bytearray, el dataType es también siempre string o bytearray.

Los imageType time64 o timedate48 fuerzan con int64 el dataType, para poder convertir las marcas de tiempo de forma correcta y completa en nanosegundos desde el 01.01.1970.

Indicar numElements > 1 fuerza el dataType ByteArray, siempre que no se haya ajustado un imageType String.

Un imageType numérico no puede llenar un dataType String, ByteArray o GpsLocation; un canal de este tipo se desactiva al iniciar con un mensaje que nombra ambos tipos.5

Tipos de datos automáticos:​

En ello, los formatos de coma flotante float y double tienen prioridad cuando se cumple uno de los siguientes criterios:

  • la fuente de datos suministra ya, mediante el imagetype (float, double, unipolar, bipolar), un valor de coma flotante o de coma fija,
  • scale≠1.0\text{scale} \neq 1.0 o offset≠0.0\text{offset} \neq 0.0,
  • se ha especificado una physicalUnit.

Si la bitLength≤24\text{bitLength} \leq 24, basta un float para una conversión sin pérdidas.

Los formatos enteros se seleccionan igualmente, mediante la bitLength y la presencia de un signo (signed) en el imageType, para el menor rango de datos posible:

  • (Unsigned)Integer8 para bitLength≤8\text{bitLength} \leq 8
  • (Unsigned)Integer16 para bitLength≤16\text{bitLength} \leq 16
  • (Unsigned)Integer32 para bitLength≤32\text{bitLength} \leq 32
  • (Unsigned)Integer64 para bitLength≤64\text{bitLength} \leq 64

El signo opcional se extiende desde el bit más significativo de la imagen hasta la anchura del dataType.

Tipos de datos manuales y conversión:​

aviso

La selección manual del dataType puede provocar una pérdida de precisión o de resolución, o una restricción significativa del rango de valores disponible, ¡por lo que por regla general debe evitarse!

Si la fuente de datos suministra un número de coma flotante según las reglas mencionadas anteriormente, para la conversión a un dataType entero se redondea: a partir de .50 al siguiente valor entero mayor.

En cualquier caso se tienen en cuenta los rangos de valores de los tipos enteros elegidos. Si el valor de la imagen queda fuera del rango disponible, se sustituye por el mínimo o el máximo representable y se emite un mensaje en el archivo de registro.

Filtro de reducción de datos​

Para cada canal se configura un filtro de reducción de datos. En el ajuste básico, este se encarga de que los nuevos registros de datos solo se escriban en el canal cuando cambia el contenido de los datos (OnChange). La marca de tiempo de recepción de los datos, en cambio, se sigue actualizando con cada registro procesado, de modo que se permite el procesamiento de los datos (constantes) en otros plugins hasta el instante más reciente.

Con la opción absoluteTolerance se coloca una banda de tolerancia alrededor del último valor escrito. Un nuevo registro de datos solo se publica cuando la diferencia con el último valor escrito se desvía en más que esta banda de tolerancia. Este ajuste es útil para señales con mucho ruido, con el fin de reducir significativamente la cantidad de datos.

Si la opción noFilter se establece en true, no se crea ningún filtro de reducción de datos. Este ajuste es útil para datos rápidos que no deben reducirse porque, por ejemplo, para señales de vibración sigue un análisis en el dominio de la frecuencia.

Información del módulo​

InformaciónValor
AutoresoptiMEAS GmbH
desde smartCORE0.103
Tipo de móduloFast Message Receiver, Producer
DependenciasMódulo de envío Fast Message (p. ej. fmudp, canbus, smartmvb, rawplayback, ...)

Footnotes​

  1. La indicación del bufferSize determina cuántas muestras se mantienen disponibles en el canal de smartCORE para su uso por otros módulos. Debe elegirse de modo que se puedan almacenar en búfer aprox. 5 .. 10 segundos. Las lagunas periódicas de datos en los datos OSF indican un bufferSize demasiado pequeño. ↩ ↩2

  2. Si el "messageKey" no está configurado, se siguen procesando los datos de todos los mensajes (esto es útil, p. ej., para CAN RAW y aplicaciones de depuración). ↩

  3. Si la "bitLength" no está configurada, se determina a partir del imageType. Para los imageType string y bytearray, el valor llega entonces hasta el final del mensaje. ↩

  4. Solo para el imageType string; sin función en otros imageType. ↩ ↩2

  5. Disponible a partir de smartCORE 2.12. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8

  6. "windows-1252" para S7Length, "UTF-16BE" para S7WLength, "ISO-8859-1" para addressSpec EN61375_MVB, en caso contrario "UTF-8". ↩

  7. Solo para el imageType time64; sin función en otros imageType. ↩

  8. Indicar scale != 1 o offset != 0 con un imageType numérico da lugar a una salida con dataType float o double. ↩ ↩2

  9. Por regla general, debe omitirse la indicación del tipo de datos, ya que entonces se determina de forma optimizada a partir del imageType y de la bitLength. Para algunas combinaciones, el módulo fija obligatoriamente el tipo de datos. ↩

  10. Indicar una cacheSize reduce la carga de CPU en fuentes de datos muy rápidas (>100Hz> 100 Hz), ya que los nuevos registros de datos se almacenan primero temporalmente en una caché y solo se publican para otros módulos cuando la caché está completamente llena. La indicación debe elegirse de modo que la publicación se realice con una frecuencia de 55 a 20Hz20 Hz. ↩

  11. Se aplica explícitamente solo al byteOrder bigEndian. Para el byteOrder littleEndian se cuenta con el esquema AscendingFirstBit. ↩

  12. Aunque en la EN la longitud de un tipo de datos# con (# = any unsigned integer) se deja abierta en algunos puntos, todas las explicaciones explícitas se indican siempre en potencias enteras de 2 (ENUM4, ENUM8, INTEGER8, INTEGER16, ...). No hay ninguna indicación sobre cómo proceder con longitudes de bit fuera de esta trama en relación con la alineación. ↩

  13. byte 1 * 8 + rightShift 3 = 11 ↩

  14. byte 4 * 8 + rightShift 1 = 33 ↩

  15. byte 1 * 8 + rightShift 2 = 10 ↩

  16. Si la fuente de datos suministra un valor NAN o INF, este explícitamente no se produce en el canal de smartCORE. ↩ ↩2