Показано с 1 по 10 из 12

Тема: Проблема с sysExecute5

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию Проблема с sysExecute5

    Коллеги, добрый день. Случилась такая вот проблема. Перестал работать парсинг JSON через ФБ sysExecute5. Хотел добавить пару изменений, разобрался с проблемой кириллицы (для тех, кто вдруг столкнется с этой проблемой: jq в любом случае выводит строку в кодировке UTF-8 в терминал, в cds 3.5.7.30 string имеет кодировку ascii, wstring - UCS-2, по этой причине в string вы не сможете записать кириллицу, а для wstring вам надо будет перекодировать строку с помощью iconv в UTF-16 сразу, либо другими способами, из библиотеки owen string utils функция CP1251_TO_UNICODE у меня не сработала), но не могу этого проверить тк вывода по сути нету. Из изменений в коде считай никаких, только изменение самой команды, отправляемой в терминал, изменения размера массива, в который потом данные записываются (добавилось 9 сигналов), изменился тип массива выходных данных (со string на wstring), и файл конфига новый (название файла поменял). В чем проблема: при старте программы ФБ sysExecute5 встает в положение xExecute := true, но после xBusy остается false и не меняет своего значения. Откат к предыдущей версии тоже перестал работать.
    Код программы ниже (упрощенная версия тк пытался сам понять, в чем проблема, тут только запись в буфер данных, без их распределения, поведение одинаковое в обоих случаях):
    Код:
    PROGRAM INICIATE_SIGNALS_2
    VAR
      GetDataFromJSON: BOOL := TRUE;
      sPathToFile:   STRING := 'home/root/CODESYS/cfg_2.json';
      fbJSONParser:  CmpSysExec.sysExecute5;
      sCommand:     STRING(255);
      i:         INT := 0;
      wsDITemp:     ARRAY [0..c_iDISize] OF WSTRING(512);
      wsDOTemp:     ARRAY [0..c_iDOSize] OF WSTRING(512);
      wsIDOTemp:     ARRAY [0..c_iIDOSize] OF WSTRING(512);
      wsAITemp:     ARRAY [0..c_iAISize] OF WSTRING(512);
      wsTIMERSTemp:   ARRAY [0..c_iTimersSize] OF WSTRING(512);
      eJSONFIeld:    JSON_FIELD := JSON_FIELD.discret_inputs; 
    END_VAR
    VAR CONSTANT
      c_iDISize:    INT := 264;
      c_iDOSize:     INT := 146;
      c_iIDOSize:    INT := 141;
      c_iAISize:    INT := 40;
      c_iTimersSize:  INT := 21;
      c_sCommand:    STRING(255) := 'jq -c $'.#SIGNALS#[] $' #PATH_TO_FILE# | iconv -f UTF-8 -t UTF-16BE';
      //c_sCommand:    STRING(255) := 'jq -c $'.#SIGNALS#[] $' #PATH_TO_FILE#'; 
    END_VAR
    
    IF GetDataFromJSON THEN
      CASE eJSONFIeld OF
        JSON_FIELD.discret_inputs:
          
          sCommand := OSU.ReplaceSubstring(sSource := c_sCommand,
                          sWhatToReplace := '#SIGNALS#',
                          sReplaceWith := 'di_signals');
                          
          sCommand := OSU.ReplaceSubstring(sSource := sCommand,
                          sWhatToReplace := '#PATH_TO_FILE#',
                          sReplaceWith := sPathToFile);
          
          fbJSONParser(xExecute := TRUE,
            pCommand := ADR(sCommand),
            szCommand := SIZEOF(sCommand),
            pOutput := ADR(wsDITemp[i]),
            szOutput := SIZEOF(wsDITemp[i])
          );
          
          IF fbJSONParser.xBusy AND wsDITemp[i] <> "" AND i < c_iDISize THEN
            i := i+1;
          END_IF
          
          IF fbJSONParser.xDone THEN
            fbJSONParser(xExecute := FALSE);
            i := 0;
            eJSONFIeld := JSON_FIELD.NULL;
          END_IF
        JSON_FIELD.NULL:
          PLC_SIGNALS.init_to_spk := TRUE;
          GetDataFromJSON := FALSE;
      END_CASE
    END_IF
    Последний раз редактировалось Dmitry Dedkov; 10.06.2025 в 11:29.

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 12.03.2025, 14:57

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •