Коллеги, добрый день. Случилась такая вот проблема. Перестал работать парсинг 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

