Отправка набора байт через Модуль упр.

Стартовая страница Форумы Понять, как работает ПО Формулы Отправка набора байт через Модуль упр.

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

    Ну собственно формулы Val() и SetVal(n, Cmd) должны уметь корректно работать в зависимости от типа данных канала.

    Либо под каждый тип должны быть аналоги формул, типа LVal(), SVal(), HVal() так же и формулы для выходного канала.

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

    > В канале все равно ведь хранится double
    Да

    > Либо под каждый тип должны быть аналоги формул, типа LVal(), SVal(), HVal()
    Наверное. На данный момент нужно их самому написать в таблице скриптов. Берёте значение как double, разбираете на байты и собираете затем в long. Это новая тема, ещё никто не пробовал 🙂

    Посмотрите BitConverter.ToInt64(buffer, index)

    #29765
    manjey73
    Участник

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

    Просто Val() и SetVal интегрированы в систему и переходя с 5-й версии, где все и всегда было double надо было как-то позаботится об этих формулах, так как в 6-й добавились типы данных канала. А учитывая, что чтобы не возвращал в канал, все преобразуется в double. Будь то long или byte или bool

    #29766
    manjey73
    Участник

    для типа данных Integer, аналог Val()

    public long LVal()
    {
    byte[] m = BitConverter.GetBytes(Val(CnlNum)); 
    long ml = BitConverter.ToInt64(m, 0);
    return ml;
    }

    Ну и извращенная формула изменения одного байта с преобразованием из dec в bcd
    с контролем вводимого числа и сразу заданием остальных байт.

    public double SetEngCommXYE(double cmd)
    {
    if (cmd < 16 || cmd > 32) throw new Exception("Значение должно быть в пределах 16 - 32");
    byte[] m = new byte[] {0x88, 0x01, (byte)DecToBCD((int)cmd) , 0x00, 0x00, 0x00, 0x00, 0x00 };
    double ml = BitConverter.ToDouble(m, 0);
    SetVal(CnlNum, ml);
    return ml;
    }

    Вот из-за того, что SetVal работает так же с double опять же дополнительные преобразования…

    Хотелось бы, чтобы подобные формулы работали с учетом типа данных канала из коробки.

    #29767
    manjey73
    Участник

    SetData(n, val, stat) double Установить текущее значение и статус входного канала n

    Вот пример, почему бы данной формуле логически не называться SetValStat

    А SetData логически правильнее работать по аналогии с SetVal только записывать в канал массив байт ????

    Уже было бы чуть правильнее и логичней.

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

    Нужно будет добавить функцию получения long в шаблон проекта.
    Где можно найти код функции DecToBCD?

    почему бы данной формуле логически не называться SetValStat

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

    #29772
    manjey73
    Участник
    // Конвертирование числа из десятичного в BCD формат
    public static int DecToBCD(int dec)
    {
    int num = 0;
    int num1 = 0;
    while (dec != 0)
    {
    num = num | dec % 10 << (num1 & 31);
    num1 += 4;
    dec /= 10;
    }
    return num;
    }

    Когда-то нарыта в интернете и используется в ScadaCommFunc.dll, куда я собираю всякое разное, чтобы не повторять в драйверах.
    Ну а так как Сервер не может подключать dll в формулах, пришлось ее перенести в Скрипты.

    Если нужна обратная, BcdToDec то она так же есть в ScadaCommFunc

    #29773
    manjey73
    Участник

    SetData было бы логичнее в рамках сравнения с CmdData, потому что Val аналогичен CmdVal.

    Я об этом.

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

    Пожелание по добавлению своих функций через DLL записал.

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