Побитное разложение сигнала

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

    Приветствую, столкнулся с небольшой задачей, которую не могу до конца понять. Мне приходит сигнал UINT, который нужно побитно разложить. В старой скаде (мастер скада) я просто преобразовывал UINT_TO_BYTE, а потом новой переменной присваивал каждый бит (с 0 по 6), каждый бит это статус аварии. Рапид работает с double, поэтому тут наверное тоже надо преобразования делать?

    В старой скаде код выглядел так (ST язык):
    devStatus_byte:=UINT_TO_BYTE(devStatus_low);
    laserAlertStatus:=devStatus_byte.0;
    flowAlertStatus:=devStatus_byte.1;

    instrumentSampleStatus:=devStatus.6;

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

    Сейчас я сделал набросок в стиле:

    public enum Status : byte
    {
    laserAlertStatus = 0,
    flowAlertStatus = 1,

    instrumentSampleStatus = 6
    }
    Нужно ли double в byte переводить или нет?

    #25825
    saprin8
    Участник

    не знаю насколько правильно, но сделал так.
    public double AlarmsMIS(double Value)
    {
    byte Status = Convert.ToByte(Value);
    double AlarmStat = 0;

    Status : byte

    laserAlertStatus = 0,

    instrumentSampleStatus = 6;

    if (laserAlertStatus == 1)
    {
    AlarmStat = 1;
    }
    else if

    else
    {
    AlarmStat = 0;
    }
    return AlarmStat;
    }

    Соответственно Value это значение канала, которому с сервера летит UINT

    #25826
    manjey73
    Участник

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

    Все.

    Так же в формуле можете проверять статус основного канала, чтобы переводить сигналы в недостоверное состояние или в 0.

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

    з.ы. кстати было бы прикольно иметь формулу или специализированную запись для расчетных каналов вида Cnl.1 или Cnl.5 и так далее, а Сервер сам поймет что просят требуемый бит. Но тут такого нет 🙂

    Если вам нужен единственный бит, то в формуле вы можете указать GetBit(Cnl, 5)
    Если в дорасчетных, то GetBit(Val(101),5) где Val(101) это номер канала куда приходит ваш UINT а 5 номер бита

    • Этот ответ был изменен 3 месяца назад от manjey73.
    #25830
    saprin8
    Участник

    Спасибо, буду пробовать, я даже и забыл про базовые формулы)

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