[Development] modbus over serial port on windows 7 ?

Dmitry Shapovalov dmitry at 0fe.ru
Wed Jun 1 19:59:32 CEST 2016


Okay. I think i found the source of problem. Calculation of send timeout is
incorrect.

Here is the calculation code:

http://code.qt.io/cgit/qt/qtserialbus.git/tree/src/serialbus/qmodbusrtuserialmaster_p.h#n294

            // Example: 9600 baud, 11 bit per packet -> 872 char/sec
            // so: 1000 ms / 872 char = 1.147 ms/char * 3.5 character
            m_sendTimer.start((1000. / (qreal(m_baudRate) / 11.)) *
m_current.adu.size());

Which in my case (115200 and 8 bytes of data) gives 0.7 ms. And after
conversion to int, it becomes zero.
So m_sendTimer is fired up immediately, which brings us to to this code:

http://code.qt.io/cgit/qt/qtserialbus.git/tree/src/serialbus/qmodbusrtuserialmaster_p.h#n323

            } else if (m_current.bytesWritten < m_current.adu.size()) {
                qCDebug(QT_MODBUS) << "(RTU client) Send failed:" <<
m_current.requestPdu;

                if (m_current.numberOfRetries <= 0) {
                    if (m_current.reply) {

m_current.reply->setError(QModbusDevice::TimeoutError,
                            QModbusClient::tr("Request timeout."));
                    }

So there comes a premature timeout.

I experimented with a timeout and found that even a value of 15-20ms does
not give stable results. only the value of around 50ms gives a stable
result in my case.
I suppose that timeout calculation must include some additional minimum
time constant.

I will report this bug.

Thank you all for the help )

2016-05-31 17:15 GMT+05:00 Ralf Nolden <nolden at kde.org>:

> Am Dienstag, 31. Mai 2016, 13:53:15 schrieb Denis Shienkov:
> >  > But why ?
> >
> > I don't know.. maybe the Qt Modbus Master closes the connection without
> > waiting of data send,
> >
> > maybe something else..
> >
> > PS: I just have checked the QSerialPort autotests with the PL2303 on
> > Windows - all worked.
> >
> > PS2: You can try to use the Terminal Example (from the Qt Serial Port)
> > with the Rx/Tx connected,
> >
> > to check that your serial port works.
>
> If you have a second PC around, try running the slave example there and
> connect them with a second adapter, then try the master example to see if
> your
> conection works between those two computers.
>
> At any rate. the modbus master is doing the right thing if the error comes
> from the serial port. We can't just ignore port errors in cases where the
> returned response theoretically matches the expected results :)
>
> >
> > 31.05.2016 13:17, Dmitry Shapovalov пишет:
> > > Yep. That's right. It is ERROR_OPERATION_ABORTED.
> > > But why ? Any other application works as expected with this hardware.
> > >
> > > And i confirm that 0x01040000000131ca and 0x0104024c494c06 are correct
> > > request and response.
> > >
> > >
> > > 2016-05-31 15:05 GMT+05:00 Denis Shienkov <denis.shienkov at gmail.com
> > >
> > > <mailto:denis.shienkov at gmail.com>>:
> > >     Seems, this:
> > >     > qt.modbus: (RTU server) QSerialPort error:
> > >     > QSerialPort::SerialPortError(ResourceError) "Операция>
> > >     ввода/вывода была прервана из-за завершения потока команд или по
> > >     запросу приложения."
> > >
> > >     It is an 'ERROR_OPERATION_ABORTED', that can be caused by
> > >
> > >     ::CancelIo() (e.g. when the serial port closes) or by a HW
> problems.
> > >
> > >     BR,
> > >
> > >     Denis
> > >
> > >     31.05.2016 12:23, Dmitry Shapovalov пишет:
> > >>     Thanks for reply Ralf. Email more preferable for me.
> > >>
> > >>     Can you tell me what type of adapter you are using? Which version
> > >>     of qtserialport are you using? Maybe my problem is related to the
> > >>     type of serial port adapter. I tried use arduino with different
> > >>     usb-uart chips(ch430 and pl2303), but unsuccessfully.
> > >>
> > >>     Here is output of qt modbus master example
> > >>
> > >>     Запускается
> > >>
>  C:\Qt\Examples\Qt-5.6\qtserialbus\serialbus\modbus\build-master-Deskt
> > >>     op_Qt_5_6_0_MinGW_32bit-Debug\debug\modbusmaster.exe... qt.modbus:
> > >>     (RTU client) Sent Serial PDU: 0x0400000001
> > >>     qt.modbus.lowlevel: (RTU client) Sent Serial ADU:
> 0x01040000000131ca
> > >>     qt.modbus: (RTU client) Send failed: 0x0400000001
> > >>     qt.modbus: (RTU server) QSerialPort error:
> > >>     QSerialPort::SerialPortError(ResourceError) "Операция
> > >>     ввода/вывода была прервана из-за завершения потока команд или по
> > >>     запросу приложения."
> > >>     qt.modbus.lowlevel: (RTU client) Response buffer: "01"
> > >>     qt.modbus: (RTU client) Modbus ADU not complete
> > >>     qt.modbus.lowlevel: (RTU client) Response buffer: "0104024c494c06"
> > >>     qt.modbus: (RTU client) Received ADU: "0104024c494c06"
> > >>     qt.modbus: (RTU client) Cannot match response with open request,
> > >>     ignoring
> > >>
> > >>     Look like it actually sends request, but qtserialport reports
> > >>     error, so qtserialbus(modbus) ignores response.
> > >>
> > >>
> > >>     2016-05-31 11:59 GMT+05:00 Ralf Nolden <nolden at kde.org
> > >>
> > >>     <mailto:nolden at kde.org>>:
> > >>         Am Dienstag, 31. Mai 2016, 09:34:19 schrieb Dmitry Shapovalov:
> > >>         > Hello,
> > >>         > can someone confirm that modbus over serial port is working
> > >>
> > >>         on windows ?
> > >>         I have tested modbus over serial port on windows with two
> > >>         Schneider Electric
> > >>         PLCs, a Twido and a Premium, both with TCP and RS485. We
> > >>         could evaluate your
> > >>         problems on IRC if you want.
> > >>
> > >>         > all my experiments led me to the thought that it is
> > >>
> > >>         absolutely broken.
> > >>
> > >>         > i am using arduno as a modbus device. i tested it with
> > >>
> > >>         qmodbus and modbus
> > >>
> > >>         > poll. works great. but when i try to use modbus examples
> from
> > >>         > qt(qtserialbus/examples/serialbus/modbus/master), look like
> > >>
> > >>         it can not send
> > >>
> > >>         > request.
> > >>         > i tried release(5.6) and git version of qtserialbus and
> > >>
> > >>         qtserialport
> > >>
> > >>         > modules with no luck.
> > >>         >
> > >>         > i am using windows 7 on virtualbox.
> > >>         > arduino modbus library from here
> > >>         >
> https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
> > >>         > arduino sketch http://pastebin.com/FHW3B7TX
> > >>         >
> > >>         > it's me or it's really broken ?
> > >>
> > >>         --
> > >>         Kind regards,
> > >>
> > >>         Ralf Nolden
> > >>
> > >>         _______________________________________________
> > >>         Development mailing list
> > >>         Development at qt-project.org <mailto:Development at qt-project.org
> >
> > >>         http://lists.qt-project.org/mailman/listinfo/development
> > >>
> > >>     _______________________________________________
> > >>     Development mailing list
> > >>     Development at qt-project.org <mailto:Development at qt-project.org>
> > >>     http://lists.qt-project.org/mailman/listinfo/development
> > >
> > >     _______________________________________________
> > >     Development mailing list
> > >     Development at qt-project.org <mailto:Development at qt-project.org>
> > >     http://lists.qt-project.org/mailman/listinfo/development
> > >
> > > _______________________________________________
> > > Development mailing list
> > > Development at qt-project.org
> > > http://lists.qt-project.org/mailman/listinfo/development
>
> --
> Kind regards,
>
> Ralf Nolden
>
> _______________________________________________
> Development mailing list
> Development at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development
>



-- 
--
With Best Regards
Dmitry Shapovalov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20160601/b0c3a66a/attachment.html>


More information about the Development mailing list