//By D.Weerasinghe COTM
#define noOfInputs 5 // Sum of inputs and outputs should be less than 10
#define noOfOutputs 5 // Sum of inputs and outputs should be less than 10
#define noOfAnalogInputs 3 // No of analog inputs Used in the program
#define printPindetails 1 // 1 to print 0 to disable print
#define printInputImage 0 // 1 to print 0 to disable print
#define printOutputImage 0 // 1 to print 0 to disable print
#define PrintScanCycleTiming 0 // 1 to print 0 to disable print
/*
inputs and outputs pind should use in this way.
#define input1Pin 3
#define input2Pin 4
#define input3Pin 5
#define input4Pin 6
#define output1Pin 13
#define output2Pin 12
#define output3Pin 11
#define output4Pin 10
*/
bool input[noOfInputs];
bool output[noOfOutputs];
int analoginputs[noOfAnalogInputs];
int scanCycleNumber = 0;
void declareInputOutputs();
void scanInputs();
void UpdateOutputs();
void setup() {
//Declaration of Inputs and Outputs
if(printPindetails || printInputImage || printOutputImage )Serial.begin(9600);
declareInputOutputs();
}
void loop() {
//Serial.println(millis() ); // for experimental determination of Cycle time Adjustment
//if(PrintScanCycleTiming) printscancycle("Start") ;
scanInputs(); // Scan Inputs and prepare Input Image
// Write PLC Program Here to calculate the outputs based on input image
/*
output[0] = input[0];
output[1] = input[1];
output[2] = input[2];
output[3] = input[3];
output[4] = input[4];
*/
/*
output[1] = 0;
delay(500);
output[1] = 1;
delay(1000);*/
UpdateOutputs();
//UpdateOutputs(printOutputImage);
if(PrintScanCycleTiming) printscancycle("End") ;
// void UpdateOutputs(PrintScanCycleTiming,printOutputImage);
scanCycleNumber++;
//Serial.println(millis() ); // for experimental determination of Cycle time Adjustment
}
void declareInputOutputs(){
if(printPindetails)Serial.println("Pins declared as inputs :");
for(int pin = 3; pin<3+ noOfInputs; pin++){
pinMode(pin, INPUT);
if(printPindetails)Serial.println(pin);
}
if(printPindetails)Serial.println();
//if(printPindetails)Serial.println();
if(printPindetails)Serial.println("Pins declared as outputs :");
for(int pin = 13; pin>13 - noOfOutputs; pin--){
pinMode(pin, OUTPUT);
if(printPindetails)Serial.println(pin);
}
if(printPindetails)Serial.println();
//if(printPindetails)Serial.println();
}
void scanInputs(){
if(printInputImage)Serial.println("Input Image:");
for(int pin = 3; pin<3+ noOfInputs; pin++){
input[pin-3] = digitalRead(pin);
}
for(int pin = 3; pin<3+ noOfInputs; pin++){
if(printInputImage){
Serial.print(" input pin");
Serial.print(pin-3);
Serial.print(" Value: ");
Serial.print(input[pin-3]);
}
}
if(printInputImage)Serial.println();
}
void UpdateOutputs(){
if(printOutputImage)Serial.println("Output Image:");
for(int pin = 13; pin>13 - noOfOutputs; pin--){
if(printOutputImage){
Serial.print(" output pin");
Serial.print(13-pin);
Serial.print(" Value: ");
Serial.print(output[13-pin]);
}
}
if(printOutputImage)Serial.println();
for(int pin = 13; pin>13 - noOfOutputs; pin--){
digitalWrite(pin,output[13-pin]);
}
}
void printscancycle(String StartOrEnd ){
int adjustment = 20; //value based on experiment
if (StartOrEnd =="start"||StartOrEnd =="Start") adjustment = 90;//value based on experiment
if(PrintScanCycleTiming){
Serial.print("cycle No: ");
Serial.print(scanCycleNumber);
Serial.print(" ");
Serial.print(StartOrEnd);
Serial.print(" at: ");
Serial.print(millis() + adjustment ); // 24 estimated based on experiment for additional due to print command
Serial.println(" milliseconds");
}
}
// PrintScanCycleTiming
// void UpdateOutputs(bool PrintCycleTime, bool printImage){