Modbus on R-Pi

From emboxit
Jump to: navigation, search

Hardware


Simple C++ code for Raspberry-Pi with FTDI to RS485


<cpp>

  1. include <stdio.h>
  2. include <unistd.h>
  3. include <string.h>
  4. include <stdlib.h>
  5. include <errno.h>
  6. include <iostream>
  7. include <modbus.h>

using namespace std;

int main() {

   int socket;
   modbus_t *ctx;
   modbus_mapping_t *mb_mapping;
   int rc;
   uint16_t dest_array[22];
   int result_modbus;
   int i;

   cout<<"Waiting for Serial connection on /dev/ttyUSB0"<<endl;
   ctx = modbus_new_rtu("/dev/ttyUSB0", 19200, 'N', 8, 1);
   modbus_set_slave(ctx, 5);
   modbus_connect(ctx);
   cout<<"Serial connection started!"<<endl;


   mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,
                                   MODBUS_MAX_READ_REGISTERS, 0);
   if (mb_mapping == NULL) {
       cout<< "Failed to allocate the mapping: %s"<< modbus_strerror(errno)<<endl;
       modbus_free(ctx);
       return -1;
   }

   //Reads from Device with address 5, one register, the register No 40007(40007-40001=6)
   result_modbus=modbus_read_registers(ctx, 6, 1, dest_array);



   if (result_modbus == -1) {
       cout<<"FIRST TRY %s"<< modbus_strerror(errno)<<endl;
       return -1;
   }

   for (i=0;i<1;i++)
   {
       cout<<"DEVICE 5 REGISTER No "<<i<< " "<< dest_array[i]<<endl;
   }

   //Reads from Device with address 3, one register, the register No 40006(40006-40001=5)
   modbus_set_slave(ctx, 3);
   result_modbus=modbus_read_registers(ctx, 5, 1, dest_array);
   for (i=0;i<1;i++)
   {
       cout<<"DEVICE 3 REGISTER No "<<i<< " "<< dest_array[i]<<endl;
   }

   cout<<"Quit the loop: %s"<< modbus_strerror(errno)<<endl;

   modbus_mapping_free(mb_mapping);
   close(socket);
   modbus_free(ctx);

   return 0;

} </cpp>