В общем, добрался до документации на сайте ОВЕН. Оказывается 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