Логика, цепь безопасности

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016
Доброго времени суток уважаемые форумчане.
Прошу помощи перевести логику в код для ардуино 
 
Станок. У оператора две кнопки (дабы занять две руки =) и концевой выключатель на защитном кожухе)
для запуска станка необходимо
Условия:
1. закрыть защитный кожух (замкнуть концевик Enable)
2. одновременно, в течении 0.3 сек. , нажать кнопки  и держать до конца цикла (Start L & Start P) 
станок запустится, - если отпустить одну из кнопок станок выключиться
если повторно нажать отпущенную кнопку - игнорировать - для запуска необходимо снова выполнить условие 2
 
У меня на этом станке стоял промышленный контроллер серии ARRAY 
вот логика которую я писал для него (цепь безопасности)
b707
Онлайн
Зарегистрирован: 26.05.2017

Aleks_neofit - если это заказ - пишите в платный раздел. Если хотите чтобы вам помогли разобраться самостоятельно - выкладывайте как вы пробовали написать код.

Duino A.R.
Онлайн
Зарегистрирован: 25.05.2015

Aleks_neofit пишет:

...
Прошу помощи перевести логику в код для ардуино 
...
Станок.
У меня на этом станке стоял промышленный контроллер серии ARRAY 
вот логика которую я писал для него (цепь безопасности)
1. Как я понял, у Вас совершенно конкретный частный случай. Стоял на станке ПЛК ARRAY, а потом - кирдык. И кто-то посоветовал Вам использовать вместо него Ардуино. В промышленном ПЛК были решены вопросы: электопитания, помехозащищенности, конструктивного исполнения, обслуживания силами цеховых специалистов, соответствия ПТБ. При использовании Ардуино Вам придется все эти вопросы решать "с чистого листа" самостоятельно. Вы готовы? Тем более, если дело касается цепей безопасности. Я не знаю, о каком станке идет речь, но в условиях производства (у меня был аналогичный случай) вполне может появиться "представитель", ткнуть пальцем в "коробочку, задействованную в цепях безопасности" и потребовать на неё сертификат установленного образца. Т.е. "камнем преткновения" может оказаться и не программа вовсе.
 
2. Для решения конкретной задачи не может быть программы "вообще". Как и на какие пины подаются сигналы, как и с каких снимаются, ...
 

b707 пишет:
Aleks_neofit - если это заказ - пишите в платный раздел. Если хотите чтобы вам помогли разобраться самостоятельно - выкладывайте как вы пробовали написать код.

Да. Только кроме кода тут столько всего вырисовывается и в цеховых условиях. :((

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

 Благодарю Duino A.R. за понимание. Всё именно так, как Вы написали.

Возможно найдётся другое решение.

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Aleks_neofit пишет:

 Благодарю Duino A.R. за понимание. Всё именно так, как Вы написали.

Возможно найдётся другое решение.

 

конечно найдётся - любой контроллер с механических прессов, изначально были на транзисторах, потом на 511 логике

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

Доброго вечера,

решил в свободное время написать черновик -  упростил концевик, оставил две кнопки (pin 2 и 3) и светодиод (pin 13)

И странно, код срабатывает один раз, - с начала старта МК (после 0,5 сек уже не работает)

Millis стартует с запуском программы, а не по нажатию кнопок...

Подскажите плиз, в чём я ошибаюсь


byte  t;
byte  k;
unsigned long  currentMillis_k1;
unsigned long  currentMillis_k2;

void setup()
{
   t = 0;
   k = 0;
   currentMillis_k1 = 0;
   currentMillis_k2 = 0;
  pinMode(13, OUTPUT);
  pinMode(2,INPUT);
  pinMode(3,INPUT);
    digitalWrite(13,LOW);
}

void loop()
{
    if (digitalRead(2) == HIGH) {
       currentMillis_k1 = millis();
    }
    if (digitalRead(3) == HIGH) {
       currentMillis_k2 = millis();
    }
    if (digitalRead(2) == HIGH && digitalRead(3) == HIGH) {
       k = 1;
    }
    if ((digitalRead(2) == HIGH && currentMillis_k1 < 500) && (digitalRead(3) == HIGH && currentMillis_k2 < 500)) {
       t = 1;
      if ((k = 1) && (t = 1)) {
        digitalWrite(13,HIGH);
      }
    }
}

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

это точно не правильно -

 if ((k = 1) && (t = 1)) {

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

 Спасибо  ua6em,

можем  написать 

 ...
if  (t = 1) {
        digitalWrite(13,HIGH);

...

но сути это не меняет - Millis стартует с запуском программы, а не по нажатию кнопок...

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

предыдущий оратор говорил про ошибку применения оператора присваивания вместо сравнения, имхо

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Aleks_neofit пишет:

 Спасибо  ua6em,

можем  написать 

 ...
if  (t = 1) {
        digitalWrite(13,HIGH);

...

Вместо этого лучше написать тождественную, но более читабельную конструкцию:

t = 1;
digitalWrite(13,HIGH);

 

bwn
Онлайн
Зарегистрирован: 25.08.2014

Aleks_neofit пишет:

но сути это не меняет - Millis стартует с запуском программы, а не по нажатию кнопок...

А кто обещал старт миллиса по нажатию кнопки? Я вот сейчас на часы глянул, там 2.12, а не 00.00, как теперь время засечь? Бяда.(((((

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

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

Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

Добрый вечер,

Спасибо за участие,

Тему со станком можно закрыть - купили сразу новый ПЛК ...

код пытаюсь писать для себя, только пока не разобрался, почему работает, не так как задумано

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

так непонятно, что именно задумано

MaksVV
Offline
Зарегистрирован: 06.08.2015

Чтож не понятного ) ТС хочет, чтобы если обе кнопки удерживаются более пол секунды, то включается лед13, ну и , надо полагать, при отпускании хотя бы одной  - выключается.  ТС,  ищите на форуме работу с кнопками, инфы полно.  

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

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