Стартовая страница › Форумы › Разработка и интеграция › Работа с архивами значений
- В этой теме 47 ответов, 4 участника, последнее обновление 7 лет, 1 месяц назад сделано
talbutdinov.
-
АвторЗаписи
-
23.06.2019 в 16:40 #12386
talbutdinov
УчастникДоброго времени суток! Ведем разработку драйвера, который будет получать значения от устройств сети LoRaWAN. Данные устройства сами передают на свой сервер один раз в час, например в 13-05 предаются пакеты данных с показаниями на 13-00. Передача может произойти и 13-10 и в 13-15, но передаваться будут данные по состоянию на 13-00 и т.д. Сервер принимает эти данные и записывает все пакеты с указанием времени среза. Драйвер Scada будет забирать раз в час такие пакеты, разбирать их и должен прописывать в архив с указанием время среза, так как обновление данных в 13-35 покажет срез на 13-00. Тем более драйвер может подтянуть пропущенные срезы данных, если вдруг были обрывы связи.
Собственно сам вопрос, есть ли где-то описание как работать с архивами. По сути драйвер не будет отображать текущие показания, а будет их добавлять в архив, а Scada будет выводить уже последнее значение из архива на определенное время по срезу.
23.06.2019 в 17:17 #12387Romiros
УчастникДа есть пример работы с архивным срезом. Смотрите KpTest в OpenKps.
24.06.2019 в 15:53 #12412talbutdinov
УчастникВсе нашел, спасибо! Теперь еще один вопрос по драйверам. Первоначальную версию 1.0.0.1 я загрузил в коммуникатор для тестирования без формы настройки, просто для теста. Все подгрузилось и все отображалось. Далее я добавил форму настройки и вывод тестовых значений и обозвал версией 1.0.0.2 и перезалил в коммуникатор. Такое ощущение у меня, что версия не изменилась в конфигурации так как при нажатии на кнопке свойства выдает сообщение, что такого нет в данном драйвере, а значения тестовые так и не выводятся. Как правильно менять одну версию драйвера на другую?
24.06.2019 в 16:10 #12413talbutdinov
УчастникПерезалил все на сервер вручную, окно со свойствами так и не отображается, но попытка вставить данные в архив уже начала работать, но с ошибками, с чем прошу помочь разобраться. Описаний работы с переменными и классами нет, так что методом тыка.
Итак собственно код, что в нем не так может подскажите:
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.Подскажите пожалуйста где я что-то не так сделал?
24.06.2019 в 16:47 #12414talbutdinov
УчастникЕще вопросик: как можно получить из текущего подключения данные, а именно Host, TcpPort, а также пользовательские параметры линии.
24.06.2019 в 17:10 #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
24.06.2019 в 17:30 #12416Romiros
УчастникВам правильно написали, индекс тега смещается на -1, поэтому у Вас выскакивает ошибка.
SetCurData это для текущих данных, для архивов не нужно.
newTagSrez(1) — создание массива тегов размером 1, здесь ставите нужное Вам количество тегов в срезе.24.06.2019 в 17:33 #12417Romiros
УчастникИспользуйте класс CommUtils для извлечени host и port
24.06.2019 в 17:50 #12418
manjey73Участникприменительно к примеру KpTest и другим похожим индекс тега да, -1.
Но применительно к своей нумерации сигналов не катит. Надо самому сохранять соотношение № сигнала = № тега.Например у меня сигнал может быть под номером 40, а тег будет = 0
24.06.2019 в 19:55 #12422
MikhailМодераторПервоначальную версию 1.0.0.1
Рекомендую начинать версии на 5.x, первая цифра — это номер поколения Rapid SCADA.
24.06.2019 в 19:56 #12423
MikhailМодераторТакое ощущение у меня, что версия не изменилась
Используйте отладчик. Здесь на форуме можно найти информацию, как подключиться к драйверу из отладчика.
24.06.2019 в 19:58 #12424
MikhailМодератортолько не совсем ясно что за параметр (1) и что он означает.
Когда Вы подключаете к проекту ScadaCommCommon.dll, в той же директории должен лежать ScadaCommCommon.xml. Тогда при нажатии Ctrl + Пробел после скобки, у Вас высветится список аргументов. Также полезно найти соответствующий метод в исходниках, и его работа зачастую проясняется.
24.06.2019 в 20:01 #12425
MikhailМодераторкак можно получить из текущего подключения данные, а именно Host, TcpPort,
Если используется стандартное свойство Connection, то в чистом виде никак, потому что это может быть последовательный порт.
а также пользовательские параметры линии
Посмотрите KpReqParams, если не ошибаюсь. Вообще откройте исходники базового класса KpLogic и посмотрите, какие полезные методы и свойства доступны.
24.06.2019 в 20:48 #12428talbutdinov
УчастникИспользуйте класс CommUtils для извлечени host и port
Нашел CommUtils.ExtractHostAndPort, но нет описания по входящим параметрам. Два последних я так понял возвращают адрес и порт, а вот какие первых два параметра входных не ясно, если порт по умолчанию еще догадываюсь, а вот что передавать первым параметром?
25.06.2019 в 19:25 #12460
MikhailМодераторExtractHostAndPort(string callNum, int defaultPort, out string host, out int port)
callNum — это позывной из параметров опроса КП в формате хост:порт
defaultPort — порт по умолчанию, который вернётся, если порт не указан в 1-м аргументе метода -
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.