[Twisted-Python] Wiring a new reactor/Client into Twisted

Eugene Coetzee projects at reedflute.com
Mon Jul 26 14:40:34 EDT 2004


Hi,

I'm using Twisted in an industrial application to replace a 
multi-threaded C++ driver which I developed some time ago to drive an 
array of serial ports (COM port expander) simultaneously. This is quite 
a typical application found in industrial control, building 
security/access control systems,  etc.  where an extended multi-drop 
serial  protocol like RS485/422 is used together with a standard message 
format such as Modbus to do remote data aquisition and control of 
embedded devices.

These kind of systems make use of what is refered  to as a master/slave 
serial driver i.e. there is only one master (typically a PC)  and a 
slave device may only respond to polls from the master.

My aim is to create a new Twisted package - say twisted.industrial  - 
which I hope contribute to the  Twisted platform.  I want to achieve 
this by extending Twisted  without modifying any Twisted sources, 
reusing as much as possible of existing Twisted code and * doing things 
very much the "Twisted way" * :)

The main problem is that most of Twisted's base classes seems to  have 
TCP/UDP network connectivity in mind.

I have managed to subclass SelectReactor in order to create 
SerialSelectReactor, base.BaseConnector to create SerialConnector, 
SerialPort to create ExtendedSerialPort  and I have the following piece 
of code working. 

***********************************************************
if __name__=='__main__':
        from serialreactor import serialreactor
        factory = ModbusFactory()
        factory.protocol=Modbus()
        serialreactor.connectSerial('/dev/ttyS0',9600,factory)
        print "start reactor"
        serialreactor.run()
        print "exit reactor"
***********************************************************

This is good but I want to run more than one serialport (or serial 
protocol) simultaneously - i.e I need to drive up to 64 serial ports at 
the same time. I believe I need  to do something like:

************************************************************
if __name__=='__main__':
        from serialapplication import SerialClient,service
        application=service.Application('Serial',uid=1,gid=1)
        factory = ModbusFactory()
        factory.protocol=Modbus()
        print "start client"
        
internet.SerialClient(79,factory).setServiceParent(service.IServiceCollection(app
lication))
        print "exit client"
**************************************************************

But I'm finding difficulty in grasping the code in application.internet 
(do not understand why it was done like that)  since I want to subclass 
_AbstractClient which is  seems to be  the product of some clever text 
manipulation and dynamic "class creation".

Any comments, suggestions, recommendations  and am I one the right track?

regards,

Eugene








More information about the Twisted-Python mailing list