Sample Modbus TCP server code
This commit is contained in:
85
poc-to-modbus.py
Normal file
85
poc-to-modbus.py
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
'''
|
||||
Pymodbus Server With Updating Thread
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
This is an example of having a background thread updating the
|
||||
context while the server is operating. This can also be done with
|
||||
a python thread::
|
||||
|
||||
from threading import Thread
|
||||
|
||||
thread = Thread(target=updating_writer, args=(context,))
|
||||
thread.start()
|
||||
'''
|
||||
# ---------------------------------------------------------------------------#
|
||||
# import the modbus libraries we need
|
||||
# ---------------------------------------------------------------------------#
|
||||
from pymodbus.server.async import StartTcpServer
|
||||
from pymodbus.device import ModbusDeviceIdentification
|
||||
from pymodbus.datastore import ModbusSequentialDataBlock
|
||||
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
|
||||
# from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# import the twisted libraries we need
|
||||
# ---------------------------------------------------------------------------#
|
||||
from twisted.internet.task import LoopingCall
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# configure the service logging
|
||||
# ---------------------------------------------------------------------------#
|
||||
import logging
|
||||
logging.basicConfig()
|
||||
log = logging.getLogger()
|
||||
log.setLevel(logging.DEBUG)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# define your callback process
|
||||
# ---------------------------------------------------------------------------#
|
||||
def updating_writer(a):
|
||||
''' A worker process that runs every so often and
|
||||
updates live values of the context. It should be noted
|
||||
that there is a race condition for the update.
|
||||
|
||||
:param arguments: The input arguments to the call
|
||||
'''
|
||||
log.debug("updating the context")
|
||||
context = a[0]
|
||||
register = 3
|
||||
slave_id = 0x00
|
||||
address = 0x10
|
||||
values = context[slave_id].getValues(register, address, count=5)
|
||||
values = [v + 1 for v in values]
|
||||
log.debug("new values: " + str(values))
|
||||
context[slave_id].setValues(register, address, values)
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# initialize your data store
|
||||
# ---------------------------------------------------------------------------#
|
||||
store = ModbusSlaveContext(
|
||||
di=ModbusSequentialDataBlock(0, [17]*100),
|
||||
co=ModbusSequentialDataBlock(0, [17]*100),
|
||||
hr=ModbusSequentialDataBlock(0, [17]*100),
|
||||
ir=ModbusSequentialDataBlock(0, [17]*100))
|
||||
context = ModbusServerContext(slaves=store, single=True)
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# initialize the server information
|
||||
# ---------------------------------------------------------------------------#
|
||||
identity = ModbusDeviceIdentification()
|
||||
identity.VendorName = 'pymodbus'
|
||||
identity.ProductCode = 'PM'
|
||||
identity.VendorUrl = 'http://github.com/bashwork/pymodbus/'
|
||||
identity.ProductName = 'pymodbus Server'
|
||||
identity.ModelName = 'pymodbus Server'
|
||||
identity.MajorMinorRevision = '1.0'
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# run the server you want
|
||||
# ---------------------------------------------------------------------------#
|
||||
time = 5 # 5 seconds delay
|
||||
loop = LoopingCall(f=updating_writer, a=(context,))
|
||||
loop.start(time, now=False) # initially delay by time
|
||||
StartTcpServer(context, identity=identity, address=("localhost", 5020))
|
||||
Reference in New Issue
Block a user