Go Down

Topic: Timer calcolo tempi morti per taglio laser lamiera (Read 958 times) previous topic - next topic

Alberto81

Oct 14, 2012, 05:48 pm Last Edit: Oct 14, 2012, 06:21 pm by Alberto81 Reason: 1
Salve a tutti! da neofita ho scritto alcune righe di codice per il mio primo progetto ovvero un timer  collegato ad una macchina da taglio laser lamiera industriale che si attivi durante la lavorazione  conteggiando i secondi di  lavorazione e di fermo macchina per visualizzare l'andamento della produzione durante la giornata.
Il codice funziona... ma sul serial monitor ogni volta che avviene un cambiamento di stato da LOW a HIGH i secondi ripartono da zero, mentre vorrei che si sommassero ai precedenti.... potreste darmi un aiutino??
Grazie a tutti!!

const int laser = 40;  // input proveniente dal plc della macchina
long start;  //inizio macchina in lavorazione
long duratas; // durata macchina in lavorazione
long fermo;  // inizio fermo macchina
long durataf; // durata fermo macchina

void setup()
{
pinMode(laser,INPUT);
Serial.begin(9600);
}
void loop()
{
  if(digitalRead(laser == HIGH))
{
  start = millis();
  while(digitalRead(laser)== HIGH);
  duratas = millis()-start;
  delay(30); Serial.print ("Laser ON:");Serial.println(duratas/1000);
  //
}
if(digitalRead(laser == LOW))
{
  fermo = millis();
  while(digitalRead(laser)== LOW);
  durataf = millis()-fermo;
  delay(30);Serial.print ("Laser OFF:");Serial.println(durataf/1000);
  //
}
}


PaoloP

Prova così

Code: [Select]
const int laser = 40;  // input proveniente dal plc della macchina
long start;  //inizio macchina in lavorazione
long duratas; // durata macchina in lavorazione
long fermo;  // inizio fermo macchina
long durataf; // durata fermo macchina

void setup() {
pinMode(laser,INPUT);
Serial.begin(9600);
}

void loop() {
if(digitalRead(laser == HIGH))
  {
  start = millis();
  while(digitalRead(laser)== HIGH);
  duratas += millis()-start;
  delay(30);
  Serial.print("Laser ON:");
  Serial.println(duratas/1000);
  }
if(digitalRead(laser == LOW))
  {
  fermo = millis();
  while(digitalRead(laser)== LOW);
  durataf +=millis()-fermo;
  delay(30);
  Serial.print ("Laser OFF:");
  Serial.println(durataf/1000);
  //
  }
}

Alberto81

Grazie!!!! funziona!!! scusate l'entusiasmo ma è il mio primo progetto e non avendo alcuna nozione  di elettronica ne di linguaggio di programmazione sono al settimo cielo! Ti adoro Arduino!
La notte scorsa... invece di prendere sonno... i miei pensieri erano offuscati da un dubbio...... nel serial monitor, ogni volta che è presente un cambiamento di stato, i valori   del nuovo vengono scritti a capo, mi chiedevo se fosse possibile avere sempre due righe come ad esempio:

Laser OFF: (120) 
Laser ON:  (50)

i valori tra parentesi dovrebbero cambiare sempre nella stessa posizione, come se fosse ad esempio il valore di un imput analogico che varia nel tempo. Spero di essermi spiegato...
Grazie a tutti !!

PaoloP

Ricorda di sostituire i long con unsigned long altrimenti col tempo vai in overflow ed escono risultati sballati.

leo72


La notte scorsa... invece di prendere sonno... i miei pensieri erano offuscati da un dubbio...... nel serial monitor, ogni volta che è presente un cambiamento di stato, i valori   del nuovo vengono scritti a capo, mi chiedevo se fosse possibile avere sempre due righe come ad esempio:

Laser OFF: (120) 
Laser ON:  (50)

i valori tra parentesi dovrebbero cambiare sempre nella stessa posizione, come se fosse ad esempio il valore di un imput analogico che varia nel tempo. Spero di essermi spiegato...
Grazie a tutti !!

Intendi eliminare il ritorno a capo e sovrascrivere i dati a quelli vecchi?
Col serial monitor dell'IDE non puoi. Dovresti scrivere un programma che intercetta i dati e che te li visualizza in una modalità a te consona. Oppure usare un display Lcd e, con opportuno codice, puoi fare quello che dici

Go Up