コード例 #1
0
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;
}
コード例 #2
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;                                
        }      
        
}