This is topic Запуск программы с кнопки in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.


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

Posted by iamdmitry (Участник № / Member № 8063) on :
 
Здравствуйте! Нужна ваша помощь.
Есть проект (система смешивания твердых отходов), в нем кнопками задается исходное количество каждого из трех компонентов и три числа, которые суммируются и по отдельности вычитаются из исходных. Написана программа, в которой прописаны эти действия. На экране размещена кнопка на запуск, из неё «1» передаётся напрямую в условие программы, которое выполняется. Проблема вот в чём: программа выполняется один раз и после этого кнопка не срабатывает, а мне надо, чтобы числа, появившиеся после действий, дальше суммировались и вычитались каждый раз по нажатию кнопки до исчерпания одного из компонентов.
Пробовал вызывать программу через атрибут 39 канала CALL типа Output, реакции не последовало.
Заранее большое спасибо!

Листинг программы
PROGRAM
VAR_INPUT Компонент_A : REAL; END_VAR
VAR_INPUT Компонент_B : REAL; END_VAR
VAR_INPUT Компонент_C : REAL; END_VAR
VAR_OUTPUT Сумма : REAL; END_VAR
VAR_OUTPUT Пуск : REAL; END_VAR
VAR_INOUT Уровень_компонента_A : REAL; END_VAR
VAR_OUTPUT Результат_компонент_A : REAL; END_VAR
VAR_INOUT Уровень_компонента_B : REAL; END_VAR
VAR_OUTPUT Результат_компонент_B : REAL; END_VAR
VAR_INOUT Уровень_компонента_C : REAL; END_VAR
VAR_OUTPUT Результат_компонент_C : REAL; END_VAR

if Пуск==1 then
Сумма=Компонент_A+Компонент_B+Компонент_C;
Результат_компонент_A=Уровень_компонента_A-Компонент_A;
Результат_компонент_B=Уровень_компонента_B-Компонент_B;
Результат_компонент_C=Уровень_компонента_C-Компонент_C;
Пуск=0;
end_if;
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Если программа должна отрабатывать однократно по нажатию кнопки на экране, надо запускать программу по команде кнопки "ВЫПОЛНИТЬ" (см. свойства ГЭ "Кнопка").

При этом программа должна вызываться каналом CALL типа OUT.

Текст программы должен выглядеть примерно так:

PROGRAM
VAR_INPUT Компонент_A : REAL; END_VAR
VAR_INPUT Компонент_B : REAL; END_VAR
VAR_INPUT Компонент_C : REAL; END_VAR
VAR_OUTPUT Сумма : REAL; END_VAR
VAR_INOUT Уровень_компонента_A : REAL; END_VAR
VAR_OUTPUT Результат_компонент_A : REAL; END_VAR
VAR_INOUT Уровень_компонента_B : REAL; END_VAR
VAR_OUTPUT Результат_компонент_B : REAL; END_VAR
VAR_INOUT Уровень_компонента_C : REAL; END_VAR
VAR_OUTPUT Результат_компонент_C : REAL; END_VAR


Сумма=Компонент_A+Компонент_B+Компонент_C;
Результат_компонент_A=Уровень_компонента_A-Компонент_A;
Результат_компонент_B=Уровень_компонента_B-Компонент_B;
Результат_компонент_C=Уровень_компонента_C-Компонент_C;

END_PROGRAM
 
Posted by iamdmitry (Участник № / Member № 8063) on :
 
Не работает. Может, что-то не так сделал: в кнопке ГЭ теперь по нажатию стоит команда "Выполнить", выбрана программа для выполнения. В разделе "Каналы" создан класс CALL типа Out, тип вызова Program, привязка к реальному значению программы, все остальные параметры по умолчанию.
В итоге программа запускается сразу при запуске в профайлере и отображает данные сразу после ввода, нажатие на кнопку запуска программы ничего не даёт.
 
Posted by iamdmitry (Участник № / Member № 8063) on :
 
Во флагах программы установил флажок "Тип Output", теперь программа запускается по нажатию кнопки, но только один раз, повторное нажатие опять ни к чему не приводит. Мне же требуется, чтобы на каждое нажатие производились действия из программы с обновляемыми данными (то есть сумма от нажатия к нажатию должна расти, количество компонента в каждом резервуаре уменьшаться и т.д.).
 
Posted by Nico (Участник № / Member № 5342) on :
 
Зачем Результат_компонент_X ???
Сумма & Пуск - VAR_INOUT
if (Пуск)
{
summa =
Уровень_компонента_X = Уровень_компонента_X - X;
Пуск = 0;
}
 
Posted by iamdmitry (Участник № / Member № 8063) on :
 
Тогда не отображается на экране результат вычитания, введенный с клавиатуры уровень (Уровень_компонента_X) остается неизменным. И по-прежнему остается проблема с однократным срабатыванием кнопки запуска программы.
 
Posted by Nico (Участник № / Member № 5342) on :
 
Результат_компонент_X ??? зачем он нужен.
должен меняться уровень -> компонент же использован
 
Posted by Nico (Участник № / Member № 5342) on :
 
PROGRAM
VAR_INPUT Компонент_A : REAL; END_VAR
VAR_INPUT Компонент_B : REAL; END_VAR
VAR_INPUT Компонент_C : REAL; END_VAR
VAR_INOUT : REAL; END_VAR
VAR_INOUT Пуск : REAL; END_VAR
VAR_INOUT Уровень_компонента_A : REAL; END_VAR
VAR_INOUT Уровень_компонента_B : REAL; END_VAR
VAR_INOUT Уровень_компонента_C : REAL; END_VAR

if Пуск==1 then
Сумма=Компонент_A+Компонент_B+Компонент_C;
Уровень_компонента_A=Уровень_компонента_A-Компонент_A;
Уровень_компонента_B=Уровень_компонента_B-Компонент_B;
Уровень_компонента_C=Уровень_компонента_C-Компонент_C;
Пуск=0;
end_if;
 
Posted by iamdmitry (Участник № / Member № 8063) on :
 
Моя ошибка, перепривязал аргументы программы к аргументам экрана и, действительно, уровень стал понижаться! Спасибо!
Первоначально сумма не изменялась при повторном нажатии, только при изменении аргумента компонента. Решил добавлением аргумента суммы в выражение:
Сумма=Сумма+Компонент_A+Компонент_B+Компонент_C;
Вдруг кому поможет!
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2