First Working Master with Adaptronic simulator

Dependencies:   mbed

main.cpp

Committer:
tecnosys
Date:
2011-07-24
Revision:
0:150538eb0bf3

File content as of revision 0:150538eb0bf3:

#include "mbed.h"
#define PROTOPLATFORM
//#define MBEDPLATFORM
#include "Protocol/modbus.h"

//LEDs
#define LED_1 (LED1)
#define LED_2 (LED1)

//Serial(1) rs232
#define RS232_TX (p13)
#define RS232_RX (p14)

//Serial(2) rs232/ttl/iphone
#define TTL_TX (p28)
#define TTL_RX (p27) 
#define TTL_GND (p26) 

//Console
#define CONSOLETX (USBTX)
#define CONSOLERX (USBRX)




//MODBUS STUFF
#define LOOP             1
#define SLAVE         0x01
#define ADDRESS_START    4096
#define ADDRESS_END      4100


 int nb = ADDRESS_END - ADDRESS_START;;
       
        uint8_t tab_rq_status[ADDRESS_END - ADDRESS_START];
        uint8_t tab_rp_status[ADDRESS_END - ADDRESS_START];
        uint16_t tab_rq_registers[ADDRESS_END - ADDRESS_START];
        uint16_t tab_rp_registers[ADDRESS_END - ADDRESS_START];
        
DigitalOut myled(LED_1);
Serial console_port(CONSOLETX, CONSOLERX);

Serial serial(RS232_TX,RS232_RX);

modbus_param_t mb_param;
       uint8_t query[MIN_QUERY_LENGTH];
        uint8_t response[MAX_MESSAGE_LENGTH];
        
void handleInterrupt() {

     int ret;
        int nb_fail;
        int nb_loop;
        int addr;
        
        
           
 printf("**");
      
        
        modbus_receive(&mb_param, query, response);
   
   //      if (ret > 0) {
                int offset;
                int i;

              //  ret = modbus_receive(mb_param, query, response);
        
                offset = mb_param.header_length;

                // If ret is negative, the loop is jumped ! 
                for (i = 0; i < ret; i++) {
                        // shift reg hi_byte to temp OR with lo_byte 
                        tab_rq_registers[i] = (response[offset + 3 + (i << 1)] << 8) | 
                                response[offset + 4 + (i << 1)];
                                printf("%d -- %d", tab_rq_registers[i],i);     
                }
     //   }
   
   /*
                                        for (int i=0; i<nb; i++) {
                                                if (tab_rq_registers[i] != tab_rp_registers[i]) {
                                                        printf("ERROR read_holding_registers\n");
                                                        printf("Slave = %d, address = %d, value %d (0x%X) != %d (0x%X)\n",
                                                               SLAVE, addr,
                                                               tab_rq_registers[i], tab_rq_registers[i],
                                                               tab_rp_registers[i], tab_rp_registers[i]);
                                                        nb_fail++;
                                                }
                                        }
    */
    
}

void handleInterrupt2() {

while(serial.readable()) {
         printf("<%.2X>", serial.getc());
}

}

void modbus_test() {


     int ret;
        int nb_fail;
        int nb_loop;
        int addr;

         modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1);

        //modbus_set_debug(&mb_param, TRUE);
        if (modbus_connect(&mb_param) == -1) {
                printf("ERROR Connection failed\n");
                exit(1);
        }

        nb = ADDRESS_END - ADDRESS_START;

/*
        tab_rq_status = (uint8_t *) malloc(nb * sizeof(uint8_t));
        memset(tab_rq_status, 0, nb * sizeof(uint8_t));

        tab_rp_status = (uint8_t *) malloc(nb * sizeof(uint8_t));
        memset(tab_rp_status, 0, nb * sizeof(uint8_t));

        tab_rq_registers = (uint16_t *) malloc(nb * sizeof(uint16_t));
        memset(tab_rq_registers, 0, nb * sizeof(uint16_t));

        tab_rp_registers = (uint16_t *) malloc(nb * sizeof(uint16_t));
        memset(tab_rp_registers, 0, nb * sizeof(uint16_t));
*/
        serial.attach( handleInterrupt2);

        nb_loop = nb_fail = 0;
        while (nb_loop++ < LOOP) { 
                for (addr = ADDRESS_START; addr <= ADDRESS_END; addr++) {
                        int i;

                        for (i=0; i<nb; i++) {
                                tab_rq_registers[i] = (uint16_t) 44097+i;;
                                tab_rq_status[i] = tab_rq_registers[i] % 2;
                        }
                        nb = ADDRESS_END - addr;
/*
                        ret = preset_multiple_registers(&mb_param, SLAVE,
                                                        addr, nb, tab_rq_registers);
                        if (ret != nb) {
                                printf("ERROR preset_multiple_registers (%d)\n", ret);
                                printf("Slave = %d, address = %d, nb = %d\n",
                                               SLAVE, addr, nb);
                                nb_fail++;
                        } else {
                        */
                      /*
                                ret = read_holding_registers(&mb_param, SLAVE,
                                                             addr, nb, tab_rp_registers);
                                                             
                                                             
                                                               printf("HERER");
  */
  
          int ret;
        int query_length;
   

         query_length = build_query_basis_rtu(SLAVE, FC_READ_HOLDING_REGISTERS, addr, nb, query);
        //  query_length = build_query_basis(&mb_param, SLAVE, FC_READ_HOLDING_REGISTERS, addr, nb, query);

        ret = modbus_send(&mb_param, query, query_length);
                               
                        //}

                }
                        
                printf("Test: ");
                if (nb_fail)
                        printf("%d FAILS\n", nb_fail);
                else
                        printf("SUCCESS\n");
        }
      //  handleInterrupt();
/*
        free(tab_rq_status);
        free(tab_rp_status);                                           
        free(tab_rq_registers);
        free(tab_rp_registers);

        modbus_close(&mb_param);
 */       
}


int main() {
     myled = 1;
    console_port.baud(230400);
    serial.baud(57600);
    
  printf("Starting\n");

modbus_test();

    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}