【问题标题】:Strange file output when using Concat in CodeSys在 CodeSys 中使用 Concat 时输出奇怪的文件
【发布时间】:2019-03-26 00:09:24
【问题描述】:

我正在使用 CodeSyS 中的 CAA-File 库将数据写入文本文件。当我将字符串写入文件时,它工作正常,但如果我将 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 = CONCAT('str1', 'str2'),甚至str1和2都没有定义。如果您不知道 уруку 以及如何使用它,就很难接受。
  • 我已经改了。
  • 您是否尝试直接写lString而不将其分配给fString

标签: file st codesys caa


【解决方案1】:

您不应该同时将 lString 作为输入传递,同时将其声明为具有初始值的变量。编译器应该拒绝以这种形式构建程序,因此您当前的程序与上面的示例略有不同,或者您的编译器没有按照应有的方式进行,并且所有的赌注都没有了。

另外,我注意到在写入文件时,您的程序可能会停留在案例 1 中进行多次扫描。在此过程中,您确定 lString 输入是有效的还是预期值?您可以单步执行程序来确认吗?
您可能希望将案例 1 的第一部分和第二部分分成 2 个案例步骤,或者将第一部分更改为以下内容:

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

【讨论】:

    【解决方案2】:

    我自己发现的。它与字符串大小有关。例如:STRING(4) 用四个字母的单词输出很好,但是用两个字母的单词它会添加两个随机字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2023-02-05
      相关资源
      最近更新 更多