Стартовая страница › Форумы › Ошибки в работе › Ошибки Сервера › Ошибка при компилировании исходного кода формул
- В этой теме 62 ответа, 9 участников, последнее обновление 1 год, 7 месяцев назад сделано
Mikhail.
-
АвторСообщения
-
24.07.2019 в 13:43 #12927
Andrew174
УчастникДобрый день!
Столкнулся со следующей ситуацией:
1. Указываю в каналах управления КП формулы (для каналов 1901 и 1902):
SetVal(CnlNum, Val(1801)-4)
SetVal(CnlNum, Val(1801)+4)Всё работает отлично. При нажатии кнопок значения уменьшаются/увеличиваются на 4
и отправляются в контроллер по Modbus (RS485).2. Указываю в каналах управления КП формулы (для каналов 1901 и 1902):
Val(1801) : Val(1801)-4
Val(1801) : Val(1801)+4Не работает. В логе пишет:
———————————————————————————
———————————————————————————
2019-07-24 15:07:48 <PC><система><ACT> Служба ScadaServerService 5.1.2.0 запущена
2019-07-24 15:07:48 <PC><система><ACT> Проверка существования директорий данных выполнена успешно
2019-07-24 15:07:48 <PC><система><ACT> Проверка существования файлов базы конфигурации выполнена успешно
2019-07-24 15:07:48 <PC><система><ACT> Входные каналы считаны из базы конфигурации. Количество активных каналов: 126
2019-07-24 15:07:48 <PC><система><ACT> Каналы управления считаны из базы конфигурации
2019-07-24 15:07:48 <PC><система><ACT> Пользователи считаны из базы конфигурации
2019-07-24 15:07:48 <PC><система><ACT> Формулы считаны из базы конфигурации
2019-07-24 15:07:48 <PC><система><ERR> Ошибка при компилировании исходного кода формул:
Строка 593, колонка 129: error CS1026: ожидалась )
Строка 593, колонка 129: error CS1525: Недопустимый терм «:» в выражении
Строка 593, колонка 131: error CS1002: ожидалась ;
Строка 593, колонка 142: error CS1002: ожидалась ;
Строка 593, колонка 142: error CS1525: Недопустимый терм «)» в выражении
Строка 594, колонка 129: error CS1026: ожидалась )
Строка 594, колонка 129: error CS1525: Недопустимый терм «:» в выражении
Строка 594, колонка 131: error CS1002: ожидалась ;
Строка 594, колонка 142: error CS1002: ожидалась ;
Строка 594, колонка 142: error CS1525: Недопустимый терм «)» в выражении
Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs
2019-07-24 15:07:48 <PC><система><ERR> Нормальная работа программы невозможнаХотелось бы использовать второй вариант написания формул (как более правильный и гибкий).
Что я делаю неправильно и куда «копать»?
24.07.2019 в 13:57 #12928manjey73
Участник: — а что вы этим хотите добиться?
24.07.2019 в 17:25 #12931Mikhail
Модераторидея формулы с двоеточием не ясна
24.07.2019 в 17:30 #12934manjey73
УчастникЭто может if по условию ?
? одна операция : другая операция;
???? чисто предположение…
24.07.2019 в 17:42 #12938Andrew174
УчастникХочу реализовать вот такую логику работы:
«https://forum.rapidscada.ru/?topic=оперативное-изменение-modbus-регистра»Как это сделано у litmi.
24.07.2019 в 17:44 #12939Andrew174
УчастникКак это сделано в теме: «оперативное изменение Modbus-регистра»
24.07.2019 в 17:46 #12940Andrew174
УчастникУсловия тоже нужны.
Необходимо проверять, чтобы значения входного канала были не меньше 20 (в первой строчке) и не больше 255 (во второй строчке).25.07.2019 в 17:45 #12945Mikhail
МодераторНапишите, пожалуйста, задачу целиком.
Если A <= значение канала <= B, то что, иначе что?26.07.2019 в 12:16 #12956Andrew174
УчастникКанал входной — 1801. Считывает значение определенного регистра устройства по Modbus.
Канал управления — 1901. Изменяет (на «- 4»), при каждом нажатии кнопки на схеме, значение определенного регистра устройства по Modbus.
Канал управления — 1902. Изменяет (на «+ 4»), при каждом нажатии кнопки на схеме, значение определенного регистра устройства по Modbus.Необходимо добавить проверку значений каналов управления, перед нажатием на кнопку:
— если значение канала 1901 меньше «20», то передача этого числа не происходит (в регистр не записывается новое значение)
— если значение канала 1902 больше «255», то передача этого числа не происходит (в регистр не записывается новое значение)Я надеялся, что будут работать следующие формулы, указанные в соответствующих каналах управления:
— Val(1801)<=20 ? Val(1801) : Val(1801)-4
— Val(1801)>=255 ? Val(1801) : Val(1801)+4К сожалению, такой вариант не работает.
В логах пишет «Ошибка при компилировании исходного кода формул».26.07.2019 в 14:45 #12957manjey73
УчастникAndrew174 потому что первая конструкция Val(1801) <=20 как бы возвращает bool а у вас попытка чего ? далее вы пытаетесь Читать переменную, а надо выставлять
канал 181 — формула — Val(180) > 0 ? SetCnl(41, 5500) : 0
В канале 181 проверяется больше 0 значение канала или 0 и если больше, идет запись в канал 41 значения, ну либо 026.07.2019 в 16:14 #12959Mikhail
МодераторУ каналов управления нет значения. Он только описывает отправку команды. Однако доступно значение отправляемой команды Cmd. Но оно не хранится в канале управлнения, а доступно только на момент вычисления формулы.
Значения есть у входных каналов.26.07.2019 в 16:15 #12960Mikhail
МодераторVal(1801) <= 20 ? Val(1801) : Val(1801) - 4
Формула выглядит нормально. Какая конкретно ошибка в журнале Сервера?
30.07.2019 в 13:34 #12983Andrew174
УчастникФормулы, указанные в соответствующих каналах управления (1901 и 1902), работают вот в таком виде:
— Val(1801)<=46 ? Val(1801) : Val(1801)-4
— Val(1801)>=254 ? Val(1801) : Val(1801)+4RapidSCADA перестала выдавать сообщение «Ошибка при компилировании исходного кода формул» после проверки и исправления ошибок в Win7.
Ну и с синтаксисом формул я, поначалу, не совсем разобрался.
Вероятно, эти два момента, присутствующих одновременно, и стали причиной ошибок.
Проблема решена.
P.S.
По использованию формул нужен отдельный HELP с примерами. Тогда вопросов на форуме будет меньше.30.07.2019 в 17:20 #12993Mikhail
МодераторХорошо, что всё получилось.
Тема формул насолько обширна, что даже непонятно, что писать в таком хелпе. Либо получится целая книга ))
Справка по формулам.30.07.2019 в 17:29 #12996manjey73
УчастникНа счет формул не хватает правильного описания, что можно а что нельзя.
Ведь формула в канале выглядит не совсем так, как в коде Visual Studio.
ну например, если это входной канал, то результат формулы самой Scada конвертируется в double.
Вот такое надо толково описать в документации, то есть нюансы, которые произойдут при компилировании формулы Scada системой. Чтобы их правильно использовать или обходить…
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.