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




Ответить с цитированием