как правильно достать текст

Помечено: ,

Просмотр 15 сообщений - с 1 по 15 (из 33 всего)
  • Автор
    Сообщения
  • #38449
    petuhovdmitry
    Участник

    Предыдушее: https://forum.rapidscada.ru/?topic=%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B-%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%B0-2&paged=5#post-38430

    >> «SN» ваши два символа ?
    Верно.

    > Надо не просто выставить строку и ASCII, надо еще во входной формуле
    > преобразовать в строку из набора байт.

    https://rapidscada.net/docs/ru/latest/configuration/scripts#examples
    Вот тут говорится, к примеру о функции, которую можжно поместить во входную формулу канала:
    DecodeAscii(val) string Преобразует заданное значение в строку ASCII длиной до 8 символов

    Но, я не могу понять (найти) как верно передать ей аргумент, содержащий данные, которые нужно преобразовать из байтов в строку.

    Вариации на тему DecodeAscii(val()) не отдают ничего, а DecodeAscii(Data()) роняет сервер.

    • Эта тема была изменена 1 месяц назад от Mikhail.
    #38450
    manjey73
    Участник

    DecodeAscii(Cnl) в данном случае, прямо во входном канале из устройства.

    #38463
    petuhovdmitry
    Участник

    в свойствах канала поставил галку Формула и в поле ВХ.
    воткнул DecodeAscii(Cnl)
    Сервер не упал, но в табличке отообразилось число 21326, то есть, не преобразованное.
    Жаль,что сюда скрины нельзя прикреплять:
    https://ncloud.interra.company/s/bi29S6k7g4HBY3b

    #38464
    manjey73
    Участник

    Так вроде надо тогда выбрать формат — Строка и тип данных ascii раз вы формулу декодирования используете.

    #38465
    petuhovdmitry
    Участник

    Так тоже не хорошо: https://ncloud.interra.company/s/7FRJPBAcFGnS82Q

    #38467
    manjey73
    Участник

    Можете набор байт этого регистра предоставить из логов?
    Может просто надо переставить байты при ответе Коммуникатора как вариант.

    #38468
    petuhovdmitry
    Участник

    Вот он:

    Request element group «hr54»
    Send (12): 00 39 00 00 00 06 01 03 00 36 00 01
    Receive (7/7): 00 39 00 00 00 05 01
    Receive (4/4): 03 02 53 4E
    OK

    #38470
    petuhovdmitry
    Участник

    https://www.rapidtables.com/convert/number/hex-to-decimal.html?x=4E53
    4E53 (20051) (NS) — это правильный результат, то есть в при получении данных я аерно указал сортировку байт 01. Осталось понять, как все же преобразовывать это в строку и отображать.

    #38471
    manjey73
    Участник

    Подозреваю, что DecodeAscii работает когда байты в числе уже соответствуют ascii символам.
    01 по идее не требуется указывать, оно и так вроде по умолчанию.

    #38472
    petuhovdmitry
    Участник

    https://ncloud.interra.company/s/kGZyR9WnPwoFSXM
    верное значение, но преобразовать в текст не выходит.

    #38473
    petuhovdmitry
    Участник

    про 01 я наврал — 10 🙂 Переворачиваем

    #38474
    petuhovdmitry
    Участник

    >> Подозреваю, что DecodeAscii работает когда байты в числе
    >> уже соответствуют ascii символам.

    этокакэто? 🙂

    #38475
    manjey73
    Участник

    Долго объяснять. Суть — modbus читает число, а не строку, а число при преобразовании далеко не похоже на представление в double формате.

    #38476
    petuhovdmitry
    Участник

    да, я понимаю, что в ПЛК хранится не строка, а набор числовых значений двухбайтовых. В питоне, получив с ПЛК примерно так конвертим:

    def convert_controller_ascii_data_to_string(self, data: list, reverse=False):
    «»»Конвертируем массив, полученный от контроллера в строку»»»
    try:
    if reverse:
    byte_order = ‘little’
    else:
    byte_order = ‘big’
    data_array_converted = [value.to_bytes(2, byteorder=byte_order).decode(‘utf-8’) for value in data]
    data_string = «».join(data_array_converted)
    data_string = data_string.replace(‘\x00’, »)
    except:
    self.logger.error(f»Не получилось конвертировать ascii массив {data} от контроллера в строку»)
    raise Exception(f»Не получилось конвертировать ascii массив {data} от контроллера в строку»)
    return data_string

    #38477
    petuhovdmitry
    Участник

    гугель подсказывает, что:

    В C#, чтобы преобразовать шестнадцатеричную строку в обычную строку, используйте метод System.Text.Encoding.ASCII.GetString() или System.Text.Encoding.UTF8.GetString(). Сначала шестнадцатеричную строку нужно преобразовать в массив байтов, а затем преобразовать этот массив байтов в строку.

    using System;
    using System.Text;

    public class HexToText
    {
    public static void Main(string[] args)
    {
    string hexString = «48656c6c6f20576f726c64»; // Пример шестнадцатеричной строки «Hello World»
    string result = HexToString(hexString);
    Console.WriteLine(result); // Вывод: Hello World
    }

    public static string HexToString(string hexString)
    {
    // Удаляем префикс «0x» (если он есть)
    if (hexString.StartsWith(«0x»))
    {
    hexString = hexString.Substring(2);
    }

    // Преобразуем шестнадцатеричную строку в массив байтов
    byte[] bytes = new byte[hexString.Length / 2];
    for (int i = 0; i < bytes.Length; i++)
    {
    string byteString = hexString.Substring(i * 2, 2);
    bytes[i] = byte.Parse(byteString, System.Globalization.NumberStyles.HexNumber);
    }

    // Преобразуем массив байтов в строку
    return Encoding.UTF8.GetString(bytes);
    }
    }

    про DecodeAscii в контексте C# ничего не нашел

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