Странный вывод файла при использовании 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?

В вашем примере нет lString = CONCAT('str1', 'str2') и даже str1 и 2 не определены. Трудно помочь, если вы не знаете уруку и как вы ее используете.

Sergey Romanov 24.03.2019 10:13

Я изменил его.

rombie18 24.03.2019 14:11

Вы пытались написать lString напрямую, не назначая его fString?

Sergey Romanov 24.03.2019 16:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
613
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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
Ответ принят как подходящий

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

Другие вопросы по теме