shimh Posted February 4, 2009 Share Posted February 4, 2009 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 More sharing options...
AzeoTech Posted February 5, 2009 Share Posted February 5, 2009 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 More sharing options...
shimh Posted February 6, 2009 Author Share Posted February 6, 2009 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 More sharing options...
AzeoTech Posted February 7, 2009 Share Posted February 7, 2009 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 More sharing options...
shimh Posted February 13, 2009 Author Share Posted February 13, 2009 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 More sharing options...
AzeoTech Posted February 13, 2009 Share Posted February 13, 2009 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.