Стартовая страница › Форумы › Разработка и интеграция › Передать строку ASCII из Коммуникатора в Сервер
- В этой теме 36 ответов, 3 участника, последнее обновление 4 года, 11 месяцев назад сделано Mikhail.
-
АвторСообщения
-
13.06.2018 в 16:30 #9678manjey73Участник
Пытался разобраться с snmp.dll но чего-то не допетрил.
Как из драйвера передать строковую переменную в Сервер в виде строки ?
Я так понимаю надо сделать конвертирование строки в double и будет обрезано все до 8 байт, но при этом необходимо чтобы в коммуникаторе отображалась вся строка …Речь о SetCurData
13.06.2018 в 17:30 #9680MikhailМодераторВ Коммуникаторе можно отобразить любую строку в методе ConvertTagDataToStr
А вот чтобы строка ушла в сервер, для получения значения double нужно вызвать EncodeAscii или EncodeUnicode
13.06.2018 в 17:48 #9681manjey73УчастникМожно немного подробнее ?
protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData)
Мне обязательно действовать через SrezTableLight.CnlData ? — что это и с чем его едят ?
Ну и вот это strVals — что ?хм, попробую разобраться что есть что, если получится….
Вот просто, у меня есть переменная string имяСтринг со значением «хххххххх», я это знаю, что надо вызвать и с какими параметрами, чтобы моя переменная превратилась в текст в Коммуникаторе ?
Сам SetCurData я вроде понял, просто преобразую в 8 байт ну и там вызов понятен.
- Этот ответ был изменен 5 лет, 10 месяцев назад от manjey73.
14.06.2018 в 21:55 #9684MikhailМодераторНу и вот это strVals — что ?
Это был массив из драйвера SNMP. В Вашем случае может быть другой массив.
ConvertTagDataToStr — Вам нужно вернуть строковое значение в зависимости от переданного в метод сигнала (номера тега) и его значения tagData.
Что вернёте — то отобразится в таблице тегов КП.26.06.2018 в 13:30 #9744manjey73УчастникМожно пример без SrezTableLight.CnlData ?
Вот просто есть переменная, она либо цифра и я сразу отправляю SetCurData(номер тега, значение переменной, 1);
Либо она текстовая и что надо сделать чтобы она текстом отобразилась в Коммуникаторе ?Со срезами у меня полное непонятие процесса, абсолютно.
26.06.2018 в 15:25 #9745manjey73Участник1. Можно ли драйвере отключить нумерацию сигналов (обведено синим). Чтобы не было возможности привязывать к базе ?
2. Там где красным, можно ли просто выводить как текст именно в данном окне Коммуникатора. То есть не все данные а только какие-то конкретные.
С примерами Snmp вообще не понимаю как разобраться….
3. Можно ли убрать ,000 только в определенных строках ? Или как вариант передавать номер в базу как положено в double а в Коммуникаторе выводить текстом ?- Этот ответ был изменен 5 лет, 10 месяцев назад от manjey73.
26.06.2018 в 17:13 #9747manjey73Участник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 попадал массив байт ASCII26.06.2018 в 17:39 #9753MikhailМодератор1. Отключить номера нельзя, но запретить привязку можно, переопределив метод BindTag.
2-3. Да, Вы можете любой текст отобразить. Текст формируется в методе ConvertTagDataToStr. Примеры в существующих драйверах.
- Этот ответ был изменен 5 лет, 10 месяцев назад от Mikhail.
26.06.2018 в 18:00 #9756manjey73УчастникВот я и не пойму как сделать этот метод.
Я не нашел определения для 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++;И в Коммуникаторе отображалось как текст….. ????
27.06.2018 в 09:15 #9760manjey73УчастникВот на примере KpSMS можно прокоментировать каждую строчку кода ?
Не нашел явного вызова в остальном коде, так понимаю этим занимается сам Коммуникатор, если такой метод встречается в коде драйвера ?
В какой момент это происходит ?, Какие действия необходимо выполнить предварительно, чтобы это сработало ?И еще такой момент, у меня нет возможности на все сигналы указать тип переменных, они формируются на лету. Я точно так же все преобразую в double, вынужден так как SetCurData может передать только double.
Например сигнал 15 при работе с одним прибором может оказаться целочисленным, с другим прибором строковым, с третьим float а с четвертым вообще DateTime.27.06.2018 в 11:30 #9762manjey73УчастникПолучилось переопределить часть сигналов. Осталось теперь придумать как поступать с остальными, номера которых я не буду знать, чтобы отображались как нужно.
27.06.2018 в 21:01 #9770MikhailМодераторСоздаёте теги Вы сами, поэтому их номера тоже будете знать. У Вас будет массив или список со свойствами каждого тега — будет ясно как отображать его значение.
С выводом текста значений получилось?27.06.2018 в 21:13 #9773manjey73УчастникДа, с выводом текста получилось.
Теги формируются динамически при добавлении линии связи из xml файла.
Есть небольшая особенность. XML разбит на группы запросов, группу можно сделать активной или нет. То есть группа переменных либо будет опрашиваться либо нет.Вот пример с моим счетчиком — у него возможны два запроса
1. Электрические параметры — ток, напряжение, косинус и т.д.
2. значения Энергий
По сути можно сделать один шаблон xml и выводить все, но запросы можно поменять местами.
А можно шаблон разделить на два файла, в одном оставить активным один запрос, в другом другой, при этом не стирая всех данных.
Ну и приборов в мире вагон и тележка и где какая переменная окажется неизвестно.з.ы. я писал код автоматического разбора телеграммы для создания шаблона, а потом подумал, зачем изобретать велосипед, если разбор телеграммы можно делать на лету не только при инициализации, но и при работе. Отсюда и вопрос — как в автомате передать тип переменной, чтобы делать конвертирование в строку. То, что в шапке телеграммы известно, а остальное не очень…
27.06.2018 в 21:20 #9774manjey73УчастникМожно воспользоваться статусом и отлавливать по нему, но это вроде не очень правильно по отношению потом к Scada или можно этим баловаться ?
Ну и можно ли изменить статус в процессе передачи серверу ?
Вот например делаю строковой переменной статус 5 SetCurData(tag xxx, конвертирую первые 8 байт строки в дабл, статус 5)
в Конвертировании тега в строку отлавливаю статус 5, знаю что это у меня текстовая переменная, вывожу в КП полную строку и тут же меняю статус на 1 чтобы отправилось в серверТак возможно ?
29.06.2018 в 18:18 #9797MikhailМодераторТехнически это может сработать, но лучше придумать более чистый способ. Лучше завести свои отдельные объекты и списки, в которых хранить нужную информацию.
можно делать на лету не только при инициализации, но и при работе. Отсюда и вопрос — как в автомате передать тип переменной, чтобы делать конвертирование в строку
Куда именно нужно передать тип переменной?
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.