Странный вывод файла при использовании Concat в CodeSys

Я использую библиотеку 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?

person rombie18    schedule 23.03.2019    source источник
comment
В вашем примере нет lString = CONCAT('str1', 'str2') и даже str1 и 2 не определены. Трудно помочь, если вы не знаете уруку и как вы ее используете.   -  person Sergey Romanov    schedule 24.03.2019
comment
Я изменил его.   -  person rombie18    schedule 24.03.2019
comment
Вы пытались написать lString напрямую, не назначая его fString?   -  person Sergey Romanov    schedule 24.03.2019


Ответы (2)


Вы не должны одновременно передавать 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
person pboedker    schedule 24.03.2019

Я узнал это сам. Это было связано с размером строки. Например: STRING(4) отлично выводится со словом из четырех букв, но со словом из двух букв добавляется два случайных символа.

person rombie18    schedule 25.03.2019