Logging Objekte
BACnet erlaubt die Verwendung von drei verschiedenen Objekten zur Speicherung von Logdaten:
Trendlog: Dieser Objekttyp repräsentiert die aufgezeichneten Logdaten einer einzelnen Datenquelle, z. B. dem Present Value eines Analog Input Objektes.
Dabei kann die Aufzeichnung per Polling (d. h. in einem festgelegten Aufzeichnungsintervall in 1/100s), per Change of Value (COV) oder mit Hilfe eines booleschen Triggers erfolgen.
Trendlog Multiple: Dieser Objekttyp erlaubt die gleichzeitige Aufzeichnung von Daten aus mehreren Quellen. Prinzipbedingt ist die Aufzeichnung nur per Polling oder Trigger, nicht jedoch per COV möglich. In der Praxis wird dieser Objekttyp in BACnet-Projekten eher selten verwendet.
Eventlog: Dieser Objekttyp erlaubt die Speicherung von BACnet-Ereignismeldungen (Events und Alarme). Existiert für die Instanznummer eines Eventlog-Objektes ein Notification Class Objekt mit derselben Instanznummer im Server, so wird das Notification Class Objekt automatisch als Datenquelle des Eventlog Objektes konfiguriert. Alarme, die über diese Notification Class gemeldet werden, werden also automatisch im Logspeicher des Eventlogobjektes gespeichert.
Das nachfolgende Beispiel zeigt die Verwendung dieser drei Objekttypen.
Variablen
fAnalogValue : REAL;
fbTon : TON;
fbAv : FB_BACnet_AV := (
sObjectName := 'Object to simulate changes and generate alarms',
fLowLimit := 1.0,
bLowLimitEnable := TRUE,
fHighLimit := 8.0,
bHighLimitEnable := TRUE,
bEnPgm := TRUE,
bEventDetectionEnable := TRUE,
nNotificationClass := 42,
aEventEnable := [TRUE,TRUE,TRUE],
eUnit := E_BA_Unit.eElectrical_Volts,
nTimeDelay := 0,
nTimeDelayNormal := 0,
fDeadband := 0.0
);
fbNC42 : FB_BACnet_NC := (
nObjectInstance := 42,
nNotificationClass := 42,
sDescription := 'NC42',
aAckRequired := [ TRUE, TRUE, TRUE ],
aPriority := [ 1, 2, 3 ]
);
fbELog_NC42 : FB_BACnet_ELogBuf := (
sObjectName := 'Event Log for NC42',
nObjectInstance := 42,
bLogEnable := TRUE
);
fbTLog : FB_BACnet_TLog := (
sObjectName := 'Trend',
nNotificationClass := 42,
aEventEnable := [ TRUE, TRUE, FALSE ],
stStartTime := F_BA_ToSTDateTime(DT#2010-01-01-00:00),
bLogEnable := TRUE,
eLoggingType := E_BA_LoggingType.ePolled,
nLogInterval := 3 * 100, // log every 3 seconds, value in 1/100 seconds!
stObjectPropertyReference := F_BACnet_Reference(fbAv, PropPresentValue)
);
fbTLogCov : FB_BACnet_TLog := (
sObjectName := 'Trend Cov',
bLogEnable := TRUE,
stObjectPropertyReference := F_BACnet_Reference(fbAv, PropPresentValue),
eLoggingType := E_BA_LoggingType.eCOV,
nCOVResubscriptionInterval := 600,
stClientCOV := (
eChoice := E_BACnet_ClientCOVChoice.eCovReal,
fIncrement := 5.0
)
);
fbTLogBuf : FB_BACnet_TLogBuf := (
sObjectName := 'Trend with PLC buffer',
bLogEnable := TRUE,
eLoggingType := E_BA_LoggingType.eTriggered,
stObjectPropertyReference := F_BACnet_Reference(fbAv, PropPresentValue)
);
fbTLogM : FB_BACnet_TLM := (
sObjectName := 'Trend Multiple',
bLogEnable := TRUE,
eLoggingType := E_BA_LoggingType.ePolled,
nLogInterval := 50, // log every 0.5 seconds, value in 1/100 seconds!
aObjectPropertyReferences := [
(iObject := fbAv, ePropertyId := PropPresentValue),
(iObject := fbAv, ePropertyId := PropStatusFlags),
(iObject := fbAv, ePropertyId := PropEventState) ]
);
Code
// generate value changes every second
fbTon( IN:= NOT fbTon.Q, PT:=T#1S );
IF fbTon.Q THEN
fAnalogValue := fAnalogValue + 1.0;
IF fAnalogValue > 10.0 THEN
fAnalogValue := 0;
END_IF
END_IF
fbAv.fValPgm := fAnalogValue;
fbAv();
// Notification Class
fbNC42();
// Event Log with buffer in PLC
fbELog_NC42();
// Trend Log every 3 seconds
fbTLog();
// COV based Trend Log
fbTLogCov();
// Trigger based Trend Log with buffer in PLC
fbTlogBuf();
// Trendlog Multiple
fbTLogM();