From 95304c9216f83575413ceb6637a7386075166ad0 Mon Sep 17 00:00:00 2001 From: Jonny007-MKD Date: Fri, 30 May 2014 15:14:33 +0000 Subject: [PATCH] ParsePacket() works --- Modbus-DLL/ModbusNet.cfg | 269 +++++++------- Modbus-DLL/include/CAPL/ModbusClient.can | 22 +- Modbus-DLL/include/CAPL/ModbusClient.cbf | Bin 182994 -> 188272 bytes .../include/CAPL/include/EilDllCommon.cin | 167 +++++++++ .../CAPL/include/ModbusClientCommon.cin | 21 +- .../CAPL/include/ModbusEilDllClientCommon.cin | 64 ++++ .../CAPL/include/ModbusTcpClientCommon.cin | 44 --- .../CAPL/include/ModbusUdpClientCommon.cin | 44 --- Modbus-DLL/include/CAPL/include/TcpCommon.cin | 204 ----------- Modbus-DLL/include/CAPL/include/UdpCommon.cin | 166 --------- Modbus-DLL/include/DBC/generated.dbc | 13 +- .../ModbusProtocolDLL/Include/IPBPacketAPI.h | 2 +- .../ModbusProtocolDLL/ModbusProtocol.cpp | 331 +++++++++++++++--- .../ModbusProtocolDLL/ModbusProtocol.dll | Bin 30208 -> 75264 bytes .../ModbusProtocolDLL/ModbusProtocol.h | 21 +- .../ModbusProtocolDLL/ModbusProtocol.ilk | Bin 0 -> 1134988 bytes .../ModbusProtocolDLL/ModbusProtocolAddOn.cpp | 6 +- .../ModbusProtocolDLL/ModbusProtocolAddOn.h | 2 + .../ModbusProtocolDLL/ModbusProtocolDLL.cpp | 22 +- Modbus-DLL/include/SysVars/generated.vsysvar | 60 ++-- Modbus-DLL/log.txt | 45 +++ 21 files changed, 803 insertions(+), 700 deletions(-) create mode 100644 Modbus-DLL/include/CAPL/include/EilDllCommon.cin create mode 100644 Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin delete mode 100644 Modbus-DLL/include/CAPL/include/ModbusTcpClientCommon.cin delete mode 100644 Modbus-DLL/include/CAPL/include/ModbusUdpClientCommon.cin delete mode 100644 Modbus-DLL/include/CAPL/include/TcpCommon.cin delete mode 100644 Modbus-DLL/include/CAPL/include/UdpCommon.cin create mode 100644 Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.ilk create mode 100644 Modbus-DLL/log.txt diff --git a/Modbus-DLL/ModbusNet.cfg b/Modbus-DLL/ModbusNet.cfg index 0c78987..ae6f88a 100644 --- a/Modbus-DLL/ModbusNet.cfg +++ b/Modbus-DLL/ModbusNet.cfg @@ -1,17 +1,17 @@ -;CANoe Version |4|7|1|55220 ModbusNet +;CANoe Version |4|7|1|38833 ModbusNet Version: 8.2.40 Build 40 32 PRO 10 -APPDIR Vector.CANoe.SignalGenerators.DLL -Vector.CANoe.SignalGenerators, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null -Vector.CANoe.SignalGenerators.ComponentWrapper -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 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.0.1 VGlobalConfiguration 1 Begin_Of_Object 17 VGlobalParameters 2 Begin_Of_Object @@ -742,15 +742,15 @@ Begin_Of_Multi_Line_String Copyright (c) 2001-2006 Actipro Software LLC. All rights reserved. http://www.ActiproSoftware.com/Products/DotNet/ ---> +fo RootDock="Right" IsAttached="False" /> End_Of_Serialized_Data 3 End_Of_Object VDesktop 3 VDesktop 3 Begin_Of_Object @@ -1596,7 +1596,10 @@ End_Of_Serialized_Data 14 16 0 17 -0 +1 +14 +ver=2: FT +End_Of_Serialized_Data 14 18 0 19 @@ -1611,29 +1614,29 @@ End_Of_Serialized_Data 14 22 1 14 -ver=2: FF +ver=2: FT End_Of_Serialized_Data 14 23 1 14 -ver=2: FF +ver=2: FT End_Of_Serialized_Data 14 24 1 14 -ver=2: FF +ver=2: FT End_Of_Serialized_Data 14 25 0 26 1 14 -ver=2: FF +ver=2: FT End_Of_Serialized_Data 14 27 1 14 -ver=2: FF +ver=2: FT End_Of_Serialized_Data 14 0 2 @@ -3462,7 +3465,7 @@ VTraceControlFixedModeExpansionItems 15 Begin_Of_Object 0 End_Of_Object VTraceControlFixedModeExpansionItems 15 14 -J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus +J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus-DLL End_Of_Serialized_Data 14 14 Trace Window @@ -4599,7 +4602,7 @@ End_Of_Object VGrMnBox 3 VDOLocalInfoStruct 3 Begin_Of_Object 3 1 -195 +199 VDAOBus 4 Begin_Of_Object 1 1 @@ -4621,7 +4624,7 @@ VConfigurationRoot 8 Begin_Of_Object End_Of_Object VConfigurationRoot 8 1 "include\CAPL\ModbusClient.can" 1 -J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus\include\CAPL\ModbusClient.cbf +J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus-DLL\include\CAPL\ModbusClient.cbf Client_2 Modbus 5 @@ -4711,7 +4714,7 @@ End_Of_Object VIPBStackSetting 8 NDebugger::VDebuggerHost 8 Begin_Of_Object 2 0 -26 +27 NDebugger::VFile 9 Begin_Of_Object 1 1 "ModbusTcpCommon.cin" @@ -4842,6 +4845,11 @@ NDebugger::VFile 9 Begin_Of_Object 1 "include\CAPL\include\UdpCommon.cin" 41 End_Of_Object NDebugger::VFile 9 +NDebugger::VFile 9 Begin_Of_Object +1 + 1 "include\CAPL\include\ModbusStructs.cin" +42 +End_Of_Object NDebugger::VFile 9 VNETStandaloneComponent 9 Begin_Of_Object 1 VNETControlBox 10 Begin_Of_Object @@ -5114,7 +5122,7 @@ VBoxRoot 9 Begin_Of_Object 1 3 1 1 1 1 0 166 -8 -30 61 86 1093 577 -Ethernet Packet Builder + 1 MDI_DOCK_INFO_END @@ -5192,11 +5200,105 @@ EOF_MBSSDATA 1 0 1 - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5207,104 +5309,10 @@ EOF_MBSSDATA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + End_Of_Object VSSPlugInConfiguration 6 NULL @@ -5340,7 +5348,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 27 0 1629118104 0 0 3 +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 1437687448 0 0 3 SS_BEGIN_COMMON_INFO 1 0 @@ -5352,7 +5360,7 @@ Ether1 11 1 1 -345965688 1 0 1 0 1 1 0 81 42 2000 1 +504289040 1 0 1 0 1 1 0 81 42 2000 1 SS_BEGIN_COMMON_INFO 1 3 @@ -5463,7 +5471,7 @@ End_Of_Serialized_Data 2 End_Of_Object VWriteBox 2 VWinStore 2 Begin_Of_Object 1 -22 2 3 -32088 -32000 -1 -1 0 0 930 767 +22 2 3 -1 -1 -1 -1 -10088 -10000 -9070 -9233 End_Of_Child_List End_Of_Object VWinStore 2 VWinStore 2 Begin_Of_Object @@ -5488,8 +5496,8 @@ VEthernetFilterConfig 4 Begin_Of_Object End_Of_Object VEthernetFilterConfig 4 VEthernetProtocolConfig 4 Begin_Of_Object 1 -1 1 0 - +1 1 1 +include\ModbusProtocolDLL\ModbusProtocol.dll End_Of_Object VEthernetProtocolConfig 4 VEthernetVnChannelConfig 4 Begin_Of_Object 1 @@ -5783,6 +5791,7 @@ End FiltersEnd 1 1 + END_OF_WORKSPACE_MEMBER_DATA END_OF_WORKSPACE_MEMBER 1 diff --git a/Modbus-DLL/include/CAPL/ModbusClient.can b/Modbus-DLL/include/CAPL/ModbusClient.can index 0b87453..af2bfa7 100644 --- a/Modbus-DLL/include/CAPL/ModbusClient.can +++ b/Modbus-DLL/include/CAPL/ModbusClient.can @@ -2,13 +2,16 @@ includes { - #include "include\ModbusUdpClientCommon.cin" + #include "include\ModbusEilDllClientCommon.cin" #include "include\ModbusFunctions.cin" } variables { msTimer gtRead; + + message Client_2_RecBits rb; + message Client_2_Ex81 ex; } // Get information of local network interface such like ip address @@ -35,8 +38,6 @@ on start //ModbusReadRegisters(0x2033, 63); if (@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputBits > 0) ModbusReadBits(0x200, @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputBits); - if (@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputRegisters > 0) - ModbusReadRegisters(0x200, @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputRegisters); setTimerCyclic(gtRead, 1, @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config::Interval); } @@ -191,7 +192,7 @@ on timer gtRead if (@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputBits > 0) ModbusReadBits(@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputRegisters * 2, @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputBits); } - +/* on sysvar %BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data::OutputBits { word firstBitAddr, count, i; @@ -216,7 +217,7 @@ on sysvar %BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data::OutputRegisters regValues[i] = @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data::OutputRegisters[i]; ModbusWriteRegisters(0x000, count, regValues); -} +}*/ on sysvar %BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config::Interval { @@ -243,4 +244,13 @@ on key '-' for (i = 0; i < @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputBits; i++) @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data::OutputBits[i] = 0; sysEndVariableStructUpdate("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Data", "OutputBits"); -} \ No newline at end of file +} +/* +on message rb +{ + write("Hello! Read Bits =)"); +} +on message ex +{ + write("Oh no, exception!"); +}*/ \ No newline at end of file diff --git a/Modbus-DLL/include/CAPL/ModbusClient.cbf b/Modbus-DLL/include/CAPL/ModbusClient.cbf index 4e5fada8b89c37cb4316cfc2351b4ff9aff2bbb0..bc161f47b9e6ecaee321ebe9153d995ccb89a11c 100644 GIT binary patch delta 22333 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 diff --git a/Modbus-DLL/include/CAPL/include/EilDllCommon.cin b/Modbus-DLL/include/CAPL/include/EilDllCommon.cin new file mode 100644 index 0000000..d999a44 --- /dev/null +++ b/Modbus-DLL/include/CAPL/include/EilDllCommon.cin @@ -0,0 +1,167 @@ +/*@!Encoding:1252*/ +includes +{ + #include "Common.cin" + #include "TcpUdpCommon.cin" +} + +variables +{ + long gPacket; + msTimer gtArp; + + byte gLocalMac[6]; + byte gRemoteMac[6]; + dword gLocalIP = 0xC0A80101; +} + + +word EilConnectTo(char Remote_IP[], word remotePort) +{ + dword remoteIp; + + // Convert IP string to Number + remoteIp = IpGetAddressAsNumber(Remote_IP); + if (remoteIp == ~1) + { + writeDbg(ConnError, "EilConnectTo: invalid server Ip address!"); + OnModbusClientPanics(ConnectionError); + return ipGetLastError(); + } + + return EilConnectTo(remoteIp, remotePort); +} + +word EilConnectTo(dword remoteIp, word remotePort) +{ + long error; + byte broadcastMac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + + if (EthGetMacId(gLocalMac) != 0) + { + gSocketState = ERROR; + error = EthGetLastError(); + writeDbg(ConnError, "EthGetMacId: Could not get local MAC! %d", error); + OnModbusClientPanics(ConnectionError); + return error; + } + + // TCP/IP API gives IP in little endian but EIL uses big endian + gRemotePort = remotePort; + gRemoteIP = (remoteIp >> 24) | (remoteIp >> 8) & 0x0000FF00 | (remoteIp << 8) & 0x00FF0000 | (remoteIp << 24); + + if (gPacket != 0) + ModbusDisconnect(); + // Try to create an ARP packet that gets the MAC from remote server + gPacket = EthInitPacket("arp"); + if (gPacket == 0) + { + gSocketState = ERROR; + error = EthGetLastError(); + writeDbg(ConnError, "EthInitPacket: Could not create ARP package! %d", error); + OnModbusClientPanics(ConnectionError); + return error; + } + + EthSetTokenData(gPacket, "eth", "source" , elCount(gLocalMac), gLocalMac); + EthSetTokenData(gPacket, "eth", "destination" , elCount(broadcastMac), broadcastMac); + EthSetTokenInt(gPacket, "arp", "hwType" , 1); // Ethernet + EthSetTokenInt(gPacket, "arp", "protType" , 0x0800); // IPv4 + EthSetTokenInt(gPacket, "arp", "hwSize" , 6); // Ethernet addr size + EthSetTokenInt(gPacket, "arp", "protSize" , 4); // IP addr size + EthSetTokenInt(gPacket, "arp", "operation" , 1); + EthSetTokenData(gPacket, "arp", "hwSourceAddr" , elCount(gLocalMac), gLocalMac); + EthSetTokenInt(gPacket, "arp", "protSourceAddr" , gLocalIP); + //EthSetTokenData(gPacket, "arp", "hwDestinationAddr" , elCount(gLocalMac), gLocalMac); + EthSetTokenInt(gPacket, "arp", "protDestinationAddr" , gRemoteIP); + + EthReceivePacket("OnEthReceivePacket"); + + EthCompletePacket(gPacket); + EthOutputPacket(gPacket); + EthReleasePacket(gPacket); + gSocketState = NULL; + gtArp.set(@sysvar::Config::Modbus::RequestTimeout); + return 0; +} + +void EilConnectTo2() +{ + gPacket = EthInitPacket("modbus"); + if (gPacket == 0) + { + gSocketState = ERROR; + writeDbg(ConnError, "EthInitPacket: Could not create UDP packet: %d", EthGetLastError()); + OnModbusClientPanics(ConnectionError); + return; + } + + EthSetTokenData(gPacket, "eth", "source" , elCount(gLocalMac), gLocalMac); + EthSetTokenData(gPacket, "eth", "destination" , elCount(gRemoteMac), gRemoteMac); + EthSetTokenInt(gPacket, "ipv4", "source" , gLocalIP); + EthSetTokenInt(gPacket, "ipv4", "destination" , gRemoteIP); + //EthSetTokenInt(gPacket, "udp", "source" , 23456); // we dont need those + //EthSetTokenInt(gPacket, "udp", "destination" , 502); // we do use modbus defaults + + gSocketState = OK; +} + +void EilDisconnect() +{ + if (gPacket != 0) + { + EthReleasePacket(gPacket); + gPacket = 0; + } + gSocketState = CLOSED; +} + + +void EilRecv() +{ +} + +byte EilSnd(byte buffer[], word length) +{ + char str[20*3]; + + switch (gSocketState) + { + case CLOSED: + EilConnectTo(gRemoteIP, gRemotePort); + if (gSocketState != OK) + { + writeDbg(ConnWarning, "EilSnd: Reconnecting failed! Doing nothing."); + return 1; + } + case OK: + break; + default: + writeDbg(ConnWarning, "EilSnd: Socket status is not OK! Doing nothing."); + return 1; + } + + bin_to_strhex(buffer, str); + writeDbg(ConnDebug, "EilSnd: %s (Länge: %d)", str, length); + + EthResizeToken(gPacket, "udp", "data" , length*8); + EthSetTokenData(gPacket, "udp", "data" , length, buffer); + + EthCompletePacket(gPacket); + EthOutputPacket(gPacket); + + return 0; +} + +long EilGetLastConnectionError(char string[]) +{ + EthGetLastErrorText(elCount(string), string); + return EthGetLastError(); +} + +on timer gtArp +{ + gSocketState = ERROR; + writeDbg(ConnError, "No (valid) ARP response detected. The host seems to be offline!"); + OnModbusClientPanics(ConnectionError); +} \ No newline at end of file diff --git a/Modbus-DLL/include/CAPL/include/ModbusClientCommon.cin b/Modbus-DLL/include/CAPL/include/ModbusClientCommon.cin index bcb4074..a81aa5d 100644 --- a/Modbus-DLL/include/CAPL/include/ModbusClientCommon.cin +++ b/Modbus-DLL/include/CAPL/include/ModbusClientCommon.cin @@ -7,7 +7,7 @@ includes variables { - const word gMaxPacketLength = __size_of(struct ModbusReqWriteRegisters); + const word gMaxPacketLength = 259; //__size_of(struct ModbusReqWriteRegisters); msTimer gtRobin; // Timer that sends the packets and watches for timeouts word gTxID = 0x0000; // Transaction Identifier for Modbus. Used as index for gQueue @@ -50,10 +50,7 @@ void ModbusInit() void ModbusMakeHeader(struct ModbusApHeader mbap, word length) { - mbap.TxID = gTxID++; // [2] Transaction ID - mbap.Protocol = 0x0000; // [2] Protocol ID = 0 = Modbus - mbap.Length = length - __offset_of(struct ModbusApHeader, UnitID); // [2] Length; Number of bytes following - mbap.UnitID = 0xFF; // [1] Unit identifier; not relevant + EthSetTokenInt(gPacket, "modbus", "TxId", gTxID++); } @@ -62,21 +59,21 @@ void ModbusMakeHeader(struct ModbusApHeader mbap, word length) /// void ModbusReadBits(word address, word count) { - const byte length = __size_of(struct ModbusReqRead); + const byte length = 12; //__size_of(struct ModbusReqRead); const byte funcCode = 0x01; - byte buffer[length]; + byte buffer[4] = {0x0B, 0x22, 0x00, 0x02}; struct ModbusReqRead mbr; ModbusMakeHeader(mbr.Header, length); // Payload - mbr.Header.FuncCode = funcCode; // [1] Function Code; 1: Read Coils (DI), 2: Read Discret Inputs (DIO), seems to be the same for WAGO 750-881 - mbr.Address = address; // [2] Start address - mbr.Count = count; // [2] Number of items; 1:max 2000=0x7D0 + EthSetTokenInt(gPacket, "modbus", "FuncCode", funcCode); + EthResizeToken(gPacket, "modbus", "data" , 4*8); + EthSetTokenData(gPacket, "modbus", "data" , 4, buffer); writeDbg(MbDebug, "Sending 'Read Bits' (0x01) command. Addr: 0x%04X, Count: %d", address, count); - memcpy_h2n(buffer, mbr); - ModbusSend(buffer, length, mbr.Header.TxID); + EthCompletePacket(gPacket); + EthOutputPacket(gPacket); } /// diff --git a/Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin b/Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin new file mode 100644 index 0000000..d83c9f8 --- /dev/null +++ b/Modbus-DLL/include/CAPL/include/ModbusEilDllClientCommon.cin @@ -0,0 +1,64 @@ +/*@!Encoding:1252*/ + +includes +{ + #include "EilDllCommon.cin" + #include "ModbusClientCommon.cin" +} + +void ModbusConnectTo(char Remote_IP[], word Remote_Port) +{ + EilConnectTo(Remote_IP, Remote_Port); +} + +void ModbusConnectTo(dword Remote_IP, word Remote_Port) +{ + EilConnectTo(Remote_IP, Remote_Port); +} + +byte ModbusSnd(byte buffer[], word length) +{ + return EilSnd(buffer, length); +} + +void ModbusRecv() +{ + EilRecv(); +} + +void ModbusDisconnect() +{ + EilDisconnect(); +} + +long ModbusGetLastConnectionError(char string[]) +{ + return EilGetLastConnectionError(string); +} + +void OnEthReceivePacket(long channel, long dir, long packet) +{ + byte buffer[gMaxPacketLength]; + long size; + + if (dir == TX) + return; + + if (EthGetTokenInt(packet, "arp", "protSourceAddr") == gRemoteIP) // this was our ARP package + { + if (EthGetTokenData(packet, "arp", "hwSourceAddr", elCount(gRemoteMac), gRemoteMac) == 6) + { + gtArp.Cancel(); + writeDbg(ConnDebug, "Remote Mac: %02X:%02X:%02X:%02X:%02X:%02X", gRemoteMac[0], gRemoteMac[1], gRemoteMac[2], gRemoteMac[3], gRemoteMac[4], gRemoteMac[5]); + EilConnectTo2(); // create the UDP package + ModbusStartQueue(); + } + return; + } + + 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); + } +} \ No newline at end of file diff --git a/Modbus-DLL/include/CAPL/include/ModbusTcpClientCommon.cin b/Modbus-DLL/include/CAPL/include/ModbusTcpClientCommon.cin deleted file mode 100644 index cb7ceae..0000000 --- a/Modbus-DLL/include/CAPL/include/ModbusTcpClientCommon.cin +++ /dev/null @@ -1,44 +0,0 @@ -/*@!Encoding:1252*/ - -includes -{ - #include "TcpCommon.cin" - #include "ModbusClientCommon.cin" -} - -void ModbusConnectTo(char Remote_IP[], word Remote_Port) -{ - TcpConnectTo(Remote_IP, Remote_Port); -} - -void ModbusConnectTo(dword Remote_IP, word Remote_Port) -{ - TcpConnectTo(Remote_IP, Remote_Port); -} - -void ModbusDisconnect() -{ - TcpDisconnect(); -} - -byte ModbusSnd(byte buffer[], word length) -{ - return TcpSnd(buffer, length); -} - -void ModbusRecv() -{ - TcpRecv(); -} - -long ModbusGetLastConnectionError(char string[]) -{ - return TcpGetLastConnectionError(string); -} - -void OnTcpReceive(dword socket, long result, dword address, dword port, byte buffer[], dword size) -{ - OnModbusReceive(socket, result, address, port, buffer, size); - if (result == 0 && size != 0) - TcpRecv(); -} \ No newline at end of file diff --git a/Modbus-DLL/include/CAPL/include/ModbusUdpClientCommon.cin b/Modbus-DLL/include/CAPL/include/ModbusUdpClientCommon.cin deleted file mode 100644 index 3c0fd9a..0000000 --- a/Modbus-DLL/include/CAPL/include/ModbusUdpClientCommon.cin +++ /dev/null @@ -1,44 +0,0 @@ -/*@!Encoding:1252*/ - -includes -{ - #include "UdpCommon.cin" - #include "ModbusClientCommon.cin" -} - -void ModbusConnectTo(char Remote_IP[], word Remote_Port) -{ - UdpConnectTo(Remote_IP, Remote_Port); -} - -void ModbusConnectTo(dword Remote_IP, word Remote_Port) -{ - UdpConnectTo(Remote_IP, Remote_Port); -} - -void ModbusDisconnect() -{ - UdpDisconnect(); -} - -byte ModbusSnd(byte buffer[], word length) -{ - return UdpSnd(buffer, length); -} - -void ModbusRecv() -{ - UdpRecv(); -} - -long ModbusGetLastConnectionError(char string[]) -{ - return UdpGetLastConnectionError(string); -} - -void OnUdpReceiveFrom(dword socket, long result, dword address, dword port, byte buffer[], dword size) -{ - OnModbusReceive(socket, result, address, port, buffer, size); - if (result == 0 && size != 0) - UdpRecv(); -} \ No newline at end of file diff --git a/Modbus-DLL/include/CAPL/include/TcpCommon.cin b/Modbus-DLL/include/CAPL/include/TcpCommon.cin deleted file mode 100644 index 857d42b..0000000 --- a/Modbus-DLL/include/CAPL/include/TcpCommon.cin +++ /dev/null @@ -1,204 +0,0 @@ -/*@!Encoding:1252*/ -includes -{ - #include "Common.cin" - #include "TcpUdpCommon.cin" -} - -variables -{ - TcpSocket gSocket; -} - - -word TcpOpenSocket() -{ - byte i; - CHAR errorText[200]; - long error; - - if (EthGetAdapterStatus() != 2) // Not connected - { - writeDbg(ConnError, "TcpOpenSocket: Adapter status not ok: %d!", EthGetAdapterStatus()); - OnModbusClientPanics(ConnectionError); - return INVALID_IP; - } - - // Try to open socket - i = 0; - do - { - gSocket = TcpSocket::Open(0, 0); - error = gSocket.GetLastSocketError(); - if (error != 0) - { - gSocket.GetLastSocketErrorAsString(errorText, elcount(errorText)); - writeDbg(ConnInfo, "TcpOpenSocket: could not open socket: (%d) %s", error, errorText); - } - } - while (error != 0 && i++ < 9); - - if (error != 0) - { - writeDbg(ConnError, "TcpOpenSocket: could not open socket: (%d) %s", error, errorText); - OnModbusClientPanics(ConnectionError); - return error; - } - else - { - writeDbg(ConnInfo, "Tcp socket opened."); - } - return 0; -} - -word TcpConnectTo(char Remote_IP[], word remotePort) -{ - dword remoteIp; - - // Convert IP string to Number - remoteIp = IpGetAddressAsNumber(Remote_IP); - if (remoteIp == INVALID_IP) - { - writeDbg(ConnError, "TcpConnectTo: invalid server Ip address: %s", Remote_IP); - OnModbusClientPanics(ConnectionError); - return 1; - } - - return TcpConnectTo(remoteIp, remotePort); -} - -word TcpConnectTo(dword remoteIp, word remotePort) -{ - long fehler; - - // Try to open a socket - fehler = TcpOpenSocket(); - if (fehler != 0) - { - gSocketState = ERROR; - return fehler; - } - - gRemoteIP = remoteIp; - gRemotePort = remotePort; - - - // Connect to Server - if (gSocket.Connect(remoteIp, remotePort) != 0) - { - fehler = gSocket.GetLastSocketError(); - - if (fehler != WSAEWOULDBLOCK) // OnTcpConnect will be called otherwise - { - writeDbg(ConnError, "TcpConnectTo: No connection established: %d", fehler); - gSocketState = ERROR; - OnModbusClientPanics(ConnectionError); - return fehler; - } - return 0; - } - else - { - writeDbg(ConnInfo, "TcpConnectTo: Successfully connected to server"); - gSocketState = OK; - return 0; - } -} - -void OnTcpConnect(dword socket, long result) -{ - if (result != 0) - { - gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); - writeDbg(ConnError, "OnTcpConnect: (%d) %s", gSocket.GetLastSocketError(), gIpLastErrStr); - gSocketState = ERROR; - OnModbusClientPanics(ConnectionError); - return; - } - else - { - writeDbg(ConnInfo, "OnTcpConnect: Successfully connected to server"); - gSocketState = OK; - ModbusStartQueue(); - } -} - -void TcpDisconnect() -{ - gSocket.Close(); - gSocketState = CLOSED; -} - -void TcpRecv() -{ - int result; - - if (gSocketState != OK) - { - writeDbg(ConnWarning, "TcpRecv: Socket status is not OK! Doing nothing."); - OnModbusClientPanics(ConnectionError); - return; - } - - result = gSocket.Receive(gRxBuffer, elcount(gRxBuffer)); - - if (result != 0) // Calling OnTcpReceive otherwise - { - gIpLastErr = gSocket.GetLastSocketError(); - - if (gIpLastErr != WSA_IO_PENDING) // Calling OnTcpReceive otherwise - { - gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); - writeDbg(ConnError, "TcpReceive: (%d) %s", gIpLastErr, gIpLastErrStr); - TcpDisconnect(); - } - } - - return; -} - -word TcpSnd(byte buffer[], word length) -{ - char str[20*3]; - - switch (gSocketState) - { - case CLOSED: - TcpConnectTo(gRemoteIP, gRemotePort); - if (gSocketState != OK) - { - writeDbg(ConnError, "TcpSnd: Reconnecting failed!"); - OnModbusClientPanics(ConnectionError); - return 1; - } - case OK: - break; - default: - writeDbg(ConnError, "TcpSnd: Socket status is not OK! Doing nothing."); - OnModbusClientPanics(ConnectionError); - return 1; - } - - bin_to_strhex(buffer, str); - writeDbg(ConnDebug, "TcpSnd: %s (Länge: %d)", str, length); - - if (gSocket.Send(buffer, length) != 0) - { - gIpLastErr = gSocket.GetLastSocketError(); - - if (gIpLastErr != WSA_IO_PENDING) - { - gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); - writeDbg(ConnError, "TcpSnd: (%d) %s", gIpLastErr, gIpLastErrStr); - TcpDisconnect(); - return 1; - } - } - return 0; -} - -long TcpGetLastConnectionError(char string[]) -{ - gSocket.GetLastSocketErrorAsString(string, elCount(string)); - return gSocket.GetLastSocketError(); -} \ No newline at end of file diff --git a/Modbus-DLL/include/CAPL/include/UdpCommon.cin b/Modbus-DLL/include/CAPL/include/UdpCommon.cin deleted file mode 100644 index 712f545..0000000 --- a/Modbus-DLL/include/CAPL/include/UdpCommon.cin +++ /dev/null @@ -1,166 +0,0 @@ -/*@!Encoding:1252*/ -includes -{ - #include "Common.cin" - #include "TcpUdpCommon.cin" -} - -variables -{ - UdpSocket gSocket; -} - - -word UdpOpenSocket() -{ - byte i; - char errorText[200]; - long error; - - if (EthGetAdapterStatus() != 2) // Not connected - { - writeDbg(ConnError, "UdpOpenSocket: Adapter status not ok: %d!", EthGetAdapterStatus()); - OnModbusClientPanics(ConnectionError); - return INVALID_IP; - } - - // Try to open socket - i = 0; - do - { - gSocket = UdpSocket::Open(0, 0); - error = gSocket.GetLastSocketError(); - if (error != 0) - { - gSocket.GetLastSocketErrorAsString(errorText, elcount(errorText)); - writeDbg(ConnInfo, "UdpOpenSocket: could not open socket: (%d) %s", error, errorText); - } - } - while (error != 0 && i++ < 9); - - if (error != 0) - { - writeDbg(ConnError, "UdpOpenSocket: could not open socket: (%d) %s", error, errorText); - OnModbusClientPanics(ConnectionError); - return error; - } - else - { - writeDbg(ConnInfo, "Udp socket opened."); - } - return 0; -} - -word UdpConnectTo(char Remote_IP[], word remotePort) -{ - dword remoteIp; - - // Convert IP string to Number - remoteIp = IpGetAddressAsNumber(Remote_IP); - if (remoteIp == INVALID_IP) - { - writeDbg(ConnError, "UdpConnectTo: invalid server Ip address: %s", Remote_IP); - OnModbusClientPanics(ConnectionError); - return 1; - } - - return UdpConnectTo(remoteIp, remotePort); -} - -word UdpConnectTo(dword remoteIp, word remotePort) -{ - long fehler; - - // Try to open a socket - fehler = UdpOpenSocket(); - if (fehler != 0) - { - gSocketState = ERROR; - return fehler; - } - - gRemoteIP = remoteIp; - gRemotePort = remotePort; - gSocketState = OK; - return 0; -} - -void UdpDisconnect() -{ - gSocket.Close(); - gSocketState = CLOSED; -} - -void UdpRecv() -{ - int result; - - if (gSocketState != OK) - { - writeDbg(ConnError, "UdpRecv: Socket status is not OK! Doing nothing."); - OnModbusClientPanics(ConnectionError); - return; - } - - result = gSocket.ReceiveFrom(gRxBuffer, elCount(gRxBuffer)); - - if (result != 0) // Calling OnUdpReceive otherwise - { - gIpLastErr = gSocket.GetLastSocketError(); - - if (gIpLastErr != WSA_IO_PENDING) // Calling OnUdpReceive otherwise - { - gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elCount(gIpLastErrStr)); - writeDbg(ConnError, "UdpReceiveFrom: (%d) %s", gIpLastErr, gIpLastErrStr); - UdpDisconnect(); - } - } - - return; -} - -byte UdpSnd(byte buffer[], word length) -{ - char str[20*3]; - - switch (gSocketState) - { - case CLOSED: - UdpConnectTo(gRemoteIP, gRemotePort); - if (gSocketState != OK) - { - writeDbg(ConnError, "UdpSnd: Reconnecting failed!"); - OnModbusClientPanics(ConnectionError); - return 1; - } - case OK: - break; - default: - writeDbg(ConnError, "UdpSnd: Socket status is not OK! Doing nothing."); - OnModbusClientPanics(ConnectionError); - return 1; - } - - bin_to_strhex(buffer, str); - writeDbg(ConnDebug, "UdpSnd: %s (Länge: %d)", str, length); - - if (gSocket.SendTo(gRemoteIP, gRemotePort, buffer, length) != 0) - { - gIpLastErr = gSocket.GetLastSocketError(); - - if (gIpLastErr != WSA_IO_PENDING) - { - gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); - writeDbg(ConnError, "UdpSnd error (%d): %s", gIpLastErr, gIpLastErrStr); - UdpDisconnect(); - return 1; - } - } - return 0; -} - -long UdpGetLastConnectionError(char string[]) -{ - gSocket.GetLastSocketErrorAsString(string, elCount(string)); - return gSocket.GetLastSocketError(); -} \ No newline at end of file diff --git a/Modbus-DLL/include/DBC/generated.dbc b/Modbus-DLL/include/DBC/generated.dbc index fdbed98..93bdfea 100644 --- a/Modbus-DLL/include/DBC/generated.dbc +++ b/Modbus-DLL/include/DBC/generated.dbc @@ -1,7 +1,7 @@ VERSION "" -NS_ : +NS_ : NS_DESC_ CM_ BA_DEF_ @@ -36,6 +36,16 @@ BS_: 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_ 16908417 Client_2_Ex81: 1 Vector__XXX + SG_ ExCode : 0|8@1+ (1,0) [0|4] "" Client_2 + + BA_DEF_ BU_ "NodeLayerModules" STRING ; BA_DEF_ "DBName" STRING ; @@ -45,3 +55,4 @@ BA_DEF_DEF_ "DBName" ""; BA_DEF_DEF_ "BusType" "Ethernet"; BA_ "BusType" "Ethernet"; BA_ "DBName" "Modbus"; + diff --git a/Modbus-DLL/include/ModbusProtocolDLL/Include/IPBPacketAPI.h b/Modbus-DLL/include/ModbusProtocolDLL/Include/IPBPacketAPI.h index 1bc7c6c..81aa1c9 100644 --- a/Modbus-DLL/include/ModbusProtocolDLL/Include/IPBPacketAPI.h +++ b/Modbus-DLL/include/ModbusProtocolDLL/Include/IPBPacketAPI.h @@ -1010,7 +1010,7 @@ namespace NIPB \param protocolToken Points the the VProtocolToken for the protocol. \param tokenId The identifier of the requested token. - \param token Points to a VToken, which must be fille by this function. + \param token Points to a VToken, which must be filled by this function. */ VDECL GetToken( const VProtocolToken /*in*/ *protocolToken, VTokenId /*in*/ tokenId, VToken /*out*/ *token ) = 0; diff --git a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.cpp b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.cpp index ad03a20..49bb0ab 100644 --- a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.cpp +++ b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.cpp @@ -8,6 +8,9 @@ #include "StdAfx.h" #include "ModbusProtocol.h" +#include +#include +#include //////////////////////////////////////////////////////////////////////// // @@ -22,11 +25,11 @@ */ ModbusProtocol::ModbusProtocol() : mProtocolId( NIPB::kNil ), - mTxId(0), - mProtType(0), - mLength(0), - mUnitId(0), - mFuncCode(0) + mTxId( NIPB::kNil ), + mProtType( NIPB::kNil ), + mLength( NIPB::kNil ), + mUnitId( NIPB::kNil ), + mFuncCode( NIPB::kNil ) { } @@ -48,22 +51,37 @@ ModbusProtocol::ModbusProtocol() : */ VDEF ModbusProtocol::Initialize( NIPB::IProtocolManager /*in*/ *protocolManager, NIPB::INetworkModel /*in*/ *networkModel, NIPB::INetworkModelCreator /*in*/ *modelCreator ) { + if (!log.is_open()) + log.open("log.txt", std::ofstream::out | std::ofstream::app); + log << "Initializing"; + if (protocolManager == 0) return NIPB::kInvalidArg; if (networkModel == 0) return NIPB::kInvalidArg; if (modelCreator == 0) return NIPB::kInvalidArg; - mProtocolManager = protocolManager; - - NIPB::ITokenDefinitionCreator *protocol = 0; - if (modelCreator->DefineProtocol( "modbus", &mProtocolId, &protocol ) == NIPB::kOK) + if (mProtocolId == NIPB::kNil) { - modelCreator->DefineProtocolField( protocol, "TxId", &mTxId, 0 ); - modelCreator->DefineProtocolField( protocol, "Protocol", &mProtType, 0 ); - modelCreator->DefineProtocolField( protocol, "Length", &mLength, 0 ); - modelCreator->DefineProtocolField( protocol, "UnitId", &mUnitId, 0 ); - modelCreator->DefineProtocolField( protocol, "FuncCode", &mFuncCode, 0 ); - } + mProtocolManager = protocolManager; + NIPB::ITokenDefinitionCreator *protocol = 0; + if (modelCreator->DefineProtocol( "modbus", &mProtocolId, &protocol ) == NIPB::kOK) + { + log << " Defining fields"; + modelCreator->DefineProtocolField( protocol, "TxId", &mTxId, 0 ); + modelCreator->DefineProtocolField( protocol, "Protocol", &mProtType, 0 ); + modelCreator->DefineProtocolField( protocol, "Length", &mLength, 0 ); + modelCreator->DefineProtocolField( protocol, "UnitId", &mUnitId, 0 ); + modelCreator->DefineProtocolField( protocol, "FuncCode", &mFuncCode, 0 ); + } + log << " MyProtocolId = " << int(mProtocolId); + } + else + { + log << " not :) "; + } + + log << ".\n"; + log.flush(); return NIPB::kOK; } @@ -75,7 +93,6 @@ VDEF ModbusProtocol::Initialize( NIPB::IProtocolManager /*in*/ *protocolManager, */ VDEF ModbusProtocol::Deinitialize( NIPB::IProtocolManager /*in*/ * /*protocolManager*/, NIPB::INetworkModel /*in*/ * /*networkModel*/ ) { - mProtocolId = 0; return NIPB::kOK; } @@ -89,12 +106,15 @@ VDEF ModbusProtocol::Deinitialize( NIPB::IProtocolManager /*in*/ * /*protocolMan */ VDEF ModbusProtocol::GetDesignator( unsigned long /*in*/ bufferSize, char /*out**/ *buffer ) { + log << "GetDesignator"; if (bufferSize == 0) return NIPB::kInvalidArg; if (buffer == 0) return NIPB::kInvalidArg; if (bufferSize < strlen("modbus")) return NIPB::kInvalidArg; strcpy_s( buffer, bufferSize, "modbus" ); - + + log << ".\n"; + log.flush(); return NIPB::kOK; } @@ -128,12 +148,9 @@ VDEF ModbusProtocol::GetEncoder( NIPB::VTokenId /*in*/ tokenId, NIPB::IEncoder / if ( tokenId == mTxId || tokenId == mProtType - || tokenId == mLength) - { - return mProtocolManager->GetEncoder( NIPB::kEncoderUnsignedLE, encoder ); - } - else if ( tokenId == mUnitId - || tokenId == mFuncCode) + || tokenId == mLength + || tokenId == mUnitId + || tokenId == mFuncCode) { return mProtocolManager->GetEncoder( NIPB::kEncoderUnsignedBE, encoder ); } @@ -155,6 +172,7 @@ VDEF ModbusProtocol::GetEncoder( NIPB::VTokenId /*in*/ tokenId, NIPB::IEncoder / */ VDEF ModbusProtocol::InitProtocol( NIPB::IPacket /*in*/ *packet, NIPB::VTokenId /*in*/ /*protocolTypeId*/, const NIPB::VProtocolToken /*in*/ * /*topProtocolToken*/, NIPB::VProtocolToken /*out*/ *modbus ) { + log << "InitProtocol"; if (mProtocolManager == 0) return NIPB::kInternalError; if (packet == 0) return NIPB::kInvalidArg; @@ -190,8 +208,8 @@ VDEF ModbusProtocol::InitProtocol( NIPB::IPacket /*in*/ *packet, NIPB::VTokenId return result; } - this->SetTokenUnsigned( udp, NIPB::kUDPSource , 2, 40002 ); // Set source port - this->SetTokenUnsigned( udp, NIPB::kUDPDestination, 2, 502 ); // Set destination port + this->SetTokenUnsigned( udp, NIPB::kUDPSource, 2, kClientPort ); // Set source port + this->SetTokenUnsigned( udp, NIPB::kUDPDestination, 2, kServerPort ); // Set destination port // // Init Modbus protocol @@ -212,7 +230,9 @@ VDEF ModbusProtocol::InitProtocol( NIPB::IPacket /*in*/ *packet, NIPB::VTokenId this->SetTokenUnsigned( *modbus, mUnitId, 1, 0xFF ); // Set some UnitID (unused) this->SetTokenUnsigned( *modbus, mFuncCode, 1, 0x00 ); // Set some invalid FuncCode } - + + log << ".\n"; + log.flush(); return result; } @@ -226,13 +246,18 @@ VDEF ModbusProtocol::InitProtocol( NIPB::IPacket /*in*/ *packet, NIPB::VTokenId */ VDEF ModbusProtocol::CompleteProtocol( NIPB::IPacket /*in*/ *packet, const NIPB::VProtocolToken /*in*/ *modbus ) { + log << "CompleteProtocol"; if (packet == 0) return NIPB::kInvalidArg; if (modbus == 0) return NIPB::kInvalidArg; if (modbus->tokenId != mProtocolId) return NIPB::kError; - WORD lengthByte; - lengthByte = (WORD)BI2BY(modbus->bitLength - kHeaderBitLength + 16); // add UnitID and FuncCode to length although they are header - this->SetTokenUnsigned( *(NIPB::VProtocolToken*)modbus, mLength, 2, lengthByte ); // Set the correct length + log << ": Modbus->bitLength = " << std::dec << modbus->bitLength << ", "; + WORD lengthBy = (WORD)BI2BY(modbus->bitLength); // this is the length of the payload + lengthBy += 2; // these are the UnitID and FuncCode fields + this->SetTokenUnsigned( *(NIPB::VProtocolToken*)modbus, mLength, 2, lengthBy ); // Set the correct length + + log << " --> Length = " << std::dec << int(lengthBy) << ".\n"; + log.flush(); return NIPB::kOK; } @@ -250,25 +275,36 @@ VDEF ModbusProtocol::CompleteProtocol( NIPB::IPacket /*in*/ *packet, const NIPB: */ VDEF ModbusProtocol::ParsePacket( NIPB::IPacket /*in*/ *packet, const NIPB::VProtocolToken /*in*/ *topProtocolToken, NIPB::IFormatter /*in*/ * /*errorWriter*/, NIPB::VTokenId /*out*/ *nextProcotolId, NIPB::VProtocolToken /*out*/ *protocolToken ) { - if (packet == 0 ) return NIPB::kInvalidArg; - if (nextProcotolId == 0 ) return NIPB::kInvalidArg; - if (protocolToken == 0 ) return NIPB::kInvalidArg; - if (topProtocolToken == 0 ) return NIPB::kInvalidArg; - if (topProtocolToken->tokenId != NIPB::kUDP) return NIPB::kInvalidArg; + log << "ParsePacket topProtocolToken->tokenId = " << topProtocolToken->tokenId; + if (packet == 0 ) return NIPB::kInvalidArg; + if (nextProcotolId == 0 ) return NIPB::kInvalidArg; + if (protocolToken == 0 ) return NIPB::kInvalidArg; + if (topProtocolToken->tokenId != NIPB::kUDP ) return NIPB::kInvalidArg; NIPB::VResult result = NIPB::kError; const BYTE *packetData = 0; ULONG packetLength = 0; NIPB::VProtocols *protocols = 0; - if ( ((result = packet->GetDataSize( &packetLength )) != NIPB::kOK) - || ((result = packet->GetDataPtr ( (void**)&packetData )) != NIPB::kOK) - || ((result = packet->GetProtocols( &protocols )) != NIPB::kOK) ) - return result; + if ( ((result = packet->GetDataSize( &packetLength )) != NIPB::kOK) // get packet + || ((result = packet->GetDataPtr ( (void**)&packetData )) != NIPB::kOK) + || ((result = packet->GetProtocols( &protocols )) != NIPB::kOK) ) + return result; - if (topProtocolToken->bitLength <= kHeaderBitLength) + if (topProtocolToken->bitLength <= kHeaderBitLength) // packet is too short return NIPB::kPacketParseError; + if ((WORD)packetData[BI2BY(topProtocolToken->bitOffset) + 2] != 0x0000) // no Modbus protocol. Caution! BE/LE + return NIPB::kPacketParseError; + + + log << " byteOffset = " << BI2BY(topProtocolToken->bitOffset) << ", byteLength = " << BI2BY(topProtocolToken->bitLength) << std::endl; + log << " Data = "; + for (ULONG i = BI2BY(topProtocolToken->bitOffset); i < BI2BY(topProtocolToken->bitOffset+topProtocolToken->bitLength); i++) + log << std::hex << std::setw(2) << std::setfill('0') << int(packetData[i]) << " "; + log << std::dec << std::endl; + log.flush(); + protocolToken->tokenId = mProtocolId; protocolToken->protocol = this; protocolToken->packet = packet; @@ -278,8 +314,13 @@ VDEF ModbusProtocol::ParsePacket( NIPB::IPacket /*in*/ *packet, const NIPB::VPro protocolToken->bitLength = topProtocolToken->bitLength - kHeaderBitLength; // don't add UnitID and FuncCode here protocols->contentId = this->GetContentId( packetData, packetLength, *protocolToken ); + log << " --> byteOffset = " << BI2BY(protocolToken->bitOffset) << ", byteLength = " << BI2BY(protocolToken->bitLength) << std::endl; + log << " --> ContentId = " << std::hex << protocols->contentId << std::dec; *nextProcotolId = 0; + + log << ".\n\n"; + log.flush(); return NIPB::kOK; } @@ -290,14 +331,14 @@ VDEF ModbusProtocol::ParsePacket( NIPB::IPacket /*in*/ *packet, const NIPB::VPro \param protocolToken Points the the VProtocolToken for the protocol. \param tokenId The identifier of the requested token. - \param token Points to a VToken, which must be fille by this function. + \param token Points to a VToken, which must be filled by this function. */ VDEF ModbusProtocol::GetToken( const NIPB::VProtocolToken /*in*/ *protocolToken, NIPB::VTokenId /*in*/ tokenId, NIPB::VToken /*out*/ *token ) { if (token == 0) return NIPB::kInvalidArg; if (protocolToken == 0) return NIPB::kInvalidArg; if (protocolToken->tokenId != mProtocolId) return NIPB::kTokenNotFound; - + if (tokenId == mTxId) return MakeHeaderToken( protocolToken, mTxId, 0, 16, token ); else if (tokenId == mProtType) @@ -337,7 +378,7 @@ VDEF ModbusProtocol::InspectProtocol ( const NIPB::VProtocolToken /*in*/ *protoc ULONG packetLength = 0; if ( ((result = protocolToken->packet->GetDataSize( &packetLength )) != NIPB::kOK) - || ((result = protocolToken->packet->GetDataPtr ( (void**)&packetData )) != NIPB::kOK) ) + || ((result = protocolToken->packet->GetDataPtr ( (void**)&packetData )) != NIPB::kOK) ) return result; if (inspector->BeginToken( mProtocolId, 0, 0) != NIPB::kOK) @@ -349,29 +390,109 @@ VDEF ModbusProtocol::InspectProtocol ( const NIPB::VProtocolToken /*in*/ *protoc // TODO: Make InspectProtocol nice and smooth switch(type) { - // Protocol Info column + // Protocol Info column case NIPB::kInspectionInfoColumn: if (inspector->SelectField( NIPB::kFieldLabel, &formatter ) == NIPB::kOK) - formatter->FormatString( "ModbusInfo" ); + { + formatter->FormatString( "MB: [" ); - // Source port - val = GetContentId( packetData, packetLength, *protocolToken ); - FormatUnsigned( inspector, "TxIDInfo", mTxId, val, 2 ); + val = GetTxId( packetData, packetLength, *protocolToken ); + formatter->FormatUnsigned(val, 2, 10); + + formatter->FormatString( "] " ); + + val = GetFuncCode( packetData, packetLength, *protocolToken ); + if (val > 0x80) + { + formatter->FormatString( "(0x" ); + formatter->FormatUnsigned( val & 0x0F, 1, 16 ); + + val = GetExCode( packetData, packetLength, *protocolToken ); + formatter->FormatString( ") Ex 0x" ); + formatter->FormatUnsigned( val, 1, 16); + switch (val) // exCode + { + case 0x01: + formatter->FormatString( ": Illegal func code!" ); + formatter->FormatUnsigned( GetFuncCode( packetData, packetLength, *protocolToken ), 1, 16 ); + break; + case 0x02: + formatter->FormatString( ": Illegal data address!" ); + break; + case 0x03: + formatter->FormatString( ": Illegal data value!" ); + break; + case 0x04: + formatter->FormatString( ": Server failure!" ); + break; + case 0x05: + formatter->FormatString( ": Acknowledge!" ); + break; + case 0x06: + formatter->FormatString( ": Server busy!" ); + break; + case 0x0A: + case 0x0B: + formatter->FormatString( ": Gateway problem!" ); + break; + default: + formatter->FormatString( "!" ); + break; + } + } + else + { + switch (val) // funcCode + { + case 0x01: + case 0x02: + formatter->FormatString( "Read bits" ); + break; + case 0x03: + case 0x04: + formatter->FormatString( "Read regs" ); + break; + case 0x05: + formatter->FormatString( "Write bit" ); + break; + case 0x06: + formatter->FormatString( "Write reg" ); + break; + case 0x0F: + formatter->FormatString( "Write bits" ); + break; + case 0x10: + formatter->FormatString( "Write regs" ); + break; + case 0x16: + formatter->FormatString( "Write masks" ); + break; + case 0x17: + formatter->FormatString( "Read&Write regs" ); + break; + default: + formatter->FormatString( "[0x" ); + formatter->FormatUnsigned(val, 1, 16); + formatter->FormatString( "]" ); + break; + } + } + } break; - // - // Detail View - // + // + // Detail View + // case NIPB::kInspectionDetailTree: if (inspector->SelectField( NIPB::kFieldLabel, &formatter ) == NIPB::kOK) formatter->FormatString( "ModbusDetail" ); - // Source port val = GetContentId( packetData, packetLength, *protocolToken ); FormatUnsigned( inspector, "TxIDDetail", mTxId, val, 2 ); break; } inspector->EndToken(); + return result; } @@ -385,11 +506,76 @@ VDEF ModbusProtocol::InspectProtocol ( const NIPB::VProtocolToken /*in*/ *protoc */ ULONG ModbusProtocol::GetContentId( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ) { - ULONG offset = BI2BY(protocol.headerBitOffset); + ULONG ip = GetIp( packetData, packetLength, protocol ); + BYTE funcCode = GetFuncCode( packetData, packetLength, protocol ); - if (offset+4 < packetLength) + return ((ip << 16) & 0xFFFF0000) | funcCode; +} + +/*--------------------------------------------------------------------*/ +//! Returns the TxID +/*! +*/ +WORD ModbusProtocol::GetTxId( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ) +{ + ULONG offset = BI2BY(protocol.headerBitOffset); + + if (offset+1 < packetLength) + return packetData[offset] << 8 | packetData[offset+1]; // BE/LE + else + return 0; +} + +/*--------------------------------------------------------------------*/ +//! Returns the FuncCode +/*! +*/ +BYTE ModbusProtocol::GetFuncCode( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ) +{ + ULONG offset = BI2BY(protocol.headerBitOffset) + 7; + + if (offset+1 < packetLength) { - return *((ULONG*)&packetData[offset]); + return packetData[offset]; + } + else + { + return 0; + } +} + +/*--------------------------------------------------------------------*/ +//! Returns the DestinationIP +/*! +*/ +ULONG ModbusProtocol::GetIp( const BYTE * /*packetData*/, ULONG /*packetLength*/, const NIPB::VProtocolToken &/*protocol*/ ) +{ + // TODO: GetDestIp + /*NIPB::VToken *ipv4DestIp; + + if (NIPB::GetToken(NIPB::kIPv4, NIPB::kIPv4Destination, ipv4DestIp) != NIPB::kOK) + return 0; + + return ipv4DestIp->bitOffset + + if (offset+2 < packetLength) + { + return *((WORD*)&packetData[offset]); + } + else + { + return 0; + }*/ + return 0xC0A80102; +} + +BYTE ModbusProtocol::GetExCode( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ) +{ + ULONG offset = BI2BY(protocol.bitOffset); + + if (offset+1 < packetLength) + { + return packetData[offset]; } else { @@ -433,6 +619,28 @@ NIPB::VResult ModbusProtocol::MakePayloadToken( const NIPB::VProtocolToken /*in* return NIPB::kOK; } +/*--------------------------------------------------------------------*/ +//! Format a unsigned token. +/*! +*/ +void ModbusProtocol::FormatUnsigned( NIPB::IPacketInspector *inspector, LPCTSTR labelPre, NIPB::VTokenId tokenId, LPCTSTR labelPost, ULONG value, ULONG valueLength ) +{ + if ((inspector) && (inspector->BeginToken( tokenId, 0, 0) == NIPB::kOK)) + { + NIPB::IFormatter *formatter = 0; + + if (inspector->SelectField( NIPB::kFieldLabel, &formatter ) == NIPB::kOK) + formatter->FormatString( labelPre ); + + if (inspector->SelectField( NIPB::kFieldValue, &formatter ) == NIPB::kOK) + formatter->FormatUnsigned( value, valueLength, 0 ); + + if (inspector->SelectField( NIPB::kFieldLabel, &formatter ) == NIPB::kOK) + formatter->FormatString( labelPost ); + + inspector->EndToken(); + } +} /*--------------------------------------------------------------------*/ //! Format a unsigned token. /*! @@ -453,6 +661,21 @@ void ModbusProtocol::FormatUnsigned( NIPB::IPacketInspector *inspector, LPCTSTR } } +/*--------------------------------------------------------------------*/ +//! Format a string. +/*! +*/ +void ModbusProtocol::FormatString( NIPB::IPacketInspector *inspector, LPCTSTR text ) +{ + if (inspector) + { + NIPB::IFormatter *formatter = 0; + + if (inspector->SelectField( NIPB::kFieldLabel, &formatter ) == NIPB::kOK) + formatter->FormatString( text ); + } +} + /*--------------------------------------------------------------------*/ //! Set the value of a unsigned token. /*! diff --git a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.dll b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.dll index dd887d4b38efeb33601ff7d8228dbd0032a71b44..b8182f56e13f3899e71707a39b7a182774145061 100644 GIT binary patch literal 75264 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

hfnYXPO|H+z;lF0`pFeZ{x%8nw=M7( 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 bdl2;V+N4ZPW(DXyOmY+Zi*evz;K2U_>dx)w delta 6858 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 H>$(2{3q%;! diff --git a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.h b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.h index a0a0276..8ff2ecd 100644 --- a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.h +++ b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.h @@ -1,5 +1,5 @@ /*------------------------------------------------------------------- - VCSignalProtocol.h + ModbusProtocol.h ------------------------------------------------------------------- (c) Vector Informatik GmbH. All rights reserved. @@ -8,6 +8,8 @@ #pragma once +#include + //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// @@ -18,7 +20,7 @@ Modbus protocol The protocol is located within a UDP protocol and uses the UDP - ports 40002 and 502. The first 8 Bytes of the UDP payload + ports 50002 and 502. The first 8 Bytes of the UDP payload contain the header: [0,2] Transaction ID [2,2] Protocol ID (Modbus := 0x0000) @@ -29,8 +31,12 @@ class ModbusProtocol : public NIPB::IProtocol { +private: static const ULONG kHeaderLength = 8; // see above static const ULONG kHeaderBitLength = kHeaderLength*8; +public: + static const WORD kClientPort = 502; + static const WORD kServerPort = 502; // // Construction @@ -135,11 +141,17 @@ public: // Methods // public: - ULONG GetContentId( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ); + ULONG GetContentId( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ); + WORD GetTxId( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ); + ULONG GetIp( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ); + BYTE GetFuncCode( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ); + BYTE GetExCode( const BYTE *packetData, ULONG packetLength, const NIPB::VProtocolToken &protocol ); static NIPB::VResult MakeHeaderToken( const NIPB::VProtocolToken /*in*/ *protocolToken, NIPB::VTokenId /*in*/ tokenId, ULONG /*in*/ offset, ULONG /*in*/ length, NIPB::VToken /*out*/ *token ); static NIPB::VResult MakePayloadToken( const NIPB::VProtocolToken /*in*/ *protocolToken, NIPB::VTokenId /*in*/ tokenId, ULONG /*in*/ offset, ULONG /*in*/ length, NIPB::VToken /*out*/ *token ); static void FormatUnsigned( NIPB::IPacketInspector *inspector, LPCTSTR label, NIPB::VTokenId tokenId, ULONG value, ULONG valueLength ); + static void FormatUnsigned( NIPB::IPacketInspector *inspector, LPCTSTR labelPre, NIPB::VTokenId tokenId, LPCTSTR labelPost, ULONG value, ULONG valueLength ); + static void FormatString( NIPB::IPacketInspector *inspector, LPCTSTR text ); static NIPB::VResult SetTokenUnsigned( NIPB::VProtocolToken &protocolToken, NIPB::VTokenId tokenId, ULONG valueLength, ULONG value ); static NIPB::VResult SetTokenData( NIPB::VProtocolToken &protocolToken, NIPB::VTokenId tokenId, ULONG dataLength, const BYTE *data ); @@ -149,6 +161,7 @@ public: // private: NIPB::VTokenId mProtocolId; //!< Token ID of this protocol + NIPB::VTokenId mTxId; //!< Token ID of the 'TxID' field NIPB::VTokenId mProtType; //!< Token ID of the 'ProtocolID' field NIPB::VTokenId mLength; //!< Token ID of the 'Length' field @@ -156,6 +169,8 @@ private: NIPB::VTokenId mFuncCode; //!< Token ID of the 'FuncCode' field NIPB::IProtocolManager *mProtocolManager; + + std::ofstream log; }; //////////////////////////////////////////////////////////////////////// diff --git a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.ilk b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocol.ilk new file mode 100644 index 0000000000000000000000000000000000000000..374a6e5c6731fba876b04db8039af4269ba0342d GIT binary patch literal 1134988 zcmeFa4_stb{XTwKSw$tA6crV7R8&gbMkOW1nq_Bq*tO z@y`8!*E!C5$KzOzom#riHkfrzoGwgpiT1u;PBEbWFaIUAS==6yk!4zjGd?(ap2Bh- zr6KG?M=;IH2>esHGwCMIj=O>6RW4IALk~js0nW!!GE%cCZT^yb5^i#za(DJU8{L-o zZghLj+U8*wTFrG%cHFHwEbi7v|K%WKk&eON&_4(>^#A@@&WBNHG|NdMEuQ7Pnfo7? z%ORQNjO<6n9&?<6<;1;DX8uYPD!Jq#Mswq@&fVvI?|3LHdW5--o$;26 z7tuKH=X{~)-F4Oxll@y>+dlV-Yd(0u^PbvT%G{TZTskTqziVAvk>Th#Bks0Se@#$K zSxzaX=i!8g^&ctvGEOTuyAwxmb1P;NZb8dNxAD$|Tk%SRM^PQ}2){oi;LssnxXpbH zCEzGIX`2gCI6A2<9du2n7>{t;IRyWNgzlN7`&1)kxQ-K}ehVq$6iGT)@KKt>2rm9X znyJF6;c_+mhV!7L4gYUAu)C<-MN5bNz0qyUEqD9=xzW2$Y}o9@$kU>vVJ0IOp?)Jz1buIspa(DRtO>WM8#D7k?+kPt5`R9bI zu@m=F+WlLW({irf;?BNw&-w;q{&ml{wz@@!mAiGFTRlwce;I7&ZK~e5Uta2(*}c)t zR@!FE%H8U6T2t3=am%Q_5hvUy!KaF=UsCQaQTuB5Eq8nVwb8B4FL&DxFdD{QVdBxr z3b*eyY9nGD3X6=#6L;^OhjQ6JQ0W(Lb^GSR$3n}U8{No@x4DBaH<-H581AYg z%s3olf1}55ajWn2+oJV!t)QcLX|p?jysxE{=dfUxXnx6gFm8O%Xl|u(l25)!e&aFb ze1y`L9xz(RdW?_BrHyX;^_$$Dv4mSgYrq)YV*uAxW-tlvlM>=?Apd99tz3WK*@ipk z8=KwapG~{-X^w#pVTtNk_}yl=;2uBC+cbRft8vRp!1>G0K{q?AJ^Pc&0U)}1? z9Z=zp{;=GQ9OQHMoo&wZbGN!>mm2)gbiy6wv7VrD+Q?;4SIZXT(ac{f+}mD^ZsE`UJYW#|)p%+OS>sKq)c@ukX|xQ}`c_I~KuXWk zd~PBiXXdxMIdpG`^s!f$yS>@8wyQSA^5{PD(5-Igq8cMlZ+7E{`&_^x^wAnw#(jh9 zPHune0|^(`Gl6}znfGJl>ClJ1BQB(kp2+&|GuKFyFhTob4tbib_Rpm9Ov)i%q z@>$aId(D_Ar8%CYwPK#;6Y^?l|DS!N+$~74_Mlulufc89uj90qAZ_A#e_yE^G=5dC zFL%d(cY)#F0Wm6 zTN19Mm%hvNNj|NoEp!hweQJeUQ^{<9ds`td^*nO zy|^?m22p16%?Wq>0@JSS9~%7RapmrAS|5<#c{1($!*t!V#qB?#+%5am7I!XE?k@7a zQ~2l>w}#4~EJ7)b-x*qemw3%EsVo1Re}BT2+#wn-&A+Q~3l*Q_A#PV=7}o{#8gH0& z;<{Mv6+Prh-#;tdfrk<<@=9KB#$odTo86K#%H2Y0Q#Xyb5t zQyW@njtxGVaFNzXd-Mp6d7SGoLgNG1#oX7iXX*Zh?&X$ROrK8QYw}TMr4Xm}Am<+& z-6AzFM$5LkT{O>odA$r`2cFvG7SI|oqC9kYY@=)!&7+ZL%vi_u46lJb4{vd2ZrGi;ETijaGi+qHJ zAJIJ&^(oGWc`e3y9!AH9LVepqUT6Q4f4{s z-&$zx8KKu|NXswTQv=c@RMA{3pyw#vFW%xd2Jfe+P%n+|DjIuIUgFA~z79!~xP-<- z1Fc_`YCp?8eXBc8>sA##R~gz#_b7B9h4O77{gcD{Zmt?PjaL|t3z7+U?w*7@KxIbN z+7lf$d@+8V0&WQv3F?#InDG>U*;coi#?#=oJ?D2Njn&+XHoI-?8L+eT+H#P_NFA>? zO}qzp(CdK`>i2f;v(aP9U6=c{;8uSufMfh~3D>1@oeWt|%DzSS!c<=#`PB94&2H;g z6D}|at@P{<$LKzE5j9VT3i9J_?1{V9t)nC)XVFnc5A~{!jJtH|IETmGQaZBfw1=<> zXS1`#+338%sdTF7*yfZwXF1o=e{XZ@oDEI`#XCHp`3HPcE8@007dUTpHaX`LSHc5~ zQQ29l4|*aLhu3!=)tqq7B^}#I4<2^6QrQk_3))aY=g_##)3=4nY@;&UDW!_)svx}= z(bWZXei7BanQA}BIn_DCiP3)ui$|EYLqlg8T-%5jEZ{$n;)_VzX7c3?&Q?0Fq;u3# zNwu8j@ykE(X7`G1yu!KGx!&37G&+ z@fDPU7G6Zi^Xd8qQqw^HZKw0MQOR>SFG1xlp|tBfmavkdGeTnlUi46%@cVpf*Ji3? zgQsjKG2*O_xSHtj1KKx97$~~Nxzy9OfqOd@CWqQsw}(12s?KsQ_n5Ave;b_B$xVN} zEmA#0g!B5}!@rIEgF_9@Rpfy%n0P0-)TGdRYHmvtug7~cVMa*TuEmtIAm`s(+r zKZpEI(0Hlzlf8KvrS$V?R8^7p+o@G`G}Er5Rwl{atBCI^8ZB2*OAU4d$BM+BS_iBH z)&c8)b-+4c9k32q2do3u0qcNuz&cwtB@I$#~J4p;}Q1J;56zybVS zO(nen+)eS)@&0Fo{sSrtu?|=V{x5a_p99eWpY6aW7cO;bQhttM1AW2)pWoQveQw2k z(gmL-siSN2d6y0JIgX3zGc9kUPqOTyPeL?#)ilug^>j4QCsR(M{A=m+KUY%9Rs8vp zlbopcd8Li?d5N7K?pm)TJ`K}ArFRi37<%dN250Uxp9>nJbMJ3p>F)-|-l@(hf0D}t z@%Gv}U>&dySO=^F)&c8)b-+4c9k32q2do3u0qcNuz&cwtB@I$#~J z4p;}Q1J(iSfOWt+U>&dySO=^F)&c8)b-+4c9k32q2do3u0qcNuz&cwtB@I$#~J4p;}Q1J(iSfOWt+U>&dySO=^F)&c8)b-+4c9k32q2do3u0qcNuz&cwtB@I$#~J4p;}Q1J(iSfOWt+U>&dySO=^F)&c8)b-+4c9k32q2do3u z0qcNuz&cwtB@I$#~J4p;}Q1J(iGf$ZV9>qO|9j_k6H{&~wrH$sPB z(wwtB@I$#~J4p;}Q1J(iSfOWt+U>&dySO=^F)&c8)b-+4c9k32q2do3u z0qcNuz&cwtB@I$#~J4p;}Q1J(iSfOWt+U>&dySO=^F)&c8)b-+4c z9k32q2do3u0qcNuz&cwtB@I$#~J4p;}Q1J(iSfOWt+U>&dySO=^F z)&c8)b-+4c9k32q2do3u0qcNuz&cwtB@I$#~J4p;}Q1J(iSfOWt+ zU>&dySO=^F)&c8)b-+4c9k32q2do3u0qcNuz&cwtB@I$#~J4p;}Q z1J(iSfOWt+U>&dySO=^F)&c8)b-+4c9k32q2do3u0qcNuz&cwtB@ zI$#~J4p;}Q1J(iSfOWt+U>&dySO=^F)&c8)b-+4c9k32q2do3u0qcNu;Q!wa6u)bu z`@gAh{|w1zTlUmbc=R^c$=;hJi<4?zApKFN!Fii=rE|Hn%elshI&~CZ;-&1O^Qd!$ za}~wcQK?;C&8w9M+YVy7n2xs-VvKZ7(2@6U)xH^SgpS4>$90?$9Fn|Y$F@O!rh9*MIKkHb(norLdZ4k~Fv6eR*-aZeq{-Oy-ArU*a798C`;T(66X z2l^%r zjyUnq|0ZnMWps414&mrNe4C2{N@n&aZ~y8zAEt{4T?=N4Fv-^cu-;~Fzw2urm-E_? z_MhmrzdY_Z-Kz)Z2ouz|b98uf)Fe4AP8zz zNss9F$kaa_*H5j(rS6Mb*1VFJ>1gT6|D;z7w4j1I=jYE)QoHx+lLI2oTfLHwr?ZQ^ z#AWpdOw3s+qqq|(ujd{>TV?KaXUIWIo)^G@`HqYD?(}rDlkUX>$~}y<0r;>GKY-R- zIwWsH-8H**HeJ69*Q3OPwGRibF^+O*PM(Mh6}yHkWgJVWsm#Tb{7!{aVs zc{dRs9YxG>9gVlQQLk+9_VyiKY6;~RsxsSYG``W<W&E=5N%i|3IpLiT$e~&sUni`45`;d$o77 zg0?tL3Ae2>E8O${R9{bi)Z>RgpP_#WfwW^j zU>rAY;e5_Z6=6>In<3?KU`}KIE%}TYTNwYTLfK<9cO#Lw^d)p;Q@^LeAWx6CbC^S{ z4RYwRx5W0l0eHkZJ??SD;<7&kIe-ZZnj?_`$F56Bbz7=m0FIgrINtQB9XCSmU5faA1<-<=5^h_#OT z7l5N71CHs7EIl4380A7OT=*fU%rSZ|50mn+?qb~!FmBvSZ1{^DmkAVz0RvI6J z8E~vLK87;jIHx-Av*=sIx^IUw;5hrcZ~ikl5NnQ+3^>lb>~8ON39;rF&4A;|$yV=n z39;rF%Yb9LZ-4K$9kJ#Z&wyj-^@rf4h=W*jOk}{(_@xu^n8QJ=IVLmUnAx(u6dZ^( z$5aL!9gkjK2oA)WV>$zlk&k?)5gdp$$4mws?oqG&12_d1{^E-k(&X>N`6E#;8pnx zf&;PUh=aq4#p{ttL7soKp1aLWe0HPz5|ixx`>Id=@Njjxd>TE>aiUJLc7`A3fTMGt za(9W|vsn1_Mi)=W<$2J*s*gNm87L2KkdRLtkz{R*GlfIS;$}f~fA_cdbt4_|I?X|8 z^h~LI4w)3df#*_q&OFS|rPiCQJ^qz6XpOOs87>jjaVn+n$9Z4+_9yWe-$5LvqlpEJ z4m=wx`_e`im_zYTAc&4;DmOtbgdeqB1{|f?<*q<*<0IuezftirNng)?fTNGchbNK> zfI~lH!!s}ORPc!RRTqP4a7gieo;~qwoFmq}3l6=9M|)Hm7le*!)s`G!IPZD)@niXP zxqWC$>>2cJEKc3y1#sl8_x;dq`M^guz6ym9YaMv6m^el%429_z^j7`&Yn$SaXbI;OTP*y|xt`h&9LL zDjXPJ7$d=;Ip#9(IfR~^-V$6}w7_0dH|NIdgh&4x51{}4AEZqqX#F}G* zJ&huhLeNvp74h`qhO4%s3}VgEoPnqB+V6yNa3Izk?aZOqQ@sYkPhB1y2s*7R13#YW zS@%`o5o?YG_CxoJ9%GpM;>Q=B{mp&gK&&~2Gw|b9=eBWhAl4ic%z^q4!p4~BFeS{t znqw*hKek@~tFyp>SaU38!10~#AATJih&4y_Su^Lfr@C+TdK!I2{CnU)tT~Y891wG= zy%Xa{*@0$%$-TtiXE-}FiX1__wC{H)4%|yg;p6B;_J+cL-ZhPM#9{XzOKd*+1@}R? z2deDd=mPU%{1XVmyZA-gZ|SLf@P16+f8eumvYytxGH>}dQSLv$QB3dJV$at1bb8+h zUi_Q?!?WI4ha|0|hy8GoK>=;iew;vQvW~s^`E5T#8N^|JGzI*?z1SrC5%yU>(UC)C zqDLA(;;4W^PzU^!wjBShf{RfGahQ&RfDZIY&6hX2z+mqW2GP+$9e@80~x^=J#?(0LnJKd^Rm^Sn*9eoXYyy8geY18Ya& zZL6U#9#7tqvLpwVb6cKxHCiL zI(Qv(xd?RVeU7#tNA`vTZyE5`QxuhT3>@ve2308zz0YCX$eQ)u*L)E#Grgd7ILDgt zA?sbx55WWYr^{dNK@qQ$31BE`J&lwv@Hsf(2l`}~{g67jh!;uP0+oxfj;P`Yj#I(@ zV4HES|-z>BJHtnNn}m2+7~OmXOb!G6tl zJGb`S<1O8Y!{&<=lzxF1)2t)a`VpZr1FWNQ1s#|#vhTM(ye~c`=O7N#QOq4EI^f0p zH;o@2kn500#zz;Gi`=^RdaCCwCYk8C@TFJ2WtoF-7Qr#Y^HzJR=PmFu#=`DT!4W;q z=;&edgX8p##32tn*B$i|Z@3^1^J7YJV0@rYnr=6KEZ<;DLnszM`pB~pTIg`UzS20A zvVc#%|DZOB!^Y_XGAT&Epih=qhvqS*d>t_=Gr>Bvr+S>~XKZh8x%F^xAP&>v1pI&( ztpmo7RO56AT4@Hrj}aCb?3ZFn7mm{TQSbRF;;??{3+R9sx!*E6QuRxmw2rWjC>s~l zaWHYef;Ha$^2%T16mgi2A;p350WS*v+vqr%IdsIuoiQpG=lSAt0qD^4g@&=?y=hDF z#?!N9D_h>@z!9NN!t1#j#i8d52DfQ!7)QlqhI2RLyr%97?ACDUi94t zZ=50y^P?otFX)qA_Cs`t2E^jW6qSp<+~|lZ4y|JomG>qq#gCtJx_62=OvixYK);|* ziob38CDl4sOXcF!ao+1}#i4b?sea+uP}bW=mk#1E9Ycx(I^e}%8an2vTq8{g=;%NN z6oTV4N@=nd9(QK+CZF+4tP=XUE@b89UW9I$vUE}H0X!kU%vE(0q;>9;xHY-@c}Pp)6kJm zWg1^V9kIapfENwlTiuTyD%bG>>ZlLsfET;d&{0HX23Uu?LcbhC=`xrkK%uyLa*#ikk@nIz>Ar+Jhuc#j5hUD>*>){ zt&H`rl^=EqR3HxXqb}eF`XulB#*b9%*vJswr_4ECTgpr`y){TbW0O4}*?&2%1Iw!y z%Us5Fg~t((_v3;B=A7p6CcDXUdVX8)Z6Sy?#|Zo3a=GBV#p?zcA4{FLd4CgtILwbC zCI$!AF^rAEJB=T*S8_F8B)k(;Zef-2f%QYi$FpC#mhM(eknsVI?lq1NaNwah#zznH z2mLsa()Z=O(_a5o?{6Cshxt(*@B?F`WO#KyW~f~B^G1i>=k$HyYJPxYe2sp9V`ddU z=yq*+e4Ofj?oY4=ahM;$=ltH-_<`|5#sXXGMUu8aV`w+e7a0S=v957{jNbV>TqD+F z-96QKI>3d4eS18mOPx>s;piq5Lmak8^#|rY`n8SQlImV+n99ZIE)8QWiV7$Mbzpok zy)!j>$q>pQ4)Zj)S30C2@m<)=Sw{yK2+o%xN|*9GANlQjPz-TczXb24&?k+fMu#3}T-7pf0cjn`pkKn?0|rOU z8v6wt3+%@Niwyd47NzHK-l6Z#Nk!&Mx5 z{lK#e+2@WuYw@2bhB$1#Gz9iJ^hrk=Iz~~Bbxf?FgSO*k9e3?te>;jH4)Y@t7$5MW z=6>S``ZpNXb3!GRn>i%Qaq07?`rgtxqTCH)g4fblNUtq5p2~}q;8=f{%E;@nOAh`1 zhk!vG)|OrtB7F-#8^%mq@cJ|uq%HZ>-bl~heXCzL==V)eh&0|ST(TyEW0=Q!6=y<6 z@OiSl1`2!M6dbkm!WQ?qNyVYZ*rAjz{=IDA{ku^NahM;$=a%T#-Ry_A$#NYMi62E& zW?&T^c?1$22Y-3LTfl)hY^(>L2cb_|er)uJ;(Ub$RdN|<1k8>@%N&Cy!Epv zhB(ZR+Q6KH7ugRO9jV58DQRtF9jW?7?k!(8bKL8o196y+1!Pi?aSAUcScmk1DPjJV zv=J(|NE~8b z+jc4!d9~@=C>IF!t=_M%{NNqlvmC@>I%X6H?hE1POd2}!s7!1X9k@@HaQh!OPvabM zn2uR4D18er>c?02qnpYlSJ5GB2dc=v>{>iR@ZvBX!TV%*v57b8XdqKvj zLmDCvt?oyH%DJoP(64{afB3=MP!ZxV9U@qCz>BUlbc|EE9@eqanvDAfS@$0K*0Xb7UD)n6ctbi>NtSXq+c#L<;Lq! z265P4SrqUCUM#VWRQK!iD93vx?o|+=L+_Qcha#`%qVD%gEZT4#+4#TL7Wg^#i19R4 zTZX7yX%L8T9PzkriyrGSL+$vA&+Cvzmd>7^u5$$r@YtO+7WAxIo46l z^#%RVI(~A`7rnM1)*Nwq+KsmKufXwAPDga%i%N&`7%gjXn=J{9|m<`-pYJ={ElzD3Yrjy>1gJH;J|${#%Rtj zSJzQST4z{C6ctbi>d0i?2H$^y7aeKn7=>q>Ouww;2l_?)xTEjJ9%w}z=11^82wvn* zt?ox9m5Z^CBr2c~^y5fM6CH2Z{G7KYBM#G166hCr(UXRbNh;^Ejs?Y`pBcQ3bjWL| zzP!J`16mP>tz$9X6lHwCi-BJmKV&TgUc!1lsiATmJ$v_yeujd6@g^F@-+k!d6BxSu zybv6bZ1Y^Zn=_$9KSRM-m-X;pIiI9iZi3d)xY_7%IWO2RcupsK|M_p9`4NgC4)bG> z7X^$*7XMRY@{c(ANu)e*k^jd(a(P9v9A3J*HuZN~4|Gu|{JX`2V?FaS->6e~=zIkw&g9i;b zrq}2PI0m*D9Z{|z=m+jkW!~=B_k=ff5Qoj%;OjYzjp}LRhm3V;2jca7(N3OCunyg~ zdfv*M1tin=#n2}+tV8PLs=Y|k@=#{$-uh(-y0pL zcno{~BRWb*YxE0yj}N`B!w;FalS>yZ)5)`OaOAEx>v{uMgMQKL80NmzdDq|HzaVNP z4IDFchn4E{ADAyPPDii)^4;J-95z0J_haaj$c*tr>J$x#B`pEZDvb^i862l)Q+auR zZvW^0`8(hdhxJSF{eARF^bbZys`Yf7$|YCnm(}(ca5Qtj=ru_93;H$H{sN8#_QOR( zDFpq%doSW&#eW_A3zR_|=Eq`SzMxNH|6}~n>mfK0gm;?Cxoh+T9DQr_100Rp_nt3$ z-s*mRbR?6~op$Ds`3FdfN&4tOz^hK?mF*T_2J zibMAcEicP|pFMr=2cLls#GyKPb4OdSp2Ca8$BZ8s@4+Db(n{q9zOeWB(CaDILRn7} zU)$OsT(X{mV~WSA?1|8^(!3QsV(}U0^G`b7dr7Dd0UY|Zy1sw8{}Wfd5oHi-j@cLB zJ>dB@&N=u|u&>!)A`nR-l^>tK_3U|+L9E+S%p6f$3q@iPy$}O-C*HgInIK>>0_4G443*U!gh{JSL1pI&(rBANzM-7#0 z;CZ{2HQ9Xu*0GKkVEvfOVEuUPtw+))3LFQqj5}O6zTV82mBuMvH%R$MANVNsBCV$s zht1pI>p6^#nLnF;*$==#ka4>EPqZ)dJ{RFK80&hU!`RS!olwbhCS2n;+3>jw`D_F@ z^!Jc}L)s#E#5!$}IrR7la>zQi()Xd{E*c$r&(<7hhptn!=(K$1z`Q^Rwgr2Glwaxl zP|7mkSn2yvYMCP)KUVrKlP2bn*IU81zz^{hZIvMH!*$Op;}q|kO8J-dSDyq7;;?bL zfJ_R|fqf2ZNBvW)kJD}%%M+|4?lJ7Wj=?9%TvX<$8t7tMb$en_2MjTcE;Kb3P?M{EThdi~gE=y%tn z7~(J;6N&?VcwQ{5uA_vs4zP{^#i9McJQ6zU579Ay*%EGxydbX|z%jskgZ6Z#*9~FMlfhAYfzc6Re(2DC z$XrBr-{M1E5{K=#3yK5%;!vM-u^-ZQF5*R!HcsUlSJ9#UeB<27mx2Ism=5m+0p&}- zpiiPtlO76EC(b2ES{0RZSx1yJgMMItk~Qe>Uu>aIH8~FAFdf0q)4_|rG;~Z;xt>-0 z(EZYsyzleSfjCS@uwURs>~E|4QAgzlR?(43zsx}-1?d-f(UgXcdG-w7A5?EBmO0Rl zA?A?vl#6(g^lkI7X)ieRe8D({hNUz(D(G{FAO%O#WB1zv4TJm}WvO&b%`yl5Mp={M zz;6cPw?4IEy~x<4R1H zx5t%sR(knJ!tbI9zstC4h1;ocEeaPWobY!tu0!EIrf?$)mmr+*_c3lv;qFkl>`(eS zD+nk2!;EwO?zeA7;VKlal5oO5!MIX|+m9Cy_}Q*-Nx}*LEaMs#ZiB*2C|nicgnyB7 zeG2ymh0D9eZ(lXxgg-Z7`foLNh3ip7* z%_v+Q;e@||aczW)(1G#!SA{G5l;6I3!U@02xDmp%QQre6Uuukgs8_fK!hxTXoleFr z@-=XAp4^D~6|RwR;0Lacaj`|3pX4cU^$NG3a7~00{$a+|6K;xe@_`({OS=5_H4_f} zsBeOCJ$#M&zN_kMR=5_zfgiY>&8FX{6z;bQH>_|j;e@|{agl!*9@Mv_aL%WFovnlu z{utvb6z&MVfdxFFaBYMW{siM(g?p94wJBUX;e@}MaYG7Mt#IQC*FiYpZ(!Vl!Zj&e zQFV~iV6xGyMNtlMwjAmM~R!MHhvdr;w;6mE!c!e7m}=#uZt(+W4F zaKnTX{tm`fE8LOmF*D6;!zG0qA)N5{GOk16HY;5GbAJ0q2`BtRj2k0dl=>d?_Hu=5 zRk$(23I90boPYW4`hY}Fs@YLzNc`xxB5CK2q*lz8P}+AvkI3~xJkkZ zf6i7j&iWKCcV8$mes(I{6yb!wfN?Vlcc#KkDcm&SgujY$`TsWUg`YbWuHf^2`(_9y z{Pm1WDqOq5)hgU9;e@}1acv6seTC~)xH-ZJe+T166z(yFn^U-X!U=yb;}#X}ko|l= zi+lX`Ef7xlhZq-o-uIxRg7~97pFZ5^_{G6IbZa3;&-Zqzn*bJs=n7NT&2R{x2eDnEiH^&P`Dcuu0!GS z2q*jq%bt&AU!qq5TlyJho zz_=V!{c3 zG2@yQu0!D(6wdqYC@vRg+}s3HMWHj8c4$iSa-zO5KQqQXG`q(6p-= zucJo@m*fM_(eV3Dy)WA4ZiWux0`{(Ub1Ik#DnCGD9D0w!14s(s%>Ih#rK^0Z^AywH z*{|E=4pM#&|31(ObY7)!?FxtAYO2{_aIHI&^u1kle?&OZSp280Zr)cb-S)?}y7)bG z{HD@G2h~L%nl)`+p) zt#J7LB=Dm=G$PJfU+#9lhn`EwM}KROL*=OKhUU79n=U4i z6yk&f21nIN+uXvwN;l$ea`D_0zmF9AEtTKb=-+UShr0&2D#9T~`xcc>;E|31ytJo| z+c!YCym!<4Hgw?c)a$8y@#{9bvjE_O;Jax}rn=$R22@A!h^p%q{NRd;IKWb50%1i{ zGuO4KaP^FXm;DNd-(C{_cE-i__1pG2gM?aQIy%;U8n%l)`Oi9DEs8IQ*89@H>@ej79eI+jo>y46z*w-n^rjd z){*d!GHycQ`0K$vU!whf`|$fl!av2hoc;awz3d>kY1X7Vg~M+e3I9Cf;tKa_h3iu| z{Em_EJKN1TYgV`m6mDMOyx%V3a(Rp!P`IlZhklQJ!*3scuSocd7&oVIA6E4>DI9*I zNchVb7d^oDRmu3F)~r*KOOhuZi8sA7XB&ee}#+Trhx+1C-=XlK6<7`{V4pAbIp7jQ@BeQ zhj}roaQMxb4lY;7IOj!v`)*bB<$T+(55E&5{H2U5Rk%kKu2SLf+c3gk$+$+s%}`&U z-}ik9Ng~M;afFGPqjGIxo_c0E>J4n_;iee3Kpjs`LPVU+OC5f1lZ zBMP@u;Tpap?aOlT8!W;fJ#UlyB{FaYw~_D_3il<2>sPn|!U_Kb z;ZCG}a24)P3OD?HzrN^kKL0G?W(hZ>a4*k83(R;)-09=+8x6u=klf_HlW+?P_XdR< zS2+Bpg7C)(mqWOsm-xQ4C|uRBU!POx^Ct-RDEV2daCa))w8D)LPWW30cP6!^i*OzE zS|0uIcZHk(fnOiK+h6!Q2!|glo*-Nfzy2#Y)U(AQ8BWs=eH^}vANgc=N$^y`Xj$SeAhkrQEq{7?Tw?pAN6%OAeFZ^YM!;c2eDcsi-uHY`eK79AP@aN8NclV?9 zC3=Y8zDE_VSK%TXeExdE;U!_}F_xSa75DxrM(?hts2|5Ughg{vT(@aHjZ zM&a)CKKaD^$}%p?!FOc~e-YuXBt7|u`o65=KVri?+I^qsr2D}b?SIT)M!2h~AxVXM zox)|0`8a&{vhXJf_uqtTQ@C3h2VdHkaa1?8Px#xoeIp9@sH$&b8Aq=HPxbk`35V}a zSyZ?)X`e$t`>KEJ>%{jN3;zJ&zD)&Uhxxu-tZ*|5hwmR2{!zl=yA0|TZeHQ)AMoqL z_XP|86yfka+dT?*MgdeBoeK(w@Ann{dBWib*QXS&RpFW+^y|a-@e03l!6tVnwJ&nG z-@b1uoHOp@@cp^MUrM;2Q+*W*_q4)Ae&XYjB|d*8;m)J_T!lNB|1byr(4}xL;e@}I za9^VWLkhQ9;rf2+*N5*<75*l|{hD+x2#)I5p>VN>d>p>-RQU1wp@+&A<+Cqz-m7r& z2_J{=1r>haVpLzP!p$jM@?jr0bB50kTp88TMYsz3>;d+be=FRS!r}Wag}$*a4bN-6XK$1~N97xi+lHy*;Cm$T`RZm` z_j2fZ!;WjOrN}8GOa;A<1dSi#x~PbUMLq(sqG^)qLRu5y5CgYcX)OMkuMyun34WBD zBOIQm_A6Y;F~~7bz=$uqId|#pP*AVWTglkvz9TW9n-fN?pUr2ql zuFM&JzZjs*Ch0gP%9?V+^(6@he&A*a zcP!z0`5L&dDBOs`H4+Z|z%3H)WWr4=+}{+g;#Yos9fTA9+&64;@foSSf^v6^?>)C1 z3r6GTgu>xF=Y&5>xb;+~l5i9B+!Z>z6t4Q$etr0kIPinBgm4#8+{)L$-K}sl3Wx7> z13z#Lgd3xHSmB;jxccAt_2E0%gx@9HFS2OPDcl*yfzh;YLE-S7X~N%0IDC&n@zLe( z6uq8?&YKjjdD^dUAnx<`5e|PBQb#z{0o>0N&iSp6TOb_xQEr%Uw^Q6r*SVw>xR)M} z9P_N8Z5c;nY|iJOARNj}s`@GzM>3r8WgLy`jfNlPX9;%&707+5uk#bCzN+7ePTIeo z@c9egXzEKS+`X#4u4Np(2B-RjKSnsZ)plAGZcgE%znA*5oFw6dKS8)f8rOq_OVWKT zd^wn2J0XyKr%&M;2`Bv3gnNwg=T&{X7)NwYY)0y%KA`r2pOT#hZeQUszAq0cT$94# z`>llEWn7KIeGqS~Q9yk|8uusqJ#j8K#JEnn?k5ds-|J5FU>L;@BRA(wo7~?}fhL8ED_rt_L}!+R@01e$0>Vv@as3MSWrdqkID7|`@W%-EKB{+C z;T9FH_K$vj&L*F~o^bf0t%76y_EpepZ3MJ$PT}w!OTynmxN`|tMY#HZnSJFJg=?Jk z>vIVw{2heD4Mn@E?~e-SKI-EdHyeIv=_MT9UO1zKtE06Z{c!Hfkz;grJm%vT2q*kQ zgu~x?EUEfFq;Nft`?!HEh98{cg!>28S8|;1%VP>xH0R?c2q*kAgiBC;4GOm}Jxf4< zp92bq?|Kpb-GpnW{9c7SMd3=H@au~aPWX$fH@Tfu-?YNLUg1U*u90xUpZnBScQ*;j zJD%G|b>E_J6@T*U!*`zuKkixYCtRh%J*{xnPx?4~M~LtP_Ygzy9RWzthz==<`7!nG+J zzSBYYfqRN{)+yZSSokTReUZQT_2D}hgdezvsX({jXk6c*a9s+A?@SQ>IQ4rG@lGn- z-Ham{PThjkN3Y-3XD#zr5stE*+!N@&j^01SJo=Tw^(h>_lR)_E8J8d&@WB0par@Bq zyu#so2*8hWJ&bEnxH5Xif&iUOfAw|Zdjo`jka2?wSEX=63Wx6s5dJa7%_|(91tCD^ zlEUHp0fc{=afK)P?faUlFaETz6W<9S{0oe$QMkudeXRxI9L za0d~tOyNGQaJ9Sr`tY~#!rx4|7f}Z{DcspHw9d3|PT}yk>%u=kxCJWHPq-@DyD`ol zR=CDz{QB^>=E6TpxX+W$SykWBctJ}6<7{ymM{6hbANY|sML5I-MZPbuRJgLgOMUcw zfpEe<&$uduJ6GXcg~Q)~3%_%rsjpq(+8KxOIjV5@yKmvoW8A31eT8utFFDVOPPz|y zJ?(#7u843KQvQ;{-A%Y`N`o&Q%Qz}S^IiDMxW1B?`M&&$>jQ35;qbgb_?sBlK)C80 z(|>i^~A@HegC2X2ILy+oW)xN8+| zLE-Q>sKP%j-Y(78akID4SIbFZN1WBZu$@DAUzg7$(F^{uC8$_S`0KIzw2 zP4yN3++3G&eeeinfh$+I+~4`Q8p18|bsgj2tKbF{ZuD^)8XYs%-o33b9Dr8XTQVeb`^L3pSQXw1HJ~@|KZ)qgp<8+_}zk|KK?7Mt?xD0 z9e0_wqyB;Y%H5j?_i9yN@O{?X>i(YK%eg|`){+7QQzoD;= z{I7r7TvrnZ($Hqa(ENRctN5pnt0!E^lDTeR9DEYozZA|{zr{;OUIXFg`Fe16mIZXALlAu z9plh$!EG$XnHe`t?f#fqJb~7^kC^Lb#=$F;MST}2T=6YFZa3lbKV`1l83%s_cd5e7 ze%{9|5N@K!T#qttR^hHwxZNj9`)I6Df6o+~>nX++lAplFPbXjL7@%X0j%W$p$I;P2 z2l7PI?TWkql|Hvi++Amw>v`q|pWvQRxVqQ)xK_d?<9t1C%0okSmg(cOUIhl@d2E}H zYa?92Yt3~Y#=#%K zJ*;p&H9oF`aP9wPuA3MKPX%|_SvWK8tG>j?brLRdskv@r+?c{$sBrb)_S-i{?W-Cz z*CUL}BVT|md}X;?Lq{ha<8)-7LGzl9COVK8eTnhBUU3&T`kJ~(Q{-xMJ;~hQgMN7a z4TX#Tz}GZOnsR?=uICsB4TAfD!cD*3udkcx8+(VjUSb?{3-0d`0 z&S}!w@vymWWL&?(U9E66zxHucgsb?Cxo&0LBK0q@IcL&*rK6dS0XpXBh?dfPq62xN z>3xbjZ`S9YByQ(Xb3M%5;1k@(6mI;_K5l|=LrscQ+PPo=Zb3MyA z=oZ{J83%{QoP?K--R2!Ppo9sNyuYKZNP*{fs`{#L@%yTe`YQ1$bDjNlbI$>P^5}Ik za8n8w>G5&>gj?e4e8$03sqgO!H}*9jH$b?-+st+1r>1-d;Yvv>>N^@A1fYO>ft&*q zE=67#C0};)bqnLBsegf;r=##yG?(ehz}I;XnR?JxsqfngH$36vMhMsUu(>W`9Q+a7(+b!0YacgCxZ2;C>oUf{Q^9Sd z_tz1;`}A2KH%7SPN6mE;IoGpXOr{F3!7|8+^D1?kfs6@T{+Cf;4q6n(G0^L4)9) zQMmdnb6<_TNy1gFGuLyBgKoi<(tGd-@UG-QAD1LtG}l}&F%E6*KgG=%&&O2~ zZt75T9horoz#r6s_H`>ri5G1rBRgQtD_oBIC9ILw*hlM*gP6tbL;t2r~y zxN5>77xg`<>Z>X8>q}656)!W_*$3r#GQA#xz1;9@O9FA1JHE3!Y!Sea0%{(K^hx#rzKomxZDjkC zgqM!I0mAi^nd?r*K{xV%+sQb1x0pz{6j8`>dX;xc)`_+v7r3{p`by7Bc@CSLo-K20cXZyaCkuT$A=6Zy2@KkWODO}fPA6H7a)-C3Gl5u5(YdqNa`8S12 zp6BCA2v?Rg*K>?(qkaIki;f98a$ZAonT}>U2I!ch19_t9%s9?W9~ZpY=Z+C~&V}ZB ziMhdtvhd)Gahw_4VZGVMSUl$`Xa7h zUzF-w;_JM-O?h}KxT_Uz?1Mh8fN+B!GS`i)GaC1CQwryP!pG$kuA$Rhw=%AQ`T^J$ zItJ;Or=xHq&1E_|=@_R2d7|k##a;S2pF5AZ3vV^oUCa%>M!Ii@2WOXq!FZniRUa22 z+yYXU3PtpZGY3a1uHg zmt9WxT(mzx=NXJcsrkzjt|^=446Cu&%eW-@32ZGLU35&)kwecl;&k8{IG%AJ4;KG&{i;^eNQV~-3Jq1I`TSbY$QKquG<(V z&wp+r++hinLW}l(4+77+kvB=WTPOw&&xzbq>6xFZ`*g+8_wj^FMJdqha^=w+*Ihy$ z0h^zo=T&rgMFamJ4@qd(>zNyV%ylPRioDQ9?V9{t!o|fBa|<7EjS4rr+;8M5;iP{{ zes1b%*=*tpia&YOKAsnqS>MaL@I!4Ey!_ScoJZE9mh{3ts#xri8%J_m9?AkIIKD?F z<6VFsQ<L?Mrm*CkYg{yqCVmb4$6~*1yfIqu9&xrchQEqCwINPA`eB z>zrNA4(B@OQm4k*?p#IJxVqL!(svPFMc+nv6@4$^RZfGmf&Sg$T;|dJCz$%_Xx0!N zsP_Om@<|)o=u*F-eI9Y(pONvYbx6ubM{=m-Hm&6Kf1<4?KkC_mf4)oqv?hM~`~dls zL+@Jdpz8|mbLW7F^CQ*)-Cguuk<}ld@2>nM`z#_;#BnE5KKDUW037)4OMLI;?zb3@ zPeH^gA)X(JOEGZZySMQkaM{)jbcAp$lDBR~9RBa7iwH>xhW0gbK*PiuIiMkL``Y|~hUztPKtuN$ zIiO)?jU3QWc<$Q#fQI@tazI1>8abe0VT~NnP;%bd{D6k$HF7}1@ESQh4av2&1sW1- zXlPm^2Q&<=kpmi**2n=3@v61?0S&Ed0S(1(TALrx(6~kpXc$~02Q(~Z$l*O0 zqUR*?+yNTOsx$K=$N>$lHzeIv9=~|mIrH?HKqnSo;0a%b*H53c!WOl z8+DSk=8M-%TlDY#;JM!47_j>_kI*M%Ij9GQV+*8%en*Wz=DO^M6wRTN1LZ=+`>OMn zMZ=NLX=sc74KzG{)9n$cPRpgwjgk(0HINs;p?{|nZINeIUwrm6)N*>ii(<{u$vW~p z2IEIihj6U)dv1Nqk-Gv1tkZRJu|3iTnM1cl>wu@ivC{9kO=ZBb((k#&GVt`~Ltps~ zv<0zf!}U@Ip04zpaFKsF-WWr>5rX3bo=U%X1^6GWqxKpa>ycz_l=Hx$$NK)1E*#gK z@$G38L%dEB8HeBf8Q^np;Q1+j^C$bi%-mN~gG>3pH#I=dSeIUa`I66mtpIApA^)DEPhEfFq&e!-lpCk-XFnQ_P%5Dv7XnK`8GtLZ2R=zxY{ z=19|zc#s1c66{Bs93%X(*=0}rsV$KmnfVd)6zyosuwPyh@B{4_XAZ1~s|ECJ&<|*+ z;Xz0s~ zW8^5+7R+0Wuco@Sd5U(-XV@>eM?ery(T*7F_)q>F96{h&k0}czELj-;Is$wXS^1 z_`z8#Ml-A2pW-tMvPXTp?RAfV2yxi`X$}`ezu^89_do@g8XeMST8N}2`5p!LL2uy# z;J|$$?tyBVBXs=`ag6isg918m57f&XGMB=1Oer0&4Cp}K9CL*BONfqH#Q{IyMKRw? zg|$WekoLll;}i${Kwcwrq^o02aX<&W7)*6f$K|EH&~c^WfDYujd@m)sxrm8E{8$R~ z3%nR*ju-C%HW$Jx?S+n$xE#iZcYjJ_EQjYy*nTVbr^12#g})NTn=iO8ETnsfjudk) zOvl@m4)_87(kskZ-#4T!%ae%nFi!E^J_s^j&?ha-k;)J89exxV3XcPR;9h;=N~0r{ zAHosOkH_PR1NZB=S1)>(;gEYIE)p7rd5Zh&ysHdH*fBn9i z&@hl0$4D7Fg|=Yd$DTj;^|g75cI?iuUzW!V_Y2xF@~!lB1m_FpEymvn&$-a?5lHmr zZD1Y48kWs-F6_0s=$7>%Ob7BRm?Kc7aX*k4rUPq7dm1{Vz0mO$-4Y-c~9O ztm|0Q$C+ba4d(MO9k|~?5I?{_!)-A+fqz5%Sl}Y!2l}M2(X>VC)GU%FzQYf_7NTE} zSI-<8yL=v^Bb(Di2l}Kx4IR>6=!mJdKnL;`m?Lxz3eiDt8F)c-z>AWrSNB8O3my8I z5_BN1nK_t#&nQI46qgVk@M1U(9nxOtI972$hnL4=EKsE>8A!yum3slv0WT8Fk!t;r z_Cm*-0y>Zvxz>0Zw(m=w45MdCk@8~hK+yp&s+c3}y%QOy4r_%Dncv{Ryv4o8&~+>8 zka;T{VfPNWZ&+fEurU^<jH*kbap`99YNDC)3O!&v`V3=n&uG zhxjHskQZ$-erW9Sd5DhS`hh;FV-Bfv8BZsYChZOO3;aM{A9Dn%G*p4auyG16=9wea zIFfANet{QF%#o^Jq`lB_P+*@!Ui^B~FZ`8o+EV{TFQ>wf zAvPLq!T5j|t;})qo@nn%`bF9c9dG4w;J|#r9+%%@bjaSLsbszg2j)wa;=n$KJ+6j1 z!aNPrA$z;@3;4&lErFq6Y6~R7kCH&YpigpdFl|YtLwtuHzg2C)I7MEPIb_Y(euRyW zfq)M5Nhfp2eAFD`hqM9rJssC6?S+ox z0y>b_$QbLVNb=s zJwPGjqlnFyaf-2#{T`zu)&3&BLr3s_9rqp;%#mt*2uIlXz`aL1bEFy{!T}xc2>5}# z3Fg>$4#>8y{h7VSd05 zc+t!pVV+8wv==&L50Nz)dBe=HM}Npgh#x^6o)r|zNyc?sr7cW>wo z_yI54m?PErkoH2y5rKX|-Z*mvnr=!45-~o4_m&RfBRuz|?P4clNt5 z=1BK7P%^LYb<*_b)2nTc= z8}I{pb*w|zzkD9jFTrPy=#xI?kUE#~bRucuJ9K=E3rN2puZi0dHpar{ZE2ui&?iI8 zA@eazhqO1WU$8&5e!zH|s$Ya7tY5G{jWI{q8YF%Q2Xq`1@B?{E+!o!2<@1n!3BDJN zK8dpqsdE`mCz2+8rkI~-O-1y%x198}AH?r9yc#7Ai=#we-Bg|7t%jGig z(vv|8lYA@h`qZ$1cTz*B;0lWR7(A+lIjSK%Xq8 zp+njW9k&K_AkY1<@grRwk-+$X7o*G}pFI>W5X(4~_PX>L0a-KQsdEJFarFByQ@0r% z8oSat+VTn(EMpz~9Xvkdvt@hWL)M^P79xEMKPQ>v=sm#ZLfRspLC2+B4jg#BkM*bW zbEYk!uaTu6*)xpw;QOXne>#|B-!ygT&p2a@L1X?$jE;22dhod=`n85RLfgXH#CQ0i zKdS&8$m_{aNAS56`eZf@9nxOtxKQ;AbRe&YUq{LK+r!$B@lh*%#cMLWXkd<1V_n({ z9l?G<-frdyRB7Y{5^;~KpN(U0fET4Vo4%DXsoNrH(q4=)X*0$tURUDzN#Vy0hsLgS zj<%F?rp!6;x3G>-Tu57T1D?Xqku=&OoDds-%hCgBakg=oN61MLLpXGR7bQ+FS&$gt! zm~$^xIxy$(9H%~mIfrMT69Ep)+5QYU-WcG3hJ}ncV)4QN2Q-whr<|2CLR+>3IG~|9 zLynIIIG~}mE5%q3sKWR-S#e-|pwANAw}Im3GGv?v=L^PY8*`+ZFES3HBlsB-x?BcC*Wq|zbng^t$-{6Jn6bI882hc6+11mDAf7hP%SkoH1Ha2-S5G;;*1 zT(Mswf%OAkL~mK$4{0xS$m<;0UyxVF9DDd67Xfit$E2^of&B$u^rfLg+6x^e%r82S zH_sgD-qYcCf)GRpyoh~jbw8xN(D5llvHac|@|sd`NZT3aeb&hh=ztePDL7>8N_(N> zlz_{eu$Cs7L$_h2^RTvnzmqxs)3(6RsWjRmo}n%Ifwo{x@67Nuq4opoI`|7d zV>}J@AY^>V*p>N$KB;9684H?A(!?`(8hoyeyk6!ARB5OJiDA#R;pbc$I;6eO5oMvW zeju;-v&N4=l`HCK=7Qn}yl7+&X**ZrMUp1%4f6wegBj`wz7GU17Sqrn?S&5g_kIKuqE*r;cYRDK8tbOiT(NP9 zgpPG?yZ8DA`!DdKnmMHHVSY$^q2ol=7U)1;H**A< zzM>z&eGXpCFh{Cqu+m=Ws0%zBM_&Jzj34qEOSdI#UGLzDCH(>~7MMfs!!?I^B<&6Q zfq9EHY`E9xNHuST1M{|)D}fHIW8NC}Wy2wLuBJowA#k8yz+b{T((RYvd_kWyGe;^N z;ye8Kj%o{ZATPmfN%#G^;O7j`CvD7;YCV&-LnPiSs zeh3G21lLpKO>K3~Ll=m@@dg1kEB2y07NzXYF4p-=jl zBh`J7v==&F7Z@MNTe#1B&LCYK$-wx47qLF$M=Bj?Z-~8u=dSWO1GGbi!ocx|xX^((Ovf}bDad?*7xAyHK0cbLTo3Dr z8H(lSL44`p^|$Ew=&QyaKsw^E@9YZhbMRt}b)@oRi9N&kc!n#Mb=?_Dx`X|uE%GdY zi~mO4$G>ZIq*_0O1M7$AMO(1XVJ$8A zy5R^N>w7fJd`FesAAkeTgYYb<D4#96>42A)f;f4rnOmzD?89y}pA8-(}Fq9D(5!l;B;5=|DSXZ_lW2 z_xkQ1{QdvHfZ<3-2gd2)%2V8b!0)neq~Hh;W4;7GKZZH$GKch|HbT;5UP8xB0UgL2 z%}_`1^DvmRIo~vGk$DiNL)r@+dd|TQGGz-IOwPd_yI3Uc`Z!khqM>-R*w&?$yhszSVw5TXoKk- z9Km%A^S&WNj^H{54UzAyZT-L+Hq&X=^*}cUT465HFDG)2^b5S|{&or-0b=w^@O3uE z#td_$+V`dZgPvla!}|nFzce~{I}dGxB!WYKb_3rrgYQDg{_hlR5irNW@c|Be7fJd@l@9MCYaMh-2J%#muG%6!0l2|kxXUVnxq zVLH&>iB(=l>1Qze|N6+Ef(LQf>!{%8g5gD58ajsAGx*W2+Jb(87gfBjr`s>V?=W*n zLl<+TdVQNsT(Qi4J%XyJK}fq`hJN@_*QSANanj`riMOlG1=x0tARqG(d_` zD+Y`hv1;0WtHlM4+F{fv0g4oikYU73D}LPSZs)ogU2yT<=*@M#ESE)>xz1(SVPKs` z%`|AIVe9UVn7QoUs9~#`X@%eG`8nsEoPPSrH{T>YDE0R}?aBFk&N=Vbd7tG>2}3>Bb<)ilbWsv;aMtXMc@|&O?0Y(e^A4jxr@X9T* zkIozPo!bysd{O*f;W~xe&TELP6?QA!pzw&oI)&p(=l5dEbq-*oj*nid-w@XE-8uK$ z%ghmLJKb79o>6s})(2c&ILGal93gU_l^hPara+G0lmMSJa|d+3@0qT=FMB!G&h9{t z-;pqUem5A|BSCrJ3(6Z0$n6W{_+5wu--Hw%lH9~EHYM%wIxmM^lJBGYeEb#!_?((u z*8a_W{ca7)+wi{m`tkb@;3H=)7s!1mkZTX*_{|5yH@RJbT#uJyXz!nsD~b4Eis2)7 zwG6jka_y%%dwyPWrHaR%d=FoNbC2q`i#@(YO$X(DEzpy1&s!dTivfH)C#=4I-Y(w{ z^gK8xR}%623zY}w<$g~UX^~u0ozwHwS2;xL$8QkW8NZh>8^~={hVG!e=LT~2y9MmV z@_pg8U!5=SmomU;Ah$D+vv>HCU0iV`!$*hj%9nmg9W?ehE3N8yBggpB%b!4crQ7e zo4$HW%+aLeT2)VUn3i0-LdIdJL+y5@1>^p5GI(b?a7x_>*UR6yjUzYzG)CLvc4eZ*sn=g6B#=6Ne6UA z7I(jVOCa|V$(3snO4oTza)yuGM}^%T$bD0CafV#Oo96M6`?BQHuI#;A;yT%L;|tY) z<(o9m?vWpsul+lX0r@`pwA}9Nw#GJ>Q|A}xLHZdTq;(&B^SrKLbSVR6aE#se_y_Q@ zd+F)({o{!G$BaKWyQ7z~C30U6-hQ&OV03-i>2q0K<1KydKHM$xy@6b5lg6GpTDtvaBxm@@JuZJJ zklQM`_6)gNU8ov9a{nf~z$YiQ2BPQPk}KDPN9pp$Bxm@@g+C5wYldA)*d6Ui&qb`x5DUiu6?ZRcm$at@4`{cFB*(TYkf$%x=j=PuG1h`F8n!`3d>T zXJ`$SuR42P&g8=|#2OV=ldcWAe7Tyv)8{1>ZVD{N7?68tRLUX|G`+)??`D>Zgh&Y1j09e2nN$Y;qt(Q)N}ud#ZT zyv9L;!Ulz%3Of}JDh&Jba{6D7@SD$;edR~wqYAaDu&e4destWd(CTC%^N}4}7{-Nq z%nH9k@v8Ft!ORmhaZ_kir@HQ61M*7KU%wgr+~oGr}*uO8rH?RahMgdlZf-98&Hcsc=f+G5G$vawTyGRpz?$wJyo; zl|LwdRKD&4-7AsbCtp9N_oAMqw%aJLu=?5ZFPHrlcFT{-7pg;xuu7|BKl#JLu2`pM zTjZ;Ry<6b{`7Eq{$sJMJh6{DiL%v!0dlep%->>7f(kn|YD{ewqIpyCa-yuB)U1Cx2MJJ1ytie~08ME|Hy-Uiu2vUA{+tOup=u zYH#_po_0=X{pQJv>y^HZ(s#G~lys|VP`l`Om%{z>M|5nuJW;weeoJjzt+th))^RVP z$~vU5dXw6By^9~y{?mFD{(bQ~9M>9kubscP7}vE%)$81OIQGbEx-K;S$b$>>4NI36 zmESEtDxZ@crJH37h5OM-J`qaEtt77b+nRG!M)jpCTfRrf-3rGPjw&qMva&KqgaW zTmFcAr(_S{bzGU7moxb=4BNxv7mMpvnUu5P`RY^hO)8^T;UW388`O^SSy<)&pte=o z{vh4*S=jy^CtIiRme;IGt}z-*_LRKh_x8N;N1rT-zDTDm(1ls!PrP8;(|3Kd1WYjY z=;DQK-;0EG!KeN-DaT;Dbua9oytX~&+^!F8iaWlmHTmquc&EZ7feWChq=aBl`huB6 z>3m0YQ*=Z0p6KSNCAucMUFV#=J8FvV&{>E4jq+{LCZ+6%UKiaKU8eIJqFYxeyYujd zXhYuGG0rwx_;|I?hdeb3EB0tK~+JcTK*I3)y}p_3NwLkd%UsypOu!#!koj&gr~9rA=!ye_=g)Y?x?z02pS#qB|7KzE{Mzm%Va$Ki$@D;nkriT~!`g?J zQkUcPK!>IkVxU9!3Ng@Oe1#b3u{}rQI!vt)106Q})5`3D4(%(% zK!^P+#6XAH6=I;n#=|SK2Rg(n#6X9GE5tyDvVUG#UC^O%g&642wL%PZIJ80xbg2B_ zE3*eWw5$*V9r{*?few=^#6X9d|FbfCphMdVG0$P(QIUd!WOv6=I;n z@Cq@|q4awzs|z}8TOkHI>|G%SI*hFl105A?z_CSZu6=I;nffZsTI{eGZ>Vgir6=Fn^-?KstbQoPB z20E1gU}g3|hwUrGK!=_cVxYs}6=I-6)xWOH9_X-Rg&642zd{Ujm|h_UI@C_B%pT~_ zu|f=V7+N6)IviahMzTQ^?0=v`!@n)f9%&48XwLU6f3Tf0b+(?Pjpn~2&;AGBkq@#g zdN`x!KdYjq*2pUY2JhgQ;BV-_o-eF@>G|{9f5E<3?W1~Tu6+JIQQL=qrJ zI(MXJHS`=Y7?nN_4Bp|hEMS0 z|AZJb?@?bbpZ^{t7-3&$Z`d&IxbiO!13{Se-rJDJ2ZQ}n-ZyFavFmGDeVu27aQn5# z+VBL7mr-wzm5i6F&$zK)>r_i@%6o7AG}0r0$^97Wf)l4|%tf^gAqMZg zA%hFY?ezD4_9rejD_ zP9JOAd_Y+kU6SAS?}cHM-|6~TgD)iA$Cy{FPoCfK?c|kZ!mK_v9AMDL*q@&)ppR85 zPm|Zf-ic1@ajLM*9?yLKFZ(EpFiVg9B+7w-9`y6J8E226E4WPhYkj@X>&iQ87yDGx zWBQZV#DgBg>@f$xfhp%BdCzOgADbT7;)utvGJTdLu(%qZ2R&{JFc|x!_0PJxSpEM1^%#Dc*9|=ww~X1||8Vw5b%j(d z+$nmL2N=mW1f;`Qf#ViYF!Ts#;?M&O>QUkKu)6y!nE@E#m;(bHnmtB=_Baj$9VV8B zF`O*u($Z|o95!%dWj3WA)l0?`DbjW#o6o@hRT`03D z{j2K{I&AlKDbya}*iWuKgwgQxmDz)O^eoY) zHdmQFsK?}pQ1yRU*`(6$8k1AhaD@#K!>Aw)+pB#=Kr$Z{-!_09<2MUqpe3> zyPP_ob^a)|=)gbh8xvr_gWw+fJVw5C-}nW3R0n#n?$$!n!{!jE#>uJ+j)?`qR7~$FKXe>u%rIvoO+{ zNRQ*zDCUmtUpPHdO^_B(&Z&#l+4?$tV`PbAEIUq^?g6=I;n_|haouE^+GYM&se)qkFhHY*CRb%7`ODlseF2*luO2~kF#+L zSKr{r+?tGDWqRBEkfjG{?H(glq(e+aX6eD)vA+O4tiI^+K|e`Q7wkb=?8oh88Fk6J zerfgoTUeQ6gaa7_+^i~`NO58{${kxjL%~BpiLS*hLstjSe)4%dxY0Ovpa*F+zK^AfbU9Ozj9VK+)-Kqh&12-7Kdip!q1Uey zXZ@74`cQ`)5T6sLz>bA~{shuIx_nB7bd z(zbbwPYHvC`YCB+9wSwxgGxna^;2w7;oEjisDM8< zJ*>Xy(e2aB9;7wr!N}^T{i$}r7QG%LU%Oa+(c>AZb&j;1zK^{yqb^x`4EYLD7y1Xb z81NX+&%iKySbfn$ue>J?48{v<+{n{hAG5V5gtGBs7>t+g0S4cx`Hb$6-ocF-%2uj&?a@Ky1L}k!|aY8{~XkXeo9)W$FMm+v`1FE45s=A zZF0b4*mw*vtX-_W=n;-N^hnayxVmIvWa%-K(gR!M@?e-AR$ugJPuYXCJszXb_11oG z+S&zMjCzcG?GpJs=y69%57NrZoIMI%U+i1-rU$mz?lCesoiEesiyjxJ^dPOrV-#wS zid4H`i^Cqn+Q1i+1QuuYMUNM!^dPP3G-r=O^_UDWm_M+^4v&$wPiJ~qebFPl&ZeJ| z*1tkMu*Gx%dRTqY!`4)rKS--R-Pt2GRk&KGBAGwZ{R3Ncc#M4Zu=-}{LE6v~^{7qt z4{UL?06na}S$dGx;OF&J)fcqK&XgY5Vzm13mOOO5&`alGf_= z$g*kHyuKr4587m($H+I2ncb<&6@eb?v2kB*oyYJ=c?0(8x>6YI(Up}ud*l`NiP+=j z0E7O4j_uy2X1`;weBCXMaa-djJe$|)8~Z&*)>>(}W_R?sB+!HY0SB7(7+LF!^$)|y z>K|~Rjb|+0KMVss-WTYBJxGf^M%JD|R{v;D*@M1u&|~DYhuJ;L9*mXJ3RjnW_Arbr zdoWhEd5o+z%G$*+&_lQR6KCUvv_{{@EWgj>ssV7xF^ zYA;w?U;lltsMQ7hLwWSbYTJQSU1-8*(u1@~kCD|svg}crvIn-PIm_9@>h6n40*kZyqKB;^)-I&Ad5lnY z?l{99X+5yTU;%nqebK`nKr%f@JK`}4T^shL?13%n&tANLSbfpsnZBZ?2Wh)JMyl#A zXDX8Zk>Wdy} z?!daxdyccI%?roW#oNO$vgSh8g$a+5)z{4)hJhXzrR+gkg~tfXpF7TIm-OBzZPM&9 ztjsxi9ax;%9X&qgGg$v1t@_-B`&ibvtxv5{w8>77VdF7N536rhyRbg(sa(8W3?r*u zSf55cM!t424D@(L${wT*__~C3m^;pBm#F}QeoC9ncnoWUIe8seoY@^cZVE8q4y4tc z=j>7F{9(VhWaEW4>GT+DLIwP>>0$Lnk58xcNYcDb3)Q1M)jzOB&STi~C80W|ht)R@ ze&dX~@Z31RZ#MNpXOB>Jp=0XuLa(s(b@0od=`ig1fn($|+IF9xB+RDRbGyf|=Q%?R zt4rkTiyk-o3}C=dnSVx~>-5Ov{HBM;ps%OzM=}4DKhI%gamy?{!spoNW9Zo9>ykBI zvc`UTKZtfc>@hOy;_Gg9#~$H5VDuoZ>U>w1LiI>rXVWG-JVrh}tiI^+mY`kGgS38+ zk+n8t*`w9BmGuv7G3_z(^>wQ+dZgQhv<}Zttt*6mEK84Y&yhI@TMT)OxxNs9Se(_D zK4x{MF7RZo2U{+7?GlJCct~C9eJU8(6#S$4xOS?7@DKYv46`ZrY*^>?Fug-1EY56( z9<~md9;EH|7@_RkafTifKGF2Ro+Ab5Vf96i^u1To)?S#$rWtxnru4uTO&-JQK35MN zSe(@tJ<`_=q;)S*k2L?l7UKozVf96i^j;rn>z?K8k*d0@QYw=EQRU;TU9d%~$FRC* z*~99K9_f3Yr0vUtku~PhdpX!*Di4O~X7xpn*LX#(pOUuW+0Gs|9>cn1>5<;+!xrrx z!^#XXEY9ki)jvqv?=ezM;Gj~Gv`cxaU9iP$0eV<{(ZhJX*@Lu=RZAN$W+Uq#*dq2A zR`)D>Sbfo>&Sx+^NIU2;3SFZ%r0jt$$}Vzs$)|_a7d`$cr3Yz^c`&T*RzKP$PU(Ry zy7FL{ZdPCPctJ`J(hhkHE9;mrqkp8Yv#~{`Utg@u5X0iEzUXmoN)OWdJVv4IQj@X= zwwUx7YeEJ5vFTy;Wvwg^^kA)IKdI)DJpD9w-N8Jx0E|n9Zn5_?{MZ zVa+dHzqGo9_F&xy|42T2Wb_Z~yEblVllp3>hqXayMvF6>VbkOGKcvGhkC7_UL8T%Y zFUReF2xGVaJ*>XyaWLo~*n_m*OI=-zn}l_-x?3E2r1w6t#e~Pmw-;>nrEQ-T=t0}k zN4G7ZZMj!4mcpQK>|G+pwJ8jA7+VrXZ9{bm105>7J$zE$fV#XYg@F#uOT_qt6b3r% zTjI6p^8*a}2W?jUoIGPLqo1bv7=3i7$FQ*x8pPtPAJR{&QhJa!;4xA~x}2#<`e~<+ zvvErwohd*Mt8do0C9ST;*&|itf_hY^^uQLK9>ePHtD6KCXZ1yo3w#D!_endjL_N|x zD6xgV-nTNd^sxG(NBBMv{e!fe$0*bubt!vbi#-MCVf951zW0bTdyux>?>iV*b2Vb$|p zAIrCgVi@RgQ-DFckha5P6w254`^DYtL7Vh@jC}LD*&RJD3G~1o>?cj<(ZlRv7}#S& zfPp>OPpaME?2*MktX&KPJ$eER>_J+G$FTf9iwiRPM_0-o^o=2pVedSK7=~+hM~`rA zz#jCCb$(9HY8SJIVPx5ZzR~J2^4Y^M&?C)HNjvK6lB)WG_DEmP(Ki}i;Myg#uY2Q| z-O=MBA7|s1wA~&fwB_7!N;$@DdVQfyMm&bK!JNDfEY9kS9_jg%w6&KlZC*d>3$gKn zEt))rm6@f7)fYX&zD_?St=nUSvUA57_9*pnrU$kdFF+5gFM9kWs0(_KcJOj%5982t zI&hGoM^mt`&0Zh2D7(U8VSBY;z)#^~d#`jD>HJyeamKxZ1KOi+yFV9a<Xy{D!(m-`*NgYO zhF|P33ekgpdR|~t#tZgt^nE=OBNfR!mcBp7nC9ECM0eV<{ z(WAvHYI=}X>gTbn`7~=@- zzEk(oJZ+l-W*(dI^#g#shk!c`|7SmZ-!Q$E?Iru z^sxG(N4Q_eyiQuqV-z}{)_WV79@t`!$FMTJs!3pRR$uf;&mW|XdW_6@ETdh zU+(8ZD>F+Et1o)&4KT0=X@~Rh^{n+J{f!80QMJ*vOTK*vt8co0aGlLH_Mt~!9iv`W zyV!NMVKC;xKE~R>+EV>sE*8Yx_s2LkXErhn^sr|LZM=}S!`H>+jtMi`B|TnflYWn3 zWri3QXLd&qi!(h)n_i+G)4mYvr?g4!%U!z|ewH3qU-U@d_aLpqW2CC?pi+^{AL-{V zu*FaTdRTq4+J&^E9wV&7+;N5;>2|>u4X;?-9#-G1b|G!%CWkRsc6gAXNBX(}TkI}C z534UW-RaA)wxu2;9wTf1u=cihF~Dd_VW7j>SGv07!?5S&z^F}Opu>Q-M?MUDPM+W8 z=?E}dw7!hor*A~G<*}*HPtbR6L)@;^mUVQP1As`?Y-66@1dnYu71Dta@d7$SXv&w$7=W% z*Nxm|PVT}txLDeuGmzsOtl*mr;b@@eO9QzBfgImm1wWK4-K_Pw+Lia~UM?Bh`tG00 zr{8OT&pbYHrzyim$xXb>$#qDMwG2J^ZlQw2{1J$LBalP+IL#P>RTUo$Uvl@ywk+`1P#J^wzCnvKBb(x?pJ=a6zDs^YKKiMi&zEnPcY5fzx>It*KNaFywrHJ~ zo)hwwKhyrH{2uvX`C0i|{jTCuy$)45U8hLTKKXI^^8XaymyhL#UEe@9cq5Q zDQ=bTksp&U`^BcXLB3OdQ2wc2hyJa4=1+Q79o2Y{?~)&pkAA7~Am1+kRIfwZt27>@ z=Y)LaV;T?gd*p}ZXXR@jf9ltv_SG5>(z8!~T)sTgcah~|`62lk`KNk298n!=O7z~S ze2@H?eAy~}BTc?jeo+3&u7l0_VY&I@hPG)uNY5%=qn6d`o30ONPxj@~{UxfGj`>~H zEUW`pYuz5%9Isa5zxs6ze!+VmmY?4gSje%im|kUm%>?U=H)>B)A(9ny9Ihm)6`8fQ zTS?LXRfdK@u3mDjiciZmNzU+*gPZS??iYc4TJOQ&c)k30B!@$;_pfuY0=bfC+Fm}?nb{yo(x1>SS#j;c z@6`9qyQO1?^xLkzxMBHO`Px(U4Hfw;xf2z);n#ExA)UtM%hza(%g6FV@-y-^Wlt@A zv+Q(Ob!e5IJ@RAnWv6M3%Xi8T%1_B>$vu_g`Wm%&bh`F!<-6oZ-3zzbgHUTzm)HiAJX}Z{D_Wg&Rm(kv%;^|wO6ZfS`>E6kII)`sj;lM zu@&MsH>vG})geD1Uv`$f*3AZm4GKFIuEdT*!tWH$pl}$g^tERBF8LAps3IG`_G>Pl z-x;^^XENd}ZLu|{(0rAz7nhK}Roeflmu}4p+ZFc9PsmrEldW%|_$$dbBHfx){vP>Z z`C0ic=~sKM#)^EO{7UejXxSZaU~f(QOFEXHCrzPOG2Uil}w%tG;wO1Fb5 z|EPT31^S&5`F-+-@*6JHH`3*s72m7y$^mi!^rR_sSoXKPq2$@l#9Rth(mjq&<1*xlg{gTJ7JUYchq^ zo76wns~r?($*m-=tXcOoggYvqQyHb3)dv;sm!Fnz)%i;B3zgj^J*qEN9p!seX1BsI zg`*0~wn(q%JUM!lzFC|`Wp&68$WO|zt5JWF-z$GmzR)_IsC;`>hojQ7L3XQquI6p| zee#FpE1su$TmD4pmQ`-kTXdgNIvtVkl+Fk6IjTX_#c z*DflfSK%S~wHq`Bhkc|){amI&)*`;6b}W*1TWXm8&V^KE8#_W0vb)L8PpQ?I**_Y-c+d~yY; zV;y^US*~1>r^<7Ctt81%lI+oC<+V8a0r%f`b?4$fg}pbcUtsAHIR!_gFPIK5QtMky zu?4?Jc$uuzrhjt(e0S6&Pu?~1vpaMz^R{!MwZcFrvw@+_M1PjFDWdk=4|drjJ&0>8 zIW@vI98)*BM2*XK+;qcxZm#wtC5m3>(vJDda{`xj+|+5$3Xn)W*eA7Tx&W&xuWC)> zU8(q1`A^8>P_jXr4VT@rJRs3@0I_Yj{uL~R`vPnd~}j;NGAuf^HE&l zsN}p~Rl{~%42u>hTA*lwf-SJ>lr^W?1Bwd>m6wgL;`>m{U2Ekh-gRq|vr)7E zjT}9`TEB5i4!wJ;mHnO3OZD%{WK}0`|HH3L()!|uRJP=+K+h#K_2u~;GFa} z-eys=L3!A+UFBg1%4@1BiJE4QD=%69Yo(j%nP5rw=$Th1a@YsE+<30z7+%k$>31pf zHgBudGT@opohIly{f%7g&h%Gho6CLHwF~DaYia3_`^2TP_@aj5YFbK+-Sx)VbrA18Qviuo|PPV7HXHL@_b95DF4e{k4LJ* zaZAzZ<^DP-N^H`zTi=lXuCCL6bFQtac3#JvJzL?jU{~gB=IadwJ`cQ4&x*p?8CUy$ z>h$0pQQi-o^7E}JaN#|-y^mwUa1QPdF!}=w-Vw`v@YuRM_B;Qu4-CQ(gE;2>4IIc> zU6}LReO=P|$!Bw=y^jV)JqdD#fh`VqI6d-VSbec+_v!N(JY(IYb#U+dj;)K!k?~h! zb+7jK)@$B+p`W){;tU@NY{neKaog*+CZVRnh-X)N)sA&%(;}KvZ`%?xA-W}U{(AXh z#kG_i*P{?Q&aF8v#zn9$(LWiBZXPM@dKp{pkYmcC#*yro?)*9edK zVWaGaPG$o`>-xjb%{5;*KMeV{JyF-o8&%&{`CfS(N-lK0JgBt&WRk;13tcbYue1lr zB$vvUtdGQ>D?iFX;ELDFfia4QMGF)yP`CvOxL%%kbbQs>LS#;Y*FK>0Yjx6CvP$cb zA{Mw_wuyUK`JpQ(^Y!v!f9(cOukEVvh3Wrx4kRWt()ue}}G@!QgtC zYuHk84OVwdns!;&%d9~-(}Oj7*z-uUz02YL8gJsd{OJ054tP|Tn_zH_*Rfa6aQN%O zOg#d?+2DG4R@cj5aJ@Vvj01TvOb@QjclzsP*0r4?LtvD04aha4aDw8FISet<*UL?} zYwtmvB;hHNS}%W%=VUM}%2kj!>;V7rr%AwdD2{yy^eNjdyZ*kDS?n5WK45qdHiMqyox2`I0)W4m&!koXlJpTG}MEb%X%VcNlV0L$P(tVX5e0J4X#`R^h zA14d7$y53Il0JO@(>ot;Ro%| zgE@}*ZJWOq%9>k3tT>tD-1l-~&2eBb$1(5J-R1U64dcdVf8su53A5(7GT#wR59YTS zUzasuq5jzB1?EzssLP1It^CoJL_gMi@lcKKU57%894Gg^ zGxC6OhCJhhYpDx9^`~>=JR^G&mE0?py?0-?HSSYb|JznKH(zv1Uod?$>E1Z^)t~%5 zsSfQ!T_=B=_NF?586&+PH7k9YFX}a3u*00)y#d-^`q@?O54rs)`z{FA;d^|aTc}N* z%JT(WGFBrqy<73yO`rPZ@0UTl0d@)6$oaw<_(IX7vY;NG#oW(IO zHR&B=U7I(s-Znk#F!){&-^3fdKNllo^A^YEPPGGtlX~A64EXNk_Z$Y_*x|c2d;Gpw z7DgC1;P=)lg)#6`hr#|Fdr2F9ZELLPx$#!_C*S>h&Iv<|S+57P%50!VBppV*9wi9M zeLA`~*-{`3G0Md0%pPTr%-4l_l*^{{Bg065{GSk`++#E;V|jpKI`Exb%m3;-AHE6* zLW|>k(D#paj)VR|n;n)OtcTW)PapdIUq^;;6$%E9{h0&)-1-N7w92mqsq9Hk!=)cq z>0Pg?@}^d_I;zZTk0)?dxxAt7Te@2$RkG1kL?Hj~Rb%deBGvJ%*JTh|JZG z`V!BWn?w;gFj&{vs~mVR7b|K}H|XoUUOC?%tZCTP3715S%e0#cjRweIiuehzR5k7 z+*Q(ec!{1d6~>s&=a#{Tq?N9B+~vgqe#OJN*kw^W-{mtapf7P|c&nSlLjt+}-CL7% z^t$xJQMB%N+Z}^0J{)?=cdd#8eneSjP`-u1* z80=-Y3xnss7Q!$+*f+n+?`5;D-KD*3FxboHxv%}g0VB(W80o$2b-$zXh104wJG^;I zvIlj2z{lpVJ4zzjBkgQ2d$E0M-dB%Q&TC?)&7MDy-U3VWwsng8YH4A-&FG`YxBZ4Rkx+#vVVs&1_)3X85jb-nP;A&lAPlAX2UJpODAp z<8AjU{c}mKyoSW*76O z2Wxbt$H>Rq;D<*7-gZR14GehOq~zgK)MGK;HWTo+8SyqS;B7U1?m2{oFpP7-5%+rD z1~1tw-UbG|jpq;AgabyF3o+8X?a)WXfyGHGeVeTpz`Fw8X8f2M(jIA7C~xEYLPOH` z8$Wj1H1uqVpC_<1Z#!3U-(6i8Z{zwV%Pp6;(I5K%NzdIYMBjv{c;413eV5DIc6{3L zwocg?-exwiUNduZHg7v3IqG+!cpJRBRlZ9emyfsYQ#yNYIL5+4`)!|B+84+qm&#{D zG`Zd#PIAouDekw;+oE_>v_R1UORzuzysiAbe-u7LVtOa`KaNM!2appw7S0dJcYZvz9~ zc0?HLxsfRg!}Ne7_IlpNK5nmg8yN65_S)+2br|5JU5Jt9ZF@hdx`>mEiTBOw+v@8j z{QiKq89zol+9U1YZ6kN;*%#@OQ@bCP9{cw@T^8Ge zvbY>;5YF^qjqddr`M4aMaXR2~)8cYqz~y%Sh1-V%H;adbaZ>@8n-Z4;11>ip4EEs` z!f-4{&#+04dpwt8UAsqI4h*;)`)@PC0VB(W7-=ro{KqO^oTS&c*?Ix|cEII~GgCv_ zBkc;^gX8R2*&vB#U;GZtM2iLmT$7#G0>{VyEaz#?gQh6KwVRut5?ox=pA#a%b4E0^T+y-UbG|t?F;w zJ{%IZo`)D=++@JpCdJ#pfVb@s2K#UeVVE9p#LoqLaGw)z0|Va1{#(Cr!m`8T5F^do z%0D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

%zSu=>(*6P>Ed-ep6F<1~| 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 literal 0 HcmV?d00001 diff --git a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.cpp b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.cpp index 6c33741..87462f1 100644 --- a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.cpp +++ b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.cpp @@ -8,7 +8,6 @@ #include "StdAfx.h" #include "ModbusProtocolAddOn.h" -#include "ModbusProtocol.h" //////////////////////////////////////////////////////////////////////// // @@ -25,6 +24,7 @@ ModbusProtocolAddOn *ModbusProtocolAddOn::sInstance = NULL; ModbusProtocolAddOn::ModbusProtocolAddOn() { sInstance = this; + this->sProtocol = NULL; } //---------------------------------------------------------------------- @@ -51,7 +51,9 @@ VDEF ModbusProtocolAddOn::CreateProtocol( const char /*in*/ *protocolSymbol, NIP if (protocol == 0) return NIPB::kInvalidArg; if (protocolSymbol == 0) return NIPB::kInvalidArg; - *protocol = new ModbusProtocol(); + if (this->sProtocol == 0) + this->sProtocol = new ModbusProtocol(); + *protocol = this->sProtocol; return NIPB::kOK; } diff --git a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.h b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.h index 511a37f..aa36f5b 100644 --- a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.h +++ b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolAddOn.h @@ -7,6 +7,7 @@ ------------------------------------------------------------------- */ #pragma once +#include "ModbusProtocol.h" //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// @@ -46,6 +47,7 @@ public: // private: static ModbusProtocolAddOn *sInstance; + ModbusProtocol *sProtocol; }; //////////////////////////////////////////////////////////////////////// diff --git a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolDLL.cpp b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolDLL.cpp index cfc023a..c29b713 100644 --- a/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolDLL.cpp +++ b/Modbus-DLL/include/ModbusProtocolDLL/ModbusProtocolDLL.cpp @@ -9,6 +9,8 @@ #include "StdAfx.h" #include "ModbusProtocolDLL.h" #include "ModbusProtocolAddOn.h" +#include "ModbusProtocol.h" +#include //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// @@ -26,15 +28,29 @@ STDAPI DllRegisterAddOn( NIPB::IAddOnRegistrar* registrar ) return E_INVALIDARG; } + std::ofstream log; + log.open("log.txt", std::ofstream::out); // // register the signal protocol at the IPB Packet Lib. For the protocol - // UDP with source port 40002 is used. + // UDP is used. // - if (registrar->RegisterProtocol( "modbus", new ModbusProtocolAddOn(), "udp", 40002, 0xFFFFFFFF ) != NIPB::kOK) + ModbusProtocolAddOn *mbpao = new ModbusProtocolAddOn(); + if (registrar->RegisterProtocol( "modbus", mbpao, "udp", ModbusProtocol::kServerPort, 0xFFFFFFFF ) != NIPB::kOK) { - ModbusProtocolAddOn::Instance().Release(); + log << "Could not register UDP 502 -> 50002\n"; + log.close(); + mbpao->Release(); return NIPB::kError; } + /*if (registrar->RegisterProtocol( "modbus", mbpao, "udp", 0xFFFFFFFF, ModbusProtocol::kServerPort ) != NIPB::kOK) + { + log << "Could not register UDP 50002 -> 502\n"; + log.close(); + mbpao->Release(); + return NIPB::kError; + }*/ + log << "Registered Modbus for UDP\n"; + log.close(); return S_OK; } diff --git a/Modbus-DLL/include/SysVars/generated.vsysvar b/Modbus-DLL/include/SysVars/generated.vsysvar index f32d34c..859312d 100644 --- a/Modbus-DLL/include/SysVars/generated.vsysvar +++ b/Modbus-DLL/include/SysVars/generated.vsysvar @@ -1,6 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11,34 +40,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/Modbus-DLL/log.txt b/Modbus-DLL/log.txt new file mode 100644 index 0000000..323b995 --- /dev/null +++ b/Modbus-DLL/log.txt @@ -0,0 +1,45 @@ +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 01 00 00 00 06 ff 01 00 00 00 00 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 9 + Data = 00 01 00 00 00 03 ff 81 03 + --> byteOffset = 50, byteLength = 1 + --> ContentId = 1020081. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 01 00 00 00 06 ff 01 00 00 00 00 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 9 + Data = 00 01 00 00 00 03 ff 81 03 + --> byteOffset = 50, byteLength = 1 + --> ContentId = 1020081. + +CompleteProtocol: Modbus->bitLength = 32, --> Length = 6. +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 02 00 00 00 06 ff 01 00 00 00 00 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 9 + Data = 00 02 00 00 00 03 ff 81 03 + --> byteOffset = 50, byteLength = 1 + --> ContentId = 1020081. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 12 + Data = 00 02 00 00 00 06 ff 01 00 00 00 00 + --> byteOffset = 50, byteLength = 4 + --> ContentId = 1020001. + +ParsePacket topProtocolToken->tokenId = 352 byteOffset = 42, byteLength = 9 + Data = 00 02 00 00 00 03 ff 81 03 + --> byteOffset = 50, byteLength = 1 + --> ContentId = 1020081. +