Jason Engelman
/
Adaptronictmp
First Working Master with Adaptronic simulator
Diff: main.cpp
- Revision:
- 0:150538eb0bf3
diff -r 000000000000 -r 150538eb0bf3 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jul 24 05:04:06 2011 +0000 @@ -0,0 +1,210 @@ +#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); + } +}