Hardware components | ||||||
| × | 2 | ||||
| × | 1 | ||||
Software apps and online services | ||||||
|
Compact PLC system based on Arduino - main purpose is the IMM emulation. Connection with the robot is provided by the E67 interface.
Customer needs to have compact IMM emulator to test industrial robot program without IMM but with all IMM features - Ejector, Core pullers, form input and output signals manipulation.
This control system is very effective while you are training customer on the robot, to the persons is much easier to understand the login if he can see all the signal states on one screen.
Untitled file
File missing, please reupload.
//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);
}
#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
#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
#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);
}
#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
//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;
}
#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
#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);
}
#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
Thanks to Ales Bedac.
Comments