diff --git a/doc/sphinx/examples/custom-datablock.rst b/doc/sphinx/examples/custom-datablock.rst new file mode 100644 index 000000000..7139c0f08 --- /dev/null +++ b/doc/sphinx/examples/custom-datablock.rst @@ -0,0 +1,6 @@ +================================================== +Custom Datablock Example +================================================== + +.. literalinclude:: ../../../examples/common/custom-datablock.py + diff --git a/examples/common/custom-datablock.py b/examples/common/custom-datablock.py new file mode 100755 index 000000000..42376ddf6 --- /dev/null +++ b/examples/common/custom-datablock.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +''' +Pymodbus Server With Custom Datablock Side Effect +-------------------------------------------------------------------------- + +This is an example of performing custom logic after a value has been +written to the datastore. +''' +#---------------------------------------------------------------------------# +# import the modbus libraries we need +#---------------------------------------------------------------------------# +from pymodbus.server.async import StartTcpServer +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSparseDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext +from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer + +#---------------------------------------------------------------------------# +# configure the service logging +#---------------------------------------------------------------------------# + +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +#---------------------------------------------------------------------------# +# create your custom data block here +#---------------------------------------------------------------------------# + +class CustomDataBlock(ModbusSparseDataBlock): + ''' A datablock that stores the new value in memory + and performs a custom action after it has been stored. + ''' + + def setValues(self, address, value): + ''' Sets the requested values of the datastore + + :param address: The starting address + :param values: The new values to be set + ''' + super(ModbusSparseDataBlock, self).setValues(address, value) + + # whatever you want to do with the written value is done here, + # however make sure not to do too much work here or it will + # block the server, espectially if the server is being written + # to very quickly + print "wrote {} to {}".format(value, address) + + +#---------------------------------------------------------------------------# +# initialize your data store +#---------------------------------------------------------------------------# + +block = CustomDataBlock() +store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) +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 +#---------------------------------------------------------------------------# + +p = Process(target=device_writer, args=(queue,)) +p.start() +StartTcpServer(context, identity=identity, address=("localhost", 5020)) diff --git a/pymodbus/client/sync.py b/pymodbus/client/sync.py index b649edede..9f05c1151 100644 --- a/pymodbus/client/sync.py +++ b/pymodbus/client/sync.py @@ -197,10 +197,12 @@ def __init__(self, host='127.0.0.1', port=Defaults.Port, :param host: The host to connect to (default 127.0.0.1) :param port: The modbus port to connect to (default 502) :param framer: The modbus framer to use (default ModbusSocketFramer) + :param timeout: The timeout to use for this socket (default None) ''' - self.host = host - self.port = port - self.socket = None + self.host = host + self.port = port + self.socket = None + self.timeout = kwargs.get('timeout', None) BaseModbusClient.__init__(self, framer(ClientDecoder()), **kwargs) @classmethod @@ -226,6 +228,7 @@ def connect(self): try: family = ModbusUdpClient._get_address_family(self.host) self.socket = socket.socket(family, socket.SOCK_DGRAM) + self.settimeout(self.timeout) except socket.error, ex: _logger.error('Unable to create udp socket %s' % ex) self.close()