Ваши комментарии

Добрый день!

Вынужден присоединиться к теме.
Не могу удержаться - "брошу свой камень".
Документация не самая сильная сторона вашей замечательной системы.
Скачал примеры с http://simplight.ru/news/118-05-05-2015-sl-4-4.
Что могу сказать, те примеры которые можно скачать на странице, они такие … примеры, что просто "…кушать не могу …"
Нет, они очень даже хорошие примеры, НО:
1) как я могу оценить работу примера, если база пуста, и какие даты не вводи - все равно получишь 0 (можно было бы разместить еще одну кнопочку, которая бы запускала скрипт, который заполнял бы базу значениями для полноценной работы примера - заодно и хороший пример того, как записывать данные в базу - лично для меня сейчас это актуальная задача)
2) хорошо, вы скажите, что пример приведен просто для того, что посмотреть как писАть скрипты. Отлично. Посмотрел. Что вижу? функцию GetOperationTimeValueFromDB. Заинтересовался, что за функция-процедура. И … ничего не нашел. А нету никакой информации про нее. НЕТУ!

Вы знаете. Я из программистов. Из бывших. Ну в том смысле, что давно ушел из большого спорта. Я смогу понять из описания по CTRL+SPACE про что эта функция. Но вы знаете, программисты - они такие фантазеры, что никакая фентези и рядом не стояла.
Уважаемые разработчики, ну сделайте пожалуйста простой файлик (в смысле pdf-файлик) с описанием всех функций процедур, что бы мы точно знали, что ожидать от этих функций. Ну а если там же привести примерчики (с пояснениями, а то в примерах ну ни одного коммментария, просто ахтунг!) основных задач (как считать канал, как считать в exel канал за определенной время, как записать в базу значения за определенное время, … и т.д.), то цены вам не будет во веки веков. Аминь!

С уважением, Кондратенко Анатолий
Новочеркасск

Успехов! Удачи! Терпения в общении с нами, пользователями. :)
Спасибо за оперативный ответ.
Остались сомнения.
"… если переменная уже была объявлена ранее …".
А если первоначальное объявление, сделанное внутри AsFirstRun, состоялось много месяцев назад и с тех пор глобальная переменная много раз меняла значение, программа много раз перегружалась…
Вся красота глобальной переменной (IMHO) - это возможность сохранить значение между перезапусками программ, перегрузками сервера.
Вопрос: то есть перезапустив программу и обнаружив, что в глобальной переменной есть что-то, то нет необходимости объявлять эту переменную с флагом AStored ?

С уважением, Кондратенко Анатолий
Новочеркасск
Добрый день!
Не совсем по теме, будем считать что тестирование продолжается ;)

1) На странице: http://simplight.ru/news/118-05-05-2015-sl-4-4 приведены примеры, которые не скачиваются, поскольку браузер сообщат следующее "The requested URL /simplight.ru/files/4.4/time_EQ_example.slz was not found on this server."

2) в help забыли добавить описание новых функций по работе с глобальными переменными, нет там ни слова про ClearGlobalVar, FlushGlobalVarCache, GetGlobalVarDef

3) кстати о глобальных переменных.
Читаю "… FlushGlobalVarCache принудительная запись на диск кэша глобальных переменных. На диск сохраняются те глобальные переменные у которых при назначении глобальной переменной был установлен в True – флаг «AStored»….".
Зацепило слово "назначении".
Вопрос:
Глобальная переменная объявляется функцией SetGlobalVar("per", 0, true). И этой же функцией меняется значение этой же глобальной переменной. А если в скрипте ниже будет написано SetGlobalVar("per", 1), то эта глобальная переменная перестанет сохраняться на диске? То есть, другими словами, если глобальная переменная должна сохраняться на диске, то надо ли при любом изменении этой глобальной переменной устанавливать флаг AStored ?

С уважением, Кондратенко Анатолий
Новочеркасск
Добрый день!
Скажите, пожалуйста, в версии 4.4 появится ли возможность сохранять в базе данных текстовую информацию ?

С уважением, Кондратенко Анатолий
Новочеркасск
Когда ожидать версию 4.5 ?
Будет ли в новой версии возможность организации места диспетчера ?
Добрый день!
Есть предложение по развитию программы Просмотрщик.

История рождения предложения.
Наращивание функциональности мнемосхем привело к тому, что на мнемосхеме появилась кнопка показа статистики (или истории работы) объекта. А именно, для полной ясности, привожу конкретный пример статистической информации:

старт программы технолога: 04.04.2015 6:25:05 номер программы: 2 номер шага: 1 величина уставки: 190 уставка достигнута: 04.04.2015 6:41:035 выдержка завершена: 04.04.2015 11:41:13 номер шага: 2 величина уставки: 260 уставка достигнута: 04.04.2015 14:48:17 выдержка завершена: 04.04.2015 16:48:15 MAX значение вакуума: -0,66 конец программы технолога: 04.04.2015 16:48:15 продолжительность работы: 10:23:10
Сюда хотелось бы добавить еще много чего, для того чтобы можно было понять реальное состояние объекта: увеличилась ли его инерционность, заросли ли тены, стал ли объект потреблять больше электроэнергии и т.д. и т.п. А всё это для того, чтобы ответить на один вопрос - выдерживаются ли технологические параметры. Поскольку если мы приближаемся к ответу НЕТ, то пора при очередном техническом обслуживании подвергнуть установку генеральной чистке, а возможно и профилактическому ремонту. Ну и конечно же, никто не отменял, контроль за соблюдением производственной и технологической дисциплины: важно знать реальные значения параметров в течение процесса, величины отклонений и т.д.

Другими словами, график течения процесса (который сейчас распечатывается в обязательном порядке) должен сопровождаться сухими статистическими данными: продолжительность процесса, отклонения величин, количество потребленных ресурсов и т.д. Это для технолога главного. А главного инженера интересует статистика работы оборудования: сколько часов в прошедшем месяце отработал двигатель, насос, установка и т.д.

Таким образом, необходима статистическая информация: постоянная (заранее сформулированная и подобранная, регулярно собираемая) и разовая (внезапный интерес к объекту, обусловленный аварией, либо модернизацией и т.д.).

Начал работы по претворению этих потребностей в жизнь. Выше приведенный пример - часть тестового файла, содержащего историю работы одной из установок. Файл дописывается при завершении работы "программы технолога" (это термин из инструкции на прибор ОВЕН ТРМ-251). Чтобы записать эту информацию в файл - необходимо ее накопить и сохранить от потери-повреждения при перезапуске SimpLight. На это все приходится тратить достаточно много ресурсов системы. Но об этом я стал задумываться лишь получая порой странные результаты статистики.

Дело в том, что объект не всегда ведет себя "правильно". Бывают просадки напряжения, отключения питания, сбой и отказ оборудования (объективные причины), а бывают и ошибочные действия персонала (субъективные причины). Для борьбы с этим приходится вводить дополнительные проверки качества сигнала, усложнять алгоритм сбора статистической информации.

И понял я, что иду "не туда":
- загружаю систему (которая каждую секунду должна обработать большой массив каналов, высчитать и отобразить оперативную информацию на мнемосхеме), несвойственной ей работой;
- качество статистической информации получается достаточно низкое (на каждые 10 блоков "нормальной" статистики, приходится один "неправильный" блок - то уставка не прописалась, то временная отметка почему-то какая-то левая и т.д. );
- достоверность информации также невелика (не хотелось бы огульно обвинить кого-либо в нарушении технологии, основываясь на данных статистики, которые получились из-за несовершенства алгоритма. Возможно, что сложилась уникальная ситуация, которой не должно быть при нормальной работе оборудования. И она вряд ли повторится в будущем, а усложнять алгоритм ради одного случая - вряд ли разумно. Да и просто повторить алгоритм сбора статистики не получится - ситуация осталась в прошлом, только вручную можно просмотреть графики).

Поэтому, предлагаю дополнить программу Просмотрщик модулем сбора статистики.
Только не надо отсылать меня к excel-лу.
У вас уже есть Калькулятор расхода - на его базе можно (IMHO) соорудить Калькулятор статистики, который будет содержать:
- список скриптов (пусть хотя бы на одном каком-то языке, например Паскаль)
- скрипты можно создавать, удалять, редактировать, выполнять;
- для выполнения скрипта указываем начальную дату, конечную дату, список каналов
- выходом скрипта служит текстовый файл, в который пользователь указывает любую, нужную ему информацию.

Достоинства:
- отделяем оперативную информацию от статистической;
- скрипты можно спокойно создавать, отлаживать, удалять
- а если создать механизм автоматического запуска скрипта, так вообще красота,
Тогда можно создавать ежедневную статистику, недельную, месячную, годовую. И всё это будет работать и НЕ МЕШАТЬ основной системе собирать информацию.

Недостатки:
- база данных увеличится в размерах, поскольку для сбора статистики придется укладывать в базу те каналы, которые раньше совершенно не требовалось сохранять в базе. Но как правило, это будут дискретные каналы (вкл/выкл) или простые числовые каналы (например число, обозначающее режим работы оборудования, от 1 до 15).
Других недостатков не придумал.

С уважением, Анатолий
Новочеркасск
Прямого ответа на Ваш вопрос нет.
Когда начинал работать с глобальными переменными, то проверил их взаимодействие со строками.
Опытным путем установил, работоспособной является конструкция:

строковая_переменная="ййй"; строковая_переменная=GetGlobalVar; if(строковая_переменная="ййй") { глобальная переменная не содержит значение };
поскольку в ответ на GetGlobalVar нет порой никакого ответа, ни да, ни нет.
Отказался от пустой строки "", появилась переменная-константа PUSTO, в которой хранятся три пробела.

Сделал для пары объектов необходимые изменения в скрипте.
Помучился.
Именно тогда в начале AsFirstRun появились строки с принудительным объявлением глобальной переменной.
Отладил - работало пару недель нормально.
Давай расширять на другие объекты - опять те же проблемы: новые переменные отказываются работать, так как работают "старые".
Сегодня подумал, может быть свое влияние оказывают имена переменных на кириллице. Заменил отечественное слово "Шкаф" на импортное "Box". Удалил файл VarCache, дабы не перепутались новые имена со старыми.
Не хочет работать и всё тут. Пока не размаркируешь строку принудительного объявления и не перезапустишь программу, опять маркируешь и снова перезапуск.

Складывается впечатление, что какие-то проблемы в организации хранения глобальных переменных на диске.
То ли кеш выгружается на диск, только при окончании работы программы.
А программа, к стати, не всегда завершается нормально - примерно каждый третий перезапуск завершается зависанием программы, и приходится вручную снимать задачу в Диспетчере задач.
Отец Анатолием назвал, и нет причин от этого отказываться.
Ниже приведена начальная часть скрипта отвечающего за отсчет интервалов времени и подсчета событий

{ int i; string PUSTO=" ", per; if(AsFirstRun) // если в глобальных переменных сохранилась какая-либо информация, то записываем ее в соответствующие каналы { //каким-то образом новой глобальной переменной присваивается числовое значение, и приходится объявлять новую глобальную строковую переменную в лоб //SetGlobalVar("Box N1 timer start", PUSTO, true); //SetGlobalVar("Box N1 timer stop", PUSTO, true); //SetGlobalVar("Box N2 timer start", PUSTO, true); //SetGlobalVar("Box N2 timer stop", PUSTO, true); //SetGlobalVar("Box N3 timer start", PUSTO, true); //SetGlobalVar("Box N3 timer stop", PUSTO, true); //SetGlobalVar("Box N4 timer start", PUSTO, true); //SetGlobalVar("Box N4 timer stop", PUSTO, true); //SetGlobalVar("Box N5 timer start", PUSTO, true); //SetGlobalVar("Box N5 timer stop", PUSTO, true); //SetGlobalVar("Box N6 timer start", PUSTO, true); //SetGlobalVar("Box N6 timer stop", PUSTO, true); //SetGlobalVar("Box N7 timer start", PUSTO, true); //SetGlobalVar("Box N7 timer stop", PUSTO, true); //SetGlobalVar("Box N8 timer start", PUSTO, true); //SetGlobalVar("Box N8 timer stop", PUSTO, true); //SetGlobalVar("Box N1 N", 0, true); //SetGlobalVar("Box N2 N", 0, true); //SetGlobalVar("Box N3 N", 0, true); //SetGlobalVar("Box N4 N", 0, true); //SetGlobalVar("Box N5 N", 0, true); //SetGlobalVar("Box N6 N", 0, true); //SetGlobalVar("Box N7 N", 0, true); //SetGlobalVar("Box N8 N", 0, true); // Шкаф №1 per = "проверка"; per = GetGlobalVar("Box N1 timer start"); if(per == "проверка") { WriteValue("Шкаф №1 timer start", PUSTO); } else { WriteValue("Шкаф №1 timer start", per); } per = "проверка"; per = GetGlobalVar("Box N1 timer stop" ); if(per == "проверка") { WriteValue("Шкаф №1 timer stop", PUSTO); } else { WriteValue("Шкаф №1 timer stop", per); } i = GetGlobalVar("Box N1 N"); if(i==0) { WriteValue("Шкаф №1 N", 0); SetGlobalVar("Box N1 N", 0, true); } else { WriteValue("Шкаф №1 N",i); } WriteValue("Шкаф №1 timer",PUSTO); WriteValue("Шкаф №1 i",0); // Шкаф №2 и т.д. таких шкафов 8 штук
Добрый день!

Вынужден вновь вернуться к вопросу о глобальных переменных.
Не получается у нас с ними мирного существования.
Я использую глобальные переменные для сохранения строковой (строка - отметка времени начала процесса) и числовой информации (счетчики событий) на случай перезапуска программы.
Так вот вынужден констатировать: глобальные переменные живут своей жизнью, причем живут весело и задорно.

Может есть какие-то особенности при использовании глобальных переменных, что-то вроде:
- нельзя использовать строковые и числовые переменные "вперемешку";
- есть ограничение на имена глобальных переменных;
- есть ограничения в количестве глобальных переменных;
- физически на диск информация записывается при определенных условиях;
- нельзя использовать сравнение "==", а необходимо использовать только ">" или "<"
и т.д.

Ранее использовал запись в текстовый файл отметок о старте процесса.
И всё работало как часы.
Теперь же решил идти в ногу с прогрессом - перейти на глобальные переменные - и уже не раз пожалел об этом. :(

С уважением, Кондратенко Анатолий
Новочеркасск


Сервис поддержки клиентов работает на платформе UserEcho