PDA

Просмотр полной версии : Работа с MySQL с новой прошивкой.



oif
17.05.2021, 10:30
Добрый день.
Пытаюсь запустить функцию MySQL_CLIENT из новой прошивки СПК для SP16. https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/08_Sockets/Example_MySQL_3516v1.projectarchive
Компиляция проходит, все нормально. Но при подаче на вход 1 для запроса нечего не происходит.
fbMySqlClient(xExecute:=SQLstartread,sUser:=sUser, sPassword:=sPassword,sipAddr:=sIpAddr,sDatabase:=s Database,sSqlStatement:=sSqlStatementread);
fbMySqlClient.asResult[1];
fbMySqlClient.xDone;
fbMySqlClient.xError;
fbMySqlClient.usiCountOfStrings;
fbMySqlClient.xBusy;
fbMySqlClient.xOverFlow;

Причем (xError, xbusy,xDone) все в False.
Такое впечатление,что не включена утилита mysql, возможно необходимо что-то еще включить в настройках СПК, так как база работает и возвращает ответы запросы, через ПО на Visual C.
Может есть какой-то более расширенный пример?

Евгений Кислов
17.05.2021, 10:32
Добрый день.
Пытаюсь запустить функцию MySQL_CLIENT из новой прошивки СПК для SP16. https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/08_Sockets/Example_MySQL_3516v1.projectarchive
Компиляция проходит, все нормально. Но при подаче на вход 1 для запроса нечего не происходит.
fbMySqlClient(xExecute:=SQLstartread,sUser:=sUser, sPassword:=sPassword,sipAddr:=sIpAddr,sDatabase:=s Database,sSqlStatement:=sSqlStatementread);
fbMySqlClient.asResult[1];
fbMySqlClient.xDone;
fbMySqlClient.xError;
fbMySqlClient.usiCountOfStrings;
fbMySqlClient.xBusy;
fbMySqlClient.xOverFlow;

Причем (xError, xbusy,xDone) все в False.
Такое впечатление,что не включена утилита mysql, возможно необходимо что-то еще включить в настройках СПК, так как база работает и возвращает ответы запросы, через ПО на Visual C.
Может есть какой-то более расширенный пример?

Добрый день.
У вас какой тип аутентификации в MySQL используется?
У нас пока только mysql_native_password поддерживается, SHA2 добавим в грядущей прошивке.

oif
17.05.2021, 11:54
Для пользователя под которым подключаюсь,установлен плагин mysql_native_password.
Причем когда делаю сброс СПК и первый раз делаю запрос SQL fbMySqlClient.xBusy становится TRUE.
При следующих изменениях xExecute не происходит уже такого, пока не сделаешь сброс.

oif
17.05.2021, 12:09
Причем тот же запрос через терминал с СПК проходит нормально. А вот с Codesys никак.

Евгений Кислов
17.05.2021, 12:10
Для пользователя под которым подключаюсь,установлен плагин mysql_native_password.
Причем когда делаю сброс СПК и первый раз делаю запрос SQL fbMySqlClient.xBusy становится TRUE.
При следующих изменениях xExecute не происходит уже такого, пока не сделаешь сброс.

Попробуйте подключиться к контроллеру по SSH и из терминала отправить команду, которую отправляет блок (ее видно во внутренней переменной).

oif
17.05.2021, 12:19
Ну подключился через Web конфигуратор и отправил через терминал именно команду которую отправляет блок(скопировал из блока,убрав ковычки только которые значения String обозначают),все нормально прошло.
Сейчас постоянно при отправке через codesys выходит на несколько секунд xbusy=true. При смене сигнала на вход,но остальные значения не получает.

Евгений Кислов
17.05.2021, 12:29
Что значит "всё нормально прошло"?
Выложите скриншот.

oif
17.05.2021, 12:29
Может в Codesys необходимо что-то подключить или настройки специфичные выполнить для СПК? Ведь по логике доступ к linux через авторизацию происходит.Но это так мысли в слух,не очень много знаний просто по Codesys.

oif
17.05.2021, 12:32
Что значит "всё нормально прошло"?
Выложите скриншот.

55116Команда обработана,результат из базы получен корректный.

Евгений Кислов
17.05.2021, 12:33
55116Команда обработана,результат из базы получен корректный.

Ок, а теперь попробуйте отправить ту же команду в примере проекта (никак его не редактируя).

oif
17.05.2021, 12:51
Через пример команда выполнилась, корректный ответ получен.
Осталось понять,что не так,когда копирую функцию в проект и запускаю ее в проекте.

Евгений Кислов
17.05.2021, 12:52
Через пример команда выполнилась, корректный ответ получен.
Осталось понять,что не так,когда копирую функцию в проект и запускаю ее в проекте.

Как я понял, вы пишете на языке ST - вероятно, некорректно производите вызов ФБ.
Выложите ваш проект - тогда можно будет понять, в чем проблема.

oif
17.05.2021, 13:05
Да на ST.По сути я скопировал функциональный блок из примера, добавил его в Application. Подключил библиотеку CmpSysExec 3.5.16.30. Объявил переменные. И вызываю функцию по изменению SQLstartread на 1 вручную для проверки.

PROGRAM PLC_PRG
VAR
fbMySqlClient: MySQL_CLIENT;
xSendCommand: BOOL;
sUser: STRING(30) := 'owen';
sPassword: STRING(30) := '';
sIpAddr: STRING(30) := '1.1.1.1';
sDatabase: STRING(30) := 'example';

sSqlStatementread: STRING(255) := 'SELECT qtyinstock FROM vtiger_products WHERE productid = 15';
sSqlStatementwrite: STRING(255);

asResult: ARRAY [1..255] OF STRING(255);
usiCountOfStrings: USINT;
END_VAR
SQLstartread;
fbMySqlClient(xExecute:=SQLstartread,sUser:=sUser, sPassword:=sPassword,sipAddr:=sIpAddr,sDatabase:=s Database,sSqlStatement:=sSqlStatementread);
fbMySqlClient.asResult[1];
fbMySqlClient.xDone;
fbMySqlClient.xError;
fbMySqlClient.usiCountOfStrings;
fbMySqlClient.xBusy;
fbMySqlClient.xOverFlow;

Евгений Кислов
17.05.2021, 14:05
Выложите проект - а то сейчас, например, всё равно непонятно, что такое SQLstartread и где оно объявлено.

oif
17.05.2021, 16:42
Выложите проект - а то сейчас, например, всё равно непонятно, что такое SQLstartread и где оно объявлено.

Хорошо,переписал пример на ST. Подставляю в него параметры своего сервера, не работает.
Беру оригинальный пример на CFC ставлю параметры сервера своего, все работает.
Не понимаю, почему.
Подскажите, что не так делаю.

oif
17.05.2021, 18:30
а с чего вдруг стали ненужны пробелы между ключом и именем, такие как пользователь и пароль
Все значения переменные вроде получают,корректно.Вы думаете в этом проблема? Я попробую завтра,но что-то никогда не обращал на это внимание.

Евгений Кислов
18.05.2021, 07:01
Пример корректного кода на ST:



fbMySqlClient(xExecute:=xSendCommand,sUser:=sUser, sPassword:=sPassword,sipAddr:=sIpAddr,sDatabase:=s Database,sSqlStatement:=sSqlStatement);

IF fbMySqlClient.xDone THEN
asResult := fbMySqlClient.asResult;
usiCountOfStrings := fbMySqlClient.usiCountOfStrings;
END_IF


55146

oif
18.05.2021, 10:35
Пример корректного кода на ST:



fbMySqlClient(xExecute:=xSendCommand,sUser:=sUser, sPassword:=sPassword,sipAddr:=sIpAddr,sDatabase:=s Database,sSqlStatement:=sSqlStatement);

IF fbMySqlClient.xDone THEN
asResult := fbMySqlClient.asResult;
usiCountOfStrings := fbMySqlClient.usiCountOfStrings;
END_IF


55146
Евгений, спасибо большое!
Понял ошибку свою!

Teinrus
26.07.2024, 15:24
Примерно аналогичная ситуация

sFinish31: STRING(255);
sProstoy: STRING(255):='INSERT INTO "titorovka_lowperformance31" ("startdata","starttime") VALUES ($'';
sString2: STRING(255):='$'::date,$'';
sString3: STRING(255):='$'::time';
sString4: STRING(255):=',$'';
sString5: STRING(255):='$',$'';
sString6: STRING(255):='$')';
sReturnId31: STRING(255):=') RETURNING "titorovka_lowperformance31"."id"';

sFinish31:= OSU.CONCAT8(
sProstoy,
dataTemp,
sString2,
timeTemp,
sString3,
sReturnId31,
);

fbPostgreSqlClientInsert31(
xExecute:=xStartInsert,
sUser:=sUser,
sPassword:=sPassword,
sIpAddr:=sIpAddr,
sDatabase:=sDatabase,
sSqlStatement:=sFinish31);

IF fbPostgreSqlClientInsert31.xDone THEN
//SQL_FORMAT(asData:=fbPostgreSqlClientInsert31.asRe sult,
// iStringCount:=fbPostgreSqlClientInsert31.usiCountO fStrings);
//awsResult31:=SQL_FORMAT.awsData;
xStartInsert:=FALSE;

если убрать RETURNING "titorovka_lowperformance31"."id"' то запись происходит но мне нужен id для следующих действий в CFC работает в ST нет не пойму в чем проблема. и при этом xDone всегда отрабатывает.
Запрос который не работает 'INSERT INTO "titorovka_lowperformance31" ("startdata","starttime") VALUES ('2024-7-26'::date,'15:33:22'::time) RETURNING "titorovka_lowperformance31"."id"'
Запрос который работает 'INSERT INTO "titorovka_lowperformance31" ("startdata","starttime") VALUES ('2024-7-26'::date,'15:33:22'::time)'

Евгений Кислов
26.07.2024, 16:39
в CFC работает в ST нет

Т. е. при использовании CFC запрос с RETURNING работает корректно?

Teinrus
27.07.2024, 15:40
Да, приэтом в нескольких программных блоках.

Евгений Кислов
27.07.2024, 17:02
Да, приэтом в нескольких программных блоках.

Тогда сравните, чем отличается рабочая реализация на CFC от нерабочей на ST.