ファンクションブロックによるスコープ記録開始、停止制御

ファンクションブロックによるスコープ記録開始、停止制御#

Scopeサーバをファンクションブロックからリモート制御できます。TE1300 Scope viewにてScopeプロジェクトを生成し、コンフィグファイルconfig.tcscopexというファイル名で保存します。

下記のメインプログラムのとおり、HMI.bRecordToScopeフラグをTRUEにしている間の収集データを、C:/ProgramData/scope以下に、record_YYYYMMDD_hhmmss-YYYYMMDD_hhmmss.svdxという書式で開始日時と終了日時の入ったファイル名で記録します。

メインプログラム#

VAR
    fbScopeController      :FB_ScopeController;
    bReset                 :BOOL;
END_VAR

fbScopeController(
    bExternalTriggerEvent := HMI.bRecordToScope, // 記録スイッチ
    bReset := bReset,                   // エラーリセット信号
    sSaveDir := 'C:/ProgramData/scope', // コンフィグと記録データを保存するディレクトリ指定
    sSaveFileNamePrefix := 'record_',   // 記録データの接頭語
    sConfigFile := 'config.tcscopex'    // コンフィグファイル名
    );

ファンクションブロック#

FUNCTION_BLOCK FB_ScopeController
VAR_INPUT
    bExternalTriggerEvent:  BOOL := FALSE; // 立ち上がり時に記録開始。立下りで記録終了。
    bReset:     BOOL := FALSE;   // エラー時のリセットフラグ
    sSaveDir:   STRING; // 保存ファイル、コンフィグファイル保存先ディレクトリ
    sSaveFileNamePrefix:    STRING; // 保存ファイル名の接頭語
    sConfigFile:    STRING; // TE1300で保存したコンフィグファイル名
END_VAR
VAR_OUTPUT
    eCurrentState: E_ScopeServerState := SCOPE_SERVER_IDLE; // 現在のScope制御状態
    bError: BOOL := FALSE; // エラーフラグ
    nErrorId: UDINT := 0; // エラーコード
END_VAR
VAR
    fbScopeServerControl: FB_ScopeServerControl;
    eRequestedState: E_ScopeServerState := SCOPE_SERVER_IDLE;
    fbLocalTime: FB_LocalSystemTime := (bEnable:=TRUE, dwCycle:=1);     // For getting current time as local time
    sPrintf: Tc2_Utilities.FB_FormatString;
    _text_current : STRING;
    _text_start: STRING(255); // datetime type strings for SQL databse.
END_VAR
// for 'datetime' value
// Get local time as timestruct type > output formatted string
fbLocalTime();
sPrintf(sFormat := '%.4d%.2d%.2d_%.2d%.2d%.2d',
        arg1 := F_WORD(fbLocalTime.systemTime.wYear),
        arg2 := F_WORD(fbLocalTime.systemTime.wMonth),
        arg3 := F_WORD(fbLocalTime.systemTime.wDay),
        arg4 := F_WORD(fbLocalTime.systemTime.wHour),
        arg5 := F_WORD(fbLocalTime.systemTime.wMinute),
        arg6 := F_WORD(fbLocalTime.systemTime.wSecond));
_text_current := sPrintf.sOut;

CASE eCurrentState OF
SCOPE_SERVER_IDLE:
    IF bExternalTriggerEvent THEN
        eRequestedState := SCOPE_SERVER_CONNECT;
        IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy AND NOT bError  THEN
            eCurrentState := eRequestedState;
        END_IF
    END_IF
SCOPE_SERVER_CONNECT, SCOPE_SERVER_START:
    IF bExternalTriggerEvent THEN
        eRequestedState := SCOPE_SERVER_START;
        IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy AND NOT bError  THEN
            eCurrentState := eRequestedState;
        ELSE
            _text_start := CONCAT(_text_current, '-');
        END_IF
    ELSE
        eRequestedState := SCOPE_SERVER_STOP;
        IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy AND NOT bError  THEN
            eCurrentState := eRequestedState;
        END_IF
    END_IF
SCOPE_SERVER_STOP:
    eRequestedState := SCOPE_SERVER_SAVE;
    IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy AND NOT bError  THEN
        eCurrentState := eRequestedState;
    ELSE
        fbScopeServerControl.sSaveFile := CONCAT(CONCAT(sSaveDir, '/'), CONCAT(sSaveFileNamePrefix,CONCAT(CONCAT(_text_start, _text_current), '.svdx')));
    END_IF
SCOPE_SERVER_SAVE:
    eRequestedState := SCOPE_SERVER_DISCONNECT;
    IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy AND NOT bError  THEN
        eCurrentState := eRequestedState;
    END_IF
SCOPE_SERVER_DISCONNECT:
    IF bExternalTriggerEvent THEN
        eRequestedState := SCOPE_SERVER_CONNECT;
        IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy AND NOT bError  THEN
            eCurrentState := eRequestedState;
        END_IF        
    END_IF
SCOPE_SERVER_RESET:
    eRequestedState := SCOPE_SERVER_IDLE;
    IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy AND NOT bError THEN
        eCurrentState := eRequestedState;
    END_IF
END_CASE

IF bError AND bReset THEN
    eRequestedState := SCOPE_SERVER_RESET;
    IF fbScopeServerControl.eReqState = eRequestedState AND NOT fbScopeServerControl.bBusy THEN
        eCurrentState := eRequestedState;
    END_IF
END_IF

fbScopeServerControl.sConfigFile := CONCAT(CONCAT(sSaveDir, '\'), sConfigFile);

fbScopeServerControl( sNetId:= '',
                    tTimeout:= T#5S,
                    eReqState := eRequestedState,
                    bError=>bError,
                    nErrorId=>nErrorId
                    );