Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Modbus master example 2:
- * The purpose of this example is to query several sets of data
- * from an external Modbus slave device.
- * The link media can be USB or RS232.
- *
- * Recommended Modbus slave:
- * diagslave http://www.modbusdriver.com/diagslave.html
- *
- * In a Linux box, run
- * "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1"
- * This is:
- * serial port /dev/ttyUSB0 at 19200 baud 8N1
- * RTU mode and address @1
- */
- #include <ModbusRtu.h>
- #include <SoftwareSerial.h>
- #define ID 0
- //#define Led 3
- uint16_t au16data[32]; //!< data array for modbus network sharing
- uint8_t u8state; //!< machine state
- uint8_t u8query; //!< pointer to message query
- /**
- * Modbus object declaration
- * u8id : node id = 0 for master, = 1..247 for slave
- * u8serno : serial port (use 0 for Serial)
- * u8txenpin : 0 for RS-232 and USB-FTDI
- * or any pin number > 1 for RS-485
- */
- Modbus master(0,0,2); // this is master and RS-232 or USB-FTDI
- /**
- * This is an structe which contains a query to an slave device
- */
- modbus_t telegram[2];
- unsigned long u32wait;
- SoftwareSerial mySerial(0, 1);
- void setup() {
- ioset_up();
- // telegram 0: write single coil
- telegram[0].u8id = 1; // slave address
- telegram[0].u8fct = 5; // function code (this one is single coil)
- telegram[0].u16RegAdd = 0; // start address in slave
- telegram[0].u16CoilsNo = 2; // number of elements (coils or registers) to read
- telegram[0].au16reg = au16data[0]; // pointer to a memory array in the Arduino
- //telegram 1: write a single register
- telegram[1].u8id = 1; // slave address
- telegram[1].u8fct = 6; // function code (this one is write a single register)
- telegram[1].u16RegAdd = 1; // start address in slave
- telegram[1].u16CoilsNo = 4; // number of elements (coils or registers) to read
- telegram[1].au16reg = au16data[0]; // pointer to a memory array in the Arduino
- // telegram 2: write single coil
- telegram[2].u8id = 1; // slave address
- telegram[2].u8fct = 5; // function code (this one is single coil)
- telegram[2].u16RegAdd = 1; // start address in slave
- telegram[2].u16CoilsNo = 2; // number of elements (coils or registers) to read
- telegram[2].au16reg = au16data[0]; // pointer to a memory array in the Arduino
- Serial.begin( 9600);
- master.begin( 9600 ); // baud-rate at 9600
- master.begin( &mySerial, 9600 );
- master.setTimeOut( 3000 ); // if there is no answer in 3000 ms, roll over
- u32wait = millis() + 1000;
- u8state = u8query = 0;
- pinMode(6, OUTPUT);
- pinMode(7, OUTPUT);
- pinMode(8, OUTPUT);
- pinMode(9, OUTPUT);
- }
- void loop() {
- io_poll();
- switch( u8state ) {
- case 0:
- if (millis() > u32wait) u8state++; // wait state
- break;
- case 1:
- master.query( telegram[u8query] ); // send query (only once)
- u8state++;
- u8query++;
- if (u8query > 2) u8query = 0;
- break;
- case 2:
- master.poll(); // check incoming messages
- if (master.getState() == COM_IDLE) {
- u8state = 0;
- u32wait = millis() + 1000;
- Serial.print(au16data[0]);
- }
- break;
- // set digital outputs -> au16data[0]
- digitalWrite( 6, bitRead( au16data[0], 0 ));
- digitalWrite( 7, bitRead( au16data[0], 1 ));
- digitalWrite( 8, bitRead( au16data[0], 2 ));
- digitalWrite( 9, bitRead( au16data[0], 3 ));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement