Sunday, December 7, 2014

How to Communication between Allen Bradley PLC and Arduino Microcontroller





How to communication PLC and Microcontroller?

This article about communication between PLC and Microcontroller, for PLC use Allen Bradley PLC and Microcontroller use Arduino with chip from Atmel.

On Allen Bradley PLC use Micrologix 1000 and DF1 Protocol, and use software: Arduino IDE for programming on microcontroller, download from arduino.cc/en/main/software.

In this application use keypad input on microcontroller and display to output on micrologix 1000 of allen bradley PLC.

Communication between Allen Bradley PLC and Arduino Microcontroller




Connection between Keypad, Arduino Microcontroller, Male RS232 Module, PLC Cable and Micrologix PLC:

Connection between Keypad, Arduino Microcontroller, Male RS232 Module, PLC Cable and Micrologix PLC


How does it work:
1. Press the Number "0", then the output O:0/0 is lit on the Micrologix PLC.
2. Press the Number "1", then the output O:0/1 is lit on the Micrologix PLC.
3. Press the Number "2", then the output O:0/2 is lit on the Micrologix PLC.
4. Press the Number "3", then the output O:0/3 is lit on the Micrologix PLC.
5. Press the Number "4", then the output O:0/4 is lit on the Micrologix PLC.
6. Press the Number "5", then the output O:0/5 is lit on the Micrologix PLC.
7. Press the Number "6", then the output O:0/6 is lit on the Micrologix PLC.
8. Press the Number "7", then the output O:0/7 is lit on the Micrologix PLC.
9. Press the Number "8", then the output O:0/8 is lit on the Micrologix PLC.
10. Press the Number "9", then the output O:0/9 is lit on the Micrologix PLC.

Character to the value to compare in PLC Programming:
1. The character "0": The value to compare in the PLC is 48
2. The character "1": The value to compare in the PLC is 49
3. The character "2": The value to compare in the PLC is 50
4. The character "3": The value to compare in the PLC is 51
5. The character "4": The value to compare in the PLC is 52
6. The character "5": The value to compare in the PLC is 53
7. The character "6": The value to compare in the PLC is 54
8. The character "7": The value to compare in the PLC is 55
9. The character "8": The value to compare in the PLC is 56
10. The character "9": The value to compare in the PLC is 57

PLC Ladder Diagram:

PLC Ladder Diagram for communication PLC and Microcontroller


Download Project File:
1. Arduino Microcontroller Programming: click here
2. PLC Ladder Programming: click here
3. Keypad Library, click here
 Copy-Paste Keypad Library to Folder C:\Program Files (x86)\Arduino\libraries

keypad libraries

keypad arduino library


Arduino Code:
#include

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte colPins[COLS] = {5, 4, 3, 2};
byte rowPins[ROWS] = {9, 8, 7, 6};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int data = 0;

static unsigned int CRC16table[] = {0x0,0xc0c1,0xc181,0x140,0xc301,0x3c0,0x280, 0xc241,
                       0xc601, 0x6c0, 0x780, 0xc741, 0x500, 0xc5c1, 0xc481, 0x440,
                       0xcc01, 0xcc0, 0xd80, 0xcd41, 0xf00, 0xcfc1, 0xce81, 0xe40,
                       0xa00, 0xcac1, 0xcb81, 0xb40, 0xc901, 0x9c0, 0x880,
                       0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81,
                       0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40,
                       0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540,
                       0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341,
                       0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141,
                       0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740,
                       0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81,
                       0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80,
                       0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800,
                       0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01,
                       0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401,
                       0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200,
                       0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001,
                       0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600,
                       0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00,
                       0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01,
                       0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800,
                       0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01,
                       0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401,
                       0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200,
                       0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000,
                       0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601,
                       0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01,
                       0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00,
                       0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801,
                       0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00,
                       0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400,
                       0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201,
                       0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040};

int Order_Inc = random(1, 127);
 
void setup(){
  Serial.begin(9600);
}

void loop(){
  char key = keypad.getKey();
  if(keypad.getState()==1 || keypad.getState()==2){
    if (key != NO_KEY){
      data = key;
    }  
  }else{
    data =0;
  }

  SendData(data);

}


void SendData(int data) {
    byte writedata[20];
 
    if (Order_Inc < 65535)
    {
      Order_Inc += 1;
    }else{
       Order_Inc = 1;
    }
 
    writedata[0] = (byte)0x10;
    writedata[1] = (byte)0x2;

    writedata[2] = (byte)0;
    writedata[3] = (byte)0;
    writedata[4] = (byte)0xf;
    writedata[5] = (byte)0;
    writedata[6] = (byte)(Order_Inc & 255);
    writedata[7] = (byte)(Order_Inc >> 8);
    writedata[8] = (byte)0xaa;

    writedata[9] = (byte)2;
    writedata[10] = (byte)7;
    writedata[11] = (byte)0x89;
    writedata[12] = (byte)0;
    writedata[13] = (byte)0;
    writedata[14] = (byte)(data & 0xff);
    writedata[15] = (byte)((data >> 8) & 0xff);

    byte dataforcrc[14];
    for (int i = 2; i<=15; i++)
    {
        dataforcrc[i-2] = writedata[i];
    }
    //CRC Computations
    unsigned int CRC = 0;
    byte bytT = 0;  
    for (int i = 0; i <14 i="" p="">    {
        bytT = (byte)((CRC & 0xff) ^ dataforcrc[i]);
        CRC = (unsigned int)((CRC >> 8) ^ CRC16table[bytT]);
    }
    bytT = (byte)(CRC & 0xff ^ 3);
    CRC = (unsigned int)((CRC >> 8) ^ CRC16table[bytT]);
 
    writedata[16] = 0x10;
    writedata[17] = 0x3;

    writedata[18] = (byte)(CRC & 255);
    writedata[19] = (byte)(CRC >> 8);

    byte ACK[] = { 0x10, 0x6 };
    Serial.write(ACK, sizeof(ACK));
    delay(100);
    Serial.write(writedata, sizeof(writedata));
    delay(200);  

}






Labels:








Newer Post Older Post Home

You may also like these ebook:

Get Free PLC eBook directly sent to your email,
and email subscription to program-plc.blogspot.com




We hate SPAM. Your information is never sold or shared with anyone.

Your Email Will Be 100% Secured !