Igor_Nekto » 22 авг 2019, 01:05
Видимо, я туплю, но прошу пояснить:
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(...) корректно подхватывает значение переменной, и скрипт записывает строчку в базу.
Видимо, я туплю, но прошу пояснить:
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(...) корректно подхватывает значение переменной, и скрипт записывает строчку в базу.