簡體   English   中英

在CodeSys中使用Concat時奇怪的文件輸出

[英]Strange file output when using Concat in CodeSys

我正在使用CodeSyS中的CAA文件庫將數據寫入文本文件。 當我向文件中寫入字符串時,它可以正常工作,但是如果我將2個字符串與CONCAT結合使用,則會得到帶有隨機字符的奇怪文件輸出(請參見下文)。 有誰知道如何解決這一問題? 謝謝!

例如, lString = 'test'可以正常工作,但是lString = CONCAT('str1', 'str2')不能。

PROGRAM initDataLogger
    VAR_INPUT
        lString : STRING;
    END_VAR
    VAR
        lString : STRING:= CONCAT('str1', 'str2');
        xFileStdInit:   BOOL:=FALSE;
        uiFileStdState: UINT:=0;
        sFileName:  CAA.FILENAME:= '/var/www/html/TestFile.txt';
        hFile:      CAA.HANDLE;
        szFileSize1:    CAA.SIZE := 0;
        szFileSize2:    CAA.SIZE := 0;
        filop:      FILE.Open;
        filwr:      FILE.Write;
        filcl:      FILE.Close;
        loop: INT := 0;
        fString: STRING;
    END_VAR

IF NOT xFileStdInit THEN
    filop(xExecute:=FALSE);
    filcl(xExecute:=FALSE);
    filwr(xExecute:=FALSE);
    xFileStdInit:=TRUE;
    uiFileStdState:=0;
ELSE
    CASE uiFileStdState OF
    0: (* create a new file *)
        filop.sFileName:=sFileName;
        filop.eFileMode:=FILE.MODE.MAPPD;
        filop.xExclusive:=TRUE;
        filop( xExecute:=TRUE);
        IF filop.xDone THEN
            hFile:=filop.hFile;
            uiFileStdState:=1;
        END_IF
        IF filop.xError THEN
            (* error handling*)
            ;
        END_IF
    1:(* write text in the file *)
        //fString := CONCAT('$R$L', lString);
        fString := lString;
        filwr.hFile:=hFile;
        filwr.pBuffer:=ADR(fString);
        szFileSize1:=SIZEOF(fString);
        filwr.szSize:=szFileSize1;
        filwr.udiTimeOut:=100000;       (* 100ms Timeout *)
        IF GVL.logData THEN
            filwr( xExecute:=TRUE);
        END_IF
        IF filwr.xDone THEN
            uiFileStdState:=2;
            GVL.logData := FALSE;
        END_IF
        IF filwr.xError THEN
            (* error handling*)
            ;
        END_IF
    2:  (* close file  - TestFile.txt *)
        filcl.hFile:=hFile;
        filcl( xExecute:=TRUE);
        IF filcl.xDone THEN
            uiFileStdState:=3;
        END_IF
        IF filcl.xError THEN
            (* error handling*)
            ;
        END_IF
    3:  (* end of example *)
        xFileStdInit := FALSE;
    END_CASE
END_IF

對於lString = CONCAT('str1', 'str2')我期望str1str2作為輸出,但是我得到了:

str1str2sys??v$??v??v?
?vd?n??
?v?`v??vd
?vK
?v?`v8
?v?v4??v?

您不應該同時傳遞lString作為輸入,並且同時將其聲明為具有初始值的變量。 編譯器應拒絕以這種形式構建程序,因此,要么您當前的程序與上面的示例有些不同,要么您的編譯器沒有按照應有的方式進行操作,因此一切都沒了。

另外,我注意到在寫入文件時,您的程序可能會在情況1下進行多次掃描。 您確定lString輸入有效還是此期間的期望值? 您可以單步執行程序來確認嗎?
您可能需要將案例1的第一部分和第二部分分為兩個案例步驟,或者將第一部分更改為以下內容:

IF NOT filwr.xExecute THEN
    //fString := CONCAT('$R$L', lString);
    fString := lString;
    filwr.hFile:=hFile;
    filwr.pBuffer:=ADR(fString);
    szFileSize1:=SIZEOF(fString);
    filwr.szSize:=szFileSize1;
    filwr.udiTimeOut:=100000;       (* 100ms Timeout *)
END_IF

我自己發現的。 它與字符串大小有關。 例如: STRING(4)很好地輸出帶有四個字母的單詞,但是帶有兩個字母的單詞可以添加兩個隨機字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM