Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Побитное разложение сигнала
Помечено: Битовое разложение, побитное разложение
- В этой теме 11 ответов, 4 участника, последнее обновление 1 год назад сделано Mikhail.
-
АвторСообщения
-
03.11.2022 в 08:14 #25824saprin8Участник
Приветствую, столкнулся с небольшой задачей, которую не могу до конца понять. Мне приходит сигнал 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 переводить или нет?03.11.2022 в 09:12 #25825saprin8Участникне знаю насколько правильно, но сделал так.
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
03.11.2022 в 10:46 #25826manjey73УчастникВ формулах есть GetBit, создаете нужное количество дорасчетных каналов на требуемое количество битов и используете формулу GetBit для требуемого бита.
Все.
Так же в формуле можете проверять статус основного канала, чтобы переводить сигналы в недостоверное состояние или в 0.
- Этот ответ был изменен 1 год, 5 месяцев назад от manjey73.
03.11.2022 в 10:48 #25828manjey73Участникз.ы. кстати было бы прикольно иметь формулу или специализированную запись для расчетных каналов вида Cnl.1 или Cnl.5 и так далее, а Сервер сам поймет что просят требуемый бит. Но тут такого нет 🙂
Если вам нужен единственный бит, то в формуле вы можете указать GetBit(Cnl, 5)
Если в дорасчетных, то GetBit(Val(101),5) где Val(101) это номер канала куда приходит ваш UINT а 5 номер бита- Этот ответ был изменен 1 год, 5 месяцев назад от manjey73.
03.11.2022 в 11:35 #25830saprin8УчастникСпасибо, буду пробовать, я даже и забыл про базовые формулы)
31.03.2023 в 11:06 #27846alexandr1803УчастникПриветствую, попробовал данную формулу для считывания состояния ПЧ, частотник передает десятичное значение (напр 1543), разложил его данной формулой на 12 бит и вывел на схему для наглядности все 12 в строку, так вот, значение в частотнике постоянно, а биты в строке живут своей жизнью, переключаясь хаотично с 0 на 1. Как так то? Что я делаю не так?
31.03.2023 в 11:23 #27848manjey73УчастникМожет из-за потери связи с частотником? Контролировать Stat
Расчетные каналы должны быть все после получаемого если порядок смотреть31.03.2023 в 11:56 #27849alexandr1803УчастникСпасибо разобрался, ошибка в номере канала была. Непонятно только как прочитать 16 бит из частотника, он выдает по регистру значение ushort только 12 бит. а в регистре на самом деле 16.
31.03.2023 в 12:22 #27854MikhailМодераторВ пакете Модбас из журнала линии связи тоже часть битов не выдаётся?
31.03.2023 в 12:45 #27859alexandr1803Участникда
31.03.2023 в 12:47 #27861alexandr1803УчастникМихаил, помогите пожалуйста с паролями в теме скада вэб.
03.04.2023 в 11:36 #27917 -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.