FB_CTRL_LOG_MAT_FILE

FB_CTRL_LOG_MAT_FILE 1:

Der Funktionsbaustein ermöglicht das Erstellen eines Log-Files im Matlab 5-Format (*.mat), in dem maximal 10 Größen aufgezeichnet werden können.

In der Datei werden zwei Variablen angelegt, ein double-Array und ein cell-Array. In dem double-Array werden die aufgezeichneten Größen zeilenweise aufgezeichnet. In dem cell-Array werden die Bezeichnungen der einzelnen Zeilen abgelegt. Der Benutzer kann den Namen des double-Arrays in der Parameterstruktur des Funktionsbausteins angeben. Der Name des cell-Arrays wird aus dem Namen des double-Arrays gebildet, indem "_Info" an den Namen der Variablen angehängt wird.

In die Spalten des Daten-Arrays werden die Eingangsdaten in zeitlich äquidistanten Abständen geschrieben. In der ersten Spalte kann der Timestamp des jeweiligen Eintrags in s abgelegt werden. Mit dem Parameter tLogCycleTime wird der zeitliche Abstand der Eintragungen festgelegt. Wenn zum Beispiel „tLogCycleTime := T\#2s“ gewählt wird, wird alle 2s ein Eintrag in die Datei geschrieben.

FB_CTRL_LOG_MAT_FILE 2:

Wenn der Mode auf eCTRL_MODE_ACTIVE gesetzt wird, wird die Log-Datei geöffnet und es werden Einträge in die Datei geschrieben. Diese Datei bleibt solange geöffnet, bis der Mode des Bausteins auf eCTRL_MODE_PASSIVE gesetzt wird.

Bevor die Log-Datei ausgewertet werden kann, muss sie unbedingt durch ein Umschalten in den eCTRL_MODE_PASSIVE geschlossen werden. Anderenfalls ist es möglich, dass noch nicht alle Einträge in die Datei geschrieben worden sind und dass diese nicht konsistent ist.

Der Baustein ermöglicht es, mit und ohne einem externen Buffer zu arbeiten.

Betrieb ohne externen Buffer:

Wenn das Loggen einer Zeile gestartet ist, wird der Ausgang bBusy TRUE. Der nächste Datensatz wird erst dann geloggt, wenn der Ausgang bBusy wieder FALSE ist. Der Füllstand des internen Buffers wird am Ausgang fBufferUsage angezeigt.

Betrieb mit externem Buffer:

Der Benutzer muss einen Buffer des Typs ARRAY OF BYTES anlegen, der größer als 1500 Byte ist.
Die einzelnen Meldungen werden temporär in dem externen Buffer abgelegt und dieser Buffer wird so schnell wie möglich in die Datei geschrieben. Der Füllstand des Buffers wird am Ausgang fBufferUsage angezeigt. Wenn es zu einem Buffer-Überlauf kommt, wird der Baustein gestoppt und ein Fehler ausgegeben.

FB_CTRL_LOG_MAT_FILE 3:

Wenn eine Bufferadresse und eine Buffergröße ungleich Null parametriert werden, wird der externe Buffer genutzt. Ohne einen externen Buffer wird ein interner Buffer mit einer Größe von 1500 Byte verwendet.

FB_CTRL_LOG_MAT_FILE 4: VAR_INPUT

VAR_INPUT
    fLogData  : T_CTRL_LOGGER_DATA;
    eMode     : E_CTRL_MODE;
END_VAR
VAR_GLOBAL CONSTANT
    nCTRL_LOGGER_DATA_ARRAY_SIZE :UINT := 10;
END_VAR

TYPE
    T_CTRL_LOGGER_DATA :ARRAY [1..nCTRL_LOGGER_DATA_ARRAY_SIZE]
OF FLOAT;
END_TYPE

Name

Typ

Beschreibung

fLogData

T_CTRL_
LOGGER_DATA

Array mit den Werten, die in das Log-File geschrieben werden.

eMode

E_CTRL_MODE

Eingang, der die Betriebsart des Bausteins festlegt.

FB_CTRL_LOG_MAT_FILE 5: VAR_OUTPUT

VAR_OUTPUT
    eState          : E_CTRL_STATE;
    bFileOpen       : BOOL
    bFileClosed     : BOOL
    fBufferUsage    : FLOAT    
    nLoggedColumns  : DINT;
    bBusy           : BOOL
    eErrorId        : E_CTRL_ERRORCODES;
    bError          : BOOL;
END_VAR

Name

Typ

Beschreibung

eState

E_CTRL_STATE

State des Funktionsbausteins

bFileOpen

BOOL

Ein TRUE an diesem Ausgang signalisiert, dass die Datei erfolgreich geöffnet wurde.

bFileClosed

BOOL

Ein TRUE an diesem Ausgang signalisiert, dass die Datei erfolgreich geschlossen wurde.

fBufferUsage

FLOAT

Aktueller Füllstand des externen Buffers in Prozent

nLogged
Columns

DINT

Anzahl der in die Datei geschriebenen Spalten

bBusy

BOOL

Ein TRUE an diesem Ausgang signalisiert, dass das Loggen einer Zeile aktiv ist.

eErrorId

E_CTRL_ERRORCODES

Liefert bei einem gesetzten bError-Ausgang die Fehlernummer.

bError

BOOL

Wird TRUE, sobald ein Fehler eintritt.

FB_CTRL_LOG_MAT_FILE 6: VAR_OUTPUT

VAR_IN_OUT
    stParams        : ST_CTRL_LOG_MAT_FILE_PARAMS;
END_VAR

Name

Typ

Beschreibung

stParams

ST_CTRL_LOG_MAT_FILE_
PARAMS

Parameterstruktur des Log-Bausteins

stParams besteht aus den folgenden Elementen:

TYPE ST_CTRL_LOG_MAT_FILE_PARAMS:
STRUCT
    tLogCycleTime         : TIME := T#0ms;
    tTaskCycleTime        : TIME := T#0ms;
    sFileName             : STRING;
    nNumberOfRows         : INT(1..10);
    sMatrixName           : STRING;
    arRowDescription      : ARRAY [1..10] OF STRING(25);
    bWriteTimeStamps      : BOOL := TRUE;
    bWriteRowDescription  : BOOL := TRUE;
    pLogBuffer_ADR        : POINTER TO
     ST_CTRL_MULTIPLE_PWM_OUT_DATA;
    nLogBuffer_SIZEOF       : UDINT;
END_STRUCT
END_TYPE

Name

Typ

Beschreibung

tLogCycleTime

TIME

Zykluszeit, mit der Einträge in das Log-File geschrieben werden. Diese muss größer oder gleich der TaskCycleTime sein.

tTaskCycleTime

TIME

Zykluszeit, mit der der Funktionsbaustein aufgerufen wird. Diese entspricht der Task-Zykluszeit der aufrufenden Task, wenn der Baustein in jedem Zyklus aufgerufen wird.

sFileName

STRING

Name und Pfad des Log-Files, z.B.: d:\Logfile.mat

nNumberOfRows

INT

Anzahl der Spalten, die in die Datei geschrieben werden (maximal 10).

sMatrixName

STRING

Name des Daten-Arrays

arRow
Description

ARRAY

Array aus Strings, die die Zeilenüberschriften enthalten.

bWriteTime
Stamps

BOOL

Wenn dieser Parameter auf TRUE gesetzt ist, wird in die erste Zeile des Daten-Arrays der Zeitstempel der Messung geschrieben.

bWriteRow
Description

BOOL

Wenn dieser Parameter auf TRUE gesetzt ist, wird ein cell-Array angelegt, in das die Beschreibungen der Zeilen geschrieben werden.

pLogBuffer_ADR

POINTER TO ST_CTRL_
MULTIPLE_PWM_OUT_DATA

Adresse des externen LogBuffers - um einen Buffer zu erkennen, muss die Adresse ungleich 0 sein.

nLogBuffer_
SIZEOF

UDINT

Größe des LogBuffers - der Buffer muss ein ARRAY OF BYTE mit mindestens 1501 Elementen sein. Die Größe des Buffers kann mit Hilfe des Ausgangs fBufferUsage optimiert werden.

Hinweis

Fehler bei Dateihandling

Der Parametersatz darf nur dann geändert werden, wenn die Datei geschlossen ist (bFileClosed = TRUE). Anderenfalls kann es zu Fehlern bei dem Dateihandling kommen.

Beispiel

PROGRAM PRG_LOG_MAT_FILE_TEST_BUFFERED
VAR
    eMode             : E_CTRL_MODE;
    stParams          : ST_CTRL_LOG_MAT_FILE_PARAMS;
    LoggerData        : T_CTRL_LOGGER_DATA;
    eErrorId          : E_CTRL_ERRORCODES;
    bError            : BOOL;
    fbCtrlLogMatFile  : FB_CTRL_LOG_MAT_FILE;
    LogBuffer         : ARRAY[0..2000] OF BYTE;
    bInit             : BOOL := TRUE;
    fIn               : LREAL;
    fOut              : LREAL;
    fMaxBufferUsage   : LREAL;
END_VAR

IF bInit THEN
    stCtrl_GLOBAL_CycleTimeInterpretation.bInterpretCycleTimeAsTicks := FALSE;
    stCtrl_GLOBAL_CycleTimeInterpretation.fBaseTime := 0;
    stParams.tLogCycleTime     := T#2ms;
    stParams.tTaskCycleTime         := T#2ms;
    stParams.nNumberOfRows     := 3;
    stParams.sFileName     := 'D:\test.mat';
    stParams.sMatrixName     := 'TwinCAT_ControllerToolbox_Log';
    stParams.arRowDescription[1] := 'Input';
    stParams.arRowDescription[2] := 'Output 1';
    stParams.arRowDescription[3] := 'Output 2';
    stParams.bWriteRowDescription := TRUE;
    stParams.bWriteTimeStamps     := TRUE;
    eMode := eCTRL_MODE_ACTIVE;
    bInit := FALSE;
END_IF

stParams.nLogBuffer_SIZEOF := SIZEOF( LogBuffer );
stParams.pLogBuffer_ADR := ADR( LogBuffer );

fIn := fIn + 0.01;
fOut := SIN(fIn);

LoggerData[1]:= fIn;
LoggerData[2]:= fOut;
LoggerData[3]:= fOut * 2;

IF fbCtrlLogMatFile.nLoggedColumns >= 25 THEN
    eMode := eCTRL_MODE_Passive;
END_IF

fbCtrlLogMatFile( fLogData := LoggerData,
             eMode := eMode,
             stParams :=stParams,
             eErrorId => eErrorId,
             bError => bError);

fMaxBufferUsage := MAX(fbCtrlLogMatFile.fBufferUsage, fMaxBufferUsage);
FB_CTRL_LOG_MAT_FILE 7: