здравствуйте!давно не заходил. вот последний вариант схемы
Напомню, что система управления состоит из местного и дистанционного режимов. Выбор режима – переключателями, установленными на ШУ (для каждой группы механизмов отдельно).
Местный режим – управление каждым механизмом в отдельности с помощью кнопки, расположенной возле него. Является настроечным не должен применятся для постоянного управления. Используется только для отладки, ремонта оборудования и в случае отказа ПЛК. Может использоваться в случае проблем в работе какого-либо звена маршрута.
Разделил на группы для того чтобы при работе элеватора от ПЛК была возможность настройки или ремонта незадействованных в маршруте звеньев.
АСУ элеватором
Re: АСУ элеватором
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: АСУ элеватором
Привет всем. Подниму тему. Занимаюсь написанием программной части зернохранилища. Проект пишу в SIMATIC PCS7 (лицензия была уже у заказчика, т.к. оборудование поставлял другой подрядчик и они же собирались писать программу но благополучно слились) Написал блоки управления и визуализацию для различных типов устройств (конвейеры, нории, тележки, распределители). Теперь предстоит задача автоматизировать управления маршрутами. Может у кого есть наработки в этом направлении? Есть вариант с фиксированными маршрутами, но различных вариантов построения маршрутов более ста штук. В идеале оператор должен задавать приемник, источник и выбирать из списка доступных на данный момент маршрутов, либо система должна сама выдавать оптимальный и готовый к работе маршрут, а далее уже запускать его в необхоимой последовательности. В общем, пока у меня не имеется никакого представления, как написать такую логику на ПЛК. Может кто-нибудь поможет?
- Автоматизатор
- Профессионал
- Сообщения: 993
- Зарегистрирован: 09 окт 2012, 05:18
Re: АСУ элеватором
Перечень маршрутов может храниться в панели оператора в виде "рецептов". Выбор оптимального маршрута автоматически из рецептов? Не знаю.
Re: АСУ элеватором
С фиксированными у Вас не должно быть проблем. Это же просто сортировка массива данных! На мой взгляд введите состояния оборудования (исправен, не исправен, в работе, нет и т.д.) после чего признак "свободного маршрута" или части маршрута. А вот насчет оптимального,..Не кажется, что это классическая задача коммивояжёра?
Re: АСУ элеватором
Панели нет. Будет операторская станция WinCC. Для использования системы рецептов нужна дополнителная лицензия, которой нет. Денег на лицензию тоже нет.Автоматизатор писал(а):Перечень маршрутов может храниться в панели оператора в виде "рецептов". Выбор оптимального маршрута автоматически из рецептов? Не знаю.
Re: АСУ элеватором
А вот тут можно поподробнее? То есть для начала составляем матрицу смежности М[i,j], где каждая строка - это номер механизма, а в столбцах ставим 0 либо 1, в зависимости от того, стыкуется ли данный i-ый механизм c j-ым механизмом? А дальше? Как сортировать массив? Извините за возможно глупые вопросы, ранее с такими задачами не сталкивался.CHANt писал(а):С фиксированными у Вас не должно быть проблем. Это же просто сортировка массива данных! На мой взгляд введите состояния оборудования (исправен, не исправен, в работе, нет и т.д.) после чего признак "свободного маршрута" или части маршрута. А вот насчет оптимального,..Не кажется, что это классическая задача коммивояжёра?
Re: АСУ элеватором
Я себе понимаю так:Alex_khv писал(а):Как сортировать массив? Извините за возможно глупые вопросы, ранее с такими задачами не сталкивался.
Сортировка массива производится по одной из переменных массива. Сортируется по возрастанию или убыванию. В нашем случае как минимум нужно отсортировать по переменной "маршрут свободен", чтобы отсеять нерабочие маршруты.
Чтобы получить оптимальный маршрут, надо отсортировать по некоторой переменной (которой еще нет), которую называют критерием оптимальности. Ну, например, "длина маршрута" или "длительность маршрута" или более сложные критерии.
Re: АСУ элеватором
1) Стоит отметить следующие особенности среды разработки Step7, если речь идет о симатиках. Для языка STL оператор LOOP работает только с положительным числом и только в сторону уменьшения счетчика цикла. Для языка SCL доступны FOR, WHILE, REPEAT в полном объеме.
2) Критерием оптимальности может быть и длина участка между вершинами графа (узлами маршрута) по всем вариантам маршрута, и какие-то параметры пропускной способности, технического состояния приводов, наработки по времени и т.п. Т.е. можно не раз перебирать в цикле, а последовательно в нескольких циклах. Т.е. сначала "свободен", затем "длина", затем "пропускная способность" и т.д. Да и стоит выводить наверное не один результат расчета для оператора, а несколько вариантов. Все равно на объекте конечное число маршрутов, и измеряется даже не сотнями)))
Для решения задачи коммивояжера есть масса алгоритмов (да и с кодом реализации, к примеру на С++), почитайте что будет оптимальней. И не обязательно эту задачу вешать на контроллер, можно и в самой WinCC выполнять в скрипте, так как ресурсов компьютера гораздо больше чем контроллера.
2) Критерием оптимальности может быть и длина участка между вершинами графа (узлами маршрута) по всем вариантам маршрута, и какие-то параметры пропускной способности, технического состояния приводов, наработки по времени и т.п. Т.е. можно не раз перебирать в цикле, а последовательно в нескольких циклах. Т.е. сначала "свободен", затем "длина", затем "пропускная способность" и т.д. Да и стоит выводить наверное не один результат расчета для оператора, а несколько вариантов. Все равно на объекте конечное число маршрутов, и измеряется даже не сотнями)))
Для решения задачи коммивояжера есть масса алгоритмов (да и с кодом реализации, к примеру на С++), почитайте что будет оптимальней. И не обязательно эту задачу вешать на контроллер, можно и в самой WinCC выполнять в скрипте, так как ресурсов компьютера гораздо больше чем контроллера.
Re: АСУ элеватором
Всем спасибо за идеи, сейчас хотя бы понял направление, в котором нужно двигаться)))
Re: АСУ элеватором
Я сейчас тоже подобной системой занимаюсь, но уже на этапе завершения. В общем как описали выше так у меня и сделано-матрица смежности строится каждый раз при построении маршрута, т.к. надо учитывать уже работающие механизмы. Я брал алгоритм Дейкстеры, даже если честно тупо нашел код и заточил под свои нужды.
У меня система управления-это отдельная программа написана на С++ и завязана с БД. Может на Винсс это тоже можно реализовать, но у меня Омрон и его скада весьма ограничена.
У меня система управления-это отдельная программа написана на С++ и завязана с БД. Может на Винсс это тоже можно реализовать, но у меня Омрон и его скада весьма ограничена.
Re: АСУ элеватором
Можете поделиться ссылками, где нашли код?zholeg писал(а):Я брал алгоритм Дейкстеры, даже если честно тупо нашел код и заточил под свои нужды.
Re: АСУ элеватором
Ссылку уже не найду, было почти год назад.
Файл выложить не получается, выложу код который я брал за исходный.
Файл выложить не получается, выложу код который я брал за исходный.
Код: Выделить всё
//---------------------------------------------------------------------------
//Алгоритм Дейкстры.поиска кратчайшего пути
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
#pragma argsused
#define VERTEXES 6 //Число вершин в графе
int v;
int main(int argc, char* argv[])
{
clrscr();
int infinity=1000; // Бесконечность
int p= VERTEXES; // Количество вершин в графе
int a[VERTEXES][VERTEXES]={ 0,1,0,0,1,3, // Матрица смежности графа
1,0,5,0,0,1,
0,5,0,5,20,1,
0,0,5,0,3,2,
1,0,20,3,0,10,
3,1,1,2,10,0 };
// Будем искать путь из вершины s в вершину g
int s; // Номер исходной вершины
int g; // Номер конечной вершины
cout<<"Vvedite s: "; // Номер может изменяться от 0 до p-1
cin>>s;
cout<<"Vvedite g: ";
cin>>g;
int x[VERTEXES]; //Массив, содержащий единицы и нули для каждой вершины,
// x[i]=0 - еще не найден кратчайший путь в i-ю вершину,
// x[i]=1 - кратчайший путь в i-ю вершину уже найден
int t[VERTEXES]; //t[i] - длина кратчайшего пути от вершины s в i
int h[VERTEXES]; //h[i] - вершина, предшествующая i-й вершине
// на кратчайшем пути
// Инициализируем начальные значения массивов
int u; // Счетчик вершин
for (u=0;u<p;u++)
{
t[u]=infinity; //Сначала все кратчайшие пути из s в i
//равны бесконечности
x[u]=0; // и нет кратчайшего пути ни для одной вершины
}
h[s]=0; // s - начало пути, поэтому этой вершине ничего не предшествует
t[s]=0; // Кратчайший путь из s в s равен 0
x[s]=1; // Для вершины s найден кратчайший путь
v=s; // Делаем s текущей вершиной
while(1)
{
// Перебираем все вершины, смежные v, и ищем для них кратчайший путь
for(u=0;u<p;u++)
{
if(a[v][u]==0)continue; // Вершины u и v несмежные
if(x[u]==0 && t[u]>t[v]+a[v][u]) //Если для вершины u еще не
//найден кратчайший путь
// и новый путь в u короче чем
//старый, то
{
t[u]=t[v]+a[v][u]; //запоминаем более короткую длину пути в
//массив t и
h[u]=v; //запоминаем, что v->u часть кратчайшего
//пути из s->u
}
}
// Ищем из всех длин некратчайших путей самый короткий
int w=infinity; // Для поиска самого короткого пути
v=-1; // В конце поиска v - вершина, в которую будет
// найден новый кратчайший путь. Она станет
// текущей вершиной
for(u=0;u<p;u++) // Перебираем все вершины.
{
if(x[u]==0 && t[u]<w) // Если для вершины не найден кратчайший
// путь и если длина пути в вершину u меньше
// уже найденной, то
{
v=u; // текущей вершиной становится u-я вершина
w=t[u];
}
}
if(v==-1)
{
cout<<"Net puti iz vershini "<<s<<" v vershinu "<<g<<"."<<endl;
break;
}
if(v==g) // Найден кратчайший путь,
{ // выводим его
cout<<"Kratchaishiy put iz vershini "<<s<<" v vershinu "<<g<<":";
u=g;
while(u!=s)
{
cout<<" "<<u;
u=h[u];
}
cout<<" "<<s<<". Dlina puti - "<<t[g];
break;
}
x[v]=1;
}
getch();
}
/*Программа запрашивает вершины s и q и выводит кратчайший путь. Например, после ввода s = 3, q = 6, программа выводит
Нет пути из вершины 3 в вершину 6.
После ввода s = 0, q = 2 программа выводит
Кратчайший путь из вершины 0 в вершину 2: 2 5 1 0. Длина пути = 3.*/
//---------------------------------------------------------------------------
Re: АСУ элеватором
Благодарю за помощьzholeg писал(а):Ссылку уже не найду, было почти год назад.
Файл выложить не получается, выложу код который я брал за исходный.
Re: АСУ элеватором
в маршруте используется как минимум 7-8 транспортных механизмов и 3-5 задвижек и клапанов. весь транспорт должен включаться и выключаться в последовательности. значит для каждого механизма дожны быть таймеры на включение и отключение. значение времени также будет разным, так как протяженность маршрутов разная. значит маркер каждого маршрута должен записывать свои значения таймеров и давать команду на включение транспортного и открытие/закрытие задвижек. я с 15-ю маршрутами морочился, а тут больше сотни. мое мнение - при таком количестве просто делать подсветку для каждого маршрута, а запускает оператор вручную. либо включать подсекциями (загрузка, очистка, сушка, выгрузка...)
Re: АСУ элеватором
Попробуй связку JL JU, сильно облегчает такие вещи
Re: АСУ элеватором
Смысл тогда с такой автоматизации если оператор будет сам все делать. После определенного времени работы операторы в голове строят любой маршрут быстрее чем система.service писал(а): делать подсветку для каждого маршрута, а запускает оператор вручную
Не совсем понял про таймеры на включение и отключение.
например у Вас построена маршрутная линия, и с конца запускаете(открываете, переключаете) поэлементно, проверяя обратную связь: если запустился - перешли к следующему элементу т.д.
Таймера нужны для выключения (тоже последовательного), но для каждого элемента оно постоянно-это время для опустошения (например для задвижки=0, для конвейера=30с) Эту задачу у меня решает PLC, а система только смотрит если время опустошения=0, то можно останавливать.
Re: АСУ элеватором
полуавтоматический режим является самым оптимальным. маршрут подсветили (или даже нет) и оператор с конца включает его. и включение, допустим, транспортера на впереди стоящую норию не возможен( отключение наоборот). также важна домотка механизмов после завершения работы ну и конечно связь элеватора с автоматикой сушилки в этом автоматизация и состоит - не дать возможность отключить/включить то, что не нужно.
Re: АСУ элеватором
это задача нижнего уровня АСУ-защита механизмов. независимо от того какой маршрут работает, нельзя включить транспортер, если за ним транспортер не запущен (задвижка закрыта, покрыт датчик верхнего уровня и т.п.) иначе будет авария.service писал(а): не дать возможность отключить/включить то, что не нужно.
И контролировать это должен PLC для каждого механизма по отдельности.
Re: АСУ элеватором
расскажите подробней, что это такоеward писал(а):Попробуй связку JL JU, сильно облегчает такие вещи
Re: АСУ элеватором
L MBxxx
JL m010
JU m000
JU m001
JU m002
....
MBxxx содержит номер перехода
См. описание инструкции в HELP Step7.
JL m010
JU m000
JU m001
JU m002
....
MBxxx содержит номер перехода
См. описание инструкции в HELP Step7.