Столкнулся со следующей проблемой. STRING ограничен 255 символами, склеил нескольких строк в одну с помощью OSU.StrConcatA и поместил в sCommand: STRING(500), в результате получилась такой запрос:
Код:
mysql -s -utest -p11 -h 10.33.1.101 --database=test --default-character-set=cp1251 -e "INSERT INTO new_table (date, time, value) values (CURRENT_DATE(), CURRENT_TIME(), 24.42029), (CURRENT_DATE(), CURRENT_TIME(), 19.95781), (CURRENT_DATE(), CURRENT_TIME(), 22.24042)"
который MYSQL отказывается почему то принимать. В БД ничего не приходит.
Может быть есть способ сформировать адекватный запрос в БД?
Задача состоит в том, чтобы раз в 1 сек зафиксировать показания датчиков ~20шт (sVar1-sVarn), приклеить метку времени и передать это все в БД.
На данный момент имею вот такой код:
Код:
FUNCTION_BLOCK MySQL_CLIENT
VAR_INPUT
xExecute: BOOL;
sUser: STRING(30);
sPassword: STRING(30);
sIpAddr: STRING(30);
sDatabase: STRING(30);
sVar1: STRING(30);
sVar2: STRING(30);
sVar3: STRING(30);
END_VAR
VAR_OUTPUT
xDone: BOOL;
xBusy: BOOL;
xError: BOOL;
asResult: ARRAY [1..255] OF STRING(255);
usiCountOfStrings: USINT;
xOverFlow: BOOL;
END_VAR
VAR
sCommand: STRING(500);
fbSe4: CmpSysExec.SysExecute4;
fbRiseEdge: R_TRIG;
END_VAR
VAR CONSTANT
c_sCommand: STRING(255):= 'mysql -s -u#USER# -p#PASS# -h #HOST# --database=#DATABASE# --default-character-set=cp1251 -e ';
END_VAR
Код:
fbRiseEdge(CLK := xExecute);
IF fbRiseEdge.Q THEN
sCommand := OSU.ReplaceSubstring(c_sCommand, '#USER#', sUser);
sCommand := OSU.ReplaceSubstring(sCommand, '#PASS#', sPassword);
sCommand := OSU.ReplaceSubstring(sCommand, '#HOST#', sIpAddr);
sCommand := OSU.ReplaceSubstring(sCommand, '#DATABASE#', sDatabase);
OSU.StrConcatA(ADR('"INSERT INTO new_table (date, time, value) values (CURRENT_DATE(), CURRENT_TIME(), '), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR(sVar1), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR('), '), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR('(CURRENT_DATE(), CURRENT_TIME(), '), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR(sVar2), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR('), '), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR('(CURRENT_DATE(), CURRENT_TIME(), '), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR(sVar3), ADR(sCommand), SIZEOF(sCommand));
OSU.StrConcatA(ADR(')"'), ADR(sCommand), SIZEOF(sCommand));
END_IF
fbSe4
(
xExecute := fbRiseEdge.Q,
sCommand := sCommand,
sOutput => asResult,
cntReadStr => usiCountOfStrings,
xOverFlow => xOverFlow,
xDone => xDone,
xBusy => xBusy,
xError => xError
);