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

Помечено: ,

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

    // Converts the specified value to an ASCII string up to 8 characters long.
    // Преобразует заданное значение в строку ASCII длиной до 8 символов.
    public string ToAscii(double val)
    {
    long ll = Convert.ToInt64(val);
    byte[] buf = BitConverter.GetBytes(ll);
    return Encoding.ASCII.GetString(buf).TrimEnd((char)0);
    }

    немного другая формула для этого — ToAscii при необходимости переставьте байты драйвером

    #38480
    manjey73
    Участник

    Просто у вас НЕТ шестнадцатеричной строки, вот в чем фокус. Обычное число по байтам выглядит иначе, чем такое же целое число в формате double.
    А ядро Scada конвертирует все числа в формат double, тем самым изменяя байты внутри.
    По этому сперва надо преобразовать обратно в обычное число, чтобы байты «вернулись» к тому же виду, как в регистре, и только потом делать декодирование в Ascii

    #38481
    petuhovdmitry
    Участник

    >> немного другая формула для этого — ToAscii
    а что передать в нее? ToAscii(Cnl) роняет скаду

    #38482
    petuhovdmitry
    Участник

    или нужно сначала закинуть это в кастомный скрипт?

    #38483
    manjey73
    Участник

    Конечно в скрипт. Формула отличается от DecodeAscii в разделе String тем, что сперва преобразует значение в Int64 а уже потом в строку.

    #38484
    petuhovdmitry
    Участник

    https://ncloud.interra.company/s/3o28CM2TzqLwBte
    Отлично, то что нужно, спасибо!
    Уверен, что этот опыт будет и другим полезен.

    #38507
    manjey73
    Участник

    ulong ll = Convert.ToUInt64(val); возможно правильнее будет к ulong приводить.

    #38509
    petuhovdmitry
    Участник

    возможно правильнее будет к ulong приводить.

    Предлагаете поправить в скрипте?

    #38510
    manjey73
    Участник

    Да по идее разницы не будет, даже если там отрицательное число окажется, байт будет тем же самым.

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

    В таблице Скрипты найдите код формул EncodeAscii и DecodeAscii, чтобы было понятнее.
    Сделайте вывод исходных каналов в табличное представление в 16-ричном виде.

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

    Рекомендую каналы входного типа оставить как есть, без формул. Это позволит чётко понимать, что получено от контроллера. Далее в расчётном канале уже применить формулу.

    #38551
    petuhovdmitry
    Участник

    Рекомендую каналы входного типа оставить как есть, без формул. Это позволит чётко понимать, что получено от контроллера. Далее в расчётном канале уже применить формулу.

    Так и поступаю, спасибо!

    #38553
    manjey73
    Участник

    ну в данном случае так и придется поступать, потому что там цифры, там символы ASCII, а еще надо прилепить точки 🙂

    #38554
    petuhovdmitry
    Участник

    ну, ToAscii(Cnl) во входном канеле оставлять жеж?

    #38555
    manjey73
    Участник

    НЕТ. Вам нужно полностью сделать другой скрипт.
    У вас получается 4 канала
    1.0.114.NS

    сделать скрипт, например с указанием первого канала, типа
    public string GetVersion(int firstNum)
    {
    Тут обработка, начиная с первого номера канала
    int x = (ushort)Val(firstNum);
    int y = (ushort)Val(firstNum+1);
    ——
    string ns = а тут обработка как раз, чтобы получить нужную строку из firstNum+3
    Склеиваете вашу строку…
    return Ваша строка;
    }

    В общем что-то типа того.
    То есть каналы принимаете как есть, и пусть они там где-то в БД будут, вы их можете скрыть из таблицы потом вообще.

    • Ответ изменён 5 месяцев, 2 недели назад пользователем manjey73.
Просмотр 15 сообщений - с 16 по 30 (из 33 всего)
  • Для ответа в этой теме необходимо авторизоваться.