Стартовая страница › Форумы › Разработка и интеграция › Строковой вид в логе Коммуникатора
- В этой теме 17 ответов, 3 участника, последнее обновление 1 год, 4 месяца назад сделано manjey73.
-
АвторСообщения
-
15.11.2022 в 17:47 #26018manjey73Участник
deviceTag = tagGroup.AddTag($"status_{channels.Value.id}", "Статус Устройства"); deviceTag.SetFormat(TagFormat.String);
Вроде добавил, что переменная строковая, но в Устройстве в Коммуникаторе получаю 0,00
Хотя для проверки в код добавил следующее
byte[] valueString = Encoding.UTF8.GetBytes("status12"); DeviceData.Set($"status_{stat.id}", BitConverter.ToDouble(valueString, 0));
Как правильно строковую переменную отображать в логе и потом уже в Scada ?
| 2 | status_60546 | Статус Устройства | 0,000 | |
— почему тут число?15.11.2022 в 20:23 #26021JurasskParkУчастникПотому что вы сделали конвертирование 🙂
BitConverter.ToDouble(valueString, 0)Отдавайте как есть 🙂 Без конвертирования
DeviceTag deviceTag = DeviceTags[tagIndex]; if (val is string strVal) { deviceTag.DataType = TagDataType.Unicode; deviceTag.Format = TagFormat.String; try { base.DeviceData.SetUnicode(tagIndex, strVal, stat); } catch { } } else if (val is DateTime dtVal) { deviceTag.DataType = TagDataType.Double; deviceTag.Format = TagFormat.DateTime; try { base.DeviceData.SetDateTime(tagIndex, dtVal, stat); } catch { } } else { deviceTag.DataType = TagDataType.Double; deviceTag.Format = TagFormat.FloatNumber; try { base.DeviceData.Set(tagIndex, Convert.ToDouble(val), stat); } catch { } }
или
if (val is string strVal) { try { base.DeviceData.SetUnicode(code, strVal, stat); } catch { } } else if (val is DateTime dtVal) { try { base.DeviceData.SetDateTime(code, dtVal, stat); } catch { } } else { try { base.DeviceData.Set(code, Convert.ToDouble(val), stat); } catch { } }
15.11.2022 в 20:57 #26022manjey73УчастникСпасибо, работает. Делал по привычке из 5-й версии.
Насколько понимаю, получить полную строку можно только создав массив каналов и никак иначе. Интересно, будет в будущем какое-то решение по дополнительной текстовой БД а в значении штатной базе ссылка на текстовую БД ???
16.11.2022 в 01:42 #26030JurasskParkУчастникЯ могу предложить свою больную фантазию на тему «как можно хранить строку в double».
😀
Это просто идея и ничего личного. Протухшими помидорами чур не кидаться. 🙂У double диапазон
1.7 х 10 в 308 в степени и сколько там цифр, я не знаю, но после запятой точно 15 цифр может быть.Допустим число 1234567890123456789.012345678901234
То есть есть точка отсчёт это точка. Если слева и справа брать по три символа в ASCII кодировке, то как минимум в числе вверху будет больше 5 букв 🙂
Осталось понять сколько целочисленных впереди перед точкой писать можно. )))
16.11.2022 в 05:33 #26031JurasskParkУчастник9866666655555555555555555555555555555555555555555555555555555555555554444444444444444444444444444444444444444444444444444444444444443333333333333333333333333333333333333333333333333333333333333322222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111111111,111111111111111111
Вот такое число переваривает 🙂
16.11.2022 в 09:32 #26032manjey73УчастникДело не в числе, а в том, что double занимает 8 байт, соответственно вывод строки ограничен 8 знаков ASCII или 4 знака UTF8
Еще с 5-й версии просили сделать текстовые БД, в 6-й версии можно сделать массив каналов, куда запихнуть всю строку, но по мне это неудобно.
Было бы удобнее иметь именно отдельную БД для строк, а в штатной БД в качестве значения double выступал бы идентификатор на текстовую БД. Но для этого все должны понимать что это именно идентификатор. то есть Таблицы, мнемосхемы и т.д.
Уж идентификатор в 8 байт запихнуть точно можно.
16.11.2022 в 09:34 #26033manjey73УчастникИ по идее какая разница, как я формирую число double, через штатный функционал или руками через BitConverter, должно было бы сработать и так и так, тут видимо другое что-то надо было сделать.
16.11.2022 в 15:45 #26046MikhailМодераторРабота со строками переменной длины существенно отразится на скорости. Поэтому каждый канал в своей основе — это одно число double. Если только с помощью какой-то программной надстройки над теми же каналами решить проблему удобства работы со строками, массивами и другими структурами данных.
16.11.2022 в 15:49 #26047manjey73Участник| 2 | status_171772 | Статус Устройства | 湵敲摡污 | |
Попытался сделать SetAscii и получил такую картину ???
Хотя предварительно сделал
//string output = Encoding.ASCII.GetString(Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(stat.status))); // TEST //Log.WriteLine(output); // TEST
и в логе отображается строка output правильно. Почему в Опросе иероглифы тогда?
16.11.2022 в 15:51 #26049manjey73УчастникДа пусть с ним, с числом канала double, пусть и остается, но почему это число не может быть идентификатором на другую БД например ?
Где скорость потеряется, если мы этот канал будем исключать из таблиц, из архивов и т.д.
Или если включили в таблицу, то вместо некоего значения Таблица будет подтягивать строку….17.11.2022 в 17:43 #26075MikhailМодераторПопытался сделать SetAscii и получил такую картину ???
Уточните, пожалуйста, вопрос.
17.11.2022 в 19:36 #26076JurasskParkУчастникhttps://jurasskpark.magicteam.net/tmp/ConvertStringToDouble.zip
Я теперь понял почему ограничение на 5 символов. 🙂
Это для manjey73 проект )
- Этот ответ был изменен 1 год, 5 месяцев назад от JurasskPark.
17.11.2022 в 22:41 #26078manjey73УчастникMikhail у меня слово больше 4-х символов Unicode, я хотел перевести его в ASCII и отобразить как в БД так и в логе Опроса Устройства в таблице как ASCII но получил иероглифы вместо нормального слова в таблице, при этом в логе через Log.WriteLine я получаю адекватное слово.
17.11.2022 в 22:43 #26079manjey73УчастникJurasskPark — нет доступа к вашей странице. И не 5-ть символов а 4, Unicod это 2 байта на символ, БД хранит в Double (8 байт)
Скачал, посмотрю
- Этот ответ был изменен 1 год, 5 месяцев назад от manjey73.
18.11.2022 в 15:03 #26123MikhailМодераторВ ASCII работают только латинские буквы. Если не латинские, то не должно работать. Если латинские, то нужно искать и исправлять причину ошибки.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.