Строковой вид в логе Коммуникатора

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

Просмотр 15 сообщений - с 1 по 15 (из 18 всего)
  • Автор
    Сообщения
  • #26018
    manjey73
    Участник
    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 | | — почему тут число?

    #26021
    JurasskPark
    Участник

    Потому что вы сделали конвертирование 🙂
    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 { }
                        }
    
    #26022
    manjey73
    Участник

    Спасибо, работает. Делал по привычке из 5-й версии.

    Насколько понимаю, получить полную строку можно только создав массив каналов и никак иначе. Интересно, будет в будущем какое-то решение по дополнительной текстовой БД а в значении штатной базе ссылка на текстовую БД ???

    #26030
    JurasskPark
    Участник

    Я могу предложить свою больную фантазию на тему «как можно хранить строку в double».
    😀
    Это просто идея и ничего личного. Протухшими помидорами чур не кидаться. 🙂

    У double диапазон
    1.7 х 10 в 308 в степени и сколько там цифр, я не знаю, но после запятой точно 15 цифр может быть.

    Допустим число 1234567890123456789.012345678901234

    То есть есть точка отсчёт это точка. Если слева и справа брать по три символа в ASCII кодировке, то как минимум в числе вверху будет больше 5 букв 🙂

    Осталось понять сколько целочисленных впереди перед точкой писать можно. )))

    #26031
    JurasskPark
    Участник

    9866666655555555555555555555555555555555555555555555555555555555555554444444444444444444444444444444444444444444444444444444444444443333333333333333333333333333333333333333333333333333333333333322222222222222222222222222222222222222222222222222211111111111111111111111111111111111111111111111111111111,111111111111111111

    Вот такое число переваривает 🙂

    #26032
    manjey73
    Участник

    Дело не в числе, а в том, что double занимает 8 байт, соответственно вывод строки ограничен 8 знаков ASCII или 4 знака UTF8

    Еще с 5-й версии просили сделать текстовые БД, в 6-й версии можно сделать массив каналов, куда запихнуть всю строку, но по мне это неудобно.

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

    Уж идентификатор в 8 байт запихнуть точно можно.

    #26033
    manjey73
    Участник

    И по идее какая разница, как я формирую число double, через штатный функционал или руками через BitConverter, должно было бы сработать и так и так, тут видимо другое что-то надо было сделать.

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

    Работа со строками переменной длины существенно отразится на скорости. Поэтому каждый канал в своей основе — это одно число double. Если только с помощью какой-то программной надстройки над теми же каналами решить проблему удобства работы со строками, массивами и другими структурами данных.

    #26047
    manjey73
    Участник

    | 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 правильно. Почему в Опросе иероглифы тогда?

    #26049
    manjey73
    Участник

    Да пусть с ним, с числом канала double, пусть и остается, но почему это число не может быть идентификатором на другую БД например ?

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

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

    Попытался сделать SetAscii и получил такую картину ???

    Уточните, пожалуйста, вопрос.

    #26076
    JurasskPark
    Участник

    https://jurasskpark.magicteam.net/tmp/ConvertStringToDouble.zip

    Я теперь понял почему ограничение на 5 символов. 🙂

    Это для manjey73 проект )

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

    Mikhail у меня слово больше 4-х символов Unicode, я хотел перевести его в ASCII и отобразить как в БД так и в логе Опроса Устройства в таблице как ASCII но получил иероглифы вместо нормального слова в таблице, при этом в логе через Log.WriteLine я получаю адекватное слово.

    #26079
    manjey73
    Участник

    JurasskPark — нет доступа к вашей странице. И не 5-ть символов а 4, Unicod это 2 байта на символ, БД хранит в Double (8 байт)

    Скачал, посмотрю

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

    В ASCII работают только латинские буквы. Если не латинские, то не должно работать. Если латинские, то нужно искать и исправлять причину ошибки.

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