Странный вывод файла при использовании Concat в CodeSys - PullRequest
0 голосов
/ 23 марта 2019

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

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Вы не должны одновременно передавать 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
0 голосов
/ 25 марта 2019

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

...