Запись из Modbus в MS SQL Server

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

Запись из Modbus в MS SQL Server

Сообщение Igor_Nekto »

Проблема при записи измеренного значения из переменной Modbus в базу MS SQL Server.
Имеется переменная замера Modbus под именем "TinAVO":
Скриншот окошка настроек переменной:
Ссылка на скриншот окошка настроек переменной: https://cloud.mail.ru/public/2XqS/YhEdVc44B
Изображение

Имеется переменная SQL тестовая под именем "SQL_TinAVO-Test":
Скриншот окошка настроек переменной: https://cloud.mail.ru/public/2sKQ/5sPsLVSKG
Ссылка на скриншот окошка настроек переменной:
Изображение
Со скриптом при чтении:
NSERT INTO STAVR_bd.dbo.Attr532 (
ObjectClassID
, P5940 --Имя переменной
, P5941 --Величина измерения
, P5942 --Дата-время измерения от OPC
)
VALUES (
532
, 'Tвход-TECT' --Имя переменной
, 999 --Item(TinAVO) --Величина измерения ТЕСТОВАЯ
, getdate() --Дата-время измерения от OPC
)

Имеется переменная SQL под именем "SQL_TinAVO-Real" для записи реального значения:
Ссылка на скриншот окошка настроек переменной: https://cloud.mail.ru/public/2CXe/4LdDg4oQ8
Скриншот окошка настроек переменной:
Изображение
Со скриптом при чтении:
INSERT INTO STAVR_bd.dbo.Attr532 (
ObjectClassID
, P5940 --Имя переменной
, P5941 --Величина измерения
, P5942 --Дата-время измерения от OPC
)
VALUES (
532
, 'Tвход-Реальная' --Имя переменной
, Item(TinAVO) --Величина измерения реальная
, getdate() --Дата-время измерения от OPC
)

В результате в базу записывается только значения Тестовой переменной.
Какую ошибку я допускаю при записи "SQL_TinAVO-Real"?
admin
Администратор
Сообщения: 578
Зарегистрирован: 05 сен 2010, 00:51

Re: Запись из Modbus в MS SQL Server

Сообщение admin »

Для аргументированного ответа необходимы данные.
Вышлите на lectussoft@gmail.com:
1) Суть проблемы;
2) Используемую конфигурацию *.cfg;
3) Лог работы *.log из каталога Log папки профиля (через меню "Настройка" - "Папка профиля");
4) Отчеты об ошибке *.txt из каталога BugReport папки профиля (если есть).
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Re: Запись из Modbus в MS SQL Server

Сообщение Igor_Nekto »

Разобрался с проблемой, но очень неудобным способом.
Причина была в том, что реальные получаемые данные - вещественного типа, а разделителем дробной части служит "запятая". Перенастраивать в самом Windows на "точку" нет возможности, т.к. другие программы требуют именно такую настройку. А в самом Lectus подобной настройки не обнаружил.
Проблему решил конвертацией "Real" в "Строку" (в отдельной "составной переменной), замены "запятой" на точку (тоже пришлось повозиться, ибо в числе напрямую через функцию Replace(s,t,v) "запятая" на "точку" не заменяется, да ещё пришлось обрамлять в апострофы, чтобы обработалось в SQL-запросе), и записи в базу уже конвертируемого числа из полученной строки.

Вот те формулы, что применил:
Переменная TinAVOtext - "Составная":
Item(TinAVOtext):=
Insert(
Insert(
Replace(
String(Item(MKU0023.MTS.Modbus.SMH4.TinAVO))
,".",Char(65) )
,"'",1)
,"'", Length(Item(MKU0023.MTS.Modbus.SMH4.TinAVO))+2
)
Первый Insert - Добавляет апостроф после числа.
Второй Insert - Добавляет апостроф перед числом.
Replace - заменяет:
- в замеренном значении из переменной ModBus "MKU0023.MTS.Modbus.SMH4.TinAVO"
- ищет разделитель целой и дробной части "точку" (подобрано опытным путём, т.к. "запятой" в величине не обнаружено, а когда используется в Item - точка заменяется на запятую по настройкам Windows)
- и заменяет на букву "А" латинскую (мог быль любой другой буквой).

Пример результата калькуляции TinAVOtext:
Из Modbus получили значение: 29.2043514251709 (Lectus разделителем ставит сразу точку, но при попытке напрямую вставить в SQL точка заменяется на запятую, по настройкам Win, и получается ошибка в SQL-запросе).
Вот лог:
09:54:04.185 [9648] Ошибка при выполнении скрипта.
Скрипт: INSERT INTO STAVR_bd.dbo.Attr532 (
ObjectClassID
, P5941 --Величина измерения
)
VALUES (
, 29,2043514251709
)

Результат вычисления TinAVOtext по формуле: 29A2043514251709
А вот если вместо "A" сразу вставлять "." - почему-то всё равно результат в логе с ","

Переменная SQL_TinAVO_Real - "Составная":
INSERT INTO STAVR_bd.dbo.Attr532 (
, P5941 --Величина измерения
)
VALUES (
, cast(
REPLACE(
Item(MKU0023.MTS.Calc.SMH4.TinAVOtext)
,Char(65)
,Char(46))
as real)
)
Тут уже в Replace заменяет:
- в текстовом значении MKU0023.MTS.Calc.SMH4.TinAVOtext
- ищет букву "А" латинскую.
- заменяет на "запятую".

Но подобные "танцы с бубнами" мне кажутся неудобными. Если имеется какая-то возможность решить проблему другим способом - буду благодарен.
Запрашиваемые данные отправлю Вам на указанную электронку. Но, возможно решение будет где-то на поверхности.
admin
Администратор
Сообщения: 578
Зарегистрирован: 05 сен 2010, 00:51

Re: Запись из Modbus в MS SQL Server

Сообщение admin »

Установите параметр:
«Настройки» - «Параметры» - «Разные» - «Дополнительно» - «Параметризированный SQL скрипт»
Igor_Nekto
Сообщения: 25
Зарегистрирован: 17 авг 2019, 01:32

Re: Запись из Modbus в MS SQL Server

Сообщение Igor_Nekto »

Да, всё получилось!
Благодарю, вопрос решён.
Ответить

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость