From 23e0b8af560528782f83b381a678cd774dd2e7a5 Mon Sep 17 00:00:00 2001 From: Jonny007-MKD Date: Thu, 12 Jun 2014 07:23:50 +0000 Subject: [PATCH] EilDLL enhancements --- Modbus-DLL/ModbusNet.cfg | 90 +++--- Modbus-DLL/include/CAPL/ModbusClient.cbf | Bin 188303 -> 180880 bytes .../include/CAPL/include/EilDllCommon.cin | 6 +- .../CAPL/include/ModbusClientCommon.cin | 127 +++----- .../CAPL/include/ModbusEilDllClientCommon.cin | 5 +- Modbus-DLL/include/DBC/generated.dbc | 6 +- Modbus-DLL/include/SysVars/generated.vsysvar | 2 +- Modbus-DLL/log.txt | 294 ++++++++++++++++++ 8 files changed, 389 insertions(+), 141 deletions(-) diff --git a/Modbus-DLL/ModbusNet.cfg b/Modbus-DLL/ModbusNet.cfg index 5c8bf72..3e0a90f 100644 --- a/Modbus-DLL/ModbusNet.cfg +++ b/Modbus-DLL/ModbusNet.cfg @@ -1,17 +1,17 @@ -;CANoe Version |4|7|1|38817 ModbusNet +;CANoe Version |4|7|1|55217 ModbusNet Version: 8.2.40 Build 40 32 PRO 10 -APPDIR Vector.CANoe.Debugger.DLL -Vector.CANoe.Debugger, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null -Vector.CANoe.Debugger.DebuggerComponent -1 -1.0.0 APPDIR Vector.CANoe.SignalGenerators.DLL Vector.CANoe.SignalGenerators, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null Vector.CANoe.SignalGenerators.ComponentWrapper -2 +1 1.0.1 +APPDIR Vector.CANoe.Debugger.DLL +Vector.CANoe.Debugger, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.Debugger.DebuggerComponent +2 +1.0.0 VGlobalConfiguration 1 Begin_Of_Object 17 VGlobalParameters 2 Begin_Of_Object @@ -67,6 +67,7 @@ DialogBegin 1 285 569 816 1103 SymbolExplorerDialogBegin + 1 HistoryBegin 1 0 @@ -741,9 +742,9 @@ Begin_Of_Multi_Line_String Copyright (c) 2001-2006 Actipro Software LLC. All rights reserved. http://www.ActiproSoftware.com/Products/DotNet/ ---> 1 "" End_Of_Object VTraceControlCfg 14 VNETTraceControlBox 14 Begin_Of_Object @@ -3553,7 +3551,7 @@ VUniqueBox 16 Begin_Of_Object VBoxRoot 17 Begin_Of_Object 1 1 -1 3 0 1 -1 -1 -1 -1 -15 105 1285 623 +1 2 0 1 -1 -1 -1 -1 22 7 1322 571 1 @@ -3565,14 +3563,14 @@ MDI_DOCK_INFO_END 6 1 0 0 0 0 0 0 1192 514 0 0 1 36756 1904 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 111 442 1 0 0 0 1 281 0 59422 1 END_OF_DOCK_INFO 1 -3 +2 0 0 1 1188 696 END_OF_DESKTOP_DATA 6 -0 1 -1 -1 -1 -1 22 7 1450 571 +0 1 -1 -1 -1 -1 22 7 1322 571 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 END_OF_DOCK_INFO 1 @@ -3580,7 +3578,7 @@ END_OF_DOCK_INFO 0 0 1 -1596 747 +1188 901 END_OF_DESKTOP_DATA END_OF_DESKTOP_DATA_COLLECTION 0 @@ -3889,7 +3887,7 @@ MDI_DOCK_INFO_END 1 6 0 1 -1 -1 -8 -30 -138 106 539 323 -6 1 0 0 0 0 0 0 677 213 0 0 1 8084 1904 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 6 66 1 0 0 0 1 382 0 59420 1 +6 1 0 0 0 0 0 0 677 213 0 0 1 8084 1904 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 6 66 1 0 0 0 1 506 0 59420 1 END_OF_DOCK_INFO 1 2 @@ -3903,7 +3901,7 @@ END_OF_DESKTOP_DATA 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 END_OF_DOCK_INFO 0 --1 +2 0 0 0 @@ -4572,7 +4570,7 @@ MDI_DOCK_INFO_END 1 6 0 1 -1 -1 -8 -30 0 0 890 487 -6 1 0 0 0 0 0 0 890 483 0 0 1 20372 1904 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 347 323 1 0 0 0 1 641 0 59421 1 +6 1 0 0 0 0 0 0 890 483 0 0 1 20372 1904 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 347 323 1 0 0 0 1 648 0 59421 1 END_OF_DOCK_INFO 1 0 @@ -4631,7 +4629,7 @@ End_Of_Object VGrMnBox 3 VDOLocalInfoStruct 3 Begin_Of_Object 3 1 -203 +211 VDAOBus 4 Begin_Of_Object 1 1 @@ -4899,7 +4897,7 @@ VBoxRoot 12 Begin_Of_Object 1 3 1 -1 0 1 -1 -1 -1 -1 35 -12 567 364 -Debugger - Programm: Client_2 [Debugging ausgeschaltet] +Debugger - Client_2 1 MDI_DOCK_INFO_END @@ -5129,7 +5127,7 @@ VSimulinkModelViewerConfiguration 7 Begin_Of_Object End_Of_Object VSimulinkModelViewerConfiguration 7 1 0 -1716208489 +327433878 0 NodeSignalPanelBustypeCount 0 End_Of_Object VSimulationNode 6 @@ -5185,7 +5183,7 @@ END_OF_DESKTOP_DATA 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 END_OF_DOCK_INFO 0 -2 +1 0 0 0 @@ -5388,7 +5386,7 @@ NULL End_Of_Object VDOLocalInfoStruct 3 0.000000 0 0 -1 1 0 59420 1 176 1 2882400001 639 815 319 694 2882400002 0 0 0 0 0 0 1 2882400001 1280 1280 321 321 2882400002 0 0 0 0 0 0 3 +1 1 0 59420 1 176 1 2882400001 632 808 319 694 2882400002 0 0 0 0 0 0 1 2882400001 1280 1280 321 321 2882400002 0 55 0 0 0 0 3 SS_BEGIN_COMMON_INFO 1 0 @@ -5400,7 +5398,7 @@ Ether1 11 1 1 -492214664 1 0 1 0 1 1 0 0 0 2000 1 +487858576 1 0 1 0 1 1 0 105 35 2000 1 SS_BEGIN_COMMON_INFO 1 2 @@ -5427,7 +5425,7 @@ VUniqueBox 3 Begin_Of_Object VBoxRoot 4 Begin_Of_Object 1 3 -0 2 0 1 -1 -1 -8 -30 162 249 890 645 +0 3 0 1 -1 -1 -1 -1 117 403 779 746 Write 1 @@ -5439,14 +5437,14 @@ MDI_DOCK_INFO_END 6 1 1010 180 0 0 300 180 300 180 0 61440 1 12180 1904 0 0 0 0 260 0 0 0 1 5 32767 1 59422 1 5 1011 185 4 6 433 1 10 0 0 1 223 0 59419 1 END_OF_DOCK_INFO 1 -2 +3 0 0 1 1188 901 END_OF_DESKTOP_DATA 6 -0 1 -1 -1 -1 -1 22 272 684 615 +0 1 -1 -1 -1 -1 117 403 779 746 6 0 1010 180 0 0 300 180 300 180 0 61440 1 12181 1904 0 0 0 0 260 1 0 0 -1 -1 32767 0 59422 0 0 0 0 0 0 0 1 10 0 0 1 229 0 59419 1 END_OF_DOCK_INFO 1 @@ -5454,7 +5452,7 @@ END_OF_DOCK_INFO 0 0 1 -1596 747 +1188 901 END_OF_DESKTOP_DATA END_OF_DESKTOP_DATA_COLLECTION 0 @@ -5831,6 +5829,8 @@ FiltersEnd 1 1 + + END_OF_WORKSPACE_MEMBER_DATA END_OF_WORKSPACE_MEMBER 1 @@ -6428,7 +6428,7 @@ END_OF_DESKTOP_DATA 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 END_OF_DOCK_INFO 0 --1 +1 0 0 0 diff --git a/Modbus-DLL/include/CAPL/ModbusClient.cbf b/Modbus-DLL/include/CAPL/ModbusClient.cbf index 064c745d5a887850748a7dade8e137ad6b80d5d1..8a9dcc37e747072cb38c3c06c419e3aaca5843df 100644 GIT binary patch delta 23353 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 literal 188303 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 -void OnModbusReceiveBits(byte buffer[]) +void OnModbusReceiveBits(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResReceiveBits mbres; struct ModbusReqRead mbreq; @@ -78,7 +79,7 @@ void OnModbusReceiveBits(byte buffer[]) byte i, j; memcpy_n2h(mbres, buffer); - memcpy_n2h(mbreq, gQueueAck[mbres.Header.TxID].Buffer); + memcpy_n2h(mbreq, gQueueAck[mbap.TxID].Buffer); writeDbg(MbDebug, "Received %d bits from 0x%04X", mbreq.Count, mbreq.Address); @@ -123,13 +124,13 @@ void ModbusReadRegisters(word address, word count) // 16 bit } /// -void OnModbusReceiveRegisters(byte buffer[]) +void OnModbusReceiveRegisters(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResReceiveRegisters mbres; struct ModbusReqRead mbreq; memcpy_n2h(mbres, buffer); - memcpy_n2h(mbreq, gQueueAck[mbres.Header.TxID].Buffer); + memcpy_n2h(mbreq, gQueueAck[mbap.TxID].Buffer); writeDbg(MbDebug, "Received %d registers from 0x%04X", mbreq.Count, mbreq.Address); @@ -169,7 +170,7 @@ void ModbusWriteBit(word address, byte value) } /// -void OnModbusConfirmBit(byte buffer[]) +void OnModbusConfirmBit(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResConfirmSingle mbc; @@ -210,7 +211,7 @@ void ModbusWriteRegister(word address, int value) } /// -void OnModbusConfirmRegister(byte buffer[]) +void OnModbusConfirmRegister(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResConfirmSingle mbc; @@ -300,7 +301,7 @@ void ModbusWriteBitsB(word address, word count, byte values[]) } /// -void OnModbusConfirmBits(byte buffer[]) +void OnModbusConfirmBits(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResConfirmMultiple mbc; @@ -350,7 +351,7 @@ void ModbusWriteRegisters(word address, word count, word values[]) } /// -void OnModbusConfirmRegisters(byte buffer[]) +void OnModbusConfirmRegisters(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResConfirmMultiple mbc; @@ -391,7 +392,7 @@ void ModbusWriteMasks(word address, word and, word or) } /// -void OnModbusConfirmMasks(byte buffer[]) +void OnModbusConfirmMasks(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResConfirmMasks mbc; @@ -442,13 +443,13 @@ void ModbusReadWriteRegisters(word readAddress, word readCount, word writeAddres } /// -void OnModbusReceiveConfirmRegisters(byte buffer[]) +void OnModbusReceiveConfirmRegisters(struct ModbusApHeader mbap, byte buffer[]) { struct ModbusResReceiveRegisters mbres; struct ModbusReqRead mbreq; memcpy_n2h(mbres, buffer); - memcpy_n2h(mbreq, gQueueAck[mbres.Header.TxID].Buffer); + memcpy_n2h(mbreq, gQueueAck[mbap.TxID].Buffer); writeDbg(MbDebug, "Wrote some registers and received %d registers from 0x%04X", mbreq.Count, mbreq.Address); @@ -470,86 +471,44 @@ void OnModbusReceiveConfirmRegistersException(struct ModbusApHeader mbap, enum M // ------------------------------------------------------------------------------------ // REGION: OnModbusReceive ------------------------------------------------------------ -/// <-OnModbusReceive> -void OnModbusReceive(dword socket, long result, dword address, dword port, byte buffer[], dword size) -{ - writeDbg(ConnDebug, "OnModbusReceive: Received %d bytes", size); - if (result == 0) - { - if (size == 0) - { - // Size of zero indicates that the socket was closed by the communication peer. - writeDbg(ConnWarning, "OnModbusReceive: Socket closed by peer"); - ModbusDisconnect(); - } - else - { - // Sucessfully received some bytes over the TCP/IP connection. - OnModbusReceive2(buffer, size); - } - } - else - { - gIpLastErr = ModbusGetLastConnectionError(gIpLastErrStr); - writeDbg(ConnError, "OnModbusReceive error (%d): %s", gIpLastErr, gIpLastErrStr); - ModbusDisconnect(); - } -} /// <-OnModbusReceive> -void OnModbusReceive2(byte buffer[], dword size) +void OnModbusReceive2(long packet) { struct ModbusApHeader mbap; - int offset; - char str[3*20]; + byte buffer[gMaxPacketLength]; + long size; // packet size in bits + //char str[3*20]; + byte header[__size_of(struct ModbusApHeader)]; - if (size < 8) // No complete Modbus Application Header - return; + size = EthGetThisData(0, gMaxPacketLength, buffer); + EthGetTokenData(packet, "modbus", "header", __size_of(struct ModbusApHeader), header); // TODO: EthGetTokenData does not handle endianness :( ///////////////////////////////////////////////// + memcpy_n2h(mbap, header); - offset = 0; - do - { - writeDbg(ConnDebug, "OnModbusReceive2: Offset pre = %d", offset); - memcpy_n2h(mbap, buffer, offset); - OnModbusReceive2OnePacket(buffer, offset, mbap); - - offset += __offset_of(struct ModbusApHeader, UnitID) + mbap.Length; - writeDbg(ConnDebug, "OnModbusReceive2: offset post = %d. %d <= %d?", offset, offset, size-8); - } - while(offset <= size-8); // We need at least 8 bytes for a new packet - writeDbg(ConnDebug, "OnModbusReceive2: yes. finished"); - - if (offset != size) // Can be removed. - { - bin_to_strhex(buffer, str); - writeDbg(ConnError, "OnModbusReceive2: Error while going through receive buffer. Our final offset is %d, but the size of the buffer is %d! Buffer: %s", offset, size, str); - OnModbusClientPanics(ParsingBuffer); - } + //bin_to_strhex(header, str); + //writeDbg(MbError, "Header: %s", str); + //writeDbg(MbError, "Header Length: 0x%X", mbap.Length); + OnModbusReceive2OnePacket(buffer, size, mbap); } /// <-OnModbusReceive> -void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader mbap) +void OnModbusReceive2OnePacket(byte buffer[], long size, struct ModbusApHeader mbap) { // Test transaction identifier? // Test unit/device identifier? word i; // counter - word length; // length of current packet - byte mbuffer[__size_of(struct ModbusResReceiveRegisters)]; // second buffer where we copy the message. This way the user won't overwrite other packages. - length = __offset_of(struct ModbusApHeader, UnitID) + mbap.Length; - // We cannot check this properly anymore. We have to trust the TCP/UDP stack and the sender... *sigh* + if (mbap.Length-2 != size) + { + writeDbg(ConnError, "OnModbusReceive2OnePAcket: Packet payload length (%d) is different from specified length (%d)!", size, mbap.Length-2); + return; + } + if (mbap.Protocol != 0) // Protocol is not Modbus (0x0000). Wayne. { writeDbg(ConnDebug, "OnModbusReceive2OnePacket: packet is no Modbus packet: Protocol = %d", mbap.Protocol); return; } - if (elCount(buffer) < offset + length) // packet larger than the (rest of the) buffer - { - writeDbg(ConnError, "OnModbusReceive2OnePacket: packet did not fit into Buffer: buffer length = %d, packet length = %d, offset = %d", elCount(buffer), __offset_of(struct ModbusApHeader, UnitID) + mbap.Length, offset); - // I REALLY don't want to assemble the two package fragments. - OnModbusClientPanics(ModbusPackageWasSplit); - return; - } // MBAP Header is OK :) Go on if (!gQueueSent.ContainsKey(mbap.TxID)) // We don't wait for this message! @@ -561,45 +520,41 @@ void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader if (mbap.FuncCode > 0x80) // Oh no, we got a exception! { - OnModbusReceive2Exceptions(buffer[offset+08], mbap); + OnModbusReceive2Exceptions(buffer[0], mbap); gQueueAck.Remove(mbap.TxID); // Remove from acknowledge queue return; } - - // Copy the message - memcpy_off(mbuffer, 0, buffer, offset, length); - // Let's give the PDU to the corresponding function switch (mbap.FuncCode) { case 0x01: case 0x02: - OnModbusReceiveBits(mbuffer); + OnModbusReceiveBits(mbap, buffer); break; case 0x03: case 0x04: - OnModbusReceiveRegisters(mbuffer); + OnModbusReceiveRegisters(mbap, buffer); break; case 0x05: - OnModbusConfirmBit(mbuffer); + OnModbusConfirmBit(mbap, buffer); break; case 0x06: - OnModbusConfirmRegister(mbuffer); + OnModbusConfirmRegister(mbap, buffer); break; case 0x0F: - OnModbusConfirmBits(mbuffer); + OnModbusConfirmBits(mbap, buffer); break; case 0x10: - OnModbusConfirmRegisters(mbuffer); + OnModbusConfirmRegisters(mbap, buffer); break; case 0x16: - OnModbusConfirmMasks(mbuffer); + OnModbusConfirmMasks(mbap, buffer); break; case 0x17: - OnModbusReceiveConfirmRegisters(mbuffer); + OnModbusReceiveConfirmRegisters(mbap, buffer); break; default: writeDbg(MbError, "OnModbusReceive2OnePacket: We received funcCode 0x%X!?", mbap.FuncCode); @@ -744,6 +699,8 @@ on timer gtRobin if (gQueueSent.Size() > 4) // Wago 750-881 cannot handle more than 5 messages at a time :( continue; + EthSetTokenInt(gPacket, "modbus", "TxId", TxID); + EthSetTokenInt(gPacket, "modbus", "FuncCode", gQueuePending[TxID].FuncCode); // if packet was sent or the socket is not currently being opened if (ModbusSnd(gQueuePending[TxID].Buffer, gQueuePending[TxID].Length) == 0 || gSocketState != NULL) { diff --git a/Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin b/Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin index d83c9f8..7026153 100644 --- a/Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin +++ b/Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin @@ -38,8 +38,6 @@ long ModbusGetLastConnectionError(char string[]) void OnEthReceivePacket(long channel, long dir, long packet) { - byte buffer[gMaxPacketLength]; - long size; if (dir == TX) return; @@ -58,7 +56,6 @@ void OnEthReceivePacket(long channel, long dir, long packet) if (EthGetTokenInt(packet, "ipv4", "protocol") == 0x11 && EthGetTokenInt(packet, "ipv4", "source") == gRemoteIP) // if this is a UDP package from our server { - size = EthGetThisData(0, gMaxPacketLength, buffer); - OnModbusReceive(0, 0, EthGetTokenInt(packet, "ipv4", "source"), gRemoteIP, buffer, size); + OnModbusReceive2(packet); } } \ No newline at end of file diff --git a/Modbus-DLL/include/DBC/generated.dbc b/Modbus-DLL/include/DBC/generated.dbc index 93bdfea..c6fa17b 100644 --- a/Modbus-DLL/include/DBC/generated.dbc +++ b/Modbus-DLL/include/DBC/generated.dbc @@ -38,9 +38,9 @@ BU_: Client_2 BO_ 3 ReadRegisters: 8 Vector__XXX -BO_ 16908289 Client_2_RecBits: 1 Vector__XXX - SG_ DI2 : 1|1@1- (1,0) [0|0] "" Client_2 - SG_ DI1 : 0|1@1- (1,0) [0|0] "" Client_2 +BO_ 16908289 Client_2_RecBits: 2 Vector__XXX + SG_ DI2 : 9|1@1+ (1,0) [0|0] "" Client_2 + SG_ DI1 : 8|1@1+ (1,0) [0|0] "" Client_2 BO_ 16908417 Client_2_Ex81: 1 Vector__XXX SG_ ExCode : 0|8@1+ (1,0) [0|4] "" Client_2 diff --git a/Modbus-DLL/include/SysVars/generated.vsysvar b/Modbus-DLL/include/SysVars/generated.vsysvar index 859312d..35cea42 100644 --- a/Modbus-DLL/include/SysVars/generated.vsysvar +++ b/Modbus-DLL/include/SysVars/generated.vsysvar @@ -34,7 +34,7 @@ - + diff --git a/Modbus-DLL/log.txt b/Modbus-DLL/log.txt index 1942e0d..36b0563 100644 --- a/Modbus-DLL/log.txt +++ b/Modbus-DLL/log.txt @@ -1,6 +1,27 @@ Registered Modbus for UDP Initializing Defining fields MyProtocolId = 4896. InitProtocol. +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 00 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 00 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 00 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 00 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 Data = 00 01 00 00 00 06 ff 01 00 00 00 02 @@ -22,3 +43,276 @@ ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 --> byteOffset = 50, byteLength = 2 --> ContentId = 1020001. +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 02 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 02 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 02 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 02 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 03 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 03 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 03 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 03 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 04 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 04 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 04 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 04 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 05 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 05 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 05 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 05 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 06 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 06 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 06 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 06 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 07 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 07 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 07 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 07 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 08 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 08 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 08 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 08 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 09 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 09 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 09 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 09 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0a 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0a 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0a 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0a 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0b 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0b 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0b 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0b 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0c 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0c 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0c 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0c 00 00 00 04 ff 01 01 01 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0d 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0d 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0d 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0d 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0e 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0e 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 0e 00 00 00 06 ff 01 00 00 00 02 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 10 + Data = 00 0e 00 00 00 04 ff 01 01 00 + --> byteOffset = 50, byteLength = 2 + --> ContentId = 1020001. +