Сцепить каналы в строку

Просмотр 15 сообщений - с 61 по 75 (из 76 всего)
  • Автор
    Сообщения
  • #38708
    Mikhail
    Модератор

    В итоге получилось просто 🙂

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

    В качестве оптимизации для строк можно поставить флаг в свойствах строкового канала, чтобы он сохранялся только в архив текущих данных. Это имеет смысл, если таких каналов много.

    #38729
    Mihail.D.
    Участник

    Здравствуйте!Я не давно начал изучать скаду. Не как не могу понять как собрать в расчетном канале строку из разных каналов с разделителем . которая будет длиннее 10 символов. Можно ли это собрать в табличном состоянии(и полностью увидеть всю строку) или только в представлении на схеме ?

    #38730
    manjey73
    Участник

    @mihail-d вам необходимо задать длину данных с учетом
    Количество символов / на 8 (для Ascii)
    Количество символов / на 4 (для Unicode)
    пример для ascii year 2025 month june — с учетом пробелов 20 символов (20/8=2,5 то есть длина данных будет нужна 3)

    p.s. Все равно не понимаю Data(XXX + ArrIdx) когда требуется еще и обработать байты массива, чтобы было читаемо потом.

    #38734
    Mihail.D.
    Участник

    @manjey73
    С Ascii да, это получается.Но у меня тип данных Double.

    #38735
    manjey73
    Участник

    double это в принципе набор байт… Ну таки да, его наверное надо сперва преобразовать в ulong. Посмотрите по примеру

    ulong ul = Convert.ToUInt64(Val(ftNum + i));
    byte[] buf = BitConverter.GetBytes(ul);
    str = Encoding.ASCII.GetString(buf).TrimEnd((char)0);

    то есть надо конвертнуть в ulong, тогда вы получите байты в составе близкие к ASCII

    #38736
    manjey73
    Участник

    если проще, то чистый double это набор бит целой части и мантиссы.
    В общем цифра 1 в дабл по байтам выглядит далеко не так, как цифра 1 в ulong…
    По этому нужна промежуточная конвертация.

    #38737
    Mihail.D.
    Участник

    Спасибо, попробую что то сваять)

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

    Табличные представления поддерживают отображения длинных строк.

    #38854
    Mihail.D.
    Участник

    Спасибо все помогло !
    Возник новый вопрос.

    public string ConvertVersionStr(int ftNum){
    string outStr = «»;

    // 954 канал типа аски
    // не понимаю как получить текущее значение 954 в ascii
    if (ftNum == 954){
    return Data(954).ToString();
    }

    // первые 4 канала в double конвертируются корректно кодом ниже
    double chVal = Val(ftNum);
    string currChValString = chVal.ToString();
    outStr = currChValString + «.»;

    return outStr;
    }

    Запускаю через ConvertVersionStr(950+ ArrIdx) с длинной 5. Последний канал типа ascii а первые 4 типа double. Получаю 1.0.5.114.Scada.Da а должно быть 1.0.5.114.NS

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

    Может быть
    Val(954).ToString()

    #38878
    Mihail.D.
    Участник

    Тогда вместо NS получаю длинное число с плавающей точкой. Что то типа 1.0.5.114.1.543745е

    #38879
    manjey73
    Участник

    блин, я же выше писал — это из-за конвертирования в double Коммуникатором, там другие байты, не соответствующие ASCII кодам. То есть некое неизвестное число (коммуникатор ни сном ни духом, что это набор ascii символы) конвертируется в double.

    Сперва его надо вернуть в uint64 и только потом применять к нему преобразование в ascii

    #38883
    Mihail.D.
    Участник

    Спасибо , пойду ковырять дальше )

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

    Чтобы получить более точные ответы на вопросы по строкам, пишите значения каналов в 16-ричном виде и строку, которую хотелось бы из них получить.

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