PDA

Просмотр полной версии : Прошу несколько советов. Переход с Arduino на ПР200



SuperRobot
04.12.2017, 21:25
Приветствую!

Имеем в цехе штамп для пробития отверстий у трубе.
Управляется Arduino

Видео работы:

https://youtu.be/aEUXpzFvpq4

Прошу совета, после Ардуино, очень все непривычно.
Как было на Ардуино - у кода, два блока - первый выполняется один раз, второй в цикле. Причем обращение к водам выводам в любой момент выполнения кода.

Тут же, судя по описанию сначала опрос всех входов, потом выполнение программы, потом я так понял подаем на выводы сигналы.

ВОПРОС 1 - как обратится ко входу, в середине выполнения программы? Писать макрос? Что то другого на ум не приходит.

У нас на Ардуино простая программа. Идет постоянный опрос педали штампа (а именно один контакт нормально замкнут и один нормально разомкнутый). Когда нажата запускается цикл, а именно - посылаем питание на реле, которое управляет первым пневмо распределителем. Это приводит в движение правый пневмоцилидр и происходит расклинивание внутри трубы. Чтобы понять, что эта процедура завершилась - ожидаем (опрашиваем) положение цилиндра по геркону (у каждого цилиндра их два - те два положения крайних). Как только первый цилиндр в рабочем положении, сразу замыкаем второе реле, и посылаем сигнал управление на второй пневмораспределитель, что заставляет двигаться левый цилиндр. И пока он не станет в рабочее положение (дословно не замкнется соответствующий геркон) программа дальше не будет выполняться. Конечно это все доли секунды. Когда цилиндры (оба) стоят в рабочем положении, делаем финальную проверку (просто всех четырех герконов), и после этого - замыкаем третье реле, а именно подаем сигнал на пресс - происходит удар (вырубка). Потом ждем 400 мс, и после этого снимаем питание с двух реле пневмораспределителей что заставляет вернуться цилиндры назад, соотвественно клины уходят и освобождают трубу. Ну и в конце простая проверка, вдруг педаль все еще нажата (на дурака), и если это так - ждем пока ее не отпустят.

На ардуино все было просто. Вот код (часть "ненужная служит выводом на экран отладочной информации, а именно на каком этапе программа сейчас, те тупо выводим цифры):


#include <QuadDisplay.h>
#define PIN 0

int Small_Cylinder = 7; // определяем пин, для замыкания реле управления маленьки цилиндром
int Big_Cylinder = 6; // определяем пин, для замыкания реле управления маленьки цилиндром
int Start = 5; // определяем пин, для замыкания реле пуска еденичного хода штампа

int Sensor_Small_Cylinder_ON = 13; // определяем пин проверяющий, что маленький цилиндр в рабочем положении
int Sensor_Small_Cylinder_OFF = 12; // определяем пин проверяющий, что маленький цилиндр в положении поумолчанию, не рабочее

int Sensor_Big_Cylinde_ON = 11; // определяем пин проверяющий, что большой цилиндр в рабочем положении
int Sensor_Big_Cylinde_OFF = 10; // определяем пин проверяющий, что большой цилиндр в положении поумолчанию, не рабочее

int Sensor_Pedal_N_Open = 9; // определяем пин проверяющий, нажата ли педаль (нормально разомкнутый)
int Sensor_Pedal_N_Closed = 2; // определяем пин проверяющий, нажата ли педаль (нормально замкнутый)


void setup()
{
pinMode(Small_Cylinder, OUTPUT); // установить пин как выход, будет замыкать реле
pinMode(Big_Cylinder, OUTPUT); // установить пин как выход, будет замыкать реле
pinMode(Start, OUTPUT); // установить пин как выход, будет замыкать реле

pinMode (Sensor_Small_Cylinder_ON, INPUT); //установить пин как вход, будет опрашивать датчик, который крепится со стороны штока
pinMode (Sensor_Small_Cylinder_OFF, INPUT); //установить пин как вход, будет опрашивать датчик, который крепится с краю цилиндра
pinMode (Sensor_Big_Cylinde_ON , INPUT); //установить пин как вход, будет опрашивать датчик, который крепится со стороны штока
pinMode (Sensor_Big_Cylinde_OFF, INPUT); //установить пин как вход, будет опрашивать датчик, который крепится с краю цилиндра
pinMode(Sensor_Pedal_N_Open, INPUT); //установить пин как вход, будет опрашивать датчик педали нормально разомкнутый
pinMode(Sensor_Pedal_N_Closed, INPUT); //установить пин как вход, будет опрашивать датчик педали нормально замкнутый

digitalWrite(Small_Cylinder, HIGH); //хоть это и бред, но подавая напряжение мы размыкаем реле в режиме нормально разомкнутой работы
digitalWrite(Big_Cylinder, HIGH); //хоть это и бред, но подавая напряжение мы размыкаем реле в режиме нормально разомкнутой работы
digitalWrite(Start, HIGH); //хоть это и бред, но подавая напряжение мы размыкаем реле в режиме нормально разомкнутой работы

}

void loop()
{
displayInt(PIN, 0, true);
if ( digitalRead(Sensor_Pedal_N_Open)== HIGH && digitalRead(Sensor_Pedal_N_Closed)== LOW) { //опрашиваем датчик педали, и если он нажат то
digitalWrite(Big_Cylinder, LOW); //убрали напряжение, и реле замкнулось управления большим цилиндром, он должен срабатывать сначала
while (!((!digitalRead (Sensor_Big_Cylinde_ON) == LOW) && (!digitalRead (Sensor_Big_Cylinde_OFF) == HIGH))){ //по сути ждем пока цилиндр не перейдет в рабочее положение и условие перестанет выполняться
displayInt(PIN, 1, true);
}

digitalWrite(Small_Cylinder, LOW); //убрали напряжение, и реле замкнулось управления малым цилиндром, он должен вторым срабатывать
while (!((!digitalRead (Sensor_Small_Cylinder_ON) == LOW) && (!digitalRead (Sensor_Small_Cylinder_OFF) == HIGH))){ //по сути ждем пока цилиндр не перейдет в рабочее положение и условие перестанет выполняться
displayInt(PIN, 2, true);
}

if ( digitalRead(Sensor_Big_Cylinde_ON) == HIGH && digitalRead (Sensor_Small_Cylinder_ON) == HIGH && digitalRead(Sensor_Big_Cylinde_OFF) == LOW && digitalRead (Sensor_Small_Cylinder_OFF) == LOW) {
// строчка выше еще раз проверяет положения всех четырех датчиков двух цилиндров, цилиндры должны быть в рабочем состоянии)
displayInt(PIN, 3, true);
digitalWrite(Start, LOW); //убрали напряжение, и реле замкнулось управления ходом пресса, он должен совершить один удар
delay(200); //возможно нужно увеличить если не юудет успевать срабатывать
digitalWrite(Start, HIGH); //подали напряжение на реле управления ходом пресса и реле разомкнулось
delay(200); // ждем пока пресс не выполнит этот удар и ползун не вернется на место

digitalWrite(Small_Cylinder, HIGH); //подали напряжение на реле управления малым цилиндром, реле разомкнулось, сначала убираем его клин
digitalWrite(Big_Cylinder, HIGH); //подали напряжение на реле управления большим цилиндром, реле разомкнулось, убираем его клин вторым после малого

while (!((!digitalRead (Sensor_Small_Cylinder_ON) == HIGH) && (!digitalRead (Sensor_Small_Cylinder_OFF) == LOW))){ //по сути ждем пока цилиндр вернется в НЕрабочее положение и условие перестанет выполняться
displayInt(PIN, 4, true);
}

while (!((!digitalRead (Sensor_Big_Cylinde_ON) == HIGH) && (!digitalRead (Sensor_Big_Cylinde_OFF) == LOW))){ //по сути ждем пока цилиндр вернется в НЕрабочее положение и условие перестанет выполняться
displayInt(PIN, 5, true);
}

while(digitalRead(Sensor_Pedal_N_Open)== HIGH && digitalRead(Sensor_Pedal_N_Closed)== LOW){ //проверка на дурака, вдруг кто нажал на педаль и до сих пор держит ее нажатой, ждем пока не отпустит в исходное положение
displayInt(PIN, 6, true);
}

}



}
}

Вопрос 2 - Сколько может стоить написание программы примерно для такой задачи?

Вопрос 3 - Опрос педали верно сделал (нажатие - один контакт замыкается, другой размыкается) ?

34441
34442

SuperRobot
04.12.2017, 21:36
Понимаю, что в коде Ардуино разбираться врятли кто будет, но на всякий случай выложил.
Там было просто - digitalRead (переменная или номер пина), и мы получаем данные с входа (в настройках указали какой порт вход, а какой выход в начале). digitalWrite (переменная или номер пина , HIGH) - подали напряжение на порт выхода (тоже указали в настройках).

В любой момент, в любом месте программы.

OWEN Logic, судя по всему опрашивает все порты ввода сразу - как бы не беда, пусть опрашивает что мне пока не надо. Но потом идет выполнение когда, и если так будет цикл одижания события, как до завершения программы снова опросить порты ввхода.

Как бы вижу два варианта - макрос, он опроси снова порты входа? И второй вариант промежуточные переменные. Те обнаружили что педаль нажата, изменили данные в перменной (булевская по сути), и сразу завершили ничем выполнение. Те пришли снова к опросу, но на педаль уже не реагируем (потому как изменилась промежуточная переменная), а смотрим снова другие входы , а именно герконы.

Мои варианты бред? В общем прошу совета.

rovki
04.12.2017, 21:37
1.Дело не в Ардуино ,а в том что вы писали программу в текстовом языке ,хотя для Ардуино есть язык FBD (FLProg) ,как и в ПР200 .
2.Ни сколько не стоит ,ребята помогут .
3.Не могу сказать не видя схемы .;)

SuperRobot
04.12.2017, 21:42
Спасибо, обновил =) Картинка в первом сообщении.
Если можно прокомментируйте мое второе сообщение.

rovki
04.12.2017, 21:44
Понимаю, что в коде Ардуино разбираться врятли кто будет, но на всякий случай выложил.
Там было просто - digitalRead (переменная или номер пина), и мы получаем данные с входа (в настройках указали какой порт вход, а какой выход в начале). digitalWrite (переменная или номер пина , HIGH) - подали напряжение на порт выхода (тоже указали в настройках).

В любой момент, в любом месте программы.

OWEN Logic, судя по всему опрашивает все порты ввода сразу - как бы не беда, пусть опрашивает что мне пока не надо. Но потом идет выполнение когда, и если так будет цикл одижания события, как до завершения программы снова опросить порты ввхода.

Как бы вижу два варианта - макрос, он опроси снова порты входа? И второй вариант промежуточные переменные. Те обнаружили что педаль нажата, изменили данные в перменной (булевская по сути), и сразу завершили ничем выполнение. Те пришли снова к опросу, но на педаль уже не реагируем (потому как изменилась промежуточная переменная), а смотрим снова другие входы , а именно герконы.

Мои варианты бред? В общем прошу совета.

Вы приятно удивитесь когда увидите схему и сравните ее с вашим кодом

SuperRobot
04.12.2017, 21:47
Вы приятно удивитесь когда увидите схему и сравните ее с вашим кодом

Потому и хотел заказать у опытного человека, чтобы понять как грамотно это сделать. Мне кажется так мое обучение (ну правильнее осовоение под простые задачи) быстрее прошло бы (мне так кажется).

А пока я в полной растерянности.

rovki
04.12.2017, 22:00
Вот на скорую руку.используются только нормально разомкнутые контакты у педали

rovki
04.12.2017, 22:02
А потом можно добавить подсчет деталей ,архивирование итд

SuperRobot
04.12.2017, 22:07
Вот на скорую руку

Да уж. Это сильные впечателения. Думал будет сильно сложнее, правда мне конечно сложно так разобраться - нужно внести в программу и смотреть пошагово.
RTGIG1 - до этого я дошел когда ковырять начал и разбираться.

А вот опрос педали. там же два контактка, я верно сделал?
34445 так педаль в ожидании

34444 А так педаль нажата

rovki
04.12.2017, 22:09
А зачем два контакта ?и одного хватит

SuperRobot
04.12.2017, 22:10
А потом можно добавить подсчет деталей ,архивирование итд

Все верно, иначе ради чего это все =)
Кстати, энергонезависимая память сможет сохранять общее количество ударов, даже после перезагрузки - я правильно понимаю? Она же переменные запоминает (уставки). значит и это будет по идее. Ардуина кстати так не может.

Плюс хотелось бы в меню режим отладки, те выдвинуть или задвинуть по желанию каждый цилиндр, плюс даже удар пресса иногда тоже надо в холостую, без цилиндров и трубы.

Ну и возможность менять настройки без ПК (скажем время задержки) меня тоже подкупило.

rovki
04.12.2017, 22:11
Ваши варианты с 2 контактами верны ,хотя и избыточны

SuperRobot
04.12.2017, 22:13
А зачем два контакта ?и одного хватит

Вы знаете у нас из за этого (похоже) сломался один раз штамп, ну точнее обломился пуансон.
Какие то наводки похоже были, и иногда (хоть и редко относительно), без нажатии на педаль, происходила рубка (те воспринималось как нажатие). Возможно тут еще проблема, что всего 5V у ардуино, и в случае с ПР200, будет 24 - вроде как лучне, но все равно. Когда мы стали опрашивать именно два контакта - проблема ушла (непроизвольного срабатывания).

Кстати - в Ардуино, мы использовали стягивающий резистр (кажется так называется), чтобы убрать шум с герконов (если опять правильно выразился), - в ПР200, можно на прямую подключить геркон или тоже надо резистр?

rovki
04.12.2017, 22:15
Вот вариант с проверкой цилиндров и пресса

SuperRobot
04.12.2017, 22:15
Благодарю за помощь. Очень приятно удивлен.

rovki
04.12.2017, 22:18
Поставьте на вход педали TON с задержкой 100-200мс ,тогда помехи не почем.

rovki
04.12.2017, 22:20
Подтягивающий резистор и дребезг геркона ;).В пром. исполнении нужно на вход Ардуино подавать сигнал через оптрон .
В пр200 по входам стоят оптроны .Сухой контакт подключается к +24 и входу ПР200
С ПР200(ОЛ) такие схемы делаются за 5 минут..(С вас 5 копеек -шутка)

SuperRobot
04.12.2017, 22:28
Подтягивающий резистор и дребезг геркона ;).В пром. исполнении нужно на вход Ардуино подавать сигнал через оптрон .
В пр200 по входам стоят оптроны .Сухой контакт подключается к +24 и входу ПР200
С ПР200(ОЛ) такие схемы делаются за 5 минут..(С вас 5 копеек -шутка)

Значит я верно понял из описания к ПР200, просто подключаем герконы к устройству и все.

Я действительно хотел бы оплатить вашу помощь. Можно ваш емейл?

rovki
04.12.2017, 22:34
Я действительно хотел бы оплатить вашу помощь. Можно ваш емейл?
Приобретите ключ на полную версию Каскады ,если так хочется и будите со смартфона менять уставки и проверять цилиндры без кнопок на ПР (что бы ушлые не нажимали) http://www.hmi-kascada.ru/kaskada/
;)

SuperRobot
04.12.2017, 22:42
Что то со схемой не то. Второй раз выложили тоже самое что и первый, но не суть.

После нажатия на педаль, сразу подаем питание на выход (первый цилидр в конечное положение приходит), но нам надо только убедиться на входе геркона что пришел. И как только это произошло, подается сразу питание на второй - и он отправляется в конечное положение, и когда получаем подверждение с геркона, остается убедиться что два геркона в конечном, а два геркона в начальном положении (те все четыре проверить), и если все так - отправляем сигнал на вырубку пресса.

У нас правда было два ожидания на последнем шаге (вырубки) первое скажем 100 мс, чтобы успел физически процесс запуститься вырубки (отработало реле и электрика пресса), а вторая задержка 300 мс, на сам процесс рубки.

И в конце снова проверка педали, если она вдруг нажата до сих пор, чтобы не произошел вторичный процесс рубки.

Так наверно все же сложнее схема да?
---

Кстати на самом ходе (момент вырубки) пресса у нас нет геркона. Как то ни к чему думаем. Самое важное чтобы клины были на месте перед ударом, иначе отломить может матрицу (она на весу оказывается).

SuperRobot
04.12.2017, 22:48
Приобретите ключ на полную версию Каскады ,если так хочется и будите со смартфона менять уставки и проверять цилиндры без кнопок на ПР (что бы ушлые не нажимали) http://www.hmi-kascada.ru/kaskada/
;)

Спасибо, полезная штука - только сегодня с напарником обсуждал это. Он говорит, а вот надо будет нам на смартфон вывести или планшет, запаримся же (не хочет с Ардуино уходить, и так вроде работает типо). Теперь вижу что не сложно. Правда надо разбираться, плату вроде докупить надо - и понять как оплатить и тд. Добавил в закладки в общем.

rovki
04.12.2017, 22:54
выход 1 делается если два концевика в начальном положении только при нажатии на педаль( по переднему фронту, поэтому пока не отпустите педаль второго цикла не будет) .Выход 2 делается ,если выполнилось 1 условие И концевик1 встал в конечное положение .Пресс включается после выполнения 2 условия И когда 2 концевик сработал (конечное положение) .Через задержку все сбрасывается .Пока снова не отпустишь и не нажмешь педаль все будет стоять .
Все проверки выполняются последовательно и являются условием для запуска следующего действия ..

rovki
04.12.2017, 22:55
Спасибо, полезная штука - только сегодня с напарником обсуждал это. Он говорит, а вот надо будет нам на смартфон вывести или планшет, запаримся же (не хочет с Ардуино уходить, и так вроде работает типо). Теперь вижу что не сложно. Правда надо разбираться, плату вроде докупить надо - и понять как оплатить и тд. Добавил в закладки в общем.

Напишите письмо на адрес с сайта и получите все ответы. К стати Каскада так же прекрасно работает с ардуино

SuperRobot
04.12.2017, 23:15
выход 1 делается если два концевика в начальном положении только при нажатии на педаль( по переднему фронту, поэтому пока не отпустите педаль второго цикла не будет) .Выход 2 делается ,если выполнилось 1 условие И концевик1 встал в конечное положение .Пресс включается после выполнения 2 условия И когда 2 концевик сработал (конечное положение) .Через задержку все сбрасывается .Пока снова не отпустишь и не нажмешь педаль все будет стоять .
Все проверки выполняются последовательно и являются условием для запуска следующего действия ..

Блин вы были правы - это как прозреть.
Я правда удивлен, все весьма просто. Сильно вам завидую =)

Ну в плане что вы это написали быстро, хотя все такие все равно это не просто для понимания (блоками мне конечно очень непривычно).

Не думали создать также страничку с упоминанием написания кода на заказ? Что то я искал в интернете, и особо нет упоминаний (будет легко выйти в поисковый топ). На конфеты и баранки хотя бы.

SuperRobot
04.12.2017, 23:27
Все таки чуть чуть я похоже не понял. Потому как у меня "не работает" в тестовом режиме защита от дурака (если нажать и держать педаль).
Происходит рубка. Потом убирается питание с управления цилиндрами и они возвращаются назад, и происходит второй цикл рубки. Вот скриншоты.
34450 первый
34451 второй
34452 третий

Возможно вся проблема в том, что я так и не понял что за входы 7 и 8. В нашем случае идет только опрос педали и четырех концевиков. Физически датчиков других и нет на входе. Потому в тесте я эти два входа не задействовал.

rovki
04.12.2017, 23:27
Вот вам проект с управлением со смартфона (сети).Можно так же добавить индикацию концевиков ...
Не туда R триггер поставил ,все исправил
Показания счетчика выдаются на экран панели и в сеть

SuperRobot
05.12.2017, 13:56
Вот вам проект с управлением со смартфона (сети).Можно так же добавить индикацию концевиков ...
Не туда R триггер поставил ,все исправил
Показания счетчика выдаются на экран панели и в сеть

Спасибо еще раз.
Стало сложнее. Буду разбираться.
Единственное перенес линию счетчика, чтобы прибавлял только тогда, когда идет пробитие - те ход пресса, короче на 3й выход. А было завязано на ход первого цилиндра (не всегда это приводит к пробитию, например трубы чуть кривая - с первого раза цилиндр может не расклинить до нужного уровня, тогда мы просто питанием перегружаем контролер, для этого кнопка рядом с рабочим местом оператора).

SuperRobot
05.12.2017, 18:01
Вот вам проект с управлением со смартфона (сети).Можно так же добавить индикацию концевиков ...
Не туда R триггер поставил ,все исправил
Показания счетчика выдаются на экран панели и в сеть

Еще раз все проанализировал. Немного передвинул и перенес блоки, чтобы повысить читаемость (вам то и так понятно, но мне так проще стало разобраться). У меня вопрос один, для чего вы ввели линию задержки и как это было сделано. Также что то не обнаружил настроек этого элемента по клику.
34472

По переменным понял, позволяют в режиме отладки двигать цилиндры и совершать рубку прессом.
Также понял по сбросу счетчика - но вот вопрос остается открытым, счетчик при обнулении питания сохранит свое значение? Вопрос менее важный, можно ли сделать для счетчика начальное значение отсчета (например пресс уже вырубил несколько тысяч заготовок), и было бы не плохо это значение тоже иметь возможность изменить.

Для подключения телефона, по вай фай - нужен модуль, его купить где и сколько стоит?
===

Еще раз большое спасибо.
За сутки мой уровень подрос, хотя бы до "попробовать разобраться в простой схеме и внести небольшие измения".

Правда еще не дошел до работы с экраном. Но там был вроде урок на эту тему в ютюбе.

rovki
05.12.2017, 18:50
пунктирная линия это линия задержки на такт ,для правильной работы обратной связи ,берется из строки вверху .
Если в свойствах счетчика поставить энергонезависимость ,то будет сохранять .
Что бы менять значение при сбросе счетчика (не только ноль) нужно поставить блок записи в ФБ .
По модулям вся информация по е майлу .

rovki
05.12.2017, 19:33
Вот вам еще вариант с функциональной диагностикой ,проверяющий ход цилиндров .Если нет сигнала с ПР200 или не работает пневмораспределитель или концевики ,то будет сигнал АВАРИИ.
Принцип работы -измеряем время хода по срабатыванию концевиков , если ход менее 1сек ,то норма ,иначе авария .

SuperRobot
05.12.2017, 20:34
Буду разбираться. Возможно уже излишне, но в качестве освоения полезно будет макрос посмотреть, плюс понять как работает ново ведение.

>пунктирная линия это линия задержки на такт ,для правильной работы обратной связи ,берется из строки вверху .
Ага часть понял. Буду пробовать понять остальное. Вроде как просто написано, да и в целом - но видно подустал уже немного. Прогоню завтра еще раз тестовый режим и тогда уже точно пойму что к чему.

Алексей Геннадьевич
06.12.2017, 09:31
Вы знаете у нас из за этого (похоже) сломался один раз штамп, ну точнее обломился пуансон.
Какие то наводки похоже были, и иногда (хоть и редко относительно), без нажатии на педаль, происходила рубка (те воспринималось как нажатие). Возможно тут еще проблема, что всего 5V у ардуино, и в случае с ПР200, будет 24 - вроде как лучне, но все равно. Когда мы стали опрашивать именно два контакта - проблема ушла (непроизвольного срабатывания).

Это общая проблема для всей техники.
В ПР/ПЛК решаю так:
1) TON 0,1-0,2сек на вход кнопок/переключателей/педалей и Т.Д. (Помехи как правило-короткие импульсы), исключается случайное кратковременное нажатие.
2) Подтягивающий к земле резистор 1ком 1вт. ( У помехи энергии мало, сдохнет на этом резисторе).
3) Силовую часть - в один бронешланг, Сигнальную часть и слаботочное управление - в другой.
4) Питание на ПР - через блок сетевого фильтра + (блок питания, если ПР200 на 24в).


Кстати - в Ардуино, мы использовали стягивающий резистр (кажется так называется), чтобы убрать шум с герконов (если опять правильно выразился), - в ПР200, можно на прямую подключить геркон или тоже надо резистр?
Резистор нужен всегда.
Особенно на длинных линиях и кнопках.