Passa al contenuto principale

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.

ProtocolloMessage KeyLunghezza della chiave
CAN-BusCAN-ID11 o 29 bit
MVB-BusNumero di porta12 bit
ProfiBusSlave-Node ID7 bit
ModbusRegister, Coil, Input, Status2 + 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.

fm Producer

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

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

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 parametroObbligatorioTipo di datiIntervallo di valori sensatoDefaultDescrizione
fmdSÌSTRINGFast Message Dispatcher del modulo di invio
bufferSizeNo1INT1 -1024(default) Dimensione del buffer dei canali creati
channelPrefixNoSTRINGPrefisso del canale (opportuno se vengono utilizzati più moduli fmproducer e le configurazioni hanno nomi di canale sovrapposti)
namespaceNoARRAY [STRING]Prefisso del canale sotto forma di namespace concatenati gerarchicamente
addressSpecNoSTRING"EN61375_MVB"Schema di indirizzamento predefinito
byteOrderNoSTRING"BigEndian"Ordine dei byte predefinito
channelsSÌJSON ArrayElenco di JSON Object dei canali configurati

Configurazione di un canale (JSON Object)​

Nome del parametroObbligatorioTipo di datiIntervallo di valori sensatoDefaultDescrizione
Filter
messageKeyNo2UINTID del messaggio ricevuto (ad es. Message ID del CAN-Bus, porta MVB, ...)
Process Image
addressSpecNoSTRING(valore dall'impostazione globale)Schema di indirizzamento, vedere la descrizione seguente
byteOrderNoSTRING"BigEndian", "LittleEndian",
"[A-Z]+"
(valore dall'impostazione globale)Ordine dei byte del valore memorizzato, vedere la descrizione seguente
imageTypeSÌSTRINGtipo di dati di origine supportato del valore memorizzato (vedere sotto)
bitOffsetSÌUINTOffset in bit del valore memorizzato nel messaggio
bitLengthNo3UINTLunghezza in bit del valore memorizzato nel messaggio
stringHintNo4STRINGIndicazione per la determinazione della lunghezza della stringa (vedere sotto)
scaleNo5FLOAT1Fattore di scalatura del valore prodotto
offsetNo5FLOAT0offset additivo del valore prodotto
smartCORE
nameSÌSTRINGNome del canale
dataTypeNo6STRINGTipo di dati del canale
bufferSizeNo1INT1 -1024Dimensione del buffer del canale creato
physicalDimensionNoSTRINGgrandezza fisica
physicalUnitNoSTRINGunità fisica
noFilterNoBOOLfalseDisattiva il filtro DataReduction
absoluteToleranceNoFLOAT0.0Tolleranza assoluta per il filtro DataReduction
cacheSizeNo7INT0Numero di campioni di dati che vengono memorizzati in una cache locale del canale prima di essere pubblicati per altri moduli.
Riservato
debugNoBOOLfalseAbilita le uscite di debug per il canale.
numElementsNoINT1Lunghezza 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.

EnumAliasDescrizione
EN61375_MVBMVB
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.
ReversedForMsbRev
Reversed
8 Per tutti i segnali i bit vengono contati in ordine inverso (Motorola).
AscendingFirstBitDBCPer tutti i segnali i bit vengono contati con significato crescente.
AscendingLSBitpositionLsbPer tutti i segnali i bit vengono contati con significato crescente.
Viene sempre indirizzata la posizione del LSBit.
AscendingMSBitpositionMsbPer 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.

  • bitLength=2kbitLength = 2^k (ipotesi e zona grigia)9 La norma non definisce tipi di dati che non abbiano una lunghezza pari a una potenza di 2 esatta.

  • bitOffset=byteOffset⋅8+rightShiftbitOffset=byteOffset \cdot 8 + rightShift 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 bitLength<8bitLength < 8

  • 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! => rightShift:=0rightShift := 0 a partire da bitLength>=8bitLength >= 8.

suggerimento

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.

Modalità di conteggio dei bit

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.

Decodifica del valore numerico Ascending

E questo diagramma integra un valore intero a 18 bit con conteggio ReversedForMsb:

Decodifica del valore numerico Reversed

La tabella riporta possibili varianti di indirizzamento per i valori int18 mostrati sopra.

addressSpecbyteOrderbitOffsetbitLength
ReversedForMsb
AscendingFirstBit
AscendingLSBit
LittleEndian1118
AscendingMSBitLittleEndian2818
(senza funzione)"CBA"111018
ReversedForMsbBigEndian1318
AscendingFirstBit
AscendingMSBit
BigEndian3418
AscendingLSBitBigEndian4918
(senza funzione)"ABC"331118

Segnali booleani​

Non da ultimo, nei segnali booleani il bit selezionato è determinato esclusivamente dal verso di conteggio:

Decodifica Boolean

addressSpecbyteOrderbitOffsetbitLength
ReversedForMsbBigEndian131
(tutti gli altri)BigEndian
LittleEndian
101
(senza funzione)"A"10121

Disposizione dei byte 'byteOrder'​

EnumAliasDescrizione
BigEndianBig, MSB, Motorola, NetworkIl byte con il bit più significativo (MSBit) si trova all'inizio del pacchetto di dati trasmesso
LittleEndianLittle, LSB, IntelIl byte con il bit meno significativo (LSBit) si trova all'inizio del pacchetto di dati trasmesso
Sequenza A-ZSe 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 202^0.

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'​

EnumAliasDescrizione
boolbooleanbitLength fissa di 1 e dataType Bool.
unsignedIntero 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
signedIntero 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.
bcdNumeri decimali codificati in binario,
ciascuno con 4 bit per la rappresentazione di una cifra 0..9
float13 bitLength fissa di 32, IEEE 754
double13 bitLength fissa di 64, IEEE 754
timedate48bitLength fissa di 48,
EN 61375-2-1 §6.4.6.2 (TCN, WTB, MVB)
time64bitLength fissa di 64, RFC 1305
bytearrayUlteriori proprietà stabiliscono come viene calcolata la lunghezza dell'array
stringUlteriori 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'​

warning

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.

EnumAliasDescrizione
FixedLengthInBitsbitLengthbitLength / 8 definisce il numero fisso di caratteri nella stringa
NullTerminatedIl primo carattere nullo (0x00) o la fine dell'area dei dati determinano la fine della stringa
FixedLengthnumElements definisce il numero fisso di caratteri nella stringa
U8LengthLa stringa inizia con un uint8 che indica dinamicamente la lunghezza della stringa.
U16LengthLa stringa inizia con un uint16 che indica dinamicamente la lunghezza della stringa.
U32LengthLa stringa inizia con un uint32 che indica dinamicamente la lunghezza della stringa.
EndOfMessageL'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'​

warning

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.

EnumAliasIntervallo di valoriApplicazione
Booleanboolfalse/trueSegnali di stato/controllo
Floatfino a 3.40⋅10383.40\cdot10^{38}Dati di misura
Doublefino a 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}-1Timestamp
UnsignedInteger8uint80…28−10\dots2^{8}-1Codici di stato
UnsignedInteger16uint160…216−10\dots2^{16}-1
UnsignedInteger32uint320…232−10\dots2^{32}-1
UnsignedInteger64uint640…264−10\dots2^{64}-1
ByteArray
StringTesto

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,
  • scale≠1.0scale \neq 1.0 oppure offset≠0.0offset \neq 0.0,
  • è specificata una physicalUnit.

Se bitLength<=24bitLength <= 24, 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 bitLength<=8bitLength <= 8
  • (Unsigned)Integer16 per bitLength<=16bitLength <= 16
  • (Unsigned)Integer32 per bitLength<=32bitLength <= 32
  • (Unsigned)Integer64 per bitLength<=64bitLength <= 64

Il segno opzionale viene esteso dal bit più significativo dell'immagine fino alla larghezza del dataType.

Tipi di dati manuali e conversione:​

warning

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​

InformazioneValore
AutorioptiMEAS GmbH
da smartCORE0.103
Tipo di moduloFast Message Receiver, Producer
DipendenzeModulo di invio Fast Message (ad es. fmudp, canbus, smartmvb, rawplayback, ...)

Footnotes​

  1. L'indicazione della bufferSize determina quanti campioni vengono mantenuti nel canale smartCORE per l'utilizzo da parte di altri moduli. Dovrebbe essere scelta in modo che possano essere bufferizzati circa 5 .. 10 secondi. Lacune periodiche nei dati OSF indicano una bufferSIze troppo piccola. ↩ ↩2

  2. Se il "messageKey" non è configurato, vengono elaborati ulteriormente i dati di tutti i messaggi (ciò è opportuno, ad es., per CAN RAW e applicazioni di debugging). ↩

  3. Se la "bitLength" non è configurata, viene determinata dall'imageType o dalla lunghezza del messaggio inoltrato. ↩

  4. Obbligatorio solo per l'imageType String ↩

  5. L'indicazione di scale != 1 o offset != 0 con un imageType numerico comporta l'uscita con dataType float o double. ↩ ↩2

  6. Di norma l'indicazione del tipo di dati dovrebbe essere omessa, poiché in tal caso viene determinato in modo ottimizzato dall'imageType e dalla bitLength. Per alcune combinazioni il tipo di dati viene stabilito obbligatoriamente dal modulo. ↩

  7. L'indicazione di una cacheSize riduce, per fonti di dati molto veloci (>100Hz> 100 Hz), il carico della CPU, poiché i nuovi record di dati vengono dapprima memorizzati temporaneamente in una cache e pubblicati per altri moduli solo quando la cache è completamente piena. L'indicazione dovrebbe essere scelta in modo tale che la pubblicazione avvenga con una frequenza compresa tra 55 e 20Hz20 Hz. ↩

  8. Vale esplicitamente solo per byteOrder bigEndian. Per byteOrder littleEndian viene contato lo schema AscendingFirstBit. ↩

  9. Sebbene nella EN in alcuni punti la lunghezza di un tipo di dati# con (# = any unsigned integer) sia lasciata aperta, tutte le trattazioni esplicite sono sempre indicate in potenze di 2 intere (ENUM4, ENUM8, INTEGER8, INTEGER16, ...). Non vi è alcuna indicazione su come procedere con lunghezze in bit al di fuori di questa griglia per quanto riguarda l'allineamento. ↩

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

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

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

  13. Se la fonte di dati fornisce un valore NAN o INF, questo non viene esplicitamente prodotto nel canale smartCORE. ↩ ↩2