Стартовая страница › Форумы › Разработка и интеграция › Получение строки неизвестной длины
- В этой теме 38 ответов, 4 участника, последнее обновление 1 год, 12 месяцев назад сделано
Mikhail.
-
АвторЗаписи
-
27.06.2023 в 17:56 #28979
MikhailМодераторМакс. длину строки нужно указать в конфигурации устройства. Она не может быть неопределённой. Посмотрите драйвер OPC, например.
Синтаксис case позволяет перечислить несколько значений.
27.06.2023 в 19:58 #28981
manjey73УчастникТак а почему при указании, что тег String не происходит отображения строки (части строки) в логе Коммуникатора как строки?
Ведь при указании, что тег DateTime в логе выводится дата а при переопределении только время или только дата..
28.06.2023 в 16:32 #29006
MikhailМодераторВ журнал линии связи пишет ваш драйвер.
28.06.2023 в 17:07 #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.
28.06.2023 в 17:16 #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); }То есть одно отрабатывает как положено, а другое почему-то нет
28.06.2023 в 17:19 #29011
manjey73УчастникЕсли выше вывести
Log.WriteLine(str_ascii); то в лог выводится строка как она и естьLogika Corp SPT941-20 v1.0.0.0.04
28.06.2023 в 17:21 #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 мсвот вывод из лога
28.06.2023 в 21:13 #29016
MikhailМодераторЗдесь можно увидеть, что тег будет показан как строка, только если он имеет тип данных ASCII или Unicode. Проверьте, что тип данных Вашего тега соответствует.
28.06.2023 в 21:14 #29017
MikhailМодераторПосмотрите работу со строками в драйвере OPC UA.
29.06.2023 в 09:33 #29025
manjey73УчастникУжас :).
Конечно в рамках протокола Modbus вполне оправдано использование для строк массивов значений, так как протокол все равно оперирует регистрами по большей части.Но в рамках других протоколов такой подход просто ужасен.
1. Почему при указании типа данных — ASCII String внутри драйвера теряется привязка к каналу, у которого не указан тип данных? Почему не достаточно привязки только по коду тега?, отображение это уже другой вопрос, но привязка канала должна сохраняться, если код тега соответствует…
У меня получилось вывести строку из первых 8-ми байт в лог Коммуникатора.2. Опять же, DeviceData.SetAscii предполагает запись массива, ок, массив я не создавал, но почему тогда в логе Коммуникатора нельзя отобразить всю строку с пометкой * например или что-то подобное, а так как массив не создан, Серверу отправлять только первые 8-мь байт ???
Опять же почему было не добавить строковые базы, если все операции происходят через Сервер ???
Строки бывают в ответах разной длины и определить сразу или вообще в процессе их длину невозможно…-
Ответ изменён 3 года, 1 месяц назад пользователем
manjey73.
29.06.2023 в 17:50 #29046
manjey73УчастникОпять же вопрос отображения. Если в драйвере задал длину 5 а в Scada в настройке канала длина не задана опять же теряется связь с каналом.
Ну если не задана, или задана с ошибкой длина канала в Администраторе, ну выводи 1-й канал (первые 8-мь байт) или столько, сколько указано…
-
Ответ изменён 3 года, 1 месяц назад пользователем
manjey73.
29.06.2023 в 17:53 #29049
manjey73УчастникА так все получилось…
30.06.2023 в 07:39 #29057
MikhailМодераторПочему при указании типа данных — ASCII String внутри драйвера теряется привязка к каналу, у которого не указан тип данных?
Специально так сделано, чтобы тег устройства и канал соответствовали друг другу.
почему тогда в логе Коммуникатора нельзя отобразить всю строку с пометкой *
Если тип тега — число, то Коммуникатор не должен отображать его в виде строки.
почему было не добавить строковые базы, если все операции происходят через Сервер ???
Оптимизация хранения и передачи данных происходит в пользу быстродействия работы с числами. Строки не так часто используются.
30.06.2023 в 10:07 #29062
manjey73УчастникБлин, писал и все пропало 🙁
Почему не использовать ячейку Тип Данных добавив в нее «Внешний ASCII String» и «Внешний UNICODE String» а сервер будет соотносить их по номерам каналов например.
Если все запрашивают данные через Сервер, он и отдаст то. что требуется.
30.06.2023 в 10:08 #29063
manjey73УчастникПо мне все-таки лучше сохранять привязку только по коду тега, а в случае несовпадения Типа данных или Формата выводить какое-то предупреждение. А то ищи свищи где ошибся…
-
Ответ изменён 3 года, 1 месяц назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.