pvbrowser ® - The Process Visualiation Browser.

  • English
  • Deutsch

Example

Modbus data acquisition

In pvbaddon/daemons/modbus/client/ you find a daemon for modbus that can be configured using an INI file. With USE_SOCKET=0 you will use modbus rtu over a serial line. If USE_SOCKET=1 you would use modbus tcp. Under [CYCLES] we define what we want to read from modbus. In this examples all cycles read from slave 1 and starting address 0. We read a number of 10, 8, 2 and 2 of the according data items.

Steps

example.ini

# ini file for modbus_client
#
# USE_SOCKET := 1 | 0  # if 0 then USE_TTY
# DEBUG      := 1 | 0
# BAUDRATE   := 300    |
#               600    |
#               1200   |
#               1800   |
#               2400   |
#               4800   |
#               9600   |
#               19200  |
#               38400  |
#               57600  |
#               115200
# STOPBITS   := 1 | 2
# PARITY     := NONE | ODD | EVEN
# PROTOCOL   := RTU | ASCII
# CYCLE   := ,
# name       := coilStatus(slave,adr)       | 
#               inputStatus(slave,adr)      |
#               holdingRegisters(slave,adr) |
#               inputRegisters(slave,adr)
# CYCLETIME in milliseconds
# SHARED_MEMORY_SIZE must be equal to SHARED_MEMORY_SIZE of pvserver
# MAX_NAME_LENGTH is maximum length of variable name in shared memory 
#

[GLOBAL]
USE_SOCKET=0
DEBUG=1
CYCLETIME=1000
N_POLL_SLAVE=5 # number of cycles a slave will not be polled when it fails

[SOCKET]
IP=192.168.1.100
PORT=502

[TTY]
DEVICENAME=/dev/ttyUSB0
BAUDRATE=9600
RTSCTS=1
STOPBITS=1
PARITY=NONE
PROTOCOL=RTU

[RLLIB]
MAX_NAME_LENGTH=30
SHARED_MEMORY=/srv/automation/shm/modbus1.shm
SHARED_MEMORY_SIZE=65536
MAILBOX=/srv/automation/mbx/modbus1.mbx

[CYCLES]
NUM_CYCLES=4
CYCLE1=10,inputStatus(1,0)
CYCLE2=8,coilStatus(1,0)
CYCLE3=2,holdingRegisters(1,0)
CYCLE4=2,inputRegisters(1,0)
    

Modbus register map

Within rlModbus all data addresses in Modbus messages are referenced to 0, with the first occurrence of a data item addressed as item number zero. Further, a function code field already specifies which register group it operates on (i.e. 0x, 1x, 3x, or 4x reference addresses).

0xxxx Read/Write Discrete Outputs or Coils.
1xxxx Read Discrete Inputs.
3xxxx Read Input Registers.
4xxxx Read/Write Output or Holding Registers.