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