Ввод значений в различных форматах

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

    Есть команды телеуправления, необходимо вводить значения в различных форматах.
    float, double, int (2 байта) и так далее.

    В форме только два варианта, строка и 16-чные данные.
    Как реализовать ввод необходимых типов ?

    #1671
    MikhailMikhail
    Модератор

    На мой взгляд, нужно вводить в виде строки, а затем в формуле её преобразовывать.
    Чтобы внутри формулы получить введенную оператором строку используйте:

    string s = Encoding.Default.GetString(CmdData);
    
    #1678
    manjey73
    Участник

    В формулах создал так, сервер при таком варианте загружается без ругани.

    public short StringToInt16 (byte[] val)
    {
    string s = Encoding.Default.GetString(val);
    short num;
    Int16.TryParse(s, out num);
    return num;
    }

    В Администраторе на канале управления указываю использовать формулу и StringToInt16(CmdData) и получаю ошибку

    2016-03-14 12:36:04 <VHPC><система><ERR> Ошибка при компилировании исходного кода формул:
    Строка 457, колонка 101: error CS0029: Неявное преобразование типа «int» в «byte[]» невозможно
    Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs

    #1680
    manjey73
    Участник

    В общем я так понял, поле команды может быть либо double (CmdVal, Cmd), либо байтовый массив (CmdData). То есть Коммуникатор или кто должен получить данные для отправки в одном из двух видов ?

    Заработала функция

    public byte[] StringToInt (byte[] val)
    {
    string s = Encoding.Default.GetString(val);
    short num;
    short.TryParse(s, out num);
    byte[] buf_out = BitConverter.GetBytes(num);
    if (BitConverter.IsLittleEndian)
    Array.Reverse(buf_out);
    return buf_out;
    }

    И формула в канале управления
    StringToInt(CmdData)

    Одно непонятно, почему пришлось переворачивать младшим байтом вперед ?

    Ввод соответственно в строковом виде.

    • Этот ответ был изменен 5 лет, 4 месяца назад от manjey73.
    #1681
    manjey73
    Участник

    И вопрос как защититься от неверно введенного значения ?
    Try.Parse позволяет при неправильном значении выдать 0 на выход, а значение не должно быть нулевым, например если 0, то не менять ничего.

    #1683
    MikhailMikhail
    Модератор

    Для стандартных команд формула должна возвращать double,
    для бинарных — byte[]

    Вы можете использовать if (int.TryParse(…)) {…}
    Если Вы вернёте double.NaN или вместо массива null, то команда не будет передана вообще — это ответ на вопрос о защите от неверного значения.

    #1684
    manjey73
    Участник

    C защитой понятно.
    С командами с одной стороны вроде как тоже, только при выборе типа команды «Стандартная» как вводить значения ? такого функционала я так понял нет.

    Как вообще предполагался ввод значений, кроме Вкл/Выкл в том же Modbus ?

    #1685
    MikhailMikhail
    Модератор

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

    #2955
    ds.zaycevds.zaycev
    Участник

    Опрашиваю контроллер по modbus, мануал по устройству обещает Input Registers в ячейке A021 (это вроде как 40993+1) хранить температуру, в формате real с диапазоном -60 200 гр. Цельсия. Не понимаю:
    1. как настроить шаблон modbus
    2. как преобразовать эти чудовищные цифры в градусы

    Судя по тому, что адреса в описании modbus идут через 2, то тип должен быть 4 байта… Получил я нечто, а как его в градусы преобразовать? Получается что обычного деления и умножения недостаточно? Нужна какая-то особая формула?

    • Этот ответ был изменен 4 года, 11 месяцев назад от ds.zaycevds.zaycev.
    #2957
    manjey73
    Участник

    ds.zaycev попробуйте переставить байты при обработке запроса.
    2 регистра это 4 байта = float (real)

    #2958
    djbond07djbond07
    Участник

    Если он хранит в Real, то скорей всего это и есть температура. Если значения не сходятся с реальными, то нужно делать преобразование. Берём устройство для измерения температуры, делаем 2 замера с разными показаниями. Получаем 2 точки, по ним строим калибровочную прямую, получаем уравнение прямой и вбиваем его в дорасчётный канал. Так что формула обычная. Но тут скорей всего дело в другом чём-то.

    #2960
    MikhailMikhail
    Модератор

    Порядок байт задаётся в Модбас-шаблоне в Коммуникаторе. Подбирается экспериментальным путем. Кроме того, в интернете есть онлайн сервисы для перевода HEX во float, на них быстрее попробовать. Полученные от устройства HEX данные можно извлечь из лога с помощью modbus.rapidscada.net

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