在 CodeSys 中使用 Concat 时出现奇怪的文件输出
Strange file output when using Concat in CodeSys
我正在使用 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 作为输入传递,同时将其声明为具有初始值的变量。编译器应该拒绝以这种形式构建程序,因此您当前的程序与上面的示例略有不同,或者您的编译器没有按照它应该的方式运行并且所有赌注都关闭了。
此外,我注意到您的程序在写入文件时可能会停留在情况 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
我自己发现的。它与字符串大小有关。例如:STRING(4)
用四个字母的单词输出很好,但是用两个字母的单词它会添加两个随机字符。
我正在使用 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 作为输入传递,同时将其声明为具有初始值的变量。编译器应该拒绝以这种形式构建程序,因此您当前的程序与上面的示例略有不同,或者您的编译器没有按照它应该的方式运行并且所有赌注都关闭了。
此外,我注意到您的程序在写入文件时可能会停留在情况 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
我自己发现的。它与字符串大小有关。例如:STRING(4)
用四个字母的单词输出很好,但是用两个字母的单词它会添加两个随机字符。