modbusPIC

download modbusPIC

of 9

Transcript of modbusPIC

  • 7/25/2019 modbusPIC

    1/9

    #include "874modbu.h"

    #define SlaveAddress 1

    int isrEnd,readEnd;

    bank1 unsigned char buffer[74];

    union transform{

    struct twoBytes{

    unsigned char lowByte;

    unsigned char highByte;

    }bytes;

    unsigned int integer;

    }T;

    void delay(unsigned int time)

    {

    unsigned int i,j;

    for (i = 0; i

  • 7/25/2019 modbusPIC

    2/9

    BRGH = 0;

    SPBRG = 31; // baud rate 9600 for 20 MHz

    SYNC = 0;

    SPEN = 1; // serial port pins ON

    CREN = 1;

    SREN = 0;

    TXIE = 0;

    RCIE = 0;

    TX9 = 0;

    RX9 = 0;

    TXEN = 1;

    }

    void startI2C(void)

    {

    SEN = 1;

    while (SEN);

    }

    void stopI2C(void)

    {

    PEN = 1;

    while (PEN);

    }

    unsigned char readRS(vid)

    {

    while(!RCIF) continue;

    return RCREG;

    }

  • 7/25/2019 modbusPIC

    3/9

    void writeRS(unsigned char c)

    {

    TXREG = c;

    TXEN = 1;

    while (!TRMT);

    }

    unsigned char readI2C(void)

    {

    isrEnd = 0;

    while(!isrEnd);

    PEN = 1;

    while (PEN);

    return SSPBUF;

    }

    void writeI2C(unsigned char data)

    {

    isrEnd = 0;

    SSPBUF = data;

    while (!isrEnd);

    while (ACKSTAT);

    }

    bit CRC16(unsigned int dataLength,char check) //CRC 16 for modbus checksum

    {

    unsigned int CheckSum;

    unsigned int j;

    unsigned char lowCRC;

    unsigned char highCRC;

  • 7/25/2019 modbusPIC

    4/9

    unsigned short i;

    CheckSum = 0xffff;

    for (j=0; j0;i--)

    if((CheckSum)&0x0001)

    CheckSum = (CheckSum>>1)^0xa001;

    else

    CheckSum>>=1;

    }

    highCRC = CheckSum>>8;

    CheckSum8;

    if (check==1){

    if ( (buffer[dataLength+1] == highCRC) & (buffer[dataLength] == lowCRC ))

    return 1;

    else

    return 0;

    }

    else

    {

    buffer[dataLength] = lowCRC;

    buffer[dataLength+1] = highCRC;

    return 1;

    }

    }

    void readRegResponse(void) //response for modbus 03 function (read registers)

    {

  • 7/25/2019 modbusPIC

    5/9

    unsigned char i;

    T.bytes.lowByte = buffer[3];

    T.bytes.highByte = buffer[2];

    T.integer*=2;

    buffer[2] = buffer[5]*2;

    for (i=0; i

  • 7/25/2019 modbusPIC

    6/9

    CRC16(3,0);

    for (i=0; i

  • 7/25/2019 modbusPIC

    7/9

    while((!RCIF) && (j < 30000)) j++;

    return RCIF;

    }

    unsigned char ReadMBFrame()

    {

    unsigned int counter = 0;

    unsigned int aux;

    stop = 0;

    while (!stop)

    if(!CheckRSInBuffer())

    stop = 1;

    else

    {

    if (counter 74) return 2; //to many bytes in frame

    if (counter < 8) return 0; //to few bytes frame

    if (buffer[0] != SlaveAddress) return 0; //wrong address

    if ((buffer[1] != 3) & (buffer[1] != 16))return 1; //wrong modbus function

    aux = (unsigned int)buffer[2] * 255 + (unsigned int)buffer[3] + (unsigned int)buffer[4]*255+(unsigned int)buffer[5];

    if (aux > 8000) return 2; // to many registers

    if ((buffer[4]>0)|( buffer[5] > 32)) return 2; // to many registers

    if( CRC16(counter - 2,1))

    return buffer[1]; //OK

    else

    return 0; //bad CRC

  • 7/25/2019 modbusPIC

    8/9

    }

    void setISR(void) /*Sets ISR bits */

    {

    GIE = 1;

    PEIE = 1;

    RCIE = 0;

    SSPIE = 1;

    EEIE = 1;

    }

    void I2CInitialize(void)

    {

    SSPEN = 1;

    SSPM3 = 1;

    SSPM2 = 0;

    SSPM1 = 0;

    SSPM0 = 0;

    SSPADD = 12;

    }

    void interrupt isr(void)

    {

    if (SSPIF)

    {

    SSPIF = 0;

    isrEnd = 1;

    }

  • 7/25/2019 modbusPIC

    9/9

    }

    void main(void)

    {

    unsigned char c;

    c = 1;

    TRISB = 0xE0;

    TRISC = 0xF8;

    RB1 = 0;

    RB2 = 0;

    RC3 = 1;

    RC4 = 1;

    setISR();

    I2CInitialize();

    setRS();

    for(;;)

    {

    if (RCIF) {

    c =ReadMBFrame();

    if (c == 3)

    readRegResponse();

    else

    if (c==16)

    writeRegResponse();

    else

    writeBadRequest(c);

    }

    }

    }