On 1/20/2011 9:42 PM, James Y Knight wrote:
> On Jan 20, 2011, at 6:32 AM, Albert Brandl wrote:
>> The main problem seems to be the specification of Modbus RTU. RTU
>> messages are separated by time gaps that are at least 3.5 characters
>> long. Unfortunately, this is the only reliable way for separating
>> messages - there is no length header or something similar. The
>> specification does define a trailing CRC, though.
>
> I don't think you'll ever be able to do this reliably in Python. At 9600 
> baud, 3.5 characters is just about 275hz (9600/10/3.5). Linux schedules 
> process at around 500hz. So, unless you use real-time scheduling, I think you 
> have no guarantee that you'll be able to detect such a gap at all -- some 
> other process may be running and you may completely miss it. And you can't 
> reasonably use real-time scheduling in python...
>
> On the other hand, are you sure you need this? http://www.libmodbus.org/ 
> seems to have code which figures out what length packets should be, and no 
> code to detect a 3.5char delay between packets. That seems much more reliable.
>
> It also doesn't seem to have any code to ensure a 3.5char between sent 
> packets, which indicates to me that either it's totally brokem or else that 
> not even the hardware end actually uses a 3.5char delay to determine packet 
> boundaries...I'd guess the second, since even on an embedded CPU, it's much 
> trickier to ensure the appropriate serial port timing than to simply count 
> the correct number of bytes.


Building upon James' reply a little further, I recently did a ModBus RTU 
implementation on a microcontroller and you need both a 1.5 and 3.5 
character timer for correct operation. With the micro, I used hardware 
timers with uS resolution synchronized to incoming characters via the 
UART interrupt. As James mentions, user-space Python is simply too far 
from the hardware to do this sort of thing. You'd probably have to write 
a custom UART driver and run it on a RTOS to get correct timing. That 
being said, you can probably write something that will work 99.9% of the 
time, but may not respond correctly for some weird corner case scenarios.


Jason Valenzuela

_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to