SIEMENS, DF&PD

Предыдущее посещение: Чт июл 07, 2016 14:12 Текущее время: Чт июл 07, 2016 14:12

Часовой пояс: UTC + 3 часа




 [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Организация задержки выполнения следующего условия! HELP!
СообщениеДобавлено: Ср май 22, 2013 9:28 
Не в сети

Зарегистрирован: Ср май 22, 2013 9:16
Сообщения: 4
Здравствуйте, коллеги.
Я новичок в программировании. Поэтому сильно не бейте =)

Стоит примерно следующая задача. Построить "барабан" проверки защит.
Исходные данные:
proba1...proba5 - тэг выбора защиты (Если proba1=1, то выбрана защита №1) - Данный тэги я принимаю из intouch.
proba101...proba105 - тэг сработки защиты. (Если proba101=1, то сработала защита №1) - Данный тэги я отдаю в intouch.

Барабан должен работать следующим образом:

Если защита №1 выделена, то проверить и отправить подтверждение о сработке.

ЗАДЕРЖКА 20сек

Если защита №2 выделена, то проверить и отправить подтверждение о сработке.

ЗАДЕРЖКА 20сек

и т.д.

Проблема в организации ЗАДЕРЖКИ! Причём могут быть ситуации, когда Защита№1 будет не выбрана, и нужно начинать цикл проверки с Защиты№2 и т.д. и т.п.

На данный момент написал:

if (GetTagBit("proba1")==1)
{
SetTagBit("proba101",1);
}
else if (GetTagBit("proba2")==1)
{
SetTagBit("proba102",1);
}
else if (GetTagBit("proba3")==1)
{
SetTagBit("proba103",1);
}
else if (GetTagBit("proba4")==1)
{
SetTagBit("proba104",1);
}
else if (GetTagBit("proba5")==1)
{
SetTagBit("proba105",1);
}

ПОМОГИТЕ ОРГАНИЗОВАТЬ ЗАДЕРЖКУ! Перепробовал варианты, не могу догнать =(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср май 22, 2013 10:07 
Не в сети
Это точно не человек

Зарегистрирован: Чт фев 16, 2006 12:27
Сообщения: 7512
Откуда: Украина
Забудьте про организацию задержек в коде скриптов WinCC. Они (задержки, не скрипты:) есть однозначное зло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср май 22, 2013 10:10 
Не в сети

Зарегистрирован: Ср май 22, 2013 9:16
Сообщения: 4
Дело в том, что в Intouch невозможно грамотно организовать данную опцию.
Но мне нужна иммено проверка защит с задержкой(перерыв).

Проверили защиту№1 - ПЕРЕРЫВ 5сек - Проверили защиту №2.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср май 22, 2013 11:30 
Не в сети
Написал больше чем Вы читали

Зарегистрирован: Чт ноя 22, 2007 5:39
Сообщения: 1369
Откуда: Иркутск
Перерывы одинаковые?

Лучше сделать циклический скрипт с периодом = перерыву и внутри проверять защиты.

Делать задержки внутри скрипта категорически нельзя. Скрипты WinCC обрабатываются в одном потоке. И вводя задержки в скрипт вы ставите все остальные скрипты в очередь. Когда очередь зашкалит (5000) скриптовая подсистема прикажет долго жить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср май 22, 2013 11:50 
Не в сети

Зарегистрирован: Ср май 22, 2013 9:16
Сообщения: 4
Перерывы между проверками одинаковые.

Предположим, что перерыв должен быть 10сек.

Объясните пожалуйста подробнее.

Если я правильно понял, то мне в моём тексте

if (GetTagBit("proba1")==1)
{
SetTagBit("proba101",1);
}
if (GetTagBit("proba2")==1)
{
SetTagBit("proba102",1);
}
if (GetTagBit("proba3")==1)
{
SetTagBit("proba103",1);
}
if (GetTagBit("proba4")==1)
{
SetTagBit("proba104",1);
}
if (GetTagBit("proba5")==1)
{
SetTagBit("proba105",1);
}

Выставить в разделе Timers/Triggers
Timer - Cyclic
Вот только что прописать дальше не очень понимаю, чтобы корректно работало.
Event: Standart Cycle;
Trigger Name - ???;
Cycle - ???


Я пробовал создавать счётчик и при сработке первой защиты заставлял его считать до 20 и выставлять в тэг Flag = 1. Вторую защиту запускать тогда можно только после того, как отработала первая через 20сек условно, НО проблема в том, что пользователь волен выбирать какие хотел защиты (например только 2,4,5). В данном случае мой способ - не годится, т.к. защита 1 никогда не сработает, и flag никогда не станет 1.
Нужно другое решение. Которое поставило меня пока в тупик =(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Организация задержки выполнения следующего условия! HELP
СообщениеДобавлено: Ср май 22, 2013 19:45 
Не в сети
Известный Писатель

Зарегистрирован: Пн окт 18, 2010 9:28
Сообщения: 158
Откуда: Казахстан
Konstantin8812 писал(а):
Если защита №1 выделена, то проверить и отправить подтверждение о сработке.

ЗАДЕРЖКА 20сек...

С помощью функций Delay можно реализовать задачку, которая отсчитывает время в миллисекундах. Я сторонник, чтобы все виды задержки выполнялись на уровне ПЛК. Если, конечно, вариантов нет, можно применить данную функцию. Про побочных эффектах задержки вам уже сообщили. Имейте ввиду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Организация задержки выполнения следующего условия! HELP
СообщениеДобавлено: Чт май 23, 2013 9:26 
Не в сети
Это точно не человек

Зарегистрирован: Чт фев 16, 2006 12:27
Сообщения: 7512
Откуда: Украина
Aibek_Reale писал(а):
Если, конечно, вариантов нет, можно применить данную функцию. Про побочных эффектах задержки вам уже сообщили. Имейте ввиду.

Зависание компьютера с WinCC - это не "побочный эффект". Варианты есть всегда. Мне видится следующее решение. Сколько защит - столько скриптов. Плюс логика с таймерами (см. канал SYSTEM INFO). Но лучше, конечно, подобное делать в контроллере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт май 23, 2013 10:38 
Не в сети

Зарегистрирован: Ср май 22, 2013 9:16
Сообщения: 4
Вот каким образом я решил вопрос. Сильно не смейтесь =) Но для 5 защит всё работает. Дело в том, что WINCC у меня выступает своеобразным иммитатором контроллера, который общается в обе стороны с Intouch через FSGateway.
На объекте конечно всё будет по другому, но показать на месте в офисе руководству как это будет примерно выглядеть пока хватит.



#include "apdefap.h"

int gscAction( void )
{

static long T1 = 0;
static long T2 = 0;
static long T3 = 0;
static long T4 = 0;

if ((GetTagBit("proba")==1) && (GetTagBit("Startdef")==1)) // Проверка начальных условий - ВКЛ/ВЫКЛ Режим проверки защит + ВКЛ/ВЫКЛ Последовательная проверка защит

{

if (GetTagBit("proba1")==1) // Проверка защиты №1
{
SetTagBit("proba101",1);
}
if ((GetTagBit("proba101")==1) || ((GetTagBit("proba1") == 0) && (GetTagBit("proba2") == 1))) // Условия запуска Таймера №1
{
SetTagBit("T1_ON",1);
}
if ((GetTagBit("proba2")==1) && (GetTagBit("T1_OFF")==1)) // Проверка защиты №2
{
SetTagBit("proba102",1);
}
if ((GetTagBit("proba102")==1) ||((GetTagBit("proba1")==0) && (GetTagBit("proba2")==0)) || ((GetTagBit("proba2")==0) && (GetTagBit("proba3")==1) &&(GetTagBit("proba101")==1))) // Условия запуска Таймера №2
{
SetTagBit("T2_ON",1);
}
if ((GetTagBit("proba3")==1) && (GetTagBit("T2_OFF")==1)) // Проверка защиты №3
{
SetTagBit("proba103",1);
}
if ((GetTagBit("proba103")==1) || ((GetTagBit("proba1")==0) && (GetTagBit("proba2")==0) && (GetTagBit("proba3")==0)) ||((GetTagBit("proba2")==0) && (GetTagBit("proba3")==0)) || ((GetTagBit("proba3")==0) && (GetTagBit("proba4")==1) &&(GetTagBit("proba102")==1))) // Условия запуска Таймера №3
{
SetTagBit("T3_ON",1);
}
if ((GetTagBit("proba4")==1) && (GetTagBit("T3_OFF")==1)) // Проверка защиты №4
{
SetTagBit("proba104",1);
}
if ((GetTagBit("proba104")==1) || ((GetTagBit("proba3")==0) && (GetTagBit("proba4")==0) && (GetTagBit("proba102")==1)) || ((GetTagBit("proba1")==0) && (GetTagBit("proba2")==0) && (GetTagBit("proba3")==0) && (GetTagBit("proba4")==0)) ||((GetTagBit("proba2")==0) && (GetTagBit("proba3")==0) && (GetTagBit("proba4")==0)) ||((GetTagBit("proba4")==0) && (GetTagBit("proba5")==1) &&(GetTagBit("proba103")==1))) // Условия запуска Таймера №4
{
SetTagBit("T4_ON",1);
}
if ((GetTagBit("proba5")==1) && (GetTagBit("T4_OFF")==1)) // Проверка защиты №5
{
SetTagBit("proba105",1);
}

}

// Обработка Таймеров

// Timer 1
if ((GetTagBit("T1_ON")==1) && (GetTagBit("T1_OFF")==0))
{
T1++;
}
else
{
T1 = 0;
}
if (T1 >= 2)
{
SetTagBit("T1_OFF",1);
SetTagBit("T1_ON",0);
}
else
{
SetTagBit("T1_OFF",0);
}

// Timer 2
if ((GetTagBit("T2_ON")==1) && (GetTagBit("T2_OFF")==0))
{
T2++;
}
else
{
T2 = 0;
}
if (T2 >= 2)
{
SetTagBit("T2_OFF",1);
SetTagBit("T2_ON",0);
}
else
{
SetTagBit("T2_OFF",0);
}

// Timer 3
if ((GetTagBit("T3_ON")==1) && (GetTagBit("T3_OFF")==0))
{
T3++;
}
else
{
T3 = 0;
}
if (T3 >= 2)
{
SetTagBit("T3_OFF",1);
SetTagBit("T3_ON",0);
}
else
{
SetTagBit("T3_OFF",0);
}

// Timer 4
if ((GetTagBit("T4_ON")==1) && (GetTagBit("T4_OFF")==0))
{
T4++;
}
else
{
T4 = 0;
}
if (T4 >= 2)
{
SetTagBit("T4_OFF",1);
SetTagBit("T4_ON",0);
}
else
{
SetTagBit("T4_OFF",0);
}

return 0;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 28, 2013 14:36 
Не в сети
Известный Писатель

Зарегистрирован: Пт окт 30, 2009 10:27
Сообщения: 435
Откуда: Москва
Очень странное решение для такого несложного задания...

Action, выполняется циклично с интервалом 20с.
Код:
#include "apdefap.h"

int gscAction( void )
{
int i;
char pr[10], pr2[10];
i=GetTagDWord("proba");  //proba - внутренний тег для хранения № текущего тега
if (i<1) i=1;
if (i>5) i=1;    //количество проверяемых аварий
sprintf(pr,"proba%d",i);
sprintf(pr2,"proba10%d",i);
if (GetTagBit(pr)==1) SetTagBit(pr2,1);
else SetTagBit(pr2,0);
SetTagDWord("proba",i+1);
return 0;
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group