В общем, добрался до документации на сайте ОВЕН. Оказывается SysExecute5 каждую новую строку из терминала пишет по заново по переданному ей указателю, перетирая предыдущие строки и последняя строка обязательно пустая. То есть необходимо вручную во время выполнения ФБ подкидывать ему новый указатель.
Вот такой код у меня заработал
Код:FUNCTION_BLOCK SQLQuery IMPLEMENTS itfSQLQuery VAR_INPUT xExecute: BOOL; END_VAR VAR_OUTPUT xDone: BOOL; xBusy: BOOL; xError: BOOL; usiCurQuery : USINT := 0; //текущий запрос 0 - запрос обработан; 1 - количество строк; 2- данные END_VAR VAR sPathToDb: STRING := '/home/ftp/kormplus_plc.db'; //путь к базе данных sCommand: STRING(2047); //переменная для целой команды sSQLQuery: STRING(2000); //переменная для запроса sTable : STRING; //Имя таблицы sColumn : STRING; //Имя столбца sWhereStatement : STRING(2000); //условия запроса iItemsCount : INT; //количество доступных строк в таблице fbSe5 : CmpSysExec.SysExecute5; fbRiseEdge : R_TRIG; // Результат выполнения запроса asResult : ARRAY[1..255] OF STRING(255); x : UINT; i : USINT := 0; // количество строк в ответе usiCountOfStrings: USINT; // TRUE - при выдаче ответа произошло переполнение массива, часть информации потеряна xOverFlow: BOOL; END_VAR VAR CONSTANT // шаблон запроса, можно отредактировать под себя // см. https://linux.die.net/man/1/sqlite3 c_sCommand: STRING(255) := 'sqlite3 #PATH_TO_FILE# "#SQL#"'; c_sCountSelect : STRING(255) := 'SELECT COUNT(#COLUMN#) FROM #TABLE# #WHERE#;'; c_sSelect : STRING(255) := 'SELECT #COLUMN# FROM #TABLE# #WHERE#;'; END_VAR fbRiseEdge(CLK := xExecute); IF fbRiseEdge.Q THEN i := 1; xOverFlow := FALSE; usiCountOfStrings := 0; END_IF fbSe5 ( xExecute := xExecute, pCommand := ADR(sCommand), szCommand := TO_DWORD(STU.StrLenA(ADR(sCommand))), pOutput := ADR(asResult[i]), szOutput := SIZEOF(asResult[i]), uiOutputSize => x, xDone => xDone, xBusy => xBusy, xError => xError ); IF fbSe5.xBusy AND asResult[i] <> '' AND i < 255 THEN i := i + 1; IF i = 255 OR x > 255 THEN xOverFlow := TRUE; END_IF END_IF IF fbSe5.xDone THEN usiCountOfStrings := i -1; END_IF




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