I can connect to my modbus slaves using pymodbus and read those connections using the synchronous client. When I attempt to use the asynchronous client with twisted I can read multiple values, and get output from one of the clients and the subsequent one hangs if I don't issue a disconnect, but if I issue a disconnect the client disconnects before the values are returned.
I'm a python novice and this is just me scraping together code from various sources. I'm sure there is a super simple solution. Forgive the code, I'm no programmer. Thanks!!
#!/usr/bin/env python
import logging
from twisted.internet import reactor
from twisted.internet import defer, task
from twisted.internet.endpoints import TCP4ClientEndpoint
from pymodbus.constants import Defaults
from pymodbus.client.async import ModbusClientFactory
import time
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
hosts = ['10.3.72.89', '10.3.72.57']
start = time.time()
def show_hreg(response):
log.debug('1st hreg = {0}'.format(response.getRegister(0)))
print response.registers
def foo(protocol):
rlist = []
r2 = protocol.read_holding_registers(1699, 4, unit=1)
r2.addCallback(show_hreg)
r3 = protocol.read_holding_registers(1099, 4, unit=1)
r3.addCallback(show_hreg)
r4 = protocol.read_holding_registers(1599, 4, unit=1)
r4.addCallback(show_hreg)
rlist.append(r2)
rlist.append(r3)
rlist.append(r4)
results = defer.gatherResults(rlist)
return results
#protocol.transport.loseConnection()
#reactor.callLater(1, protocol.transport.loseConnection)
#reactor.callLater(1.5, reactor.stop)
def main(reactor, hosts):
dlist = []
for server in hosts:
d = TCP4ClientEndpoint(reactor, server, Defaults.Port)
protocol = d.connect(ModbusClientFactory())
protocol.addCallback(foo)
dlist.append(protocol)
# finish the process when the "queue" is done
results = defer.gatherResults(dlist).addCallback(printElapsedTime)
return results
def printElapsedTime(ignore):
print "Elapsed Time: %s" % (time.time() - start)
task.react(main, [hosts])