// modbus slave simple demo model RGK 2023 // version for arduino nano board /* SimpleModbusSlaveV10 supports function 3, 6 & 16. The modbus_update() method updates the holdingRegs register array and checks communication. */ #include #define SLAVE_ID 1 // modbus slave address #define TX_RX 2 // RS485 Rx/Tx changeover #define potmeter A0 // analog input for sensor demo #define RY1 10 // relays <> digital pins #define RY2 9 #define RY3 8 #define RY4 7 #define RY5 6 #define RY6 5 #define RY7 4 #define RY8 3 unsigned char RELAYS = 0; unsigned char RELAYS_OLD=0; // Using the enum instruction allows for an easy method for adding and // removing registers. Doing it this way saves you #defining the size // of your slaves register array each time you want to add more registers // and at a glimpse informs you of your slaves register layout. //////////////// registers of your slave /////////////////// enum { // just add or remove registers and your good to go... // The first register starts at address 0 REG_1, REG_2, HOLDING_REGS_SIZE // leave this one // total number of registers for function 3 and 16 share the same register array // i.e. the same address space }; unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 16 register array void setup() { modbus_configure(&Serial, 9600, SERIAL_8N2, SLAVE_ID, TX_RX, HOLDING_REGS_SIZE, holdingRegs); DDRB=0b00001111; //alternatieve pinMode instructie DDRD=0b11111100; } void loop() { static unsigned int error; static unsigned int data; modbus_update(); RELAYS = lowByte(holdingRegs[REG_1]);// get content of Modbus register 1 and use lower byte for relays if(RELAYS!=RELAYS_OLD)//only if something is changed { digitalWrite(RY1,(bitRead(RELAYS,0))); digitalWrite(RY2,(bitRead(RELAYS,1))); digitalWrite(RY3,(bitRead(RELAYS,2))); digitalWrite(RY4,(bitRead(RELAYS,3))); digitalWrite(RY5,(bitRead(RELAYS,4))); digitalWrite(RY6,(bitRead(RELAYS,5))); digitalWrite(RY7,(bitRead(RELAYS,6))); digitalWrite(RY8,(bitRead(RELAYS,7))); RELAYS_OLD=RELAYS; } data= analogRead(potmeter); //read analog input (potmeter voltage) holdingRegs[REG_2] = data;// put analog value in Modbus register 2 }