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

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

Просмотр 15 сообщений - с 16 по 30 (из 39 всего)
  • Автор
    Записи
  • #28979
    Mikhail
    Модератор

    Макс. длину строки нужно указать в конфигурации устройства. Она не может быть неопределённой. Посмотрите драйвер OPC, например.

    Синтаксис case позволяет перечислить несколько значений.

    #28981
    manjey73
    Участник

    Так а почему при указании, что тег String не происходит отображения строки (части строки) в логе Коммуникатора как строки?

    Ведь при указании, что тег DateTime в логе выводится дата а при переопределении только время или только дата..

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

    В журнал линии связи пишет ваш драйвер.

    #29008
    manjey73
    Участник

    В журнал выводил строку и как ASCII и конвертировал ее в UNICODE пишет нормально.
    Но там же я выводил через Log.WriteLine

    то есть строка соответствует действительности.
    А вот говоря ей TagFormat.Sting ничего не происходит в таблице

    | Номер | Код     | Наименование         |                  Значение | Канал |
    +-------+---------+----------------------+---------------------------+-------+
    | ******************************* Настройки ******************************** |
    +-------+---------+----------------------+---------------------------+-------+
    | 1     | curTime | T                    |                  16:01:42 |       |
    +-------+---------+----------------------+---------------------------+-------+
    | 2     | date    | D                    |                28.06.2023 |       |
    +-------+---------+----------------------+---------------------------+-------+
    | 3     | G1      | Объемный расход 1    |                     3,076 |       |
    +-------+---------+----------------------+---------------------------+-------+
    | 4     | Gм1     | Массовый расход 1    |                     2,978 |       |
    +-------+---------+----------------------+---------------------------+-------+
    | 5     | Info    | Информация о приборе | 2 305 356 792 575 910,000 |   400 |
    +-------+---------+----------------------+---------------------------+-------+
    | 6     | Q       | Q                    |                11 153,294 |       |
    +-------+---------+----------------------+---------------------------+-------+
    | 7     | SPtek   | CПтек                |                         3 |       |
    +-------+---------+----------------------+---------------------------+-------+
    

    Только Время и только Дата отрабатывает нормально, а строка в виде числа первые 8-мь байт, которые соответствуют в принципе строке ASCII
    Logika Corp SPT941-20 v1.0.0.0.04
    первым ее 8-ми байтами — канал 400, при этом как выше написал если указать в БД, что Тип Данных ASCII строка то связь с каналом пропадает

    • Ответ изменён 3 года, 1 месяц назад пользователем manjey73.
    #29010
    manjey73
    Участник
    if (type == "time")
    {
    deviceTag.Format = new TagFormat(TagFormatType.Date, "HH:MM:ss");
    }
    else if (type == "date")
    {
    deviceTag.Format = new TagFormat(TagFormatType.Date, "dd/MM/yyyy");
    }
    else if (type == "float")
    {
    deviceTag.Format = TagFormat.FloatNumber;
    }
    else if (type == "uint" || type == "int")
    {
    deviceTag.Format = TagFormat.IntNumber;
    }
    else if (type == "string")
    {
    deviceTag.Format = TagFormat.String;
    }
    

    Вот так формируются типы, то есть тип string определен, как и time и date

    if (vals.vType.ToLower() == "time")
    {
    DateTime dt = new DateTime(2000, 1, 1, values[iVal][3], values[iVal][2], values[iVal][1]).ToUniversalTime();
    DeviceData.Set(vals.vCode, dt.ToOADate(), 1);
    }
    

    Тайм в таблице показывает только время, как положено
    А вот строка ни в какую, я даже просто делал Set и первые 8-мь байт через BitConverter преобразовывал в double, в таблице все равно число показывало

    else if (vals.vType.ToLower() == "string")
    {
    string str_ascii = Encoding.ASCII.GetString(values[iVal]);
    DeviceData.SetAscii(vals.vCode, str_ascii, 1);
    }
    

    То есть одно отрабатывает как положено, а другое почему-то нет

    #29011
    manjey73
    Участник

    Если выше вывести
    Log.WriteLine(str_ascii); то в лог выводится строка как она и есть

    Logika Corp SPT941-20 v1.0.0.0.04

    #29012
    manjey73
    Участник
    Тип переменной string Байты 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
    Получено за 2198 мс

    вот вывод из лога

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

    Здесь можно увидеть, что тег будет показан как строка, только если он имеет тип данных ASCII или Unicode. Проверьте, что тип данных Вашего тега соответствует.

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

    Посмотрите работу со строками в драйвере OPC UA.

    #29025
    manjey73
    Участник

    Ужас :).
    Конечно в рамках протокола Modbus вполне оправдано использование для строк массивов значений, так как протокол все равно оперирует регистрами по большей части.

    Но в рамках других протоколов такой подход просто ужасен.

    1. Почему при указании типа данных — ASCII String внутри драйвера теряется привязка к каналу, у которого не указан тип данных? Почему не достаточно привязки только по коду тега?, отображение это уже другой вопрос, но привязка канала должна сохраняться, если код тега соответствует…
    У меня получилось вывести строку из первых 8-ми байт в лог Коммуникатора.

    2. Опять же, DeviceData.SetAscii предполагает запись массива, ок, массив я не создавал, но почему тогда в логе Коммуникатора нельзя отобразить всю строку с пометкой * например или что-то подобное, а так как массив не создан, Серверу отправлять только первые 8-мь байт ???

    Опять же почему было не добавить строковые базы, если все операции происходят через Сервер ???
    Строки бывают в ответах разной длины и определить сразу или вообще в процессе их длину невозможно…

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

    Опять же вопрос отображения. Если в драйвере задал длину 5 а в Scada в настройке канала длина не задана опять же теряется связь с каналом.

    Ну если не задана, или задана с ошибкой длина канала в Администраторе, ну выводи 1-й канал (первые 8-мь байт) или столько, сколько указано…

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

    А так все получилось…

    Строка из прибора

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

    Почему при указании типа данных — ASCII String внутри драйвера теряется привязка к каналу, у которого не указан тип данных?

    Специально так сделано, чтобы тег устройства и канал соответствовали друг другу.

    почему тогда в логе Коммуникатора нельзя отобразить всю строку с пометкой *

    Если тип тега — число, то Коммуникатор не должен отображать его в виде строки.

    почему было не добавить строковые базы, если все операции происходят через Сервер ???

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

    #29062
    manjey73
    Участник

    Блин, писал и все пропало 🙁

    Почему не использовать ячейку Тип Данных добавив в нее «Внешний ASCII String» и «Внешний UNICODE String» а сервер будет соотносить их по номерам каналов например.

    Если все запрашивают данные через Сервер, он и отдаст то. что требуется.

    #29063
    manjey73
    Участник

    По мне все-таки лучше сохранять привязку только по коду тега, а в случае несовпадения Типа данных или Формата выводить какое-то предупреждение. А то ищи свищи где ошибся…

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