ModBus

Some notes about building a ModBus class are placed here.

Download, build and install the libmodbus library:

$ cd ~install
$ wget http://github.com/downloads/stephane/libmodbus/libmodbus-3.0.1.tar.gz
$ tar xzvf libmodbus-3.0.1.tar.gz
$ cd libmodbus-3.0.1
$ ./configure
$ make
$ sudo make install

Some fiddling with external library calls, led to this.
It connects to my modbus device, changing the address or pull out the cable lead to a connect error, so that looks good.
Only getting the values out of the pResult pointer needs some work, or more insight ;-)


' Gambas module file

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' external library calls to modbus routines based on libmodbus
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LIBRARY "libmodbus" 
PRIVATE EXTERN modbus_new_tcp(sIp AS String, iPort AS Integer) AS Pointer
PRIVATE EXTERN modbus_connect(pMb AS Pointer) AS Integer
PRIVATE EXTERN modbus_read_registers(pMb AS Pointer, iAddr AS Integer, iCnt AS Integer, pResult AS Pointer)
PRIVATE EXTERN modbus_close(pMb AS Pointer)
PRIVATE EXTERN modbus_free(pMb AS Pointer)

PUBLIC SUB Main()

  Connect("192.168.178.25", 502)

END

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' open connection to modbus
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PUBLIC FUNCTION Connect(sAddress AS String, iPort AS Integer) AS Boolean

  DIM mb AS Pointer
  DIM tab_reg AS Integer[32]
  DIM fResult AS Float
  DIM pResult AS Pointer
  DIM sResult AS String

  ' setup new modbus instance
  mb = modbus_new_tcp(sAddress, iPort)
  ' mb = modbus_init_rtu(&mb_param, "/dev/ttyUSB2", 19200, "none", 8, 1); 
  ' connect to it
  IF modbus_connect(mb) = -1 THEN
    PRINT "Failed to connect to modbus device with address " & sAddress
  ELSE
    PRINT "Connected to modbus device with address " & sAddress
    ' read 5 registers from the address 0

    ' modbus_read_registers(mb, 1, 14, pResult)

    ' sResult = StrPtr(pResult)
    ' Free(pResult)
    ' PRINT sResult
    ' FOR EACH iValue IN tab_reg
    '   PRINT iValue & " ";
    ' NEXT

    ' close
    modbus_close(mb)
    modbus_free(mb)
  ENDIF

END