LogObjectBaseFileHandleTableEntry (STRUCT) ¶ TYPE LogObjectBaseFileHandleTableEntry : STRUCT InOut: Name Type Initial instNumber DWORD Constants.LOG_INVALID_INSTNUMBER hFile RTS_IEC_HANDLE RTS_INVALID_HANDLE
Test_Prg (PRG) ¶ PROGRAM Test_Prg Structure: CheckErrors (Action) ClearErrors (Action)
LogObjectsBase (FB) ¶ FUNCTION_BLOCK ABSTRACT LogObjectsBase EXTENDS BACnet.BACnetServerPluginBase Base class for logging objects default implementions (Trend_Log, Trend_Log_Multiple, Event_Log). It tries to provide a feature complete implementation for logging objects with a reasonable simple implementation. Assumptions / provisions of LogObjectBase and derived: A.) All log data are stored in the file system, one file per object. If large data volumes should be used (Buffer_Size) a high performance file system is recommended. B.) no sophisticated Sequence / Total_Record_Count overflow handling needed - they simply overflow / wrap around If those assumptions / provisions are not valid for your use case, a more sophisticated implementation is needed, for example based on database, in-memory-database etc. BACstack log data are delivered as either IEC_BACNET_LOG_RECORD, IEC_BACNET_LOG_RECORD_MULTIPLE, or IEC_BACNET_EVENT_LOG_RECORD packed in a IEC_BACNET_PROPERTY_CONTENTS and are stored binary as is in one file per logging object. Such a log file contains: 1.) file header 2.) 0..numRecords-1 log records A log record in such a file consists of: 1.) log record header sequence : IEC_BACNET_UNSIGNED time stamp : IEC_BACNET_DATE_TIME 2.) log record data as C-structure 3.) actual number of records in file : IEC_BACNET_UNSIGNED Reasons to do so: - SysFile write operations in append mode doesnt allow writing at file pos <> end for some platforms - reading the last record should be efficient (rewind from file end), for example to get last sequence number If the number of records is supposed to be limited practically (Buffer_Size), then purge operations of the data files are needed (to get rid of old records). Those purge operations are done implicitely in the implementation. A purge operation basically copies the records - except the purged record(s) - to a temporary file, deletes the data file, copy/move the data file to the data file. For those purge operations it might be useful to choose a TempPath on a high speed file system (RAM file system). If TempPath <> PersistentPath the temporary file will be copied to the data file and deleted afterwards, otherwise the temporary file will be renamed to the data file. The purge operations involve a significant performance degradation. In general this should not be an issue, because BACnet logging objects are designed to inform a BACnet management device (OWS/AWS) about “log buffer mostly full” via Notification_Threshold and notifications. The BACnet management device should read and clear the log buffer to avoid “log buffer full” situations which will cause loss of logging data anyway. Properties: HardShutdown MaxDataSize ObjectType PersistentPath ServerDeviceId TempPath Methods: FreeReadRangeResult GetBufferSize GetRecordsByPosition GetRecordsBySequence GetRecordsByTime GetStopWhenFull Init PostStopBACnetStack ReadRangeResultSetInfo ScanObjectsAndSetCallbackAttachments SetCallbackAttachments SetReadCallbackAttachment SetWriteCallbackAttachment UpdateObjectPropertiesFromDataFile ComputeRecordSize CreateDataFiles DataFileName ListDataFiles LogDataFile LogFilePos LogFileSize LogFileSizeAndPos LogObjectAddrString LogObjectPropertyAddrString LogReadRangeResult LogRecord LogRecordContentInfo ObjectId PurgeDataFile ReadNumberOfRecordsAndLastSequenceFromDataFile ReadNumberOfRecordsFromDataFile ReadRangeErrorCompletion ReadRangeInfoToString RemoveDataFiles RemoveUnusedDataFiles ResetDataFile WriteRecordContentToDataFile Structure: BACnetEventCallback ReadRangeErrorCompletion (Method) Files DataFiles CreateDataFiles (Method) DataFileName (Method) ListDataFiles (Method) PurgeDataFile (Method) ReadNumberOfRecordsAndLastSequenceFromDataFile (Method) ReadNumberOfRecordsFromDataFile (Method) RemoveDataFiles (Method) RemoveUnusedDataFiles (Method) ResetDataFile (Method) WriteRecordContentToDataFile (Method) base ComputeRecordSize (Method) FreeReadRangeResult (Method) GetBufferSize (Method) GetRecordsByPosition (Method) GetRecordsBySequence (Method) GetRecordsByTime (Method) GetStopWhenFull (Method) HardShutdown (Property) Init (Method) Logging LogDataFile (Method) LogFilePos (Method) LogFileSize (Method) LogFileSizeAndPos (Method) LogObjectAddrString (Method) LogObjectPropertyAddrString (Method) LogReadRangeResult (Method) LogRecord (Method) LogRecordContentInfo (Method) MaxDataSize (Property) ObjectHandling ObjectId (Method) ObjectType (Property) PersistentPath (Property) PostStopBACnetStack (Method) ReadRangeResultSetInfo (Method) ScanObjectsAndSetCallbackAttachments (Method) ServerDeviceId (Property) SetCallbackAttachments (Method) SetReadCallbackAttachment (Method) SetWriteCallbackAttachment (Method) TempPath (Property) ToString ReadRangeInfoToString (Method) UpdateObjectPropertiesFromDataFile (Method)
Test_Prg.CheckErrors (ACT) ¶
BTagWriterCreateSavePoint (FUN) ¶ FUNCTION BTagWriterCreateSavePoint : RTS_IEC_HANDLE InOut: Scope Name Type Comment Return BTagWriterCreateSavePoint RTS_IEC_HANDLE Input hWriter RTS_IEC_HANDLE pData POINTER TO BYTE dwDataSize DWORD pResult POINTER TO RTS_IEC_RESULT optionally for an errorcode
LogObjectsBase.PurgeDataFile (METH) ¶ METHOD PROTECTED PurgeDataFile : RTS_IEC_RESULT InOut: Scope Name Type Return PurgeDataFile RTS_IEC_RESULT Input instNumber DWORD numRecords CmpBACnet.IEC_BACNET_UNSIGNED
BTagWriterCreateSavePointDynamic (FUN) ¶ FUNCTION BTagWriterCreateSavePointDynamic : RTS_IEC_HANDLE InOut: Scope Name Type Comment Return BTagWriterCreateSavePointDynamic RTS_IEC_HANDLE Input hWriter RTS_IEC_HANDLE pResult POINTER TO RTS_IEC_RESULT optionally for an errorcode
BTagWriterDestroy (FUN) ¶ FUNCTION BTagWriterDestroy : RTS_IEC_RESULT InOut: Scope Name Type Return BTagWriterDestroy RTS_IEC_RESULT Input hWriter RTS_IEC_HANDLE
LogObjectsBase.ReadNumberOfRecordsAndLastSequenceFromDataFile (METH) ¶ METHOD ReadNumberOfRecordsAndLastSequenceFromDataFile : RTS_IEC_RESULT InOut: Scope Name Type Return ReadNumberOfRecordsAndLastSequenceFromDataFile RTS_IEC_RESULT Input instNumber DWORD Output numRecords CmpBACnet.IEC_BACNET_UNSIGNED lastSequence CmpBACnet.IEC_BACNET_UNSIGNED
BTagWriterDestroySavePoint (FUN) ¶ FUNCTION BTagWriterDestroySavePoint : RTS_IEC_RESULT InOut: Scope Name Type Return BTagWriterDestroySavePoint RTS_IEC_RESULT Input hSavePoint RTS_IEC_HANDLE