Опрос прибора в коде OnAddedToCommLine()

Стартовая страница Форумы Разработка и интеграция Опрос прибора в коде OnAddedToCommLine()

Просмотр 15 сообщений - с 16 по 30 (из 36 всего)
  • Автор
    Записи
  • #9357
    manjey73
    Участник

    Уже не помню точно, но кажется добавлял собственные статусы и назначал им цвет, это работало в событиях, а будет ли работать на схемах не помню. Давно не рисовал ничего для Scada, все больше с драйверами разбираюсь.
    Или это только в Типах событий работало…

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

    • Ответ изменён 8 лет, 3 месяца назад пользователем manjey73.
    #9359
    Romiros
    Участник

    Спасибо, сделал через статусы. Мне для событий и надо было.
    Количество атрибутов думаю не имеет значения. Это всё можно запрограммировать. Просто, как я понял у Вас могут быть очень разные конфиги, в зависимости от прибора. Мне кажется сериализация даст универсальность. Нужно просто продумать сам класс.
    Надо у Михаила спросить, он всё знает 🙂

    #9360
    manjey73
    Участник

    Он то знает, но отправит KpModbus изучать а я ни разу не программист 🙂
    Сейчас продумываю структуру XML. Нашел код, который выводит все из него, даже если я этого не знаю, думаю смогу переделать это в массивы, на счет сериализации пока не нашел толковых примеров, которые бы я понял…

    #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.
    #9366
    Romiros
    Участник

    Мне кажется сериализация подойдёт. Создать универсальный класс со всеми параметрами и его сохранять в xml.

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

    Он то знает, но отправит KpModbus изучать а я ни разу не программист

    Я могу ответить на какой-то конкретный вопрос, прислав ссылку на похожий кусок кода ))

    #9377
    manjey73
    Участник

    Михаил, мне нужен пример распаковки и упаковки данной структуры XML в List, массив или что угодно, чтобы потом это легко интегрировалось в драйвере для организации тегов, ну и можно было настраивать.

    Просто KpModbus для меня очень сложен для понимания, особенно что касается UI и формирования тегов на лету. Вот пример того, как это реализовано в KpModbus но в виде одного куска программы и не привязанный к dll Scada не хватает.

    Ну и структуру XML вы видите, дайте совет как ее лучше будет обработать ? ну и чем

    #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
         }
     }
    
    #9383
    Mikhail
    Модератор

    То есть структура XML создастся автоматически на основе объекта.
    Пример чтения и записи XML в самой скаде:
    Пример 1
    Пример 2

    #9388
    manjey73
    Участник

    Так в том и дело, что примеры из Scada для меня трудно понимаемы, так как разбросаны по разным кускам программы. Пока сам допетрю до всего времени уходит вагон…
    Примеры ищу и пытаюсь пробовать, но не все получается, то блин не нравится public, то это нельзя, то то нельзя и так далее….

    Сейчас нашел как добавлять List в Dictionary, выглядит неплохо для дальнейшей реализации, так как могу теперь обращаться к переменным так — dic.Value.sndName но вот все это связать ?????

    Спасибо за примеры, буду изучать… Просто вот не хватает в качестве KpTest на сайте примера более простого чем KpModbus но с реализацией редактирования шаблонов и с хорошими комментариями, что для чего. Ну и чтобы пример UI там был попроще тоже…

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

    • Ответ изменён 8 лет, 3 месяца назад пользователем manjey73.
    #9392
    Romiros
    Участник

    maney73 Вам нужно создать класс по шаблону Вашего xml. Сохранение и загрузка его уже не Ваша забота, все сериализуемый автоматом. Просто путь правильный указать.
    Я могу помочь, мне тоже предстоит драйвер писать, просто пока завал с работой.
    Мне просто по xml файлу не понятны моменты.
    У Вас префикс Cnt означает колличество или номер? SigCnt и др.?
    И не понял про разные файлы для текущих и архивов, лучше все в одном конфиге делать.

    Михаил, скажите пожалуйста при опросе архивов из приборов, как вы фиксирует какие данные были получены, чтобы повторно за эти часы или дни не опрашивать? Какой-то дополнительный xml файлик?

    #9393
    manjey73
    Участник

    Romiros это все из-за ограничений возможности Коммуникатора было сделано.
    В драйвере для Меркурия я применил битовую маску для настроек в командной строке, что читать из счетчика, а что нет.
    Выглядит у меня это так — КП1 — опрос счетчика в цикле — одна командная строка для мгновенных значений (мониторинг сети и т.д.)
    КП2 — опрос того же счетчика раз в час — другая командная строка (энергия)
    Просто не предусмотрено в Коммуникаторе выполнять опросы различных тегов в разное время или по команде, а для таких приборов как счетчики это достаточно оптимально было бы.
    Например у меня сейчас лежит счетчик с MBus китайский, он может прислать 2 телеграммы, одна это Энергия, вторая это Мгновенные значения. Нет смысла читать первую телеграмму постоянно в цикле, а вторую смысл есть, так как там все — ток, частота, напряжение и т.д.

    Cnt — это счетчик, при добавлении, удалении запросов в конфигурации, согласно запросам нумеровать ответы, попытаться использовать эту нумерацию для Словарей.
    С XML первый раз разбираюсь вообще, так что тяжко 🙂

    Сейчас опять уперся, в примере, данным Михаилом используется LoadFromXml — это что-то свое из Scada ? сейчас буду искать
    Я понимаю, что в коде Scada уже много реализовано, но блин разобраться с этим????
    Был бы пример драйвера попроще, чем KpModbus с комментариями что есть что и где лежит, было бы проще… Опрос самого прибора не большая проблема, а вот взаимодействие со Scada для меня уже проблема….

    • Ответ изменён 8 лет, 3 месяца назад пользователем manjey73.
    #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.
    #9399
    Mikhail
    Модератор

    Михаил, скажите пожалуйста при опросе архивов из приборов, как вы фиксирует какие данные были получены, чтобы повторно за эти часы или дни не опрашивать? Какой-то дополнительный xml файлик?

    Да, такое было в старом драйвере ЦЭ6850. Писал в текстовый файл. XML тоже подойдёт. Но нужно учитывать ситуацию, что файл может повредиться.

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

    используется LoadFromXml

    Это метод описан в том же файле, посмотрите поиском.

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