/
modbus_client.py
82 lines (61 loc) · 2.75 KB
/
modbus_client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#-------------------------------------------------------------------------------
# Copyright (c) 2014 Proxima Centauri srl <info@proxima-centauri.it>.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the GNU Public License v3.0
# which accompanies this distribution, and is available at
# http://www.gnu.org/licenses/gpl.html
#
# Contributors:
# Proxima Centauri srl <info@proxima-centauri.it> - initial API and implementation
#-------------------------------------------------------------------------------
from pymodbus.client.sync import ModbusTcpClient, ConnectionException
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
import logging
from exception import ConnectionExceptionRest
#---------------------------------------------------------------------------#
# configure the service loggerging
#---------------------------------------------------------------------------#
logger = logging.getLogger(__name__)
def open_client(address, port):
logger.debug("open connection to " + str(address))
return ModbusTcpClient(address, port)
def close_client(client):
return client.close()
def read_register(client, register):
logger.info("---- Read register " + str(register))
try:
rr = client.read_holding_registers(register, count=2, unit=1)
logger.info("Register value are " + str(rr.registers))
# build register
reg=[0, 0]
reg[0] = rr.registers[0]
reg[1] = rr.registers[1]
# decode register
decoder = BinaryPayloadDecoder.fromRegisters(reg, endian=Endian.Big)
decoded = decoder.decode_32bit_float()
logger.info("Register decoded value are " + str(decoded))
return decoded
except ConnectionException:
raise ConnectionExceptionRest("")
def read_coil(client, coil):
logger.info("---- Read coil " + str(coil))
try:
result = client.read_coils(coil, count=1)
if result == None:
raise ConnectionExceptionRest("")
logger.info("Status coil: " + str(result.bits[0]))
return result.bits[0]
except ConnectionException:
raise ConnectionExceptionRest("")
def write_coil(client, coil, value):
logger.info("---- Write coil " + str(coil) + " Value: " + str(value))
try:
client.write_coil(coil, value)
except ConnectionException:
raise ConnectionExceptionRest("")
def read_input_registers(client, register):
logger.info("---- Read register " + str(register))
result = client.read_input_registers(register, count=1)
logger.info("Input register: " + str(result.registers))
return result.registers[0]