Здравствуйте. У меня такая ситуация. Есть две программы, которые должны отрабатывать друг за другом. Т.е. вторая программа должна сработать, после того как выполнится первая(из первой должно придти значение во вторую и вторая срабатывает). Какой следует поставить цикл пересчета у обоих программ?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Разнести исполнение программ по разным циклам можно, если использовать циклы пересчета типа F1, F2 и т.д. Однако, при циклическом исполнении программ понятия "первая" и "вторая" весьма условны. Если эти программы работают эпизодически (запускаются по какому-то событию), то корректнее сделать их выключенными. Включать первую. Первая отрабатывает, передает данные, запускает вторую и выключает себя. Вторая отрабатывает и выключает себя.
Posted by Avsiannikova (Участник № / Member № 5946) on :
Они должны постоянно выполняться одна за одной.
Posted by Avsiannikova (Участник № / Member № 5946) on :
Что именно вы понимаете под "включает/выключает"?
Posted by Alex210271 (Участник № / Member № 4421) on :
Имеется в виду атрибут "Выключить – (3, C) Состояние" канала CALL вызова программы. Его можно изменить и изнутри самой этой программы и тем самым остановить пересчет канала. В Вашем случае естественно запустив перед этим на выполнение вторую программу. Вот только если программы выполняются последовательно друг за другом, нельзя ли все сделать в одной программе?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
"Они должны постоянно выполняться одна за одной. " Если программы выполняются без пауз, трудно понять, какая из них будет первой, какая - второй.
Posted by Жигалов Денис Николаевич (Участник № / Member № 6035) on :
А что у вас там за программы то две? Их в одну не как не объединить?
Posted by Avsiannikova (Участник № / Member № 5946) on :
Первая генерирует некоторые числа в канал и посылает бит=1. Вторая считывает значение канала из первой и сбрасывает бит. На основе этого значения из базы данных вытягиваются некоторые знаЧения, которые рассылаются по выходным каналам.
Тоесть, сгенерилось значение при помощи пилы(если пила=4 одно, если 5 другое и итд от 0 до 23) и послалась единичка на исполнение выборки из базы. Вторая програмка подсчитала сгенеренное значение и записала выбранное из базы в нужный канал. Потом обнуляем бит. В одной программе что-то не идет.. извините, если не совсем понятно.
Posted by Alex210271 (Участник № / Member № 4421) on :
За один проход программы конечно не получится, поскольку выборка из базы запустится программой только после окончания этого прохода программы. К тому же выборка может выполнятся долго - не один цикл пересчета. Но одной программой сделать можно и нужно. Если Вы выставляете бит=1 в какой-то канал, то по нему и надо ориентироваться. Проверяете бит в начале программы и если бит равен нулю выполняем первую часть программы (определяем значение и взводим бит, запускаем на исполнение запрос) если бит равен единице проверяем выполнился ли запрос к БД (после отработки значение канала запроса должно сбросится в ноль), если запрос еще не выполнен ничего не делаем, если запрос завершен, выполняем вторую часть программы, потом обнуляем бит. Программа будет постоянно повторятся со своим периодом пересчета и будет выполнять разные действия при разных условиях. Как-то так :-)
Posted by Avsiannikova (Участник № / Member № 5946) on :
Как проверить выполнился ли запрос? Или может делать какую-то задержку, чтобы подождать пока выполнится запрос? Кажется такой простой алгоритм, а уже всю голову сломала.
Posted by Жигалов Денис Николаевич (Участник № / Member № 6035) on :
quote:Отправитель / Originally posted by Avsiannikova: Как проверить выполнился ли запрос? Или может делать какую-то задержку, чтобы подождать пока выполнится запрос? Кажется такой простой алгоритм, а уже всю голову сломала.
...проверяем выполнился ли запрос к БД (после отработки значение канала запроса должно сбросится в ноль)...
Т.е смотрим на входное или реальное значение канала(канал который шаблон связей с СУБД). Смотрим при выполнении запроса там 1 или 0. Я вот тут не уверен говорить не стану.
Posted by Alex210271 (Участник № / Member № 4421) on :
Ну если у Вас запрос к БД канал CALL с типом вызова SQLQuery, то в справке написано: "Значение канала CALL задает номер выполняемого запроса (см. Создание SQL-запросов ). После отработки значение канала автоматически сбрасывается в 0", то есть если в первой половине программы вы дали команду выполнить запрос, то во второй половине программы проверяете значение канала и как только оно равно нулю значит запрос выполнен. (Правда нужно еще проверить достоверность канала CALL.SQLQuery. Так как вот еще цитата из справки: "Если SQL-запрос по каким-либо причинам выполнить невозможно, то по истечении 600 секунд с момента инициализации запроса каналу CALL устанавливается признак аппаратной недостоверности. ")
Posted by Жигалов Денис Николаевич (Участник № / Member № 6035) on :
Ну наверное как то так. "выполнить_запрос" = 1; IF "CALL.SQLQuery_In(или R)" = 0 and "CALL.SQLQuery_I(достоверность)" = 0 THEN <Делаем что нам надо>; END_IF;
Ну и так по случаю добавлю. Если TM не сможет выполнить запрос(допустим сервер БД выключился), он начинает так тормозить что глаза на лоб вылезают, учтите это.
Posted by Avsiannikova (Участник № / Member № 5946) on :
Спасибо за ответы, делала не через стандартный сервер БД,а при помощи базы Оракла и Industrial Data Bridge. Сделала все в одной программе.