Стартовая страница › Форумы › Понять, как работает ПО › Формулы › Подскажите как составить формулу!
- В этой теме 50 ответов, 7 участников, последнее обновление 2 года, 6 месяцев назад сделано
Mikhail.
-
АвторСообщения
-
17.10.2023 в 11:08 #30005
Sever
УчастникКак составить формулу чтоб показания входного канала до 100 приравнивались к нулю.
17.10.2023 в 11:47 #30006
MikhailМодераторДля канала типа Входной или Входной/выходной
Cnl < 100 ? 0 : Cnl-
Ответ изменён 2 года, 8 месяцев назад пользователем
Mikhail.
17.10.2023 в 11:48 #30008
manjey73УчастникCnl > 100 ? Cnl : 0
>= при необходимости
🙂 или переставить местами
-
Ответ изменён 2 года, 8 месяцев назад пользователем
manjey73.
17.10.2023 в 11:52 #30011Sever
УчастникСпасибо! Помогло)
05.11.2023 в 14:51 #30251mr_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.
05.11.2023 в 15:20 #30253
manjey73УчастникСмотрите в логах сервера почему упал, вероятно ошибка в скрипте.
з.ы. а зачем вообще делали скрипт? Это же можно перечислением сделать.
Добавьте свое перечисление, дайте ему имяОстановка; Ожидание; Блокировка
Если например нужно пропустить 0, то будет так
; Остановка; Ожидание; Блокировка
05.11.2023 в 15:21 #30254
manjey73УчастникИ не совсем ясно при чем тут статус канала и статус устройства, которое числовым значением передает свое состояние.
Это изначально разные вещи…Длина поля значение канала всего 8 байт. В UTF вы можете использовать всего 4 байта из-за того, что для русских букв требуется по 2 байта на символ.
Как бы не влезет больше чем Оста, Ожид, Блок даже если преобразовывать в строку и делать канал строковым.-
Ответ изменён 2 года, 7 месяцев назад пользователем
manjey73.
05.11.2023 в 15:24 #30256mr_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; }При попытке логина постоянно пишет «приложение не готово». Хотя онлайн компилятор ошибок не выдает.
05.11.2023 в 16:02 #30257mr_smit
УчастникОшибка при компиляции исходного кода скриптов и формул:
(391,70): error CS1503: Argument 1: cannot convert from ‘double’ to ‘int’Считываемое значение двух байтовое int. Где он там double видит не понимаю.
-
Ответ изменён 2 года, 7 месяцев назад пользователем
mr_smit.
05.11.2023 в 16:10 #30259
manjey73УчастникПотому что в формулу потом надо подставлять Formula((int)Val(XXX))
Но вы изначально не туда поперлись 🙂 Вам не нужны строки, которые вы создаете от значения канала. Вам нужно сделать Перечисление и выбрать его потом в формате канала и все. Scada сама подставит в текстовые поля строковые значения перечисления.
Потому что все каналы в базе именно Double — это надо принять и п-р-растить 🙂
05.11.2023 в 16:14 #30262
manjey73УчастникВы объявили входную переменную как int, но подаете туда значение канала double.
Движок скрипта в данном не знает о том, что его надо конвертировать, по этому это надо сделать самостоятельно.
Движок конвертирует выход в double автоматом как правило.Но еще раз, вам не надо возвращать строку, это из другой оперы немного. Точнее можно и так, но будет ограничение на 4 символа для русского и 8 символов ASCII
Проще в данном случае сделать перечислением. И будет правильнее сделать перечислением
05.11.2023 в 16:17 #30263
manjey73УчастникВы когда считываете драйвером Modbus 2 байта int, оно «неожиданно» 🙂 в БД попадает как double. Вообще все числа в БД в поле Значение канала хранятся как double со времен еще предыдущих версий.
Я сам знаю, что это не совсем удобно, но так БД работает быстрее.
з.ы. мне например тоже не хватает полноценных текстовых переменных вместо double, но когда появятся неизвестно…05.11.2023 в 18:36 #30264
MikhailМодераторВам здесь вообще не нужна формула. Используйте формат канала перечисление.
05.11.2023 в 21:53 #30265mr_smit
Участник06.11.2023 в 07:50 #30267Romiros
УчастникВ таблице Форматы создайте свой формат с вашими 16-ю перечислениями по аналогии с похожим форматом. Можете сразу задать цвет фразам. Далее для своего канала выберите созданный формат.
-
Ответ изменён 2 года, 8 месяцев назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.


