Occasionally CRC error in AB_DF1 protocol


shimh

Recommended Posts

We are writing script to read data using AB DF 1 protocol. However, we always have occasional, kinda random "CRC error in response". We try to capture the traffic when the CRC error occurs. The following are the data acquired (debug output in command window) by the script

temp1 = device.AB_PLC.ReadAnalog(0,"F8:0",21,1)
{{0.0500000007451, -1.61300003529, 0, 0, 0, 0, 0, 0, 0, 0, 5.449999809265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
// the data above are the content of temp1

temp1 = device.AB_PLC.ReadAnalog(0,"N10:0",30,1)
{{-2, 1, 1, -1614, -1953, 53, 0, 0, 0, 0, 30, 30, 30, 4600, 4600, 54, 7311, 0, 0, 0, 10, 10, 10, 2083, 2000, 18, 0, 0, 0, 0}}

temp1 = device.AB_PLC.ReadAnalog(0,"N10:30",30,1)
{{-2, 1, 1, -1614, -1953, 53, 0, 0, 0, 0, 30, 30, 30, 4600, 4600, 54, 7311, 0, 0, 0, 10, 10, 10, 2083, 2000, 18, 0, 0, 0, 0}}

CRC error occur, retry....................
time instance: 14:59:12.781

temp1 = device.AB_PLC.ReadAnalog(0,"N10:30",30,1)
{{11, 9, 4600, 1147, 0, 2, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, -20000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}

temp1 = device.AB_PLC.ReadAnalog(0,"N10:60",2,1)
{{56, 45}}

And then this is the corresponding com link traffic captured in com monitor

Tx (14:59:11.519): \x10\x06
Tx (14:59:11.537): \x10\x02\x00\x00\x0F\x00x\x12\xA2<\x0A\x89\x00\x00\x10\x03\xC6i
Rx (14:59:11.573): \x10\x06
Rx (14:59:11.573): \x10\x02\x00\x00O\x00x\x12\xFE\xFF\x01\x00\x01\x00\xB2\xF9_\xF85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1E\x00\x1E\x00\x1E\x00\xF8\x11\xF8\x116\x00\x8F\x1C\x00\x00\x00\x00\x00\x00\x0A\x00\x0A\x00\x0A\x00#\x08\xD0\x07\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03S\xB3
Rx (14:59:12.647): \x10
Tx (14:59:12.647): \x10\x06
Tx (14:59:12.652): \x10\x02\x00\x00\x0F\x00y\x12\xA2<\x0A\x89\x1E\x00\x10\x03\xAB\xFF
Rx (14:59:12.694): \x05\x10
Rx (14:59:12.694): \x06\x10\x02\x00\x00O\x00y\x12\x0B\x00\x09\x00\xF8\x11{\x04\x00\x00\x02\x00\x05\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE0\xB1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03[\xD6
Tx (14:59:12.780): \x10\x06
Tx (14:59:12.784): \x10\x02\x00\x00\x0F\x00z\x12\xA2<\x0A\x89\x1E\x00\x10\x03\xBF\x0F
Rx (14:59:12.826): \x10\x06
Rx (14:59:12.826): \x10\x02\x00\x00O\x00z\x12\x0B\x00\x09\x00\xF8\x11{\x04\x00\x00\x02\x00\x05\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE0\xB1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x98\xD6
Tx (14:59:12.911): \x10\x06
Tx (14:59:12.915): \x10\x02\x00\x00\x0F\x00{\x12\xA2\x04\x0A\x89<\x00\x10\x03\x16-
Rx (14:59:12.957): \x10\x06
Rx (14:59:12.957): \x10\x02\x00\x00O\x00{\x128\x00-\x00\x10\x03\xC9\x8B
Tx (14:59:12.978): \x10\x06

So it is obvious that the first try of temp1 = device.AB_PLC.ReadAnalog(0,"N10:30",30,1) returns the same data of device.AB_PLC.ReadAnalog(0,"N10:0",30,1), i.e. the previous acquisition. After retry, correct data are acquired.

Sometimes, when the CRC error happens, temp1 is empty. I guess this happens when the data type of previous acquisition is different from current acquisition. So the result of ReadAnalogue is interpretable for ReadBinary.

Do you the reason of the problem and how to fix it? Thanks.

Link to comment
Share on other sites

First, when viewing the monitor of a binary protocol like DF1 or modbus, make sure and have "display all ascii chars as codes" checked. Without that the monitor is largely unreadable because some bytes come through as characters.

The data looks ok. It looks like the device is actually returning the exact same values. Its not an echo because the frame counter increases. I think you are likely just going to have to program around this as you may have a wiring or device issue.

Link to comment
Share on other sites

Ok. The following are the data with HEX ticked.

temp1 = device.AB_PLC.ReadAnalog(0,"N7:0",30,1)
{{-29000, -24800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}

temp1 = device.AB_PLC.ReadAnalog(0,"N7:30",30,1)
CRC error occur, retry....................
time instance: 21:13:05.061
{{-29000, -24800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}

temp1 = device.AB_PLC.ReadAnalog(0,"N7:30",30,1)
{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 34, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}}

The corresponding raw data are:

Tx (21:13:03.822): \x10\x02\x00\x00\x0F\x00\xD6\x06\xA2\x3C\x07\x89\x00\x00\x10\x03\x5F\x30
Rx (21:13:03.855): \x10\x06
Rx (21:13:03.855): \x10\x02\x00\x00\x4F\x00\xD6\x06\xB8\x8E\x20\x9F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x89\x55
Rx (21:13:04.929): \x10
Tx (21:13:04.929): \x10\x06

Tx (21:13:04.934): \x10\x02\x00\x00\x0F\x00\xD7\x06\xA2\x3C\x07\x89\x1E\x00\x10\x03\x32\xA6
Rx (21:13:04.976): \x05\x10\x06\x10\x02\x00\x00\x4F\x00\xD7\x06\x00
Rx (21:13:04.997): \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x5A\xB3
Tx (21:13:05.061): \x10\x06

Tx (21:13:05.066): \x10\x02\x00\x00\x0F\x00\xD8\x06\xA2\x3C\x07\x89\x1E\x00\x10\x03\x73\x56
Rx (21:13:05.107): \x10\x06
Rx (21:13:05.108): \x10\x02\x00\x00\x4F\x00\xD8\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x95\xB0
Tx (21:13:05.192): \x10\x06

So is it the PLC device does not give the correct reply? Any hint about what kind problem in the device or daqfactory could give this type of error? Thanks.

Link to comment
Share on other sites

Thanks for reposting. Its much easier to follow. OK, it appears your device is just arbitrarily outputing \x10\x05 about 0.070 seconds after the first query shown above. As you can see by the next responses, this is not expected and DF thinks its part of the response coming from the second request, and thus gives you a CRC error since the CRC is the first thing it checks and it is wrong because the actual CRC is offset by a byte (its a byte because the \x10 is actually before the Tx so is purged, but the \x05 is after so DF thinks its part of the response).

Now then, since its throwing an error, temp1 never gets reset to a new value and this is why you are seeing the previous value duplicated. To avoid this confusion, set temp1 to NaN() or something else before each query.

I do not know why your device is responding with that extra \x10\x05 and I don't have the AB specs right in front of me. Try slowing down the queries a bunch and see if it just does it occasionally. From my memory, the frame should end with \x10\x03 then two bytes of CRC, so this \x10\x05 is definitely extra. Again, from memory, I think \x10\x05 is Nak meaning it got an invalid query. If you get this at random times then you most likely have noise on the line that the PLC is taking as a query and generating a random Nak response.

Link to comment
Share on other sites

Thank you very much for the information. \x10\x05 you mentioned is the ENQ Retry symbol in AB DF1 protocol. PLC makes ENQ Retry to inquiry (a message asking whether the previous message was received) of a node after an ACK timeout. Then we set ENQ Retries to 0 in PLC and there is no CRC error anymore. So the issue is solved.

Then the following are just a few questions which may make things clearer and probably may make DAQFatory better. Is ENQ retry mechanism implemented in DAQFactory? Is our issue caused by that DAQFactory does not understand ENQ Retry (i.e. do you think if it is neccessary to put a note in DAQFactory manual that ENQ retry should be disabled?)? The following is the traffic after ENQ Retry is disabled on PLC. Do you know what could probably trigger PLC to make ENQ Retries? Thank you.

Tx (11:10:32.083): \x10\x02\x00\x00\x0F\x00\xFA\x43\xA2\x04\x0A\x89\x3C\x00\x10\x03\xBE\x8B
Rx (11:10:32.126): \x10\x06
Rx (11:10:32.127): \x10\x02\x00\x00\x4F\x00\xFA\x43\x3C\x00\x05\x00\x10\x03\x24\xCA
Tx (11:10:32.127): \x10\x06

Tx (11:10:32.175): \x10\x02\x00\x00\x0F\x00\xFB\x43\xA2\x02\x00\x82\x0A\x00\x10\x03\xC9\x56
Rx (11:10:32.183): \x10\x06
Rx (11:10:32.203): \x10\x02\x00\x00\x4F\x00\xFB\x43\x00\x00\x10\x03\x0E\x95
Tx (11:10:32.204): \x10\x06

Tx (11:10:32.265): \x10\x02\x00\x00\x0F\x00\xFC\x43\xA2\x02\x00\x82\x00\x00\x10\x03\xCF\x64
Rx (11:10:32.272): \x10\x06\x10
Rx (11:10:32.293): \x02\x00\x00\x4F\x00\xFC\x43\x02\x00\x10\x03\x1A\x95
Tx (11:10:32.293): \x10\x06

Tx (11:10:32.302): \x10\x02\x00\x00\x0F\x00\xFD\x43\xA2\x02\x03\x85\x1E\x00\x10\x03\xE7\x86
Rx (11:10:32.339): \x10\x06
Rx (11:10:32.339): \x10\x02\x00\x00\x4F\x00\xFD\x43\x00\x00\x10\x03\x86\x95
Tx (11:10:32.339): \x10\x06

Tx (11:10:32.352): \x10\x02\x00\x00\x0F\x00\xFE\x43\xA2\x02\x03\x85\x50\x00\x10\x03\x93\x61
Rx (11:10:32.385): \x10\x06
Rx (11:10:32.385): \x10\x02\x00\x00\x4F\x00\xFE\x43\x00\x00\x10\x03\xC2\x95
Tx (11:10:32.386): \x10\x06

Tx (11:10:33.407): \x10\x02\x00\x00\x0F\x00\xFF\x43\xA2\x3C\x07\x89\x00\x00\x10\x03\x68\xAE
Rx (11:10:33.441): \x10\x06
Rx (11:10:33.441): \x10\x02\x00\x00\x4F\x00\xFF\x43\xB8\x8E\x20\x9F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\xDC\x5A
Tx (11:10:33.444): \x10\x06

Tx (11:10:33.445): \x10\x02\x00\x00\x0F\x00\x00\x44\xA2\x3C\x07\x89\x1E\x00\x10\x03\x0C\xBA
Rx (11:10:33.489): \x10\x06
Rx (11:10:33.489): \x10\x02\x00\x00\x4F\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x72\x04
Tx (11:10:33.493): \x10\x06

Tx (11:10:33.498): \x10\x02\x00\x00\x0F\x00\x01\x44\xA2\x3C\x07\x89\x3C\x00\x10\x03\xA1\x20
Rx (11:10:33.538): \x10\x06
Rx (11:10:33.538): \x10\x02\x00\x00\x4F\x00\x01\x44\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\xE5\x78
Tx (11:10:33.541): \x10\x06

Tx (11:10:33.544): \x10\x02\x00\x00\x0F\x00\x02\x44\xA2\x14\x07\x89\x5A\x00\x10\x03\x53\xE7
Rx (11:10:33.587): \x10\x06\x10
Rx (11:10:33.587): \x02\x00\x00\x4F\x00\x02\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x50\x10\x03\x53\x85
Tx (11:10:33.587): \x10\x06

Tx (11:10:33.597): \x10\x02\x00\x00\x0F\x00\x04\x44\xA2\x54\x08\x8A\x00\x00\x10\x03\x02\xD1
Rx (11:10:33.633): \x10\x06
Rx (11:10:33.634): \x10\x02\x00\x00\x4F\x00\x04\x44\xCD\xCC\x4C\x3D\x8D\x97\xCE\xBF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\xB1\x7B
Tx (11:10:33.654): \x10\x06

Tx (11:10:33.671): \x10\x02\x00\x00\x0F\x00\x05\x44\xA2\x3C\x0A\x89\x00\x00\x10\x03\x7E\x2D
Rx (11:10:33.705): \x10\x06
Rx (11:10:33.705): \x10\x02\x00\x00\x4F\x00\x05\x44\x00\x00\x01\x00\x01\x00\xB2\xF9\x5F\xF8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1E\x00\x1E\x00\x1E\x00\xF8\x11\xF8\x11\x36\x00\x8F\x1C\x00\x00\x00\x00\x00\x00\x0A\x00\x0A\x00\x0A\x00\x23\x08\xD0\x07\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\xF3\x66
Tx (11:10:33.707): \x10\x06

Tx (11:10:33.709): \x10\x02\x00\x00\x0F\x00\x06\x44\xA2\x3C\x0A\x89\x1E\x00\x10\x03\x0A\xDB
Rx (11:10:33.753): \x10\x06
Rx (11:10:33.753): \x10\x02\x00\x00\x4F\x00\x06\x44\x0B\x00\x09\x00\xF8\x11\x7B\x04\x00\x00\x02\x00\x05\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE0\xB1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\xD6\x9F
Tx (11:10:33.755): \x10\x06

Tx (11:10:33.757): \x10\x02\x00\x00\x0F\x00\x07\x44\xA2\x04\x0A\x89\x3C\x00\x10\x03\xA3\xF9
Rx (11:10:33.800): \x10\x06\x10
Rx (11:10:33.800): \x02\x00\x00\x4F\x00\x07\x44\x3C\x00\x05\x00\x10\x03\x09\xB2
Tx (11:10:33.801): \x10\x06

Tx (11:10:33.822): \x10\x02\x00\x00\x0F\x00\x08\x44\xA2\x02\x00\x82\x0A\x00\x10\x03\x98\x44
Rx (11:10:33.834): \x10\x06\x10\x02\x00\x00\x4F\x00\x08\x44\x00\x00\x10\x03\x0B\xF4
Tx (11:10:33.835): \x10\x06

Tx (11:10:33.856): \x10\x02\x00\x00\x0F\x00\x09\x44\xA2\x02\x00\x82\x00\x00\x10\x03\xB5\xD6
Rx (11:10:34.349): \x10\x06\x10\x02\x00\x00\x4F\x00\x09\x44\x02\x00\x10\x03\x97\xF4
Tx (11:10:34.349): \x10\x06

Tx (11:10:34.357): \x10\x02\x00\x00\x0F\x00\x0A\x44\xA2\x02\x03\x85\x1E\x00\x10\x03\x84\x54
Rx (11:10:34.394): \x10\x06\x10
Rx (11:10:34.394): \x02\x00\x00\x4F\x00\x0A\x44\x00\x00\x10\x03\x72\x34
Tx (11:10:34.395): \x10\x06

Tx (11:10:34.407): \x10\x02\x00\x00\x0F\x00\x0B\x44\xA2\x02\x03\x85\x50\x00\x10\x03\xE9\xD3
Rx (11:10:34.440): \x10\x06\x10
Rx (11:10:34.440): \x02\x00\x00\x4F\x00\x0B\x44\x00\x00\x10\x03\x4F\xF4
Tx (11:10:34.441): \x10\x06

Tx (11:10:35.458): \x10\x02\x00\x00\x0F\x00\x0C\x44\xA2\x3C\x07\x89\x00\x00\x10\x03\x39\xBC
Rx (11:10:35.493): \x10\x06
Rx (11:10:35.494): \x10\x02\x00\x00\x4F\x00\x0C\x44\xB8\x8E\x20\x9F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\xED\x21
Tx (11:10:35.495): \x10\x06

Tx (11:10:35.497): \x10\x02\x00\x00\x0F\x00\x0D\x44\xA2\x3C\x07\x89\x1E\x00\x10\x03\x54\x2A
Rx (11:10:35.540): \x10\x06
Rx (11:10:35.540): \x10\x02\x00\x00\x4F\x00\x0D\x44\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x3E\xC7
Tx (11:10:35.542): \x10\x06

Tx (11:10:35.545): \x10\x02\x00\x00\x0F\x00\x0E\x44\xA2\x3C\x07\x89\x3C\x00\x10\x03\xE0\xD0
Rx (11:10:35.587): \x10\x06
Rx (11:10:35.588): \x10\x02\x00\x00\x4F\x00\x0E\x44\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x03\x2A\x7B
Tx (11:10:35.589): \x10\x06

Link to comment
Share on other sites

enq retry is not implemented and I'm not sure why the PLC thinks it needs to send it. In the above monitor you can see that DF acks the response within a few milliseconds. In the monitor that wasn't working in previous posts there is a big delay for the Ack, probably because DF is expecting one more character. A note has been made in the manual. Thanks for mentioning it.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.