Приветствую!
Имеем в цехе штамп для пробития отверстий у трубе.
Управляется Arduino
Видео работы:
Прошу совета, после Ардуино, очень все непривычно.
Как было на Ардуино - у кода, два блока - первый выполняется один раз, второй в цикле. Причем обращение к водам выводам в любой момент выполнения кода.
Тут же, судя по описанию сначала опрос всех входов, потом выполнение программы, потом я так понял подаем на выводы сигналы.
ВОПРОС 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 - Опрос педали верно сделал (нажатие - один контакт замыкается, другой размыкается) ?
WhatsApp Image 2017-12-01 at 20.39.39.jpeg
343.jpeg