Выходная формула для управления

Стартовая страница Форумы Понять, как работает ПО Формулы Выходная формула для управления

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Автор
    Записи
  • #40899
    Alexandr
    Участник

    Всем добрый день,

    подскажите пожалуйста как записать выходную формулу в канале.
    одно из значений которое требуется передать 12ED00000002

    Передаю данное значение через вкладку Устройство-Команда все работает, как это значение отобразить в выходной формуле в каналах не совсем пониманию.

    #40900
    manjey73
    Участник

    Нужно собрать необходимый массив байт и преобразовать его в double

    Попробуйте по аналогии.

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

    тут я нужное число добавляю к требуемому массиву. вам вероятно надо просто сделать потом return ml (то есть собранный вами массив). Возможно надо будет переворачивать массив, но это уже по месту разберетесь.

    #40901
    manjey73
    Участник

    сама суть — собираем нужный массив, преобразовываем в double и его отправляем.
    Например по кнопке «отправить команду сразу»

    #40902
    Alexandr
    Участник

    Manjey73,

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

    Да, придется думать что делать, в указанном Вами скрипте не совсем понимаю его логику.

    Спасибо

    #40903
    manjey73
    Участник

    да, в скриптах. Потом просто его вызываете в выходной.
    в принципе, можно и в выходной, вложил одно действие в другое, типа

    BitConverter.ToDouble(new byte[] {0x88, 0x01, (byte)((int)cmd) , 0x00, 0x00, 0x00, 0x00, 0x3C }, 0) но не проверял.

    у меня еще там проверка на вводимое число есть.

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

    Добрый день!
    Если речь про Модбас, попробуйте передать число
    20809116549122

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

    Сделайте скриншот формы команды, которая работает через Коммуникатор.

    #40908
    Alexandr
    Участник

    Михаил, число не принимает.
    Попробовал через каналы и через устройство-команда, выводит ошибку.

    #40909
    Alexandr
    Участник

    Михаил, выложил три скрина.
    Где через коммуникатор команда исполняется.

    https://cloud.mail.ru/public/q94Q/xQ8GeyQ44

    #40910
    Alexandr
    Участник

    управление контроллера ComAp должно проходить по регистру 4207, занимает 3 count, используется функция 16.

    #40912
    manjey73
    Участник

    вам надо собрать либо 12 ED 00 00 00 02, либо добавить еще пару нулей в начале или конце при сборке double.
    в общем пробовать надо.

    Раз из коммуникатора принимает, то и через формулу должно

    #40914
    Alexandr
    Участник

    manjey73,

    в коммуникаторе, в конце значения 12 ED 00 00 00 02 добавил 00 00, так отрабатывает.
    если ставить в начале то выходит ошибка команды

    #40917
    manjey73
    Участник

    Ну так попробуйте по моему примеру. Единственное, может массив придется заполнять с хвоста. Для битконвертера 0 байт левый.
    Ещё возможно надо возвращать не double, а byte[], то есть CmdData. Посмотрите в доке по применяемым формулам. И вероятно выставить формат команды HEX или String.

    #40947
    Alexandr
    Участник

    manjey73,

    Подскажи пожалуйста, в каком скрипте понять значения.

    я так понимаю что данный скрипт будет не совсем полный

    BitConverter.ToDouble(new byte[] {0x88, 0x01, (byte)((int)cmd) , 0x00, 0x00, 0x00, 0x00, 0x3C }, 0)

    и где можно почитать как происходит преобразование HEX в Byte и может быть имеется сервис онлайн для проверки скрипта.

    просто пока совсем не понимаю данный скрипт.

    #40948
    manjey73
    Участник

    я в таком виде не пробовал в выходной формуле делать, чисто мое предположение.
    Я сделать в таблице скриптов с public у меня работает.

    вот еще пример записи времени в ПЛК, где были разделены регистры по году, часам и т.д.

    public byte[] WriteDt()
    {
    DateTime dt = DateTime.Now;
    var year = BitConverter.GetBytes((ushort)dt.Year);
    byte[] cmdData = new byte[12] {0, (byte)dt.Second, 0, (byte)dt.Minute, 0, (byte)dt.Hour,
    0, (byte)dt.Day, 0, (byte)dt.Month, 0, 0};
    cmdData[10] = year[1];
    cmdData[11] = year[0];
    return cmdData;
    }

    здесь как раз мы возвращаем не double а массив байт.

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