Автор |
Сообщение |
Сообщение создано: 31. 05. 2011 [19:28]
|
Osipetka
Пётр Осипенко
Создатель темы
Зарегистрирован(а) с: 27.03.2011
Сообщения: 27
|
Есть ли возможность в JavaLikeCalc использовать функцию "noop" не городя велосипеды с количеством запуска функции и тд?
Это первое.
Второе. Максимально возможное время выполнения функции JavaLikeCalc 999 секунд и не более. Как это можно обойти?
|
Сообщение создано: 31. 05. 2011 [19:43]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"Osipetka" wrote:
Есть ли возможность в JavaLikeCalc использовать функцию "noop" не городя велосипеды с количеством запуска функции и тд?
В каком языке высокого уровня Вы это видели? Это не ассемблер!
"Osipetka" wrote:
Второе. Максимально возможное время выполнения функции JavaLikeCalc 999 секунд и не более. Как это можно обойти?
Код писать атомарно и не зацикливать. А обходить это не желательно, иначе начнёте потом рассказывать, что зависает, хотя здесь: http://wiki.oscada.org/Doc/JavaLikeCalc#h101-2 (во вкладке "Функция").
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 31. 05. 2011 [20:10]
|
Osipetka
Пётр Осипенко
Создатель темы
Зарегистрирован(а) с: 27.03.2011
Сообщения: 27
|
просто нужно притормозить выполнение функции на 15-20 секунд (что-то типа sleep из windows.h), а не тупо слать запросы пока контроллер занят
|
Сообщение создано: 31. 05. 2011 [20:14]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"Osipetka" wrote:
просто нужно притормозить выполнение функции на 15-20 секунд (что-то типа sleep из windows.h), а не тупо слать запросы пока контроллер занят
Проверить, что контроллер занят и завершить функцию. Через 15-20 секунд повторить в стандартном цикле.
Это не системный язык программирования и подобные примеры тут не уместны.
P.S. Ознакомьтесь с основами программирования в циклических системах! Тогда Вы перестанете тянуть в них нехарактерные, неэффективные и даже вредные подходы deadline систем.
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 21. 06. 2011 [07:06]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"roman" wrote:
Проверить, что контроллер занят и завершить функцию. Через 15-20 секунд повторить в стандартном цикле.
Это не системный язык программирования и подобные примеры тут не уместны.
Но если очень хочется: SYS.system("sleep 5");
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 21. 06. 2011 [13:29]
|
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 516
|
А что будет если SYS.system("sleep 1001");? )))
Не всякая задача может быть решена с помощью параллельных вычислений (например, если в каждом следующем шаге алгоритма требуются результаты предыдущих шагов). Также не каждый алгоритм поддаётся исполнению в цикле (каждый следующий шаг значительно отличается от предыдущих). Такие алгоритмы не являются отмирающими (deadline). Просто их стараются заменить другими, поддающимися распараллеливанию и/или исполнению в цикле. Но это не всегда возможно.
На практике при автоматизации такие алгоритмы вряд ли нужны, но могут появиться при использовании OpenSCADA для решения сложных математических задач, моделировании сложных процессов и т.д. Выкрутиться можно, передавая "эстафету" из одной ява-программы в другую через каждые, например, 900 секунд или выполняя части алгоритма по cron. Это если известно время выполнения участков алгоритма хотя бы приблизительно. В других случаях как быть - неизвестно. Поэтому планировщики задач (процессов) не должны ограничивать по времени выполнения. Что и делается во всех операционных системах и средах программирования.
[Сообщение редактировалось 3 раз(а), в последний раз 21.06.2011 в 13:58.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Сообщение создано: 21. 06. 2011 [15:24]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"almaz" wrote:
А что будет если SYS.system("sleep 1001");? )))
Запустите - узнаете.
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 22. 06. 2011 [07:47]
|
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 516
|
Запустил - узнал. Максимальное время исполнения ява-программы устанавливается в библиотеке функций и максимальное вводимое значение составляет 2147483647 секунд, что около 68 лет. Наверно, достаточно. )))
При исполнении длительной ява-программы заметны подвисания интерфейса программы, хотя процессор не нагружен. При первых нескольких запусках происходило полное зависание интерфейса всего конфигуратора, потом как-то разработалось и подвисания были только на некоторых вкладках (тестировал с пустой базы, вводя только нужное). Например, при редактировании программы в библиотеке функций во время выполнения невозможно применить изменения до завершения исполнения. Это единственное подвисание, которое осталось после множества запусков. Насколько понимаю, параллельные процессы не должны мешать друг другу при ненагруженном процессоре и приводить к подвисаниям?
На что хотелось бы обратить особое внимание: галочки "включен" и "запущен" контроллера не останавливают запущенный контроллер, а дожидаются завершения работы ява-программы чтобы снять галочку. Если завершения за некоторое время не произошло, то выдаётся сообщение о невозможности остановки и действие пользователя отменяется. Такое поведение галочек уже давно мешает...
Не должна ли хотя бы одна из этих галочек (например, "включен") останавливать ява-программу безусловно и сразу? Кроме того, время появления сообщения о невозможности остановки (галочкой "запущен") можно сократить до секунды (сейчас около 4-5 секунд). Это улучшило бы на порядок интерактивность скады...
[Сообщение редактировалось 4 раз(а), в последний раз 22.06.2011 в 08:19.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Сообщение создано: 22. 06. 2011 [08:56]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"almaz" wrote:
Насколько понимаю, параллельные процессы не должны мешать друг другу при ненагруженном процессоре и приводить к подвисаниям?
Плохо понимаете. Эти самые параллельные процессы с общими данными через ресурсы работают, а не сами по себе.
"almaz" wrote:
На что хотелось бы обратить особое внимание: галочки "включен" и "запущен" контроллера не останавливают запущенный контроллер, а дожидаются завершения работы ява-программы чтобы снять галочку. Если завершения за некоторое время не произошло, то выдаётся сообщение о невозможности остановки и действие пользователя отменяется. Такое поведение галочек уже давно мешает...
Кому обратить? Я нигде не говорил, что это правильно и категорически против этого.
"almaz" wrote:
Не должна ли хотя бы одна из этих галочек (например, "включен") останавливать ява-программу безусловно и сразу? Кроме того, время появления сообщения о невозможности остановки (галочкой "запущен") можно сократить до секунды (сейчас около 4-5 секунд). Это улучшило бы на порядок интерактивность скады...
Делайте.
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 22. 06. 2011 [10:24]
|
almaz
Almaz Karimov
Contributor
Зарегистрирован(а) с: 25.09.2008
Сообщения: 516
|
Сделал бы, если бы знал все подводные течения в скаде на Вашем уровне. Незнаючи можно одно сделать, а другое поломать. Речь же о коррекции уже сделанного, да и то на уровне обсуждения. Если даже не корректировать - хотя бы знать будем.
Подвисания свидетельствуют о некорректном разделении данных между процессами. Другой вывод при зависании всего конфигуратора из-за ява-программы не напрашивается. Ява-программа захватывает доступ к общим данным на всё время исполнения, хотя данные ей нужны только на короткие времена (чтение на входе, запись на выходе, вызовы из ява-программы других участков кода и др.).
Полное подвисание конфигуратора было при первых запусках длительной ява-программы (пустая БД всего с одной функцией SYS.system("sleep 20"); и одним контроллером) и манипуляциях с галочками включения-запуска. Далее почему-то зависания прекращаются. Зависает всегда при применении изменений самой программы в библиотеке функций. Тут уже не только остановить запущенный контроллер невозможно, но и вообще что-либо делать. Или завершать скаду средствами ОС или ждать окончания выполнения ява-программы. Даже если конфигуратор не подвешивать, всё равно галочками длительную ява-программу не остановить...
А ведь длительными могут стать и вроде бы недолгие ява-программы. Например, при обрыве связи и отработке таймаутов (время исполнения превышает период запуска), при случайной ошибке в ява-программе (бесконечный цикл) и др. Всё это может приводить к зависаниям всей скады, а не только некоторого участка проекта, уже при эксплуатации на реальном объекте. С этим уже сталкивались на практике... Жаль, что нельзя просто остановить зависший контроллер галочкой, исправить код и запустить... Приходится перепускать всю скаду, а иногда и целиком железку, если у компа нет монитора-клавиатуры-мыши, а только удалённый доступ по внутреннему протоколу скады self.
[Сообщение редактировалось 4 раз(а), в последний раз 22.06.2011 в 10:47.]
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|