Подскажите как составить формулу!

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

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

    Как составить формулу чтоб показания входного канала до 100 приравнивались к нулю.

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

    Для канала типа Входной или Входной/выходной
    Cnl < 100 ? 0 : Cnl

    • Ответ изменён 2 года, 8 месяцев назад пользователем Mikhail.
    #30008
    manjey73
    Участник

    Cnl > 100 ? Cnl : 0

    >= при необходимости

    🙂 или переставить местами

    • Ответ изменён 2 года, 8 месяцев назад пользователем manjey73.
    #30011
    Sever
    Участник

    Спасибо! Помогло)

    #30251
    mr_smit
    Участник

    Есть переменная статуса типа int которая считывается с устройства. Эта переменная отображает статус работы устройства:

    бит	значение
    
    0	Останов
    1	Ожидание
    2	Блокировка
    
    и т.д.

    Необходимо отобразить это состояние в динамическом тексте в web.

    Отредактировал Custom script и добавил туда:

    // Возвращает строку статуса режима работы
    public string GetStatusFromByte(int stat)
    {
        string strBuf = "";
        if ( (1 << 0)  &  stat) strBuf = "Останов"; 
        if ( (1 << 1)  &  stat) strBuf = "Ожидание"; 
        if ( (1 << 2)  &  stat) strBuf = "Блокировка"; 
    
        return strBuf;
    }

    Сделал новый канал, расчетный. Прописал во входную формулу GetStatusFromByte(Val(108)). Где 108 это канал куда читается значение состояния. На мнемосхему добавил динамический текст и на входной канал указал номер расчетного канала.

    Загрузил на сервер и сервер полностью упал… Открывается только форма логина/пароля и сколько не жди — сервер не доступен. Не входит. Как правильно формулу написать?

    • Ответ изменён 2 года, 7 месяцев назад пользователем mr_smit.
    #30253
    manjey73
    Участник

    Смотрите в логах сервера почему упал, вероятно ошибка в скрипте.

    з.ы. а зачем вообще делали скрипт? Это же можно перечислением сделать.
    Добавьте свое перечисление, дайте ему имя

    Остановка; Ожидание; Блокировка

    Если например нужно пропустить 0, то будет так

    ; Остановка; Ожидание; Блокировка

    #30254
    manjey73
    Участник

    И не совсем ясно при чем тут статус канала и статус устройства, которое числовым значением передает свое состояние.
    Это изначально разные вещи…

    Длина поля значение канала всего 8 байт. В UTF вы можете использовать всего 4 байта из-за того, что для русских букв требуется по 2 байта на символ.
    Как бы не влезет больше чем Оста, Ожид, Блок даже если преобразовывать в строку и делать канал строковым.

    • Ответ изменён 2 года, 7 месяцев назад пользователем manjey73.
    #30256
    mr_smit
    Участник

    Так тоже не работает:

    // Возвращает строку статуса режима работы
    public string GetStatusFromByte(int stat)
    {
        string strBuf = "";
        if ( Convert.ToBoolean( (1 << 0)  &  stat) ) strBuf = "Останов"; 
        if ( Convert.ToBoolean( (1 << 1)  &  stat) ) strBuf = "Ожидание"; 
        if ( Convert.ToBoolean( (1 << 2)  &  stat) ) strBuf = "Блокировка"; 
    
        return strBuf;
    }

    При попытке логина постоянно пишет «приложение не готово». Хотя онлайн компилятор ошибок не выдает.

    1
    2

    #30257
    mr_smit
    Участник

    Ошибка при компиляции исходного кода скриптов и формул:
    (391,70): error CS1503: Argument 1: cannot convert from ‘double’ to ‘int’

    Считываемое значение двух байтовое int. Где он там double видит не понимаю.

    • Ответ изменён 2 года, 7 месяцев назад пользователем mr_smit.
    #30259
    manjey73
    Участник

    Потому что в формулу потом надо подставлять Formula((int)Val(XXX))

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

    Потому что все каналы в базе именно Double — это надо принять и п-р-растить 🙂

    • Ответ изменён 2 года, 7 месяцев назад пользователем manjey73.
    • Ответ изменён 2 года, 7 месяцев назад пользователем manjey73.
    #30262
    manjey73
    Участник

    Вы объявили входную переменную как int, но подаете туда значение канала double.
    Движок скрипта в данном не знает о том, что его надо конвертировать, по этому это надо сделать самостоятельно.
    Движок конвертирует выход в double автоматом как правило.

    Но еще раз, вам не надо возвращать строку, это из другой оперы немного. Точнее можно и так, но будет ограничение на 4 символа для русского и 8 символов ASCII

    Проще в данном случае сделать перечислением. И будет правильнее сделать перечислением

    #30263
    manjey73
    Участник

    Вы когда считываете драйвером Modbus 2 байта int, оно «неожиданно» 🙂 в БД попадает как double. Вообще все числа в БД в поле Значение канала хранятся как double со времен еще предыдущих версий.

    Я сам знаю, что это не совсем удобно, но так БД работает быстрее.
    з.ы. мне например тоже не хватает полноценных текстовых переменных вместо double, но когда появятся неизвестно…

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

    Вам здесь вообще не нужна формула. Используйте формат канала перечисление.

    #30265
    mr_smit
    Участник

    Приведите пожалуйста пример. Я не понимаю. У меня int и соответственно 16 возможных состояний. Где какое перечисление выбрать?

    123

    #30267
    Romiros
    Участник

    В таблице Форматы создайте свой формат с вашими 16-ю перечислениями по аналогии с похожим форматом. Можете сразу задать цвет фразам. Далее для своего канала выберите созданный формат.

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