Aleš Bedač
Published © GPL3+

IMM Emulator

Injection molding machine emulator with interface E67. Allows you to emulate injection mold machine and to control using the robot.

BeginnerProtip10 hours1,249
IMM Emulator

Things used in this project

Hardware components

Be-DIO (Arduino PLC Shield)
×2
Nextion NX8048T070 - Generic 7.0" HMI TFT LCD Touch Display
Itead Nextion NX8048T070 - Generic 7.0" HMI TFT LCD Touch Display
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Schematics

imm_emulator_-_master_0L4kOCcYAt.pdf

Untitled file

File missing, please reupload.

Code

IMM_MASTER.ino

Arduino
//Projekt : Emulator VSS, MASTER #0
//CPU : DM-238D

/* Cyklus v automatu
* otevreni formy
* jadra ven
* vyhazovace vpred
* vyhazovace zpet
* jadra dovnitr
* zavreni formy
*/

#include "config.h"
#include "iomap.h"
#include "E:\svn_remote\Arduino\BE_Devices\IMM_EMU\general\cmd.h"
#include "ports.h"
PORTS master;

#include <SoftwareSerial.h>
SoftwareSerial uart(UART_RX,UART_TX);    // RX, TX

//WATCH DOG
byte watchdog_counter = 0;
unsigned long last_millis =0;

//LCD variables
#include <Nextion.h>
SoftwareSerial uart_nextion(LCD_RX,LCD_TX);    // RX, TX
Nextion myNextion(uart_nextion, DEF_LCD_BAUDRATE);  //Pozor Nextion ma Defaultne 9600!

int vaMode = 0;     //Operating Mode
int vaCurrentProgressValue = 0; //Progress bar value
int vaStepNr = 0;   //step number
int vaCycle = 0;    //cycle time
int vaEjector = 0;  //ejector time 
int vaCore = 0;     //core pullers time

//IMM Program
unsigned long PreviousTime = 0;

void setup(){
  myNextion.init();
    
  last_millis = millis() - 10000;  
  uart.begin(DEF_UART_BAUDRATE); //CAN-BUS UART

  //Setup LCD values
  SetValueOnLCD("vaMode", 0);       //Operating mode
  SetValueOnLCD("vaStepNr", vaStepNr);     //step number
  SetValueOnLCD("progress", vaCurrentProgressValue);
}

void loop(){  
  ImmCycle();
  ReadFromLCD();
  WriteToLCD();
  ReadFromUart();
  WriteToUart();  
  
  if(watchdog_counter < DEF_WATCHDOG_MAX)
  {
    SetupOutputs();
    watchdog_counter++;	
  }  
}

void ImmCycle(){
  ResetOutputStates();
  
  if (vaMode==0)
  {
    vaStepNr = 0;
  }

  //Imm program steps
  switch(vaStepNr)
  {
    case 0: //Manual
      OutM01_EjectorIsBack = true;
      OutM03_Core1IsPulled = true;
      OutM05_Core2IsPulled = true;
      OutS06_FormIsOpened = true;
      
      if(vaMode>0) vaStepNr++;
      break;
    case 1: //Automat started - Form closing    
      if(InS01_PermitFormClose)
      {
         UpdateImmTime();
      }
    case 2:   //Form is closing
      if(RefreshImmCycle(5000))
      {
        OutS05_FormIsClosed = true;
        UpdateImmTime();
      }
    case 3:   //Form is closed - plastification
      if(RefreshImmCycle(vaCycle))
      {
        UpdateImmTime();
      }    
      break;
    case 4:   //Form opening
      if(RefreshImmCycle(5000))
      {
        OutS06_FormIsOpened = true;
        UpdateImmTime();
      }
      break;
    case 5:   //Cores eject
      
      break;      
      
    default:
      vaStepNr = 0;
      break;      
  }  
}

bool RefreshImmCycle(unsigned long interval)
{  
  if (millis() - PreviousTime > interval)
  {
    PreviousTime = millis();
    return true;
  }
  return false;
}

void UpdateImmTime(){
  PreviousTime= millis();
  vaStepNr++;
}

void WriteToLCD(){
  SetValueOnLCD("vaWD", 0);
  SetValueOnLCD("vaWDCAN", watchdog_counter*10);  //Progress range is 0-100
  SetValueOnLCD("vaStepNr", vaStepNr);
  SetValueOnLCD("progress", vaCurrentProgressValue);

  SetValueOnLCD("c0", InS05_PermitCore1Pull);
  SetValueOnLCD("c1", InS02_PermitFormOpen);
  SetValueOnLCD("c2", InS03_PermitEjectorBack);
  SetValueOnLCD("c3", InS04_PermitEjectorForward);
  SetValueOnLCD("c4", InS05_PermitCore1Pull);
  SetValueOnLCD("c5", InS06_PermitCore1Eject);
  SetValueOnLCD("c6", InM04_PermitCore2Pull);
  SetValueOnLCD("c7", InM05_PermitCore2Eject);
  SetValueOnLCD("c8", InM01_A5);
  SetValueOnLCD("c9", InM02_C5);
  SetValueOnLCD("c10", InM03_C8);
  
  SetValueOnLCD("c11", OutS05_FormIsClosed);
  SetValueOnLCD("c12", OutS06_FormIsOpened);
  SetValueOnLCD("c13", OutM01_EjectorIsBack);
  SetValueOnLCD("c14", OutM02_EjectorIsForward);
  SetValueOnLCD("c15", OutM03_Core1IsPulled);
  SetValueOnLCD("c16", OutM04_Core1IsEjected);
  SetValueOnLCD("c17", OutM05_Core2IsPulled);
  SetValueOnLCD("c18", OutM06_Core2IsEjected);
  SetValueOnLCD("c19", OutM07_ZC8);

  SetValueOnLCD("c22", InM06_RobotNotAus);
  SetValueOnLCD("c23", InM07_FormIsFreeSoftware);
  SetValueOnLCD("c24", InM12_FormIsFreeElectrical);
  SetValueOnLCD("c25", InM13_RobotInAuto);
  
  SetValueOnLCD("c27", OutS04_SecurityDoor);
  SetValueOnLCD("c28", OutS01_ImmAutomat);
  SetValueOnLCD("c29", OutS02_RejectPart);
  SetValueOnLCD("c30", OutS03_MIddlePosition);
}

void ReadFromLCD(){
	vaMode = ReadValueFromLCD("vaMode");
  
  if (vaMode==0)
  {
    vaCycle = ReadValueFromLCD("vaCycle");
    vaEjector = ReadValueFromLCD("vaEjector");
    vaCore = ReadValueFromLCD("vaCore");   
  }
}

void SetupOutputs(){  
  if(watchdog_counter >= DEF_WATCHDOG_MAX)
  {
    //can-bus communication error
    vaMode==0;    
    ResetOutputStates();
  }
  
  master.SetOutput(OUTPUT_1, OutM01_EjectorIsBack);
  master.SetOutput(OUTPUT_2, OutM02_EjectorIsForward);
  master.SetOutput(OUTPUT_3, OutM03_Core1IsPulled);
  master.SetOutput(OUTPUT_4, OutM04_Core1IsEjected);
  master.SetOutput(OUTPUT_5, OutM05_Core2IsPulled);
  master.SetOutput(OUTPUT_6, OutM06_Core2IsEjected);
  master.SetOutput(OUTPUT_7, OutM07_ZC8);
}

void ResetOutputStates(){
  //Master
  OutM01_EjectorIsBack = false;
  OutM02_EjectorIsForward = false;
  OutM03_Core1IsPulled = false;
  OutM04_Core1IsEjected = false;
  OutM05_Core2IsPulled = false;
  OutM06_Core2IsEjected = false;
  OutM07_ZC8 = false;
  OutS04_SecurityDoor = false;
  
  //Slave
  OutS01_ImmAutomat = false;
  OutS02_RejectPart = false;
  OutS03_MIddlePosition = false;
  OutS04_SecurityDoor = false;
  OutS05_FormIsClosed = false;
  OutS06_FormIsOpened = false;
}

void WriteToUart(){  
  //Repeat message after elapsed 100ms
  unsigned long time_value = millis() - last_millis;
  if(time_value < abs(100)) return;  
  last_millis = millis();
    
  uart.println(SlaveOutPutsValue());
}

byte SlaveOutPutsValue(){
  byte outputs_value = 0;
    
  if(watchdog_counter < DEF_WATCHDOG_MAX)
  { 
    bool states[8] = {
      OutS01_ImmAutomat,
      OutS02_RejectPart,
      OutS03_MIddlePosition,
      OutS04_SecurityDoor,
      OutS05_FormIsClosed,
      OutS06_FormIsOpened,
      false,
      false
      };
    
    //Stavy vystupu na byte
    for (int n =0; n<8; n++)
    {
      outputs_value = outputs_value + (states[n] << n);    
    }
  }
  
  return outputs_value ;
}

void ReadFromUart(){    
  String received_string;
  
  while (uart.available())
  {
    received_string = uart.readStringUntil('\n');    
  }

  UartDataParser(received_string);   
}

void UartDataParser(String ReceivedString){
  
  //Stav Vstupu ze slave #1
  int delimiter_index = ReceivedString.indexOf(';');
  
  if(delimiter_index > 0)
  {
    watchdog_counter = 0;
    int in1 = ReceivedString.substring(0,delimiter_index).toInt(); 
    int in2 = ReceivedString.substring(delimiter_index + 1, ReceivedString.length()).toInt();
    ParseInputFromUart(in1, in2);    
  }
}

void ParseInputFromUart(int InputA, int InputB){
  int tempvalue;
  bool states[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
  
  //Vstupy 1.-8.  
  for(int i=0;i<8;i++)
  {
    tempvalue = (InputA >> i) & 1;
    states[i] = (tempvalue == 0) ? false : true;    
  }

  //Vstupy 9.-10.
  for(int i=8;i<13;i++)
  {
    tempvalue = (InputB >> i) & 1;
    states[i] = (tempvalue == 0) ? false : true;
  }

  //Update Input states from  SLAVE
  InS01_PermitFormClose = states[0];
  InS02_PermitFormOpen = states[1];
  InS03_PermitEjectorBack = states[2];
  InS04_PermitEjectorForward = states[3];
  InS05_PermitCore1Pull = states[4];
  InS06_PermitCore1Eject = states[5];
}

//LCD METHODS
int ReadValueFromLCD(String VariableName)
{
  return myNextion.getComponentValue(VariableName);
}

void SetValueOnLCD(String VariableName, int Value)
{
  myNextion.setComponentValue(VariableName, Value);
}

config.h

Arduino
#ifndef config_h
#define config_h

#define DEF_UART_BAUDRATE 57600
#define DEF_LCD_BAUDRATE 115200
#define MASTER_ADDRESS 0
#define DEF_WATCHDOG_MAX 10       //Ovlivni dobu vypadku vystupu (primoumerne)
#define DEF_LENGTH 15
#define DEF_LOOP_DELAY 5

#endif

//115200
//230400
//250000
//500000
//1000000
//2000000

iomap.h

Arduino
#ifndef IOMAP_h
#define IOMAP_h

//Master IO
bool InM01_A5;
bool InM02_C5;
bool InM03_C8;
bool InM04_PermitCore2Pull;
bool InM05_PermitCore2Eject;
bool InM06_RobotNotAus;
bool InM07_FormIsFreeSoftware;
bool InM12_FormIsFreeElectrical;
bool InM13_RobotInAuto;

bool OutM01_EjectorIsBack;
bool OutM02_EjectorIsForward;
bool OutM03_Core1IsPulled;
bool OutM04_Core1IsEjected;
bool OutM05_Core2IsPulled;
bool OutM06_Core2IsEjected;
bool OutM07_ZC8;

//Slave IO
bool InS01_PermitFormClose;
bool InS02_PermitFormOpen; //! Permit form open?
bool InS03_PermitEjectorBack;
bool InS04_PermitEjectorForward;
bool InS05_PermitCore1Pull;
bool InS06_PermitCore1Eject;

bool OutS01_ImmAutomat;
bool OutS02_RejectPart;
bool OutS03_MIddlePosition;
bool OutS04_SecurityDoor;
bool OutS05_FormIsClosed;
bool OutS06_FormIsOpened;

#endif

ports.cpp

Arduino
#include "ports.h"

//PUBLIC METHODS
bool PORTS::GetInput(byte input)
{	
	//return input state
	return !digitalRead(input);
}

void PORTS::SetOutput(byte output, bool state)
{	
	digitalWrite(output, state);
}

//PRIVATE METHODS
void PORTS::SetupPorts()
{
  pinMode(INPUT_1, INPUT);
  pinMode(INPUT_2, INPUT);
  pinMode(INPUT_3, INPUT);
  pinMode(INPUT_4, INPUT);
  pinMode(INPUT_5, INPUT);
  pinMode(INPUT_6, INPUT);
  pinMode(INPUT_7, INPUT);
  //8-11 UART!
  pinMode(INPUT_12, INPUT);
  pinMode(INPUT_13, INPUT);
  
  pinMode(OUTPUT_1, OUTPUT); 
  pinMode(OUTPUT_2, OUTPUT); 
  pinMode(OUTPUT_3, OUTPUT); 
  pinMode(OUTPUT_4, OUTPUT); 
  pinMode(OUTPUT_5, OUTPUT); 
  pinMode(OUTPUT_6, OUTPUT); 
  pinMode(OUTPUT_7, OUTPUT); 
}

ports.h

Arduino
#ifndef PORTS_h
#define PORTS_h

#include <Arduino.h>

//Define hardware ports
#define INPUT_1 0
#define INPUT_2 1
#define INPUT_3 2
#define INPUT_4 3
#define INPUT_5 4
#define INPUT_6 5
#define INPUT_7 6
//#define INPUT_8 A5
//#define INPUT_9 A4
//#define INPUT_10 A3
//#define INPUT_11 A2
#define INPUT_12 A1
#define INPUT_13 A0

//Digital outputs
#define OUTPUT_1 7
#define OUTPUT_2 8
#define OUTPUT_3 9
#define OUTPUT_4 10
#define OUTPUT_5 11
#define OUTPUT_6 12
#define OUTPUT_7 13

#define UART_RX A2
#define UART_TX A3
#define LCD_RX A4
#define LCD_TX A5

class PORTS
{
public:
  PORTS()
  { 
    SetupPorts();
  };
  ~PORTS(){};
  
  bool GetInput(byte input);
  void SetOutput(byte output, bool state);
  
private:
   void SetupPorts();
};

#endif

IMM_SLAVE.ino

Arduino
//Projekt : Emulator VSS, SLAVE #1
//CPU : MD-238

#include "config.h"
#include "ports.h"
#include "E:\svn_remote\Arduino\BE_Devices\IMM_EMU\general\cmd.h"
PORTS slave;

//WATCH DOG
byte watchdog_counter = 0;

//Vystupy
bool INPUTS[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
bool OUTPUTS[7] = {0,0,0,0,0,0,0};

#include <SoftwareSerial.h>
SoftwareSerial uart(PIN_RX, PIN_TX);   // RX, TX    !POZOR PROTOTYP MA PROHOZENO RX a TX

void setup(){
  watchdog_counter = 0;
  uart.begin(DEF_UART_BAUDRATE);
} 

void loop(){
  ReadFromUart();
  SetupOutputs();
  ReadInputs();
  delay(DEF_DELAY);
}

void SetupOutputs()
{  
  //Watch Dog Counter
  if(watchdog_counter >= DEF_WATCHDOG_MAX)
  {
    for(int n =0; n<8;n++)
    {
      OUTPUTS[n] = false;
    }
  }
  else
  {
    watchdog_counter++;
  } 

  //Zapsat stav na vystup
  slave.SetOutput(OUTPUT_1, OUTPUTS[0]);
  slave.SetOutput(OUTPUT_2, OUTPUTS[1]);
  slave.SetOutput(OUTPUT_3, OUTPUTS[2]);
  slave.SetOutput(OUTPUT_4, OUTPUTS[3]);
  slave.SetOutput(OUTPUT_5, OUTPUTS[4]);
  slave.SetOutput(OUTPUT_6, OUTPUTS[5]);
  slave.SetOutput(OUTPUT_7, OUTPUTS[6]);
}

void ReadFromUart(){  
  String received_string;
  int received_value = 0;
  uart.setTimeout(100);

  bool on = false;
  
  while (uart.available())
  {    
    received_string = uart.readStringUntil('\n');
    received_value = received_string.toInt();

    on = true;
  }

  if(on)
  {
    uart.println(received_string);
  }
  
    
  UartDataParser(received_value);  
}

void ReadInputs(){
  INPUTS[0] = slave.GetInput(INPUT_1);
  INPUTS[1] = slave.GetInput(INPUT_2);
  INPUTS[2] = slave.GetInput(INPUT_3);
  INPUTS[3] = slave.GetInput(INPUT_4);
  INPUTS[4] = slave.GetInput(INPUT_5);
  INPUTS[5] = slave.GetInput(INPUT_6);
  INPUTS[6] = slave.GetInput(INPUT_7);
  INPUTS[7] = slave.GetInput(INPUT_8);
  INPUTS[8] = slave.GetInput(INPUT_9);
  INPUTS[9] = 0;  //UART
  INPUTS[10] = 0; //UART
  INPUTS[11] = slave.GetInput(INPUT_12);
  INPUTS[12] = slave.GetInput(INPUT_13);
}


void UartDataParser(int Value){
  if(Value < 0 || Value > 255 )
  {
    uart.println("Error - 0 to 255");
    Value = 0;  
  }  

  //New output states 
  int temp_value;
  
  //Vystupy 1.-7.    
  for(int i=0;i<7;i++)
  {
    temp_value = (Value >> i) & 1;
    OUTPUTS[i] = (temp_value == 0) ? false : true;      
  }

  //Write To Uart + WatchDog; Hodnota vystupu nikdy nebude nula (Pozor - to je zavisla na kombinaci a zapojeni)
  if(Value > 0)
  {
    watchdog_counter = 0;

    //Nacist stavy    
    String out_data = String(InputStates1ToByte()) + ";" + String(InputStates2ToByte());    
    uart.println(out_data);
  }
}

byte InputStates1ToByte(){
  //Vstup 1-8
  byte valueA = 0;    
  for (int n =0; n<8; n++)
  {
    valueA = valueA + (INPUTS[n] << n);
  }
  return valueA;
}

byte InputStates2ToByte(){
  //Vstup 9-13
  byte valueB = 0;    
  for (int n =8; n<13; n++)
  {
    valueB = valueB + (INPUTS[n] << n);
  }
  return valueB;
}

config.h (slave)

Arduino
#ifndef config_h
#define config_h

#define DEF_UART_BAUDRATE 57600     
#define DEF_WATCHDOG_MAX 100       //Ovlivni dobu vypadku vystupu (primoumerne)
#define DEF_DELAY 20
 
#endif

ports.cpp (slave)

Arduino
#include "ports.h"

//PUBLIC METHODS
bool PORTS::GetInput(byte input)
{	
	return !digitalRead(input);
}

void PORTS::SetOutput(byte output, bool state)
{	
	digitalWrite(output, state);
}

//PRIVATE METHODS
void PORTS::SetupPorts()
{
  pinMode(INPUT_1, INPUT);
  pinMode(INPUT_2, INPUT);
  pinMode(INPUT_3, INPUT);
  pinMode(INPUT_4, INPUT);
  pinMode(INPUT_5, INPUT);
  pinMode(INPUT_6, INPUT);
  pinMode(INPUT_7, INPUT);
  pinMode(INPUT_8, INPUT);
  pinMode(INPUT_9, INPUT);
  //10-11 UART!
  pinMode(INPUT_12, INPUT);
  pinMode(INPUT_13, INPUT);
  
  pinMode(OUTPUT_1, OUTPUT); 
  pinMode(OUTPUT_2, OUTPUT); 
  pinMode(OUTPUT_3, OUTPUT); 
  pinMode(OUTPUT_4, OUTPUT); 
  pinMode(OUTPUT_5, OUTPUT); 
  pinMode(OUTPUT_6, OUTPUT); 
  pinMode(OUTPUT_7, OUTPUT); 
}

ports.h (slave)

Arduino
#ifndef PORTS_h
#define PORTS_h

#include <Arduino.h>

//Define hardware ports
#define INPUT_1 0
#define INPUT_2 1
#define INPUT_3 2
#define INPUT_4 3
#define INPUT_5 4
#define INPUT_6 5
#define INPUT_7 6
#define INPUT_8 A5
#define INPUT_9 A4
//#define INPUT_10 A3   !UART
//#define INPUT_11 A2   !UART
#define INPUT_12 A1
#define INPUT_13 A0

//Digital outputs
#define OUTPUT_1 7
#define OUTPUT_2 8
#define OUTPUT_3 9
#define OUTPUT_4 10
#define OUTPUT_5 11
#define OUTPUT_6 12
#define OUTPUT_7 13

#define PIN_RX A2
#define PIN_TX A3

class PORTS
{
public:
  PORTS()
  { 
    SetupPorts();
  };
  ~PORTS(){};
  
  bool GetInput(byte input);
  void SetOutput(byte output, bool state);
  
private:
  void SetupPorts();   
};

#endif

Credits

Aleš Bedač

Aleš Bedač

1 project • 1 follower
Thanks to Ales Bedac.

Comments