Стартовая страница › Форумы › Разработка и интеграция › Опрос прибора в коде OnAddedToCommLine()
- В этой теме 35 ответов, 3 участника, последнее обновление 8 лет, 3 месяца назад сделано
Mikhail.
-
АвторЗаписи
-
17.05.2018 в 10:11 #9357
manjey73УчастникУже не помню точно, но кажется добавлял собственные статусы и назначал им цвет, это работало в событиях, а будет ли работать на схемах не помню. Давно не рисовал ничего для Scada, все больше с драйверами разбираюсь.
Или это только в Типах событий работало…Спасибо. Поищу примеры сериализации, главное чтобы это было возможно при разном количестве атрибутов в секциях xml. Ну и возможность записи внутри секций нужна.
-
Ответ изменён 8 лет, 3 месяца назад пользователем
manjey73.
17.05.2018 в 11:23 #9359Romiros
УчастникСпасибо, сделал через статусы. Мне для событий и надо было.
Количество атрибутов думаю не имеет значения. Это всё можно запрограммировать. Просто, как я понял у Вас могут быть очень разные конфиги, в зависимости от прибора. Мне кажется сериализация даст универсальность. Нужно просто продумать сам класс.
Надо у Михаила спросить, он всё знает 🙂17.05.2018 в 11:32 #9360
manjey73УчастникОн то знает, но отправит KpModbus изучать а я ни разу не программист 🙂
Сейчас продумываю структуру XML. Нашел код, который выводит все из него, даже если я этого не знаю, думаю смогу переделать это в массивы, на счет сериализации пока не нашел толковых примеров, которые бы я понял…17.05.2018 в 15:36 #9364
manjey73Участник<?xml version="1.0" encoding="utf-8"?> <DevTemplate> <Params Name="sdm220" Init="false" Address="true"></Params> <SndGroups> <SndGroup sndCnt="1" sndName="тепло" sndActive="true" sndType="req_ud2" sndFcb="7B" sndVar="" /> <SndGroup sndCnt="2" sndName="мощность" sndActive="true" sndType="snd_ud" sndFcb="53" sndVar="" /> </SndGroups> <CmdGroups> <CmdGroup cmdCnt="1" cmdActive="true" cmdSndType="snd_ud" cmdFcb="73" cmdType="address" cmdVar="" /> <CmdGroup cmdCnt="2" cmdActive="true" cmdSndType="snd_ud" cmdFcb="73" cmdType="id" cmdVar="" /> <CmdGroup cmdCnt="3" cmdActive="true" cmdSndType="snd_ud" cmdFcb="73" cmdType="boudrate" cmdVar="" /> </CmdGroups> <Telegrams> <Telegram teleCnt="1" teleName="response1" rspud="0x08" teleType="variable"> <Val sigCnt="1" valName="temperature" valType="bcd" range="0.01" /> <Val sigCnt="2" valName="massflow" valType="bcd" range="0.001" /> <Val sigCnt="2" valName="massflow" valType="bcd" range="0.001" /> </Telegram> <Telegram teleCnt="2" teleName="response2" rspud="0x08" teleType="variable"> <Val sigCnt="3" valName="power" valType="bcd" range="0.01" /> <Val sigCnt="4" valName="voltage" valType="bcd" range="0.01" /> <Val sigCnt="5" valName="massflow" valType="bcd" range="0.001" /> </Telegram> </Telegrams> </DevTemplate>Вот набросал пример xml файла. Первоначально секций Telegram нет вообще.
SndGroups и CmdGroups пустые — это будет настраиваться. Snd — это запросы для чтения данных, Cmd — это запросы для выполнения команд. При первом запуске в Init ставим true, произойдет опрос прибора, разбор полетов по переменным и создастся секция Telegram с нужным количеством переменных Val. Потом можно отредактировать Имена, множитель и т.д. и на последующих запусках уже при Init = false будут формироваться теги с номерами сигналов и т.д.
Вот исходя из структуры xml файла надо понять как с ним работать будет лучше и проще.
Идея использовать один xml файл для однотипных приборов, ну или 2 и более если надо разнести чтение во времени как я делал в счетчике. Один файл настроек для мгновенных значений, чтение в цикле, второй файл для значений энергий, чтение через час или раз в сутки.-
Ответ изменён 8 лет, 3 месяца назад пользователем
manjey73.
17.05.2018 в 16:59 #9366Romiros
УчастникМне кажется сериализация подойдёт. Создать универсальный класс со всеми параметрами и его сохранять в xml.
17.05.2018 в 20:15 #9369
MikhailМодераторОн то знает, но отправит KpModbus изучать а я ни разу не программист
Я могу ответить на какой-то конкретный вопрос, прислав ссылку на похожий кусок кода ))
18.05.2018 в 06:56 #9377
manjey73УчастникМихаил, мне нужен пример распаковки и упаковки данной структуры XML в List, массив или что угодно, чтобы потом это легко интегрировалось в драйвере для организации тегов, ну и можно было настраивать.
Просто KpModbus для меня очень сложен для понимания, особенно что касается UI и формирования тегов на лету. Вот пример того, как это реализовано в KpModbus но в виде одного куска программы и не привязанный к dll Scada не хватает.
Ну и структуру XML вы видите, дайте совет как ее лучше будет обработать ? ну и чем
18.05.2018 в 09:14 #9382
MikhailМодераторПо поводу сохранения в XML довольно простой способ отсюда
XmlSerializer xsSubmit = new XmlSerializer(typeof(MyObject)); var subReq = new MyObject(); var xml = ""; using(var sww = new StringWriter()) { using(XmlWriter writer = XmlWriter.Create(sww)) { xsSubmit.Serialize(writer, subReq); xml = sww.ToString(); // Your XML } }18.05.2018 в 09:17 #9383
MikhailМодератор18.05.2018 в 10:19 #9388
manjey73УчастникТак в том и дело, что примеры из Scada для меня трудно понимаемы, так как разбросаны по разным кускам программы. Пока сам допетрю до всего времени уходит вагон…
Примеры ищу и пытаюсь пробовать, но не все получается, то блин не нравится public, то это нельзя, то то нельзя и так далее….Сейчас нашел как добавлять List в Dictionary, выглядит неплохо для дальнейшей реализации, так как могу теперь обращаться к переменным так — dic.Value.sndName но вот все это связать ?????
Спасибо за примеры, буду изучать… Просто вот не хватает в качестве KpTest на сайте примера более простого чем KpModbus но с реализацией редактирования шаблонов и с хорошими комментариями, что для чего. Ну и чтобы пример UI там был попроще тоже…
Еще приходится убивать время на изучение языка, что тоже массу времени занимает..
-
Ответ изменён 8 лет, 3 месяца назад пользователем
manjey73.
18.05.2018 в 11:26 #9392Romiros
Участникmaney73 Вам нужно создать класс по шаблону Вашего xml. Сохранение и загрузка его уже не Ваша забота, все сериализуемый автоматом. Просто путь правильный указать.
Я могу помочь, мне тоже предстоит драйвер писать, просто пока завал с работой.
Мне просто по xml файлу не понятны моменты.
У Вас префикс Cnt означает колличество или номер? SigCnt и др.?
И не понял про разные файлы для текущих и архивов, лучше все в одном конфиге делать.Михаил, скажите пожалуйста при опросе архивов из приборов, как вы фиксирует какие данные были получены, чтобы повторно за эти часы или дни не опрашивать? Какой-то дополнительный xml файлик?
18.05.2018 в 11:46 #9393
manjey73УчастникRomiros это все из-за ограничений возможности Коммуникатора было сделано.
В драйвере для Меркурия я применил битовую маску для настроек в командной строке, что читать из счетчика, а что нет.
Выглядит у меня это так — КП1 — опрос счетчика в цикле — одна командная строка для мгновенных значений (мониторинг сети и т.д.)
КП2 — опрос того же счетчика раз в час — другая командная строка (энергия)
Просто не предусмотрено в Коммуникаторе выполнять опросы различных тегов в разное время или по команде, а для таких приборов как счетчики это достаточно оптимально было бы.
Например у меня сейчас лежит счетчик с MBus китайский, он может прислать 2 телеграммы, одна это Энергия, вторая это Мгновенные значения. Нет смысла читать первую телеграмму постоянно в цикле, а вторую смысл есть, так как там все — ток, частота, напряжение и т.д.Cnt — это счетчик, при добавлении, удалении запросов в конфигурации, согласно запросам нумеровать ответы, попытаться использовать эту нумерацию для Словарей.
С XML первый раз разбираюсь вообще, так что тяжко 🙂Сейчас опять уперся, в примере, данным Михаилом используется LoadFromXml — это что-то свое из Scada ? сейчас буду искать
Я понимаю, что в коде Scada уже много реализовано, но блин разобраться с этим????
Был бы пример драйвера попроще, чем KpModbus с комментариями что есть что и где лежит, было бы проще… Опрос самого прибора не большая проблема, а вот взаимодействие со Scada для меня уже проблема….-
Ответ изменён 8 лет, 3 месяца назад пользователем
manjey73.
18.05.2018 в 16:57 #9396
manjey73УчастникПока из примера по ссылке научился в List загонять значения переменных атрибутов, но блин по одному все это…. нет ли одной команды для такого случая ?
XmlNode SndNode = rootElem.SelectSingleNode("SndGroups"); // Запись в список всех атрибутов запросов if (SndNode != null) { List<SndInfo> sndlist = new List<SndInfo>(); XmlNodeList sndGroupList = SndNode.SelectNodes("SndGroup"); foreach (XmlElement SndGroupElem in sndGroupList ) { sndlist.Add(new SndInfo(SndGroupElem.GetAttrAsInt("sndCnt"), SndGroupElem.GetAttrAsString("sndName"), SndGroupElem.GetAttrAsBool("sndActive"), SndGroupElem.GetAttrAsString("sndType"), SndGroupElem.GetAttrAsString("sndFcb"), SndGroupElem.GetAttrAsString("sndAddr"), SndGroupElem.GetAttrAsString("sndVar"))); }Правда при помощи GetAttrAs можно сразу в нужную переменную загонять, правда не знаю, что будет если он не сможет сконвертировать ?
Гы, необработанное исключение в ScadaData.dll 🙂-
Ответ изменён 8 лет, 3 месяца назад пользователем
manjey73.
18.05.2018 в 18:51 #9399
MikhailМодераторМихаил, скажите пожалуйста при опросе архивов из приборов, как вы фиксирует какие данные были получены, чтобы повторно за эти часы или дни не опрашивать? Какой-то дополнительный xml файлик?
Да, такое было в старом драйвере ЦЭ6850. Писал в текстовый файл. XML тоже подойдёт. Но нужно учитывать ситуацию, что файл может повредиться.
18.05.2018 в 18:55 #9400
MikhailМодераториспользуется LoadFromXml
Это метод описан в том же файле, посмотрите поиском.
-
Ответ изменён 8 лет, 3 месяца назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.