About Modbus programming

Modbus capability of the data logger must be enabled through configuration or programming. See the CRBasic Editor help for detailed information on program structure, syntax, and each instruction available to the data logger.

CRBasic Modbus instructions include:

  • ModbusClient()
  • ModbusServer()
  • MoveBytes()

See the CRBasic Editor help for detailed instruction information and program examples: https://help.campbellsci.com/crbasic/cr6/ .

Endianness

Endianness refers to the sequential order in which bytes are arranged into larger numerical values when stored in memory. Words may be represented in big-endian or little-endian format, depending on whether bits or bytes or other components are ordered from the big end (most significant bit) or the little end (least significant bit).

In big-endian format, the byte containing the most significant bit is stored first, then the following bytes are stored in decreasing significance order, with the byte containing the least significant bit stored last. Little-endian format reverses this order: the sequence stores the least significant byte first and the most significant byte last. Endianness is used in some Modbus programming so it is important to note that the CR6 is a big-endian instrument.

Function codes

A function code tells the server which storage entity to access and whether to read from or write to that entity. Different devices support different functions (consult the device documentation for support information). The most commonly used functions (codes 01, 02, 03, 04, 05, 15, and 16 ) are supported by Campbell Scientific data loggers.

Most users only require the read- register functions. Holding registers are read with function code 03. Input registers are read with function code 04. This can be confusing, because holding registers are usually listed with an offset of 40,000 and input registers with an offset of 30,000. Don’t mix up the function codes. Double check the register type in the device documentation.

Function code Action Entity
01 (01 hex) Read Discrete Output Coils
05 (05 hex) Write single Discrete Output Coil
15 (0F hex) Write multiple Discrete Output Coils
02 (02 hex) Read Discrete Input
04 (04 hex) Read Input Registers
03 (03 hex) Read

Holding Registers

06 (06 hex) Write single

Holding Register

16 (10 hex) Write multiple Holding Registers

The write-register functions will only work on holding registers. Function 06 only changes one 16-bit register, whereas function 16, changes multiple registers. Note, when writing registers, the Variable parameter for the ModbusClient() instruction refers to a source, not a destination.