myems/myems-modbus-tcp
13621160019@163.com 23412c2817 added docker image immigration to readme 2022-01-03 22:56:45 +08:00
..
.gitignore udpated gitignore files 2021-02-20 20:18:31 +08:00
Dockerfile updated Dockerfiles 2022-01-02 19:30:01 +08:00
LICENSE merged myems-cleaning 2021-02-19 12:11:42 +08:00
README.md added docker image immigration to readme 2022-01-03 22:56:45 +08:00
acquisition.py removed uncessary pass from acquisition.py of myems-modbus-tcp 2021-08-15 14:04:03 +08:00
byte_swap.py merged myems-modbus-tcp 2021-02-19 11:11:20 +08:00
config.py updated config files 2021-12-19 07:58:01 +08:00
example.env added default gateway token to database and myems_modbus_tcp 2021-11-06 15:43:06 +08:00
gateway.py added gateway procedure to myems-modbus-tcp service 2021-04-30 14:19:50 +08:00
main.py added gateway process to myems-modbus-tcp service 2021-04-30 14:07:46 +08:00
myems-modbus-tcp.service merged myems-modbus-tcp 2021-02-19 11:11:20 +08:00
requirements.txt updated config.py files to move all variables to .env files via Python Decouple 2021-10-12 18:39:42 +08:00
run.sh updated config.py files to move all variables to .env files via Python Decouple 2021-10-12 18:39:42 +08:00
test.py merged myems-modbus-tcp 2021-02-19 11:11:20 +08:00

README.md

MyEMS Modbus TCP Service

Introduction

This service is a component of MyEMS to acquire data from Modbus TCP devices.

Prerequisites

mysql-connector-python

modbus_tk

schedule

python-decouple

Quick Run for Development

cd myems/myems-modbus-tcp
pip install -r requirements.txt
cp example.env .env
chmod +x run.sh

Installation

Option 1: Install myems-modbus-tcp on Docker

In this section, you will install myems-modbus-tcp on Docker.

  • Copy example.env file to .env file and modify the .env file Note: There is a default Gateway Token in example.env, if you run more than one myems-modbus-tcp instances, please create new Gateway and get new token in Admin UI.
cd myems/myems-modbus-tcp
cp example.env .env
  • Build a Docker image
docker build -t myems/myems-modbus-tcp .
  • Run a Docker container
docker run -d --restart always --name myems-modbus-tcp myems/myems-modbus-tcp

-d Run container in background and print container ID

--restart Restart policy to apply when a container exits

--name Assign a name to the container

If you want to immigrate the image to another computer,

  • Export image to tarball file
docker save --output myems-modbus-tcp.tar myems/myems-modbus-tcp
  • Copy the tarball file to another computer, and then load image from tarball file
docker load --input .\myems-modbus-tcp.tar

Option 2: Install myems-modbus-tcp on Ubuntu Server (bare-metal or virtual machine)

Download and install MySQL Connector:

cd ~/tools
wget https://cdn.mysql.com/archives/mysql-connector-python-8.0/mysql-connector-python-8.0.23.tar.gz
tar xzf mysql-connector-python-8.0.23.tar.gz
cd ~/tools/mysql-connector-python-8.0.23
python3 setup.py install

Download and install Schedule

cd ~/tools
git clone https://github.com/dbader/schedule.git
cd ~/tools/schedule
python3 setup.py install

Download and install modbus-tk

cd ~/tools
git clone https://github.com/pyserial/pyserial.git
cd ~/tools/pyserial
python3 setup.py install
git clone https://github.com/ljean/modbus-tk.git
cd ~/tools/modbus-tk
python3 setup.py install

Download and install Python Decouple

cd ~/tools
git clone https://github.com/henriquebastos/python-decouple.git
cd ~/tools/python-decouple
python3 setup.py  install

Install myems-modbus-tcp service

cd myems
cp -R myems/myems-modbus-tcp /myems-modbus-tcp

Create .env file based on example.env and edit the .env file if needed:

cp /myems-modbus-tcp/example.env /myems-modbus-tcp/.env
nano /myems-modbus-tcp/.env

Setup systemd service:

cp myems-modbus-tcp.service /lib/systemd/system/

Enable the service:

systemctl enable myems-modbus-tcp.service

Start the service:

systemctl start myems-modbus-tcp.service

Monitor the service:

systemctl status myems-modbus-tcp.service

View the log:

cat /myems-modbus-tcp.log

Add Data Sources and Points in MyEMS Admin

NOTE: If you modified Modbus TCP datasources and points, please restart this service:

systemctl restart myems-modbus-tcp.service

Input Data source protocol:

modbus-tcp

Data source connection example:

{"host":"10.9.67.99","port":502}

Point address example:

{"slave_id":1, "function_code":3, "offset":0, "number_of_registers":2, "format":"<f", "byte_swap":true}

Address

slave_id

The slave ID

function_code

    01 (0x01) Read Coils
    02 (0x02) Read Discrete Inputs
    03 (0x03) Read Holding Registers
    04 (0x04) Read Input Registers
    23 (0x17) Read/Write Multiple registers

offset

The starting register address specified in the Request PDU

number_of_registers

The number of registers specified in the Request PDU

format

Use python3 library struct to format bytes. Python bytes objects are used to hold the data representing the C struct and also as format strings (explained below) to describe the layout of data in the C struct.

The optional first format char indicates byte order, size and alignment: @: native order, size & alignment (default) =: native order, std. size & alignment <: little-endian, std. size & alignment >: big-endian, std. size & alignment !: same as >

The remaining chars indicate types of args and must match exactly; these can be preceded by a decimal repeat count: x: pad byte (no data); c:char; b:signed byte; B:unsigned byte; ?: _Bool (requires C99; if not available, char is used instead) h:short; H:unsigned short; i:int; I:unsigned int; l:long; L:unsigned long; f:float; d:double.

Special cases (preceding decimal count indicates length): s:string (array of char); p: pascal string (with count byte). Special cases (only available in native format): n:ssize_t; N:size_t; P:an integer type that is wide enough to hold a pointer.

Special case (not in native mode unless 'long long' in platform C): q:long long; Q:unsigned long long

Whitespace between formats is ignored.

byte_swap

A boolean indicates whether or not to swap adjacent bytes.
Swap adjacent bytes of 32bits(4bytes) or 64bits(8bytes). This is not for little-endian and big-endian swapping, and use format for that. The option is effective when number_of_registers is ether 2(32bits) or 4(64bits), else it will be ignored.

References

[1]. http://myems.io

[2]. http://www.modbus.org/tech.php

[3]. https://github.com/ljean/modbus-tk

[4]. https://docs.python.org/3/library/struct.html#format-strings