This is topic Циклы пересчета in forum Редактор проекта TRACE MODE 6 / at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/32/t/000632.html

Posted by Avsiannikova (Участник № / Member № 5946) on :
 
Здравствуйте.
У меня такая ситуация. Есть две программы, которые должны отрабатывать друг за другом. Т.е. вторая программа должна сработать, после того как выполнится первая(из первой должно придти значение во вторую и вторая срабатывает).
Какой следует поставить цикл пересчета у обоих программ?
 
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. Сделала все в одной программе.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2