Стартовая страница › Форумы › Разработка и интеграция › ModArcMSSql
- В этой теме 77 ответов, 5 участников, последнее обновление 5 месяцев, 3 недели назад сделано Mikhail.
-
АвторСообщения
-
22.09.2022 в 13:34 #25174MikhailМодератор
По использованию SQL-сервера для .NET6 смогу помочь, только когда будет переводиться модуль экспорта или драйвер импорта из БД.
У Вас архив PostgreSQL из дистрибутива работает или тоже ошибка?
22.09.2022 в 13:42 #25176JurasskParkУчастникТоже ошибка. я про это и писал в сообщении
https://forum.rapidscada.ru/?topic=modarcmssql&paged=2#post-2504610.11.2022 в 22:19 #25958JurasskParkУчастникВопрос на обсуждение.
Начнем издалека.
Когда система работает быстро в многопоточном режиме, ворочает десятками тысяч тегов — это всё круто и здорово.
В автоматизации за свои 15 лет я 7 лет работаю с Wonderware System Platform и АРМ, где больше 3000 тегов я видел только два. В основном АРМ не превышает 500-1000 тегов. Средний АРМ. (Сейчас кто-то скажет, что мол у него 100.000 тегов на АРМ есть, допустим, а вот как OPC-сервер справляется с таким большим количеством тегов? После подключения ждать 1 минуту, а появление данных?=) А еще такие OPC-сервера любят теги последние не прогружать)…
Так вот я на ModArcMSSql «подзабил» и разрабатывал скелет, как генерировать скрипты для создания таблиц, запросов, как сравнивать таблицы и находить расхождения, а на основе расхождения генерировать запросы — обновления.
Когда я с этим закончил, то решил через драйвер (!не модуль, а именно драйвера коммуникатора) вставить данные в SQL. И если подключение к серверу RapidSCADA, получения текущих значений через клиент TCP происходит быстро — 1-3 секунды, может даже меньше, то вот пройтись по каждому тегу, получить текущие данные и сгенерировать SQL-запрос, то на 1000 тегов уходит 160 секунд.
Естественно, можно разбивать и делать сколько угодно устройств, чтобы каждый драйвер это отдельный был поток.
Вопрос вот в чем. На 1000 тегов вставка около 2 минут — это норм или дофига много?-------------------------------------------------------------------------------- 2022-11-11 00:03:59 Запуск линии связи [2] ExportDB [2022-11-11 00:04:01.700] [INFO] [Получено с сервера 999 каналов, активных каналов 999 штук] 2022-11-11 00:04:01 Сеанс связи с устройством [2] ExportData [2022-11-11 00:04:01.705] [EXECUTE] [START] + 2022-11-11 00:04:01.70567 [2022-11-11 00:04:01.706] [INFO] [VALUE] + 16241 [2022-11-11 00:04:01.706] [INFO] [bit00] + 1 [2022-11-11 00:04:01.706] [INFO] [START] + 2022-11-11 00:04:01.70665 [2022-11-11 00:05:53.561] [INFO] [STOP ] + 2022-11-11 00:05:53.56181 [2022-11-11 00:05:53.562] [EXECUTE] [STOP] + 2022-11-11 00:05:53.56217 2022-11-11 00:05:53 Сеанс связи с устройством [2] ExportData [2022-11-11 00:05:53.839] [EXECUTE] [START] + 2022-11-11 00:05:53.83991 [2022-11-11 00:05:53.840] [INFO] [VALUE] + 16241 [2022-11-11 00:05:53.840] [INFO] [bit00] + 1 [2022-11-11 00:05:53.840] [INFO] [START] + 2022-11-11 00:05:53.84075 [2022-11-11 00:07:45.724] [INFO] [STOP ] + 2022-11-11 00:07:45.72460 [2022-11-11 00:07:45.724] [EXECUTE] [STOP] + 2022-11-11 00:07:45.72492 2022-11-11 00:07:45 Сеанс связи с устройством [2] ExportData [2022-11-11 00:07:45.989] [EXECUTE] [START] + 2022-11-11 00:07:45.98937 [2022-11-11 00:07:45.989] [INFO] [VALUE] + 16241 [2022-11-11 00:07:45.990] [INFO] [bit00] + 1 [2022-11-11 00:07:45.990] [INFO] [START] + 2022-11-11 00:07:45.99073 [2022-11-11 00:09:38.028] [INFO] [STOP ] + 2022-11-11 00:09:38.02830 [2022-11-11 00:09:38.028] [EXECUTE] [STOP] + 2022-11-11 00:09:38.02867
10.11.2022 в 23:18 #25959JurasskParkУчастникЗабыл добавить, что это в синхронном режиме.
11.11.2022 в 06:22 #25960RomirosУчастникМожет быть подход к решению задачи неправильный? Почему на каждый тег отдельный запрос, а не одним запросом вставить 1000 тегов? Перебирать по одному мне кажется в любом случае будет затратно.
11.11.2022 в 08:35 #25961JurasskParkУчастникЯ с вами согласен, но затрата то идёт на
`
currentData = Program.client.GetCurrentData(new int[1]
{
num
}, true, out Program.cnlListID);
‘
Сервер офигевает, если к нему 1000 клиентов подключается одновременно, значит нужно сразу получить массив значений (срез текущий) по всем тегам…+ Я еще подумал, что можно же и файл current.dat читать… это быстрее 🙂
Я наоборот, написал чтение файлов .dat, а потом захотел всё через TCP-сервер делать.- Этот ответ был изменен 1 год, 5 месяцев назад от JurasskPark.
11.11.2022 в 11:50 #25967RomirosУчастникТак Вы и можете запросить сразу весь срез с нужными каналами. В 6 версии в этом большие улучшения в том числе и в архивных срезах.
Теперь можно использовать разные подходы для извлечения данных в зависимости от задачи.11.11.2022 в 13:10 #25968JurasskParkУчастникА для тупых и криворуких можете подсказать «как это сделать?» =D
11.11.2022 в 15:59 #25972MikhailМодераторНа 1000 тегов вставка около 2 минут — это норм или дофига много?
Субъективно, это медленно. Рекомендую сравнить с конкретными числами. Например, установить PostgreSQL и писать в его архив имеющимся модулем. Можно использовать проект HelloWorld, поставив запись в архив по изменению и уменьшив таймаут опроса Simulator.
Для увеличения скорости, откройте транзакцию, выполните примерно сотню инсертов и затем сделайте коммит, если сейчас так не делаете.
11.11.2022 в 22:34 #25975JurasskParkУчастникПроблема решена, тем, что я понял, что можно передавать массив каналов =D.
11.11.2022 в 23:37 #25976JurasskParkУчастникhttps://www.youtube.com/watch?v=qF0XNWFwIjo
Короче, я доволен. 🙂12.11.2022 в 17:57 #25977JurasskParkУчастникhttps://www.youtube.com/watch?v=UjwPyfmv6Yc
10000 запросов за 2 секунды)12.11.2022 в 20:14 #25978JurasskParkУчастникhttps://www.youtube.com/watch?v=5ipDV-ra9CU
Продолжаю баловаться и вот что я понял.
Если вставлять данные в MSSQL и просить его вставить дату, через GETDATE(), то он запрос выполнит, но вот в зависимости от его нагрузки или от скорости отработки кода, загрузки ПК (памяти и процессора), выполнить это можно с запаздыванием, поэтому лучше сразу один раз определить дату вставки, когда сгенерировался срез данных и её везде использовать в скрипте.P.S. Еще я нашел баг, когда я брал элемент у количества команд — я не знал, что там ограничение на 100 шт, поэтому в DBImport ограничение на количество тегов в 100 шт.
=D
Чуть позже это исправлю. Или сделаю как доп. опцию за деньги. XD13.11.2022 в 09:58 #25979manjey73Участниккак опцию за деньги придется еще повозиться 🙂
14.11.2022 в 10:45 #25988MikhailМодератор@jurasskpark, пишите по мере прогресса в разработке или появления вопросов
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.