Modbus on R-Pi
From emboxit
Hardware
Simple C++ code for Raspberry-Pi with FTDI to RS485
- The library used is: libmodbus library for Linux
<cpp>
- include <stdio.h>
- include <unistd.h>
- include <string.h>
- include <stdlib.h>
- include <errno.h>
- include <iostream>
- 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>