int writequeue(char slavetype, char slavename, char addresstype, int address, int value) { //First update internal DB updateDB(slavetype,slavename, addresstype,address,value); //This needs to be written to slaves switch (slavetype) { case ENVIRONMENTAL_CONTROL: switch (slavename) { case BEDROOM: setmodbusslave(4); switch (addresstype) { case REGISTERS: write_single_register(address - 1,value); return 1; case COILS: write_single_coil(address - 1,value); return 1; break; } case SALOON: setmodbusslave(3); switch (addresstype) { case REGISTERS: write_single_register(address - 1,value); return 1; case COILS: write_single_coil(address - 1,value); return 1; break; } } case GENERAL_BOARD: switch (slavename){ case GENERAL_ENGINE: setmodbusslave(0); switch (addresstype) { case REGISTERS: write_single_register(address - 1,value); return 1; case COILS: write_single_coil(address - 1,value); return 1; break; } break; } case LCD_CONTROL: setmodbusslave(1); switch (addresstype) { case ALARM: write_single_coil(address - 1,value); break; case WARNING: write_single_coil(address - 1, value); break; default: write_single_register(address - 1,value); break; break; } setmodbusslave(2); switch (addresstype) { case ALARM: write_single_coil(address - 1,value); break; case WARNING: write_single_coil(address - 1, value); break; default: write_single_register(address - 1,value); break; break; } } return 0; }
int ModbusSlave232::update(int *regs, unsigned int regs_size) { unsigned char query[MAX_MESSAGE_LENGTH]; unsigned char errpacket[EXCEPTION_SIZE + CHECKSUM_SIZE]; unsigned int start_addr; int exception; int length = W232.available(); unsigned long now = millis(); //USB.print("\n"); //USB.print("Datos recibidos : "); //USB.println(length); if (length == 0) { lastBytesReceived = 0; return 0; } if (lastBytesReceived != length) { lastBytesReceived = length; Nowdt = now + T35; return 0; } if (now < Nowdt) return 0; lastBytesReceived = 0; length = modbus_request(query); if (length < 1) return length; exception = validate_request(query, length, regs_size); if (exception) { build_error_packet( query[FUNC], exception, errpacket); send_reply(errpacket, EXCEPTION_SIZE); return (exception); } start_addr = ((int) query[START_H] << 8) + (int) query[START_L]; switch (query[FUNC]) { case FC_READ_REGS: return read_holding_registers( start_addr, query[REGS_L], regs); break; case FC_WRITE_REGS: return preset_multiple_registers( start_addr, query[REGS_L], query, regs); break; case FC_WRITE_REG: write_single_register( start_addr, query, regs); break; } }