Я использую библиотеку CAA-File в CodeSyS для записи данных в текстовый файл. Когда я записываю строку в файл, он работает нормально, но если я объединяю 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
напрямую, не назначая его fString
?
Вы не должны одновременно передавать 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)
отлично выводится со словом из четырех букв, но со словом из двух букв добавляется два случайных символа.
В вашем примере нет
lString = CONCAT('str1', 'str2')
и дажеstr1
и 2 не определены. Трудно помочь, если вы не знаете уруку и как вы ее используете.