Округление до десятых

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

    RS6. Читаю температуру по modbus, тип real. Получаю, например, 22.437. Хочу округлить до 22.4. Во входной формуле написал Math.Round(Val(109),1). Но это срабатывает только один раз. Далее значение не меняется (хотя входное меняется). Как правильно округлять?

    P.S. И ещё заметил что установка на дисплее отображает температуру, округленную до десятых, но как то хитро. В большую сторону что ли. Например 22.537 округлит до 22.6, хотя по правилам вроде как 22.5 должно быть.

    #30356
    Romiros
    Участник

    Подозреваю что ситуация в следующем. Видимо пытаетесь применить данную формулу во входном, а не расчетном канале. Val() — это значение канала после расчета. Оно у Вас рассчитывается первый раз и далее Вы к нему постоянно обращаетесь, игнорируя реальные входящие данные.
    Поэтому во входном канале используйте Math.Round(Cnl,1)

    Есть разные способы округления. Почитайте про округления в c# и подберите нужное, если хотите повторить поведение как у установки.

    #30358
    a80808
    Участник

    Например 22.537 округлит до 22.6,
    По правилам математики если последняя цифра 4 — округляется вниз, 5 — вверх. А вот у бухгалтеров не так — 5 — вниз… Постоянно с бухгалтерией конфликтовали на этот счет.

    #30360
    manjey73
    Участник

    Там несколько правил округления, еще зависит какая цифра стоит после той, на которой требуется округлить…

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

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

    Используйте формат канала. Округление с помощью формулы в данном случае излишне.

    #30417
    mr_smit
    Участник

    В 101 канал читаю значение bool. Его же назначил во входной канал для тумблера. Работает. Теперь надо чтобы при нажатии на тумблер произошла отправка значения 0 или 1 устройству. Для это использую другой канал (136). Значение должно отправиться инверсно. Т.е. если читаем в 101-м канале 1, то при нажатии на тумблер должно отправиться 0. Используется Rapid Scada 6.

    Т.е. тумблер отображает состояние устройства (0-1), а при нажатии меняет его.

    В выходной формуле для 136 канала написал:
    !Val(101)
    Но не фурычит.

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

    Потому что канал Double. Сперва приведите его к bool

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

    Для это использую другой канал

    Другой канал является лишним, обычно достаточно одного канала. Компонент тумблер отправляет значение в зависимости от положения тумблера, поэтому формула тоже лишняя.

    #30429
    mr_smit
    Участник

    Запись идет по другому адресу. Не по тому откуда считывается значение.

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

    Без формулы попробуйте, в любом случае.

    #30454
    mr_smit
    Участник

    Да, получилось без формулы. Тумблер, по умолчанию, оказывается 0 или 1 отправляет в выходной канал. Просто указал входной и выходной канал. По входному он сам переводится в нужное положение. А по выходному отправляет 0 ил 1 в зависимости опять же от положения. Если был включен -> при нажатии отправит 0 для выключения.

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

    Если команда приходит в Коммуникатор, то её фактическое значение пишется на странице данных устройства — удобно для контроля.
    Если команда проходит через канал, то можно поставить маску события, чтобы увидеть значение.

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