Получение строки неизвестной длины

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

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

    Собственно вопрос как создать каналы в драйвере, когда длина строки неизвестна?
    1. Длина неизвестна в начале при первом запросе, но потом можно посмотреть (вычислить длину) и соответственно под данную длину зарезервировать место

    2. Как создать каналы в драйвере, если длина переменной в виде строки вариативна?

    з.ы. еще с 5-й версии не хватает тестовых БД и возможностью их связи с основной БД…
    Вот опять возникает вопрос — как это добавить а не заниматься созданием массивов каналов под строку, особенно для варианта 2, когда строка может иметь разную длину…
    Ведь есть же понятие Формата канала String ASCII или UNICODE, ну почему тогда в канале значения double (у нас целых 8 байт) не хранить ссылку на Текстовую базу и номер ячейки строки откуда выводить значение и куда собственно писать Сервером эти переменные ??????

    #28955
    manjey73
    Участник

    То, что показывает Коммуникатор в логе 2 305 356 792 575 910,000
    deviceTag.Format = TagFormat.String; — указано для типа string

    При этом запись такого вида

    string str_ascii = Encoding.ASCII.GetString(массив байт строки);
    DeviceData.SetAscii(vals.vCode, str_ascii, 1);

    Что не так?, почему в логе Коммуникатора цифра непонятно чего вместо строки ?

    #28956
    manjey73
    Участник

    Байты 4C 6F 67 69 6B 61 20 43 6F 72 70 20 53 50 54 39 34 31 2D 32 30 20 76 31 2E 30 2E 30 2E 30 2E 30 34

    Logika Corp SPT941-20 v1.0.0.0.04

    Собственно строка соответствует полученному из массива байт при помощи Encoding.ASCII.GetString

    #28957
    manjey73
    Участник

    2 305 356 792 575 910 — почему при вводе данного числа в калькулятор получаем байты, отличные от массива байт в строке ???? даже близко не похоже, хоть взять первые 8 байт строки ascii хоть последние, хоть середину…

    Так что же делает DeviceData.SetAscii на самом деле если строка полностью соответствует массиву байт ?

    #28958
    manjey73
    Участник

    Число это представление в десятичном первых 8-ми байт строки, но какого Коммуникатор в логе выводит число вместо части строки, если указано, что это Format.String ??????

    #28959
    manjey73
    Участник
           public static TagFormat GetDefault(TagDataType dataType)
            {
                switch (dataType)
                {
                    case TagDataType.Int64:
                        return IntNumber;
                    case TagDataType.ASCII:
                    case TagDataType.Unicode:
                        return String;
                    default:
                        return FloatNumber;
                }
            }

    Если здесь после case TagDataType.ASCII: нет return String — что возвращается фактически? FloatNumber потому что он по дефолту или String потому что он стоит следующим ?

    #28960
    manjey73
    Участник

    Попробовал после case TagDataType.ASCII добавить return String

    Заменил библиотеку Scada.Comm.Common — Коммуникатор перестал запускаться.
    Проверить не получилось…

    #28961
    manjey73
    Участник

    В общем какая-то лажа здесь…

    Делаю преобразование в строку ascii и при команде

    DeviceData.SetAscii я получаю число 2 305 356 792 575 910, 000 что соответствует перевернутым первым 8-ми байтам строки.

    Если же преобразовываю строку ascii в строку unicode и делаю DeviceData.SetUnicode я получаю число 0,000 (ну хоть что-то тут должно же быть а не просто нули ?….
    Хотя если там 0,000000011 то наверное и не покажет…

    Но в любом случае я не получаю в логе Коммуникатора куска строки…

    Logika Corp SPT941-20 v1.0.0.0.04

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

    В общем непонятно, почему Коммуникатор показывает некое число вместо строки…
    Как-то так…

    #28964
    manjey73
    Участник

    Скажу еще больше, создаем в базе канал, указываем Формат String

    В таблице показывает число
    | 5 | Info | Информация о приборе | 2 305 356 792 575 910,000 | 400 |
    При этом связь с каналом ЕСТЬ…

    Стоит только поменять Тип Данных на ASCII sntring то в логе как показывало число, так и показывает, но вот только связи с каналом НЕТ

    | 5 | Info | Информация о приборе | 2 305 356 792 575 910,000 | |

    #28966
    Romiros
    Участник

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

    #28967
    manjey73
    Участник

    Ну так DeviceData.SetAscii и тип Данных Ascii строка это не одно и то же ?

    Да и перезапуск через передачу данных Серверу из Администратора. Иначе как по другому, если мы меняем Тип Данных ?

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

    Меня больше интересует, почему при этом еще и Коммуникатор не хочет отображать строку в логе Устройства, а продолжает упорно выдавать цифры

    #28973
    manjey73
    Участник

    Вообще, если разбираться логически, даже если я передаю в канал обычный double но при этом выбираю тип данныз Ascii string то
    1. Привязка никуда не должна теряться
    2. в канале просто должны отобразиться кракозябры различного рода вместо понимаемого текста.

    но не так, выбрал тип и привязка пропала….

    #28974
    manjey73
    Участник

    А еще при отключенном Типе данных я включил Дину данных 2 и привязка так же пропала…

    При этом DeviceData.SetAscii ведет на SetByteArray который в свою очередь ведет на SetByteArray а далее на SetDoubleArray

    В общем кручу верчу, обмануть хочу 🙂

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