Драйвер ODBC

Просмотр 15 сообщений - с 106 по 120 (из 136 всего)
  • Автор
    Сообщения
  • #36013
    Oleg
    Участник

    Наконец попробовал — спасибо!
    Теперь с чтением проблемы определенные.
    Драйвер зачем-то создает лишние каналы, по фото более наглядно)

    https://disk.yandex.ru/i/KTG1mvgVivD2Cw

    https://disk.yandex.ru/i/KX8qbCFt_G_1ZQ

    #36014
    manjey73
    Участник

    Это массивы, предполагаю для строковых переменных.
    От этого не уйти если нужна вся строка а не только первые 8 байт строки.

    а, или чуть-чуть что-то не доделано. я вроде одной строкой выводил в лог устройства.

    • Ответ изменён 1 год, 6 месяцев назад пользователем manjey73.
    #36016
    JurasskPark
    Участник

    Совершенно верно @manjey73 написал.
    Это в предпоследней версии появилось, что когда вы указываете переменную Tag тип строковый, то указываете, сколько там будет максимально символов.
    Соответственно, в системе под эти теги фиксируются теги, чтобы случайно не создать тег.

    А вы как-то придумали обход, как писать теги строковые. И наверное, сами делили в скрипте.

    В итоге ваше технология делениям строки на теги, сошлась с моей.

    Просто обычно самая большая проблема для обычных людей мутить со скриптами.

    #36017
    manjey73
    Участник

    Вроде из самого драйвера можно задавать какой длины будет переменная. Тогда это в логе устройства выглядит одним тегом.
    Например в дрв 61107 серийный номер с длиной 2. В логе устройства одна строка.

    • Ответ изменён 1 год, 6 месяцев назад пользователем manjey73.
    #36019
    manjey73
    Участник

    Другой пример, это драйвер Симулятора, где каждый элемент массива это свое значение.
    В общем подхода два для разных случаев.

    На счёт скриптов там да, неудобно.
    Дело в том, что одна и та же формула подставляется в каждый элемент массива.
    Надо вычислять индекс массива и выполнять или не выполнять.
    По идее, если индекс 0, то собираем весь массив во что нам надо, остальные побоку 😀

    • Ответ изменён 1 год, 6 месяцев назад пользователем manjey73.
    #36023
    JurasskPark
    Участник

    https://forum.rapidscada.ru/?topic=драйвер-odbc&paged=6#post-34877

    Вот мой пост. Там даже скриншот есть. )

    #36024
    manjey73
    Участник

    1

    String_Log

    Я вот об этом, если это строка как одно значение тега, зачем же ее так насиловать то?
    Формула для версии 6 будет другая? ну это наверное меньшее из зол.

    Минусы — при неизвестной длине строки из ответа непонятно сколько задавать длину. Хотя этот же минус если вы разрываете строку на отдельные элементы массива и теги в том числе.

    Если это блок данных, по принципу драйвера Симулятора — то да, надо создавать несколько тегов.
    Если это строка — зачем?
    Не, ну в качестве варианта предположим, но в целом зачем? 🙂

    #36025
    manjey73
    Участник

    з.ы. в очередной раз не понимаю стойкое нежелание Михаила сделать строковую БД, чтобы вот не было вот этих вот сколько надо задать элементов, как их потом обрабатывать и т.д. 🙂

    Учитывая что в БД в канале и так есть вся инфа, что этот тег Строка ASCII или Unicode и то, что это самое главное СТРОКА. 🙂

    #36026
    JurasskPark
    Участник

    Чтобы никто не забыл и не занял пустое номер канала(тега), который физически не сохраняется при таком подходе.
    А там при импорте тегов из коммуникатора в базу конфигурации создаются физически параметры и администратор на их месте не создаст новый тег.

    Михаил объяснял, что для это придется создать новый рядом элемент, который будет занимать место и память.
    А это быстродействие.

    Я бы для таких вещей придумал бы просто новый тип БД, как для Сигнализации авари и событий. И у тега(канала) в конфигурации в Маске архива выбирали строковый архив.

    Но может такой архив можно сделать самостоятельно. Подкладывать ему. А вот как веб научить оттуда тянуть данные — уже вопрос. )

    #36027
    manjey73
    Участник

    да нет там вопросов, недоделки только 🙂

    есть канал 100, есть его длина 3 (например)
    Когда Администратор добавляет следующий канал, он добавляется с номером 101 — вот почему Администратор не смотрит, что у предыдущего канала длина задана другая?
    Это чистой воды недоработка. Сам так постоянно нарываюсь.

    Опять же — есть канал 100 с длиной 3 и это СТРОКА. Учитывая, что в БД мы можем делать нумерацию с разрывами 100-150, 200-250 и для БД это нормально, есть id канала в базе.
    То почему тот же Администратор, WEB, Сервер, зная, что канал СТРОКА тут же не могут обратиться с строковой БД, где будут непосредственно строки с каналами 100 и 200 например ?
    То же со Временем.
    Вполне можно было выделить Строки и Время в отдельные БД с теми же названиями + префикс даже на этапе простого создания архива.

    • Ответ изменён 1 год, 6 месяцев назад пользователем manjey73.
    #36258
    JurasskPark
    Участник

    https://rutube.ru/video/private/b07143ccd2366be0854bbb1d045a5652/?p=KL2yEPhLWJDdW1NK5vSJ9A

    Вообщем, я исправил всё про что говорили, давно бы опубликовал… НО!!!
    При попытке отправить команды без кода команды, валится ошибка, но команда выполняется.
    Решил посмотреть как в DrvDbImport, а там отправка команды только через код команды.
    Смотрю другой драйвер.

    
           /// <summary>
           /// Finds a command configuration by command code or number.
           /// </summary>
           private bool FindCommandConfig(TeleCommand cmd, out DbCommand dbCommand)
           {
               if (dataSource.ExportCommandsCode != null && 
                   !string.IsNullOrEmpty(cmd.CmdCode) &&
                   dataSource.ExportCommandsCode.TryGetValue(cmd.CmdCode, out dbCommand))
               {
                   return true;
               }
    
               if (dataSource.ExportCommandsNum != null && 
                   cmd.CmdNum > 0 &&
                   dataSource.ExportCommandsNum.TryGetValue(cmd.CmdNum, out dbCommand))
               {
                   return true;
               }
    
               dbCommand = null;
               return false;
           }
    

    В итоге я сошёл с ума и не понимаю, почему команда без кода тега не выполняется. Думаю забить на это уже… 🙁

    P.S. кому музыка в ролике не нравится, можете выключить звук. 🙂

    #36259
    manjey73
    Участник

    Там вроде проверку как-то делать надо, по которой определяется номер или код.

    #36260
    JurasskPark
    Участник

    Так я ее делаю. FindCommandConfig.
    Вопрос почему самому SQL серверу не нравится такая команда…

    #36261
    manjey73
    Участник

    SendCommand(TeleCommand cmd)

    cmd.CmdNum — собственно номер команды
    cmd.CmdCode != «» — можно проверить, что код команды пустой.

    #36262
    JurasskPark
    Участник

    Так команда находиться.
    Вопрос не в нахождении, а в выполнении.
    https://github.com/JurasskPark/RapidScada_v6/blob/05f3ac4e2474680d70d9ac3fbeb29baf85ad9ae6/OpenDrivers/DrvDbImportPlus_v6/DrvDbImportPlus.Logic/DevDbImportPlusLogic.cs#L819

    Я думаю проблема в while (RequestNeeded(ref tryNum))
    Поиосwhile (RequestNeeded(ref tryNum)) что она возвращает tryNum через RequestNeeded , а я не понимаю что это такое. )))

Просмотр 15 сообщений - с 106 по 120 (из 136 всего)
  • Для ответа в этой теме необходимо авторизоваться.