Запись данных в MySQL

Вопросы по программе Lectus Modbus OPC/DDE server
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Запись данных в MySQL

Сообщение Igor_Nekto »

Перевожу запись данных в MySQL (ранее работал с записью в MS SQL Server).
Изучил тему "LectusOPC + ПЛК100 (50шт) + mySQL + ....".
По ней подключил базу MySQL "MKU", расположенную на том же компе, что и Lectus.
Строка подключения получилась такой:
Provider=MySqlProv.3.9;Data Source=MKU;Integrated Security="";Password=12345;User ID=root;Location=localhost;Extended Properties=""
Тест проходит - "Подключение Ok".
Запрос в самом MySQL - срабатывает корректно. Записи в таблицу "inputvalue" - вставляются нормально.
А вот в Lectus - нет.
Лог выдаёт следующий:
--------------------------------
23:48:40.003 [3856] Ошибка при выполнении скрипта.
Скрипт: INSERT INTO MKU.inputvalue (
NameParam
, ValueParam
, DateTimeOPC
)
VALUES (
'Tвход в АВО'
, 999
, now()
);
Произошла одна или несколько ошибок во время обработки команды
--------------------------------
При просмотре темы "LectusOPC + ПЛК100 (50шт) + mySQL + ....", вроде как, была та же ошибка, но вот как от неё избавились - так и не понял.
В чём же тут ошибка?
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Re: Запись данных в MySQL

Сообщение Igor_Nekto »

Кажется, проблема в русском тексте для параметра NameParam.
Нижеуказанный скрипт срабатывает:
INSERT INTO MKU.inputvalue (
NameParam
, ValueParam
, DateTimeOPC
)
VALUES (
'TinAVO'
, 999
, now()
);
В принципе - совсем не критично, но... Может есть некие настройки для "русификации MySQL"? К тому же через "MySQL Workbench" - запрос с русским текстом вставляется корректно...
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Re: Запись данных в MySQL

Сообщение Igor_Nekto »

А вот при использовании функции обращения к переменной Modbus - опять выдаёт ругается.
Скрипт записи в SQL вот такой:
----------------------------------
INSERT INTO MKU.inputvalue (
NameParam
, ValueParam
, DateTimeOPC

)
VALUES (
'TinAVO'
,Item(MKU0023.MTS.Modbus.SMH4.TinAVO)
, now()
);
----------------------------------
А вот в Логе - функция Item вообще меняется в написании, скорее всего в этом и дело:
----------------------------
00:40:42.324 [3856] Ошибка при выполнении скрипта.
Скрипт: INSERT INTO MKU.inputvalue (
NameParam
, ValueParam
, DateTimeOPC

)
VALUES (
'TinAVO'
,:Item_MKU0023_MTS_Modbus_SMH4_TinAVO_
, now()
);
Произошла одна или несколько ошибок во время обработки команды
------------------------------------
Где я опять совершаю ошибку?
Версия Lectus - 3.9 сборка 133.
admin
Администратор
Сообщения: 578
Зарегистрирован: 05 сен 2010, 00:51

Re: Запись данных в MySQL

Сообщение admin »

Посмотрите в каком виде SQL запрос доходит до SQL сервера. Попробуйте выполнить его в SQL Explorer. Анализируйте ошибки
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Re: Запись данных в MySQL

Сообщение Igor_Nekto »

Видимо, я туплю, но прошу пояснить:
1. Как посмотреть, в каком виде SQL запрос доходит до SQL сервера?
У меня MySQL установлен на тот же комп, где и Lectus. Работаю с MySQL через "MySQL Workbench 6.3 CE".
Где мне нужно смотреть?
2. Что значит, "Попробуйте выполнить его в SQL Explorer"?
Сам скрипт, имеющийся в переменной SQL Lectus, без мелкой редакции не выполнится нигде, кроме самого Lectus. Просто не обработает функцию "Item(SMH4.TinAVO)".
Если же я откорректирую скрипт запроса, и вместо "Item(SMH4.TinAVO)" поставлю "123" - то подобный запрос корректно выполняется и в "MySQL Workbench 6.3 CE" и в самом Lectus (т.е., данные будут записываться в базу MySQL "MKU.inputvalue"):
-----------------------
INSERT INTO MKU.inputvalue (
ValueParam
, DateTimeOPC
)
VALUES (
123
, now()
);
-----------------------

3. Какие ошибки анализировать?
Единственная ошибка, которая появляется - это ошибка в Log-файле.
Имеется переменная Modbus - "TinAVO": читает по адресу "C" величину типа "Single Float". Читается корректно, отображает величину "29,204".
Имеется переменная SQL - "MySQL_TinAVO_Real". В ней имеется скрипт, исполняемый при чтении:
-----
INSERT INTO MKU.inputvalue (
ValueParam
, DateTimeOPC
)
VALUES (
Item(SMH4.TinAVO)
, now()
);
-----
И при запуске опроса в логе появляется текст ошибки следующего содержания:
---------
00:08:31.716 [9120] Ошибка при выполнении скрипта.
Скрипт: INSERT INTO MKU.inputvalue (
ValueParam
, DateTimeOPC
)
VALUES (
:Item_SMH4_TinAVO_
, now()
);
Произошла одна или несколько ошибок во время обработки команды
---------
Как видно, строку
" Item(SMH4.TinAVO)"
Lectus каким-то образом преобразовал в:
" :Item_SMH4_TinAVO_"
Дальнейший анализ выявил следующее:
Если вместо строки " Item(SMH4.TinAVO)" ввести "29,204" - выдаёт ошибку.
Если вместо строки " Item(SMH4.TinAVO)" ввести "29.204" - записывает корректно.
"Танцы с бубнами" с попытками преобразовать в текст, и вставлять как преобразованный текст - не привели к успеху. Едва в SQL-переменной используется функция "Item(...)", как её в логе отображает с "двоеточием" в начале и "подчёркиванием" вместо скобок и точек.

При этом, если используется скрипт с функцией Quality(...), но без функции Item(...) - запись в БД ведётся корректно:
---------------------------
INSERT INTO MKU.inputvalue (
ValueParam
, DateTimeOPC
, QualityOPC
)
VALUES (
444.44
, now()
, Quality(SMH4.TinAVO)
);
---------------------------
Больше не знаю, какой анализ можно проводить.

Установить вот такую опцию, как советовали при записи в MS SQL
--
Установите параметр:
«Настройки» - «Параметры» - «Разные» - «Дополнительно» - «Параметризированный SQL скрипт»
---
не получится, т.к. нет подобной опции в данной сборке 133.

Установка в "Региональных стандартах" разделителя дробной части с "запятой" на "точку" - результат в логе не поменялся.

При этом, если работать с базой MS SQL - подобный SQL скрипт отрабатывает корректно: функция Item(...) корректно подхватывает значение переменной, и скрипт записывает строчку в базу.
admin
Администратор
Сообщения: 578
Зарегистрирован: 05 сен 2010, 00:51

Re: Запись данных в MySQL

Сообщение admin »

Попробуйте например так:
https://m.habr.com/ru/post/177057/
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Re: Запись данных в MySQL

Сообщение Igor_Nekto »

Как я понял из статьи, "mysql-proxy" перенаправляет на порт 4040 SQL-запросы для MySQL, созданные в PHP, перехватывает, и показывает в "командной строке", или выгружает в файл. Так?
Но как это применить к Lectus?
Выполнив все действия, указанные в статье, при запуске Lectus не получаю никаких данных в окошках "командных строк".
admin
Администратор
Сообщения: 578
Зарегистрирован: 05 сен 2010, 00:51

Re: Запись данных в MySQL

Сообщение admin »

Мы не знакомы с особенностями применения MySQL. Посмотрите в Google возможные инструменты:
https://www.google.ru/search?newwindow= ... itor+mysql
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Re: Запись данных в MySQL

Сообщение Igor_Nekto »

Принято! Благодарю за терпение и качественную информацию.
Последний вариант, который попробовал - удалил версию 2.9 сборки 133 и установил тестовую, v2.10 сборки 33.
Результат не изменился.
Личное сообщение создателю темы "LectusOPC + ПЛК100 (50шт) + mySQL + ...." написать не получается, не находит данного пользователя по его имени. А это, кажется, единственный, кто сумел запустить запись в MySQL из Lectus.
Больше не знаю, куда обращаться.
Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 1 гость