This is topic Програмирование циклов в Техно ST in forum Языки программирования в TRACE MODE 6 / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.


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

Posted by sinegub_mihail (Участник № / Member № 4460) on :
 
Уважаемая техническая поддержка!!!

Вопрос 1:
Как реализовать работу программы методом циклов??? На языке Си понятно, а как на Техно ST?
Например, в первом цикле "Исходном" проверяется условие насоса и вентилятора =0, если соответствует, тогда переходим в цикл "Проверка", где проверить состояние дискретных датчиков на равенство =1, если равно то перейти в следующий цикл "Управление", где нужно послать 1 на включение насоса и вентилятора. После включения проверить одновременно состояние этих механизмов (проверка равенства =1), после этого переходим в другой цикл "Проверка 1", где проверяем другие дискретные датчики на равенство =1. Если в условиях любой из датчиков =0 то надо возвратится в цикл "Исходное". И все начинается с начала...


Вышлите пример работы с циклами и каким то таймером ( подсчет по 1 сек) на ел. почту.

Вопрос 2:

Программа циклограммы работы должна находится первой среди программ или ризница не имеется ???
Допустим в циклограмме будет описываться работа объекта с разных циклов, "Проверка", "ПУСК", "Управление" , "Регулирование" , "Аварийный останов" или так далее... [clever / умный] [clever / умный] [clever / умный]
 
Posted by Abram Shnider (Участник № / Member № 4534) on :
 
Насколько я понимаю, программы в TM6 выполняются в цикле по умолчанию. Следовательно, предлагаю Вам построить конструкцию из вложенных операторов if-then-else.
Если я Вас правильно понял, то Вы хотите получить период отработки программы по таймеру... Тут могу сказать только то, что TM6 точно может отрабатывать программу каждую секунду (пробовал каждый цикл воспроизводить текущее количество секунд с начала суток).
 
Posted by sinegub_mihail (Участник № / Member № 4460) on :
 
таймер нужен для счета времени цикла а также задержки или контроля входных сигналов или управления исполнительными механизмами.
Вот например цикл "Проверка герметичности клапанов" на языке Си реализуем так:
#include "zio8252.h"
#include "zstdio.h"
#include "cycles.h"
#include "const.h"


extern void Control_False_Plam_1_2(); /* Контроль ложного пламени 1,2 */

void Control_Cycle_Test_Bell() /* Тест звонка */
{
f_Enable_Long_Stop = 0; /* сбрасываем длинный останов */

if ( f_timer_cycle == ON )
{
Alarm_Bell = ON; /* Звонок аварии */
Alarm_Dispatcher = ON; /* Авар. диспетч. */
Work_Dispetcher = ON; /* Работа диспетч. */
}
else
{
Alarm_Bell = OFF; /* Звонок аварии */
Alarm_Dispatcher = OFF; /* Авар. диспетч. */

if ( f_Control_Hermetic == 0 ) /* проверка герметичности */
{ Next_Cycle = Cycle_tr1; } /* указываем следующий цикл */
else
{ Next_Cycle = Cycle_t1; } /* указываем следующий цикл */
}
}

void Control_Cycle_tr1() /* Цикл tr1 - Натечка */
{
Control_False_Plam_1_2(); /* контроль ложного пламени 1,2 */

if ( Hermetic == 1 ) /* Герметичность - утечка */
{ f_Alarm_Hermetic = 0; }
else
{ f_Alarm_Hermetic = 1; }


if (
f_Alarm_False_Plam_1 == 0 &&
f_Alarm_False_Plam_2 == 0 &&
f_Alarm_Hermetic == 0
)
{
Ventilate_Burner = ON; /* Вент. горелки */
Valve_Security = ON; /* Кл. безопасности */
Work_Dispetcher = ON; /* Работа диспетч. */
}
else
{
f_Alarm = 1;
Next_Cycle = Cycle_Alarm_Stop; /* запускаем Alarm_Stop */
}

if ( f_timer_cycle == OFF ) /* если время цикла истекло */
{ Next_Cycle = Cycle_tr2; } /* указываем следующий цикл */
}

void Control_Cycle_tr2() /* Цикл tr2 - Нет контроля */
{
Control_False_Plam_1_2(); /* контроль ложного пламени 1,2 */

if (
f_Alarm_False_Plam_1 == 0 &&
f_Alarm_False_Plam_2 == 0
)
{
Ventilate_Burner = ON; /* Вент. горелки */
Valve_Security = ON; /* Кл. безопасности */
Valve_Cut_Off_1 = ON; /* Кл. отсекателя 1 */
Work_Dispetcher = ON; /* Работа диспетч. */
}
else
{
f_Alarm = 1;
Next_Cycle = Cycle_Alarm_Stop; /* запускаем Alarm_Stop */
}

if ( f_timer_cycle == OFF ) /* если время цикла истекло */
{ Next_Cycle = Cycle_tr3; } /* указываем следующий цикл */
}

void Control_Cycle_tr3() /* Цикл tr3 - Утечка? Откр. */
{
Control_False_Plam_1_2(); /* контроль ложного пламени 1,2 */

if ( Hermetic == 0 ) /* Герметичность - утечка */
{ f_Alarm_Hermetic = 0; }
else
{ f_Alarm_Hermetic = 1; }


if (
f_Alarm_Plam_1 == 0 &&
f_Alarm_Plam_2 == 0 &&
f_Alarm_Hermetic == 0
)
{
Ventilate_Burner = ON; /* Вент. горелки */
Valve_Security = ON; /* Кл. безопасности */
Valve_Cut_Off_1 = ON; /* Кл. отсекателя 1 */
Work_Dispetcher = ON; /* Работа диспетч. */
}
else
{
f_Alarm = 1;
Next_Cycle = Cycle_Alarm_Stop; /* запускаем Alarm_Stop */
}

if ( f_timer_cycle == OFF ) /* если время цикла истекло */
{
Valve_Cut_Off_1 = OFF; /* Кл. отсекателя 1 */
Next_Cycle = Cycle_tr4; /* указываем следующий цикл */
}
}

void Control_Cycle_tr4() /* Цикл tr4 - Утечка? Закр. */
{
Control_False_Plam_1_2(); /* контроль ложного пламени 1,2 */

if ( Hermetic == 0 ) /* Герметичность - утечка */
{ f_Alarm_Hermetic = 0; }
else
{ f_Alarm_Hermetic = 1; }

if (
f_Alarm_Plam_1 == 0 &&
f_Alarm_Plam_2 == 0 &&
f_Alarm_Hermetic == 0
)
{
Ventilate_Burner = ON; /* Вент. горелки */
Valve_Security = ON; /* Кл. безопасности */
Valve_Cut_Off_1 = OFF; /* Кл. отсекателя 1 */
Work_Dispetcher = ON; /* Работа диспетч. */
}
else
{
f_Alarm = 1;
Next_Cycle = Cycle_Alarm_Stop; } /* запускаем Alarm_Stop */

if ( f_timer_cycle == OFF ) /* если время цикла истекло */
{
Valve_Security = OFF; /* Кл. безопасности */
Next_Cycle = Cycle_t1; /* указываем следующий цикл */
 
Posted by sinegub_mihail (Участник № / Member № 4460) on :
 
наименование циклов указывается в заголовочном файле но не в этой программе...
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
sinegub_mihail,
вышлите, пожалуйста, Ваше описание задачи и преполагаемое Вами решение на адрес техподдержки.
Как бы общо не выглядел вопрос с организацией обработки данных, его решение в каждом конкретном случае может быть разным.
 
Posted by sinegub_mihail (Участник № / Member № 4460) on :
 
как в программе на языке ST с оператором if-then-else добавить несколько проверок переменных на равенство в одной строке при одном условии присвоении переменной значения, пример:

PROGRAM
VAR_INPUT Газ_низко : REAL; END_VAR
VAR_INPUT Газ_высоко : REAL; END_VAR
VAR_INPUT Вода_больше : REAL; END_VAR
VAR_INPUT Вода_меньше : REAL; END_VAR
VAR_INPUT Взрыв : REAL; END_VAR
VAR_INPUT Вентилятор_вкл : REAL; END_VAR
VAR_OUTPUT Клапан_1 : REAL; END_VAR
VAR_OUTPUT Клапан_2 : REAL; END_VAR
VAR_OUTPUT Клапан_3 : REAL; END_VAR
VAR_OUTPUT Клапан_4 : REAL; END_VAR

if Газ_низко == 0
then Клапан_1 =0;
elsif Газ_высоко == 0
then Клапан_1 =0;
elsif Вода_больше == 0
then Клапан_1 =0;
else Клапан_1 =1;
end_if;

END_PROGRAM

Нужно на равенство (в одну строку )добавить все входные ( Вода_меньше, Взрыв, Вентилятор_вкл) при условии что выходе присвоение значения переменной будет только Клапан_1
 
Posted by Abram Shnider (Участник № / Member № 4534) on :
 
Если я правильно Вас понимаю, то подойдет следующая конструкция:

IF ((Газ_низко == 0) || (Газ_высоко == 0) || (Вода_больше == 0))
THEN
Клапан_1 = 0;
ELSE
Клапан_1 = 1;
END_IF;

Исходя из своего опыта могу добавить, что надо быть внимательным с типами данных переменных (см. тему http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/33/t/000100.html)
Удачи!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
IF ((Газ_низко == 0) || (Газ_высоко == 0) || (Вода_больше == 0))
THEN
Клапан_1 = 0;
ELSE
Клапан_1 = 1;
END_IF;
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2