Modulo Fast Message Producer "fmproducer"
Descrizione
Quasi tutte le fonti di dati nella tecnica di processo trasmettono i dati in campi di dati compattati di byte. Il contenuto ed eventualmente anche la lunghezza di questi pacchetti sono identificabili tramite un messageKey (o anche "ID"). Nella tabella seguente sono riportati alcuni esempi.
| Protocollo | Message Key | Lunghezza della chiave |
|---|---|---|
| CAN-Bus | CAN-ID | 11 o 29 bit |
| MVB-Bus | Numero di porta | 12 bit |
| ProfiBus | Slave-Node ID | 7 bit |
| Modbus | Register, Coil, Input, Status | 2 + 16-bit |
Diversi plug-in smartCORE (ad es. fmudp, canbus, smartmvb) realizzano il collegamento dell'hardware tramite interfacce dedicate, ricevono o inviano pacchetti di dati e con i pacchetti ricevuti alimentano il cosiddetto Fast Message Dispatcher (FMD). Questo mette a disposizione in smartCORE una tecnologia efficiente per estrarre, da fonti di dati qualsiasi e secondo uno schema sempre ricorrente, dati di misura e informazioni di stato e produrli in singoli canali smartCORE (da cui il nome "fm Producer").
I moduli di interfaccia creano almeno un'istanza di un FMD con il proprio nome. Questo viene collegato nell'fmProducer tramite la proprietà fmd.
Nei pacchetti ricevuti sono contenuti, oltre al MessageID e a un timestamp, i dati in un campo di dati composto da byte. Per un canale, i dati si trovano al suo interno a partire da un determinato bitOffset con una bitLength definita. Hanno inoltre rilevanza la disposizione dei byte byteOrder nel buffer e (purtroppo) la addressSpec(ification), con cui viene stabilito come vengono contati i bit nel buffer.
Dopo che i byte dei dati grezzi sono stati portati nell'ordine corretto e il valore è stato correttamente spostato e mascherato, avviene l'interpretazione tramite l'imageType. Il numero ha il segno oppure no? Il numero va letto come BCD (Binary Coded Decimal) o come valore polare (virgola fissa)? Intero, virgola mobile o addirittura testo?
Dopo una scalatura opzionale a una grandezza di misura fisica (scale, offset, physicalUnit) secondo
avviene la produzione del valore dei dati nel canale smartCORE con il timestamp (di ricezione) trasmesso anch'esso dal modulo di interfaccia.
Interfacce e protocolli utilizzati
- Fast Message Dispatching
Configurazione JSON
Nella sezione seguente viene descritta l'intera configurazione JSON del modulo e vengono illustrati i singoli parametri.
Configurazione di esempio (minima)
{
"module":"FmProducer",
"factory":"fmproducer",
"config":{
"fmd":"FastMessageDispatcher",
"channels":[
{
"name":"Channel",
"messageKey":42,
"bitOffset":0,
"bitLength":32,
"imageType":"float"
},
[...]
]
}
}
Configurazione di esempio (massima)
{
"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
},
[...]
]
}
}
Parametri globali del modulo
| Nome del parametro | Obbligatorio | Tipo di dati | Intervallo di valori sensato | Default | Descrizione |
|---|---|---|---|---|---|
| fmd | SÌ | STRING | Fast Message Dispatcher del modulo di invio | ||
| bufferSize | No1 | INT | 1 - | 1024 | (default) Dimensione del buffer dei canali creati |
| channelPrefix | No | STRING | Prefisso del canale (opportuno se vengono utilizzati più moduli fmproducer e le configurazioni hanno nomi di canale sovrapposti) | ||
| namespace | No | ARRAY [STRING] | Prefisso del canale sotto forma di namespace concatenati gerarchicamente | ||
| addressSpec | No | STRING | "EN61375_MVB" | Schema di indirizzamento predefinito | |
| byteOrder | No | STRING | "BigEndian" | Ordine dei byte predefinito | |
| channels | SÌ | JSON Array | Elenco di JSON Object dei canali configurati |
Configurazione di un canale (JSON Object)
| Nome del parametro | Obbligatorio | Tipo di dati | Intervallo di valori sensato | Default | Descrizione |
|---|---|---|---|---|---|
| Filter | |||||
| messageKey | No2 | UINT | ID del messaggio ricevuto (ad es. Message ID del CAN-Bus, porta MVB, ...) | ||
| Process Image | |||||
| addressSpec | No | STRING | (valore dall'impostazione globale) | Schema di indirizzamento, vedere la descrizione seguente | |
| byteOrder | No | STRING | "BigEndian", "LittleEndian", "[A-Z]+" | (valore dall'impostazione globale) | Ordine dei byte del valore memorizzato, vedere la descrizione seguente |
| imageType | SÌ | STRING | tipo di dati di origine supportato del valore memorizzato (vedere sotto) | ||
| bitOffset | SÌ | UINT | Offset in bit del valore memorizzato nel messaggio | ||
| bitLength | No3 | UINT | Lunghezza in bit del valore memorizzato nel messaggio | ||
| stringHint | No4 | STRING | Indicazione per la determinazione della lunghezza della stringa (vedere sotto) | ||
| scale | No5 | FLOAT | 1 | Fattore di scalatura del valore prodotto | |
| offset | No5 | FLOAT | 0 | offset additivo del valore prodotto | |
| smartCORE | |||||
| name | SÌ | STRING | Nome del canale | ||
| dataType | No6 | STRING | Tipo di dati del canale | ||
| bufferSize | No1 | INT | 1 - | 1024 | Dimensione del buffer del canale creato |
| physicalDimension | No | STRING | grandezza fisica | ||
| physicalUnit | No | STRING | unità fisica | ||
| noFilter | No | BOOL | false | Disattiva il filtro DataReduction | |
| absoluteTolerance | No | FLOAT | 0.0 | Tolleranza assoluta per il filtro DataReduction | |
| cacheSize | No7 | INT | 0 | Numero di campioni di dati che vengono memorizzati in una cache locale del canale prima di essere pubblicati per altri moduli. | |
| Riservato | |||||
| debug | No | BOOL | false | Abilita le uscite di debug per il canale. | |
| numElements | No | INT | 1 | Lunghezza di un campo di dati in multipli dell'elemento di base |
Specifiche di indirizzo 'addressSpec'
Perché deve essere stabilito uno schema di indirizzamento?
L'fmproducer scompone il pacchetto di dati ricevuto da un dispositivo esterno. La specifica di questo dispositivo e dell'interfaccia utilizzata stabilisce come localizzare i singoli canali di dati nel flusso di dati. Esistono purtroppo molte varianti, perché, nonostante la standardizzazione, in determinati ambiti esistono ancora numerose implementazioni proprietarie.
La specifica di indirizzo addressSpec stabilisce con quale modalità di conteggio il MSBit o il LSBit sono indicati nel bitOffset. Per motivi storici (l'fmProducer è stato sviluppato dapprima per l'MVB) l'impostazione EN61375_MVB è anche l'impostazione predefinita.
Valori impostabili
Se non diversamente indicato, viene indirizzata la posizione del primo bit (Msb/Lsb a seconda del byteOrder). L'indicazione della addressSpec non ha alcuna funzione se come byteOrder viene selezionato un mapping libero.
| Enum | Alias | Descrizione |
|---|---|---|
| EN61375_MVB | MVB EN61375 RevNum ReversedNum ReversedForMsbNumerics | Segue rigorosamente la EN61375 per quanto riguarda ByteOrder, tipi di dati, allineamento e conteggio dei bit. - Il bitOffset è byteOffset * 8 + rightShift - Le configurazioni non conformi vengono rifiutate. |
| ReversedForMsb | Rev Reversed | 8 Per tutti i segnali i bit vengono contati in ordine inverso (Motorola). |
| AscendingFirstBit | DBC | Per tutti i segnali i bit vengono contati con significato crescente. |
| AscendingLSBit | positionLsb | Per tutti i segnali i bit vengono contati con significato crescente. Viene sempre indirizzata la posizione del LSBit. |
| AscendingMSBit | positionMsb | Per tutti i segnali i bit vengono contati con significato crescente. Viene sempre indirizzata la posizione del MSBit. |
Definizione della posizione dell'immagine per EN61375_MVB
Nella norma EN 61375-2-1, a partire dal §6.4.2, sono presenti diverse indicazioni su come devono essere trasmessi i dati sull'MVB. Determinati casi sono esclusi a priori. I canali con una configurazione non conforme vengono segnalati dall'fmproducer, a partire da smartCORE 2.10.1, come errore nel file di log e bloccati per l'elaborazione.
-
(ipotesi e zona grigia)9 La norma non definisce tipi di dati che non abbiano una lunghezza pari a una potenza di 2 esatta.
-
Il bitOffset non si riferisce quindi in modo coerente al MSBit o al LSBit di una variabile, ma o al primo byte (intero) oppure al LSbit in un byte per
-
La rappresentazione è sempre BigEndian. Le disposizioni LittleEndian sono pertanto escluse.
-
La posizione dell'immagine deve essere sempre allineata a un multiplo della sua dimensione nel buffer dei dati. I tipi di dati con lunghezza di 1, 2 o 4 bit possono quindi trovarsi esclusivamente all'interno di un byte. Tutti gli altri con lunghezza di 8, 16, 32, 64 bit devono essere obbligatoriamente allineati a un byte. Uno spostamento dell'immagine non è ammesso! => a partire da .
Se una decodifica con questo schema EN61375_MVB non è possibile, per un singolo canale può comunque essere scelto uno degli altri schemi e si può quindi provare anche uno spostamento e un riallineamento dei bit e dei byte.
Conteggio della posizione dei bit
La distinzione più importante per tutti gli altri schemi è anzitutto l'ordine in cui vengono contati i bit.
Con le impostazioni Ascending* i bit vengono contati secondo il significato crescente. Ciò è tipico delle configurazioni CANbus o Profibus e corrisponde anche alle implementazioni nei linguaggi di programmazione.
Con l'impostazione ReversedForMsb i bit nel byteOrder BigEndian (Motorola, MSB, Network) vengono contati rigorosamente da sinistra a destra. Ciò corrisponde alla modalità di conteggio a livello fisico nei protocolli di trasmissione dati seriali, come ad es. CANbus, SPI o anche MVB.
La grafica mostra le diverse modalità di conteggio per 3 byte a titolo di esempio.
Definizione del bit di ancoraggio per la posizione dell'immagine
Nelle impostazioni Ascending* si distingue quale bit del valore dei dati viene indirizzato con il bitOffset. Di solito è il primo bit (AscendingFirstBit), quindi con byteOrder bigEndian il MSBit e con littleEndian il LSBit. Esistono tuttavia anche eccezioni in cui, indipendentemente dal byteOrder, viene sempre indirizzato il MSBit o il LSBit.
Nel diagramma seguente, da un telegramma di dati con conteggio Ascending* vengono estratti due valori interi a 18 bit, trasmessi una volta con byteOrder littleEndian e una volta con bigEndian.
E questo diagramma integra un valore intero a 18 bit con conteggio ReversedForMsb:
La tabella riporta possibili varianti di indirizzamento per i valori int18 mostrati sopra.
| addressSpec | byteOrder | bitOffset | bitLength |
|---|---|---|---|
| ReversedForMsb AscendingFirstBit AscendingLSBit | LittleEndian | 11 | 18 |
| AscendingMSBit | LittleEndian | 28 | 18 |
| (senza funzione) | "CBA" | 1110 | 18 |
| ReversedForMsb | BigEndian | 13 | 18 |
| AscendingFirstBit AscendingMSBit | BigEndian | 34 | 18 |
| AscendingLSBit | BigEndian | 49 | 18 |
| (senza funzione) | "ABC" | 3311 | 18 |
Segnali booleani
Non da ultimo, nei segnali booleani il bit selezionato è determinato esclusivamente dal verso di conteggio:
| addressSpec | byteOrder | bitOffset | bitLength |
|---|---|---|---|
| ReversedForMsb | BigEndian | 13 | 1 |
| (tutti gli altri) | BigEndian LittleEndian | 10 | 1 |
| (senza funzione) | "A" | 1012 | 1 |
Disposizione dei byte 'byteOrder'
| Enum | Alias | Descrizione |
|---|---|---|
| BigEndian | Big, MSB, Motorola, Network | Il byte con il bit più significativo (MSBit) si trova all'inizio del pacchetto di dati trasmesso |
| LittleEndian | Little, LSB, Intel | Il byte con il bit meno significativo (LSBit) si trova all'inizio del pacchetto di dati trasmesso |
| Sequenza A-Z | Se viene utilizzata una stringa di mapping, i byte possono essere portati nell'ordine corretto a partire da una disposizione mista arbitraria. addressSpec è quindi senza funzione. |
Utilizzo di una stringa di mapping
I byte nel buffer di ricezione vengono indicizzati in ordine crescente a partire da bitOffset / 8, iniziando con 'A'. L'ordine dei byte in significato decrescente è stabilito dalla stringa. bitOffset MODULO 8 determina di quanti bit il valore estratto deve essere spostato verso destra, affinché il bit meno significativo (LSBit) si trovi alla posizione .
Con questo mapping libero è in genere possibile interpretare tutti i telegrammi che hanno percorso una lunga strada da un morsetto di misura, attraverso accoppiatori di bus, controllori, gateway, ecc., subendo diversi riordinamenti e interpretazioni dell'ordine dei byte. Ogni sistema offre proprie possibilità di impostazione e queste vengono anche ampiamente utilizzate. Potrebbe essere così semplice...
Esempio:
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);
Tipi di dati di origine 'imageType'
| Enum | Alias | Descrizione |
|---|---|---|
| bool | boolean | bitLength fissa di 1 e dataType Bool. |
| unsigned | Intero senza segno con bitLength 2..64. Può essere combinato con scale e offset in una grandezza fisica scalata. | |
| antivalent, antivalent2 | => unsigned con bitLength = 2, usato per lo più nel contesto MVB per valori booleani protetti: 0: ERROR 1: FALSE 2: TRUE 3: UNDEFINED | |
| signed | Intero con segno con bitLength 2..64, il bit più significativo è il bit di segno. Può essere combinato con scale e offset in una grandezza fisica scalata. | |
| bcd | Numeri decimali codificati in binario, ciascuno con 4 bit per la rappresentazione di una cifra 0..9 | |
| float | 13 bitLength fissa di 32, IEEE 754 | |
| double | 13 bitLength fissa di 64, IEEE 754 | |
| timedate48 | bitLength fissa di 48, EN 61375-2-1 §6.4.6.2 (TCN, WTB, MVB) | |
| time64 | bitLength fissa di 64, RFC 1305 | |
| bytearray | Ulteriori proprietà stabiliscono come viene calcolata la lunghezza dell'array | |
| string | Ulteriori proprietà stabiliscono come viene calcolata la lunghezza della stringa | |
UniPolar<M>.<N> | Numero a virgola fissa senza segno con <M> bit interi e una bitLength fissa di <N> bit.Può essere combinato con scale e offset in una grandezza fisica scalata. EN 61375-2-1 §6.4.3.7 (TCN, WTB, MVB) | |
BiPolar<M>.<N> | Numero a virgola fissa con segno con <M> bit interi (segno incluso) e una bitLength fissa di <N> bit.Può essere combinato con scale e offset in una grandezza fisica scalata. EN 61375-2-1 §6.4.3.8 (TCN, WTB, MVB) |
Indicazioni per la determinazione della lunghezza di una stringa 'stringHint' e 'numElements'
imageType: String
La funzione di decodifica delle stringhe non è ancora verificata. Utilizzare solo previo accordo!
L'area riservata alla stringa nel buffer dei dati risulta da
-
la bitLength in multipli interi di 8 oppure
-
l'indicazione di numElements come numero di caratteri.
| Enum | Alias | Descrizione |
|---|---|---|
| FixedLengthInBits | bitLength | bitLength / 8 definisce il numero fisso di caratteri nella stringa |
| NullTerminated | Il primo carattere nullo (0x00) o la fine dell'area dei dati determinano la fine della stringa | |
| FixedLength | numElements definisce il numero fisso di caratteri nella stringa | |
| U8Length | La stringa inizia con un uint8 che indica dinamicamente la lunghezza della stringa. | |
| U16Length | La stringa inizia con un uint16 che indica dinamicamente la lunghezza della stringa. | |
| U32Length | La stringa inizia con un uint32 che indica dinamicamente la lunghezza della stringa. | |
| EndOfMessage | L'area dei dati disponibile viene sempre estesa fino alla fine del buffer dei dati. |
Indicazioni per la determinazione della lunghezza di un campo di dati 'numElements'
imageType: ByteArray
La funzione di decodifica dei campi di dati non è ancora verificata. Utilizzare solo previo accordo!
Tipi di dati dei canali (tipi di dati di destinazione) 'dataType'
Il dataType viene sempre determinato automaticamente dall'imageType, se non viene specificato. In tal caso viene impostato un formato di destinazione con cui si evita una perdita di informazioni con il minor fabbisogno di memoria possibile.
| Enum | Alias | Intervallo di valori | Applicazione |
|---|---|---|---|
| Boolean | bool | false/true | Segnali di stato/controllo |
| Float | fino a | Dati di misura | |
| Double | fino a | ||
| Integer8 | int8 | ||
| Integer16 | int16 | ||
| Integer32 | int32 | ||
| Integer64 | int64 | Timestamp | |
| UnsignedInteger8 | uint8 | Codici di stato | |
| UnsignedInteger16 | uint16 | ||
| UnsignedInteger32 | uint32 | ||
| UnsignedInteger64 | uint64 | ||
| ByteArray | |||
| String | Testo |
Tipi di dati imposti:
Se la bitLength == 1 o l'imageType == bool, anche il dataType è sempre automaticamente bool.
Per imageType == string o bytearray anche il dataType è sempre string o bytearray.
Gli imageType time64 o timedate48 impongono con int64 il dataType, per poter convertire i timestamp in modo corretto e completo in nanosecondi dal 01.01.1970.
Un'indicazione di numElements > 1 impone il dataType ByteArray, a meno che non sia impostato un imageType String.
Tipi di dati automatici:
In tal caso i formati a virgola mobile float e double hanno la precedenza, se è soddisfatto uno dei seguenti criteri:
- la fonte di dati fornisce già, tramite l'imagetype (float, double, unipolar, bipolar), un valore a virgola mobile o fissa,
- oppure ,
- è specificata una physicalUnit.
Se , un float è sufficiente per una conversione senza perdite.
Anche i formati interi vengono selezionati, in base alla bitLength e alla presenza di un segno (signed) nell'imageType, per il più piccolo intervallo di dati possibile:
- (Unsigned)Integer8 per
- (Unsigned)Integer16 per
- (Unsigned)Integer32 per
- (Unsigned)Integer64 per
Il segno opzionale viene esteso dal bit più significativo dell'immagine fino alla larghezza del dataType.
Tipi di dati manuali e conversione:
La selezione manuale del dataType può comportare una perdita di precisione, di risoluzione o una limitazione significativa dell'intervallo di valori disponibile e deve quindi di norma essere evitata!
Se la fonte di dati fornisce un numero a virgola mobile secondo le regole citate in precedenza, per la conversione in un dataType intero si arrotonda: a partire da .50 al valore intero immediatamente superiore.
In ogni caso vengono considerati gli intervalli di valori dei tipi interi scelti. Se il valore dell'immagine si trova al di fuori dell'intervallo disponibile, viene sostituito con il minimo o il massimo rappresentabile e viene emesso un messaggio nel file di log.
Filtro di riduzione dei dati
Per ogni canale viene configurato un filtro di riduzione dei dati. Nell'impostazione di base esso fa in modo che i nuovi record di dati vengano scritti nel canale solo se il contenuto dei dati cambia (OnChange). Il timestamp di ricezione dei dati viene invece aggiornato a ogni record elaborato, in modo che sia possibile elaborare i dati (costanti) in altri plug-in fino all'istante più recente.
Con l'opzione absoluteTolerance viene posta una banda di tolleranza attorno all'ultimo valore scritto. Un nuovo record di dati viene pubblicato solo quando la differenza rispetto all'ultimo valore scritto si discosta di oltre questa banda di tolleranza. Questa impostazione è utile per segnali fortemente rumorosi, per ridurre in modo significativo la quantità di dati.
Se l'opzione noFilter viene impostata su true, non viene creato alcun filtro di riduzione dei dati. Questa impostazione è opportuna per dati veloci che non devono essere ridotti, perché ad es. per i segnali di vibrazione segue un'analisi nel dominio della frequenza.
Informazioni sul modulo
| Informazione | Valore |
|---|---|
| Autori | optiMEAS GmbH |
| da smartCORE | 0.103 |
| Tipo di modulo | Fast Message Receiver, Producer |
| Dipendenze | Modulo di invio Fast Message (ad es. fmudp, canbus, smartmvb, rawplayback, ...) |