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

Просмотр 12 сообщений - с 1 по 12 (из 12 всего)
  • Автор
    Сообщения
  • #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.

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

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

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

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

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

    #27846
    alexandr1803
    Участник

    Приветствую, попробовал данную формулу для считывания состояния ПЧ, частотник передает десятичное значение (напр 1543), разложил его данной формулой на 12 бит и вывел на схему для наглядности все 12 в строку, так вот, значение в частотнике постоянно, а биты в строке живут своей жизнью, переключаясь хаотично с 0 на 1. Как так то? Что я делаю не так?

    #27848
    manjey73
    Участник

    Может из-за потери связи с частотником? Контролировать Stat
    Расчетные каналы должны быть все после получаемого если порядок смотреть

    #27849
    alexandr1803
    Участник

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

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

    В пакете Модбас из журнала линии связи тоже часть битов не выдаётся?

    #27859
    alexandr1803
    Участник

    да

    #27861
    alexandr1803
    Участник

    Михаил, помогите пожалуйста с паролями в теме скада вэб.

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

    Насколько я понял, вопрос решен здесь.

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