commit 3ebeaf7b0b82485ed9867ac8e9bd0c2d1cc7e122 Author: Patrick McDonagh Date: Mon Oct 31 17:02:21 2016 -0500 Sample Modbus TCP server code diff --git a/poc-to-modbus.py b/poc-to-modbus.py new file mode 100644 index 0000000..46a35d7 --- /dev/null +++ b/poc-to-modbus.py @@ -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))