Работа с архивами значений

Стартовая страница Форумы Разработка и интеграция Работа с архивами значений

Просмотр 15 сообщений - с 1 по 15 (из 48 всего)
  • Автор
    Записи
  • #12386
    talbutdinov
    Участник

    Доброго времени суток! Ведем разработку драйвера, который будет получать значения от устройств сети LoRaWAN. Данные устройства сами передают на свой сервер один раз в час, например в 13-05 предаются пакеты данных с показаниями на 13-00. Передача может произойти и 13-10 и в 13-15, но передаваться будут данные по состоянию на 13-00 и т.д. Сервер принимает эти данные и записывает все пакеты с указанием времени среза. Драйвер Scada будет забирать раз в час такие пакеты, разбирать их и должен прописывать в архив с указанием время среза, так как обновление данных в 13-35 покажет срез на 13-00. Тем более драйвер может подтянуть пропущенные срезы данных, если вдруг были обрывы связи.

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

    #12387
    Romiros
    Участник

    Да есть пример работы с архивным срезом. Смотрите KpTest в OpenKps.

    #12412
    talbutdinov
    Участник

    Все нашел, спасибо! Теперь еще один вопрос по драйверам. Первоначальную версию 1.0.0.1 я загрузил в коммуникатор для тестирования без формы настройки, просто для теста. Все подгрузилось и все отображалось. Далее я добавил форму настройки и вывод тестовых значений и обозвал версией 1.0.0.2 и перезалил в коммуникатор. Такое ощущение у меня, что версия не изменилась в конфигурации так как при нажатии на кнопке свойства выдает сообщение, что такого нет в данном драйвере, а значения тестовые так и не выводятся. Как правильно менять одну версию драйвера на другую?

    #12413
    talbutdinov
    Участник

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

    Итак собственно код, что в нем не так может подскажите:

    base.Session();
    
    TagSrez srez = new TagSrez(1);
    srez.DateTime = DateTime.Now;
                
    srez.KPTags[1] = KPTags[1];
    SetCurData(1, 1, 1);
    srez.TagData[1] = curData[1];
    
    srez.KPTags[2] = KPTags[2];
    SetCurData(2, 2, 1);
    srez.TagData[2] = curData[2];
    
    srez.Descr = "Дата обновления " + DateTime.Now;
    AddArcSrez(srez);
    CommLineSvc.FlushArcData(this);
    
    CalcSessStats();

    Если я все правильно понял, то этой строкой создаем срез TagSrez srez = new TagSrez(1); только не совсем ясно что за параметр (1) и что он означает.

    Дальше в срезе указываем ссылки на свои теги srez.KPTags[1] = KPTags[1];
    Дальше задаем значение, только не совсем понял для чего SetCurData(1, 1, 1);
    Дальше присваиваем заданное значение в срез srez.TagData[1] = curData[1];

    Вот такая ошибка в итоге у меня получается: 2019-06-24 17:09:40 Ошибка при выполнении сеанса опроса КП 1 "Прачка": Index was outside the bounds of the array.

    Подскажите пожалуйста где я что-то не так сделал?

    #12414
    talbutdinov
    Участник

    Еще вопросик: как можно получить из текущего подключения данные, а именно Host, TcpPort, а также пользовательские параметры линии.

    #12415
    manjey73
    Участник

    Со срезами не подскажу, еще не разбирался, а
    SetCurData(номер тега начиная с 0, Значение в double, Статус канала);

    Нумерация тегов формируется драйвером и это та таблица, которая отображается в Коммуникаторе. смотрите в KpTest

    public KpTestLogic(int number)
                : base(number)
            {
                random = new Random();
                CanSendCmd = true;
    
                List<TagGroup> tagGroups = new List<TagGroup>();
                TagGroup tagGroup = new TagGroup("Group 1");
                tagGroup.KPTags.Add(new KPTag(1, "Tag 1"));
                tagGroup.KPTags.Add(new KPTag(2, "Tag 2"));
                tagGroup.KPTags.Add(new KPTag(3, "Tag 3"));
                tagGroup.KPTags.Add(new KPTag(4, "Tag 4"));
                tagGroup.KPTags.Add(new KPTag(5, "Tag 5"));
                tagGroups.Add(tagGroup);
    
                tagGroup = new TagGroup("Group 2");
                tagGroup.KPTags.Add(new KPTag(6, "Tag 6"));
                tagGroup.KPTags.Add(new KPTag(7, "Tag 7"));
                tagGroup.KPTags.Add(new KPTag(8, "Tag 8"));
                tagGroup.KPTags.Add(new KPTag(9, "Tag 9"));
                tagGroup.KPTags.Add(new KPTag(10, "Tag 10"));
                tagGroups.Add(tagGroup);
    
                InitKPTags(tagGroups);
            }

    Здесь создаются меню — TagGroup tagGroup = new TagGroup(«Group 1»);
    и сами теги tagGroup.KPTags.Add(new KPTag(Номер сигнала, «Имя тега»));
    Но нумерация у них будет с нуля и сквозная, по этому если хотите делать свою нумерацию сигналов, разрывать ее, делать динамическую с разрывом и т.д. надо предпринять шаги, например создавать словарь или список, где вы свяжете свою нумерацию с индексацией списка тегов.

    Теги можно формировать в разделе OnAddedCommLine

    #12416
    Romiros
    Участник

    Вам правильно написали, индекс тега смещается на -1, поэтому у Вас выскакивает ошибка.
    SetCurData это для текущих данных, для архивов не нужно.
    newTagSrez(1) — создание массива тегов размером 1, здесь ставите нужное Вам количество тегов в срезе.

    #12417
    Romiros
    Участник

    Используйте класс CommUtils для извлечени host и port

    #12418
    manjey73
    Участник

    применительно к примеру KpTest и другим похожим индекс тега да, -1.
    Но применительно к своей нумерации сигналов не катит. Надо самому сохранять соотношение № сигнала = № тега.

    Например у меня сигнал может быть под номером 40, а тег будет = 0

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

    Первоначальную версию 1.0.0.1

    Рекомендую начинать версии на 5.x, первая цифра — это номер поколения Rapid SCADA.

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

    Такое ощущение у меня, что версия не изменилась

    Используйте отладчик. Здесь на форуме можно найти информацию, как подключиться к драйверу из отладчика.

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

    только не совсем ясно что за параметр (1) и что он означает.

    Когда Вы подключаете к проекту ScadaCommCommon.dll, в той же директории должен лежать ScadaCommCommon.xml. Тогда при нажатии Ctrl + Пробел после скобки, у Вас высветится список аргументов. Также полезно найти соответствующий метод в исходниках, и его работа зачастую проясняется.

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

    как можно получить из текущего подключения данные, а именно Host, TcpPort,

    Если используется стандартное свойство Connection, то в чистом виде никак, потому что это может быть последовательный порт.

    а также пользовательские параметры линии

    Посмотрите KpReqParams, если не ошибаюсь. Вообще откройте исходники базового класса KpLogic и посмотрите, какие полезные методы и свойства доступны.

    #12428
    talbutdinov
    Участник

    Используйте класс CommUtils для извлечени host и port

    Нашел CommUtils.ExtractHostAndPort, но нет описания по входящим параметрам. Два последних я так понял возвращают адрес и порт, а вот какие первых два параметра входных не ясно, если порт по умолчанию еще догадываюсь, а вот что передавать первым параметром?

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

    Исходники ExtractHostAndPort

    ExtractHostAndPort(string callNum, int defaultPort, out string host, out int port)
    callNum — это позывной из параметров опроса КП в формате хост:порт
    defaultPort — порт по умолчанию, который вернётся, если порт не указан в 1-м аргументе метода

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