Передать строку ASCII из Коммуникатора в Сервер

Стартовая страница Форумы Разработка и интеграция Передать строку ASCII из Коммуникатора в Сервер

Просмотр 15 сообщений - с 1 по 15 (из 37 всего)
  • Автор
    Сообщения
  • #9678
    manjey73
    Участник

    Пытался разобраться с snmp.dll но чего-то не допетрил.
    Как из драйвера передать строковую переменную в Сервер в виде строки ?
    Я так понимаю надо сделать конвертирование строки в double и будет обрезано все до 8 байт, но при этом необходимо чтобы в коммуникаторе отображалась вся строка …

    Речь о SetCurData

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

    В Коммуникаторе можно отобразить любую строку в методе ConvertTagDataToStr

    А вот чтобы строка ушла в сервер, для получения значения double нужно вызвать EncodeAscii или EncodeUnicode

    #9681
    manjey73
    Участник

    Можно немного подробнее ?

    protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData)

    Мне обязательно действовать через SrezTableLight.CnlData ? — что это и с чем его едят ?
    Ну и вот это strVals — что ?

    хм, попробую разобраться что есть что, если получится….

    Вот просто, у меня есть переменная string имяСтринг со значением «хххххххх», я это знаю, что надо вызвать и с какими параметрами, чтобы моя переменная превратилась в текст в Коммуникаторе ?

    Сам SetCurData я вроде понял, просто преобразую в 8 байт ну и там вызов понятен.

    • Этот ответ был изменен 5 лет, 10 месяцев назад от manjey73.
    #9684
    Mikhail
    Модератор

    Ну и вот это strVals — что ?

    Это был массив из драйвера SNMP. В Вашем случае может быть другой массив.

    ConvertTagDataToStr — Вам нужно вернуть строковое значение в зависимости от переданного в метод сигнала (номера тега) и его значения tagData.
    Что вернёте — то отобразится в таблице тегов КП.

    #9744
    manjey73
    Участник

    Можно пример без SrezTableLight.CnlData ?

    Вот просто есть переменная, она либо цифра и я сразу отправляю SetCurData(номер тега, значение переменной, 1);
    Либо она текстовая и что надо сделать чтобы она текстом отобразилась в Коммуникаторе ?

    Со срезами у меня полное непонятие процесса, абсолютно.

    #9745
    manjey73
    Участник

    Коммуникатор

    1. Можно ли драйвере отключить нумерацию сигналов (обведено синим). Чтобы не было возможности привязывать к базе ?
    2. Там где красным, можно ли просто выводить как текст именно в данном окне Коммуникатора. То есть не все данные а только какие-то конкретные.
    С примерами Snmp вообще не понимаю как разобраться….
    3. Можно ли убрать ,000 только в определенных строках ? Или как вариант передавать номер в базу как положено в double а в Коммуникаторе выводить текстом ?

    • Этот ответ был изменен 5 лет, 10 месяцев назад от manjey73.
    #9747
    manjey73
    Участник

    ConvertTagDataToStr(tag, new SrezTableLight.CnlData(ScadaUtils.EncodeAscii(idnum.ToString()), 1)); tag++;

    Так получаю прочерки — в Коммуникаторе в поле «Значение»
    idnum — номер ID прибора

    Нужно вместо 12 345 678,000 отображать просто как текст 12345678
    Вместо ахринительного числа 768 290 844 870 296 куча нулей,000

    надо всего три символа чтобы выводило…
    При необходимости надо чтобы в Scada попадал массив байт ASCII

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

    1. Отключить номера нельзя, но запретить привязку можно, переопределив метод BindTag.

    2-3. Да, Вы можете любой текст отобразить. Текст формируется в методе ConvertTagDataToStr. Примеры в существующих драйверах.

    • Этот ответ был изменен 5 лет, 10 месяцев назад от Mikhail.
    #9756
    manjey73
    Участник

    Вот я и не пойму как сделать этот метод.
    Я не нашел определения для tagData например.

            /// <summary>
            /// Преобразовать данные тега КП в строку
            /// </summary>
            protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData)
            {
                if (tagData.Stat > 0)
                {
                        return ((int)tagData.Val).ToString();
                }
    
                return base.ConvertTagDataToStr(signal, tagData);
            }

    SetCurData(tag, ConvertTagDataToStr(tag, idnum), 1); tag++; приводит к этому.

    Ошибка CS1503 Аргумент 2: не удается преобразовать из «int» в «Scada.Data.Tables.SrezTableLight.CnlData».

    Ну не понимаю я как передать одновременно номер в базу
    SetCurData(tag, idnum, 1); tag++; (это работает).
    Но при этом чтобы в Коммуникаторе отобразилось как строка 12345678 вместо 12 345 678,000

    Как этим ConvertTagDataToStr пользоваться никак не въеду…
    И как в случае текстового сообщения чтобы работало и это
    SetCurData(tag, ScadaUtils.EncodeAscii(smanufact), 1); tag++;

    И в Коммуникаторе отображалось как текст….. ????

    #9760
    manjey73
    Участник

    Вот на примере KpSMS можно прокоментировать каждую строчку кода ?
    Не нашел явного вызова в остальном коде, так понимаю этим занимается сам Коммуникатор, если такой метод встречается в коде драйвера ?
    В какой момент это происходит ?, Какие действия необходимо выполнить предварительно, чтобы это сработало ?

    И еще такой момент, у меня нет возможности на все сигналы указать тип переменных, они формируются на лету. Я точно так же все преобразую в double, вынужден так как SetCurData может передать только double.
    Например сигнал 15 при работе с одним прибором может оказаться целочисленным, с другим прибором строковым, с третьим float а с четвертым вообще DateTime.

    #9762
    manjey73
    Участник

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

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

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

    #9773
    manjey73
    Участник

    Да, с выводом текста получилось.
    Теги формируются динамически при добавлении линии связи из xml файла.
    Есть небольшая особенность. XML разбит на группы запросов, группу можно сделать активной или нет. То есть группа переменных либо будет опрашиваться либо нет.

    Вот пример с моим счетчиком — у него возможны два запроса
    1. Электрические параметры — ток, напряжение, косинус и т.д.
    2. значения Энергий
    По сути можно сделать один шаблон xml и выводить все, но запросы можно поменять местами.
    А можно шаблон разделить на два файла, в одном оставить активным один запрос, в другом другой, при этом не стирая всех данных.
    Ну и приборов в мире вагон и тележка и где какая переменная окажется неизвестно.

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

    #9774
    manjey73
    Участник

    Можно воспользоваться статусом и отлавливать по нему, но это вроде не очень правильно по отношению потом к Scada или можно этим баловаться ?

    Ну и можно ли изменить статус в процессе передачи серверу ?
    Вот например делаю строковой переменной статус 5 SetCurData(tag xxx, конвертирую первые 8 байт строки в дабл, статус 5)
    в Конвертировании тега в строку отлавливаю статус 5, знаю что это у меня текстовая переменная, вывожу в КП полную строку и тут же меняю статус на 1 чтобы отправилось в сервер

    Так возможно ?

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

    Технически это может сработать, но лучше придумать более чистый способ. Лучше завести свои отдельные объекты и списки, в которых хранить нужную информацию.

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

    Куда именно нужно передать тип переменной?

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