Skip to content

taka-wang/modbusd

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

modbusd

Docker API

Modbus master daemon

  • Support doxygen style comments.
  • ZeroMQ is a high-level message library, you can replace it with your own data bus implementations without losing the core functionalities.

Table of content


Continuous Integration

I do continuous integration and build docker images after git push by self-hosted drone.io server for armhf platform , circleci server for x86 platform and dockerhub service.

CI Server Target Status
Travis API Build Status
CircleCI x86 CircleCI
Drone armhf Build Status

Design

Implemented libmodbus function codes

FC Description #Len API
0x01 read coils 2000 int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest)
0x02 read discrete inputs 2000 int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest)
0x03 read holding registers 125 int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)
0x04 read input registers 125 int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)
0x05 write single coil - int modbus_write_bit(modbus_t *ctx, int addr, int status)
0x06 write single register - int modbus_write_register(modbus_t *ctx, int addr, int value)
0x0F write multi coils 1968 int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *src)
0x10 write multi registers 125 int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src)

Coil/register number and address table

Coil/Register numbers data address type table name offset function code
1-9999 0000 to 270E (9998) Read-Write Discrete Output Coils 1 1, 5, 15
10001-19999 0000 to 270E (9998) Read-Only Discrete Input Contacts 10001 2
30001-39999 0000 to 270E (9998) Read-Only Analog Input Registers 30001 4
40001-49999 0000 to 270E (9998) Read-Write Analog Output Holding Registers 40001 3, 6, 16

Command mapping table

Command Number Description
FC1 1 modbus fc 1
FC2 2 modbus fc 2
FC3 3 modbus fc 3
FC4 4 modbus fc 4
FC5 5 modbus fc 5
FC6 6 modbus fc 6
FC15 15 modbus fc 15
FC16 16 modbus fc 16
SET_TCP_TIMEOUT 50 set tcp timeout
GET_TCP_TIMEOUT 51 get tcp timeout

Environment variable

  • CONF_MODBUSD: config file path

Configuration File

{
    "syslog": 1,
    "zmq":
    {
        "sub": "ipc:///tmp/to.modbus",
        "pub": "ipc:///tmp/from.modbus"
    },
    "mbtcp":
    {
        "connect_timeout": 200000
    }
}

Modbus TCP command format

Please refer to command definition.

External libraries


Library documentations

Flow Chart

flow


Setup

Setup development dependencies

sudo apt-get update
sudo apt-get install -y git build-essential autoconf libtool pkg-config cmake

Setup OSS libs dependencies

Install libmodbus library (3.1.4)

git clone https://github.com/stephane/libmodbus/
cd libmodbus
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

Install libzmq (3.2.5)

wget https://github.com/zeromq/zeromq3-x/releases/download/v3.2.5/zeromq-3.2.5.tar.gz
tar xvzf zeromq-3.2.5.tar.gz
cd zeromq-3.2.5
./configure
make
sudo make install
sudo ldconfig

Install czmq (high-level C binding for zeromq)

git clone git://github.com/zeromq/czmq.git
cd czmq
./autogen.sh
./configure
make
sudo make install
sudo ldconfig

Build from source code

git clone modbusd
cd modbusd
mkdir build
cd build
cmake ..
make
./modbusd ../modbusd.json # load external configuration file

Test Cases

  • Test holding registers (4x)
    • 4X Table: 60000 Read/Write uint16 value test: FC6, FC3
    • 4X Table: 30000 Read/Write int16 value test: FC6, FC3
    • 4X Table Multiple read/write test: FC16, FC3
    • 4X Table Multiple read/write test: FC16, FC3
  • Test coils (0x)
    • 0X Table Single read/write test:FC5, FC1
    • 0X Table Multiple read/write test: FC15, FC1
  • Test Discrete Input (1x)
    • 1X Table read test: FC2
  • Test Input Registers (3x)
    • 3X Table read test:FC4
  • Test TCP Timeout
    • Set timeout test
    • Get timeout test

ci

Images and testing from the scratch

docker pull edgepro/c-modbus-slave:x86
docker build -t edgepro/modbusd .
docker build -t edgepro/dummy-psmbtcp test/dummy-psmbtcp/.

docker run -itd --name=slave edgepro/c-modbus-slave:x86
docker run -v /tmp:/tmp --link slave -it --name=modbusd edgepro/modbusd
docker run -v /tmp:/tmp -it --link slave edgepro/dummy-psmbtcp

Docker compose

docker-compose up --abort-on-container-exit

Deployment Diagram

uml


Documentations


License

MIT