ModArcMSSql

Просмотр 15 сообщений - с 31 по 45 (из 78 всего)
  • Автор
    Сообщения
  • #25174
    Mikhail
    Модератор

    По использованию SQL-сервера для .NET6 смогу помочь, только когда будет переводиться модуль экспорта или драйвер импорта из БД.

    У Вас архив PostgreSQL из дистрибутива работает или тоже ошибка?

    #25176
    JurasskPark
    Участник

    Тоже ошибка. я про это и писал в сообщении
    https://forum.rapidscada.ru/?topic=modarcmssql&paged=2#post-25046

    #25958
    JurasskPark
    Участник

    Вопрос на обсуждение.
    Начнем издалека.
    Когда система работает быстро в многопоточном режиме, ворочает десятками тысяч тегов — это всё круто и здорово.
    В автоматизации за свои 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
    #25959
    JurasskPark
    Участник

    Забыл добавить, что это в синхронном режиме.

    #25960
    Romiros
    Участник

    Может быть подход к решению задачи неправильный? Почему на каждый тег отдельный запрос, а не одним запросом вставить 1000 тегов? Перебирать по одному мне кажется в любом случае будет затратно.

    #25961
    JurasskPark
    Участник

    Я с вами согласен, но затрата то идёт на
    `
    currentData = Program.client.GetCurrentData(new int[1]
    {
    num
    }, true, out Program.cnlListID);

    Сервер офигевает, если к нему 1000 клиентов подключается одновременно, значит нужно сразу получить массив значений (срез текущий) по всем тегам…

    + Я еще подумал, что можно же и файл current.dat читать… это быстрее 🙂
    Я наоборот, написал чтение файлов .dat, а потом захотел всё через TCP-сервер делать.

    • Этот ответ был изменен 1 год, 5 месяцев назад от JurasskPark.
    #25967
    Romiros
    Участник

    Так Вы и можете запросить сразу весь срез с нужными каналами. В 6 версии в этом большие улучшения в том числе и в архивных срезах.
    Теперь можно использовать разные подходы для извлечения данных в зависимости от задачи.

    #25968
    JurasskPark
    Участник

    А для тупых и криворуких можете подсказать «как это сделать?» =D

    #25972
    Mikhail
    Модератор

    На 1000 тегов вставка около 2 минут — это норм или дофига много?

    Субъективно, это медленно. Рекомендую сравнить с конкретными числами. Например, установить PostgreSQL и писать в его архив имеющимся модулем. Можно использовать проект HelloWorld, поставив запись в архив по изменению и уменьшив таймаут опроса Simulator.

    Для увеличения скорости, откройте транзакцию, выполните примерно сотню инсертов и затем сделайте коммит, если сейчас так не делаете.

    #25975
    JurasskPark
    Участник

    Проблема решена, тем, что я понял, что можно передавать массив каналов =D.

    #25976
    JurasskPark
    Участник

    https://www.youtube.com/watch?v=qF0XNWFwIjo
    Короче, я доволен. 🙂

    #25977
    JurasskPark
    Участник

    https://www.youtube.com/watch?v=UjwPyfmv6Yc
    10000 запросов за 2 секунды)

    #25978
    JurasskPark
    Участник

    https://www.youtube.com/watch?v=5ipDV-ra9CU
    Продолжаю баловаться и вот что я понял.
    Если вставлять данные в MSSQL и просить его вставить дату, через GETDATE(), то он запрос выполнит, но вот в зависимости от его нагрузки или от скорости отработки кода, загрузки ПК (памяти и процессора), выполнить это можно с запаздыванием, поэтому лучше сразу один раз определить дату вставки, когда сгенерировался срез данных и её везде использовать в скрипте.

    P.S. Еще я нашел баг, когда я брал элемент у количества команд — я не знал, что там ограничение на 100 шт, поэтому в DBImport ограничение на количество тегов в 100 шт.
    =D
    Чуть позже это исправлю. Или сделаю как доп. опцию за деньги. XD

    #25979
    manjey73
    Участник

    как опцию за деньги придется еще повозиться 🙂

    #25988
    Mikhail
    Модератор

    @jurasskpark, пишите по мере прогресса в разработке или появления вопросов

Просмотр 15 сообщений - с 31 по 45 (из 78 всего)
  • Вы должны авторизироваться для ответа в этой теме.