I am using the Digi One IAP to read from a Modbus Ethernet/TCP device and it is working but I am still having a few problems. I am calling a MSG instruction every 500 ms (I want to run it faster) to get 4 words and it works for 10 - 15 minutes with no problems. After that time it will stop requesting data from the slave device. If I stop the MSG instruction for about 10 seconds it will start working again. Has anyone seen this problem before? and what is the fastest someone has been able to repeatedly get data from an Ethernet/TCP device using the Digi One IAP?
Thanks for the help.
Ethernet/IP is a tough protocol to run because it has so many internal timers/timeouts running. Make sure you have the latest firmware (which is rev G2) as it fixes some issues with the uLgx 1100 related to socket recovery.
My gut feeling is the Modbus/TCP slave might be using serial RTU internally (may drives do this), which means it might get out of sync and thus every response is “too late” for the DOIAP. Thus the DOIAP is seeing responses, but discarding them all because they have old sequence numbers.
You might want to try running this telnet trace - it will include basic stats which could explain where the ball drops:
Your first goal should be discovering how predictable and long the MB/TCP responses are to return (worst case, not best case).
Thanks for the quick reply. I ran the event trace and unfortunately it looks like the slave device that is timing out for some reason. I have attached a few screen shots in case I am missing something but i believe that is the problem. What is the fastest you have been able to communicate with a Ethernet/TCP device from Ethernet/IP?
I have attaches a PC that is using modbus to read the same data every second or so and when my ControlLogix communications stop working the computer continues reading with no problem. So that makes me think there is still something set up wrong in the Digi. Also it will start communicating again after about a minute.
Well, I’m biased (since I wrote the code), but I’ve found a basic max of about 30 transactions per second between my old ControlLogix via DOIAP to a fast Modbus/TCP slave/server. So once every 35 msec or so.
I believe you’re correct that the DOIAP is “involved”, but there’s no magic here. You literally have three or four disjoined loops running here:
- ControlLogix polls DOIAP - ControlLogix giving up on DOIAP is in no way truly understood by the DOIAP
- The EIP side of DOIAP “polls” the Modbus side, again there is no direct way for either side to slow down or speed up the other side actively.
- The DOIAP polls the MB/TCP slave/server.
- it looks like the Modbus/TCP slave/server might also poll a send Modbus/RTU (or use a backplane) and so on.
If any of the “lower number” layers gives up before the “higher number” you’ll have problems. This means trying to reduce the DOIAP times NEVER speeds things up in such a 1-to-1 linkage.
- the DOIAP’s table/route slave timeout at 1 second or higher … assuming you have a socket, timeout should never occur.
- the DOIAP’s master messagetimeout should be left at 2500 msec
- my experience with ControlLogix is that even if you attempt to trigger the MSG block every 50 msec, it just takes up to 30 seconds to obtain an anwser and ignores the missed triggers.
So polling once per 500msec should be fine - once per 100 msec also should be fine. However, keep the timer in place as it allows throttling (dialing faster/slower) the comms. And also, don’t try to reduce timeouts within the DOIAP in your situation because it cannot help but can hurt you. Also, if there really is a serial Modbus link embedded within remote device have two or more masters polling increases the response time the DOIAP sees by a large amount.
Thanks again for your help, I looked again and realized I was polling 39 words not 2 so i changed that back and am getting around 30-35ms responses and it has been running for bout 20 minutes with no interruptions. i think I need to poll the MSG instruction every 30ms or so to get the response I want unless I am missing something but I think if there is no problem after running all night there should be nothing else to fix.
It may pay to ask the vendor of the other product if there is any bandwidth limitations; personally I’d avoid putting more than a 50% load on it since you want other devices to get in from time to time. For example running a simple poller during troubleshooting or checking the device config.
If there is say a 19200 baud serial link embedded in there, then it literally requires nearly 40 msec just to physically shift a serial Modbus response of 39 registers between the main processor and Modbus-coprocessor. This ignores the time for the request shift and response creation delay.