From ca030c8f59f5cac50fd8d26ee376727df2f1f86d Mon Sep 17 00:00:00 2001 From: "parallelbgls@outlook.com" Date: Wed, 27 Aug 2014 15:57:25 +0800 Subject: [PATCH] 2014-08-27 update 1 --- .../ModBus.Net.Modeling.modelproj | 39 - .../ModelDefinition/ModBus.Net.Modeling.uml | 60 - .../ModelDefinition/Package1_1514.uml | 1947 ----------------- .../ModelDefinition/Package2_1514.uml | 176 -- .../ModelDefinition/Package_1514.uml | 21 - .../ReverseEngineering.Log.xml | 39 - NA200H/ModBus.Net/CRC16.cs | 608 +++++ NA200H/ModBus.Net/ComConnector.cs | 311 +++ NA200H/ModBus.Net/ComProtocalLinker.cs | 22 + .../ConfigurationManager.Designer.cs | 9 + NA200H/ModBus.Net/ConfigurationManager.resx | 3 + NA200H/ModBus.Net/Connector.cs | 16 + NA200H/ModBus.Net/ModBus.Net.csproj | 13 +- NA200H/ModBus.Net/ModbusComProtocal.cs | 21 + NA200H/ModBus.Net/ModbusComProtocalLinker.cs | 34 + NA200H/ModBus.Net/ModbusProtocal.cs | 32 + NA200H/ModBus.Net/ModbusTCPProtocal.cs | 4 +- NA200H/ModBus.Net/ModbusTcpProtocalLinker.cs | 8 +- NA200H/ModBus.Net/ProtocalLinker.cs | 17 +- .../ModBus.Net/ProtocalLinkerBytesExtend.cs | 22 + NA200H/ModBus.Net/TCPProtocalLinker.cs | 54 +- NA200H/ModBus.Net/TCPSocket.cs | 14 +- NA200H/NA200H.UI.Console/Program.cs | 52 +- NA200H/NA200H.sln | 8 +- 24 files changed, 1159 insertions(+), 2371 deletions(-) delete mode 100644 NA200H/ModBus.Net.Modeling/ModBus.Net.Modeling.modelproj delete mode 100644 NA200H/ModBus.Net.Modeling/ModelDefinition/ModBus.Net.Modeling.uml delete mode 100644 NA200H/ModBus.Net.Modeling/ModelDefinition/Package1_1514.uml delete mode 100644 NA200H/ModBus.Net.Modeling/ModelDefinition/Package2_1514.uml delete mode 100644 NA200H/ModBus.Net.Modeling/ModelDefinition/Package_1514.uml delete mode 100644 NA200H/ModBus.Net.Modeling/ReverseEngineering.Log.xml create mode 100644 NA200H/ModBus.Net/CRC16.cs create mode 100644 NA200H/ModBus.Net/ComConnector.cs create mode 100644 NA200H/ModBus.Net/ComProtocalLinker.cs create mode 100644 NA200H/ModBus.Net/Connector.cs create mode 100644 NA200H/ModBus.Net/ModbusComProtocal.cs create mode 100644 NA200H/ModBus.Net/ModbusComProtocalLinker.cs diff --git a/NA200H/ModBus.Net.Modeling/ModBus.Net.Modeling.modelproj b/NA200H/ModBus.Net.Modeling/ModBus.Net.Modeling.modelproj deleted file mode 100644 index a99bd60..0000000 --- a/NA200H/ModBus.Net.Modeling/ModBus.Net.Modeling.modelproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - {fa929e21-544c-444e-b18d-184e98b427c6} - 2.0.0.0 - ModBus.Net.Modeling - ModBus.Net.Modeling - - - bin\Debug\ - - - bin\Release\ - - - 10.0 - $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - - Content - - - Content - - - Content - - - - Content - - - \ No newline at end of file diff --git a/NA200H/ModBus.Net.Modeling/ModelDefinition/ModBus.Net.Modeling.uml b/NA200H/ModBus.Net.Modeling/ModelDefinition/ModBus.Net.Modeling.uml deleted file mode 100644 index ccfa9f7..0000000 --- a/NA200H/ModBus.Net.Modeling/ModelDefinition/ModBus.Net.Modeling.uml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NA200H/ModBus.Net.Modeling/ModelDefinition/Package1_1514.uml b/NA200H/ModBus.Net.Modeling/ModelDefinition/Package1_1514.uml deleted file mode 100644 index ef05f6d..0000000 --- a/NA200H/ModBus.Net.Modeling/ModelDefinition/Package1_1514.uml +++ /dev/null @@ -1,1947 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 属性 Logger 引用类型 ILog。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NA200H/ModBus.Net.Modeling/ModelDefinition/Package2_1514.uml b/NA200H/ModBus.Net.Modeling/ModelDefinition/Package2_1514.uml deleted file mode 100644 index a9b551f..0000000 --- a/NA200H/ModBus.Net.Modeling/ModelDefinition/Package2_1514.uml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NA200H/ModBus.Net.Modeling/ModelDefinition/Package_1514.uml b/NA200H/ModBus.Net.Modeling/ModelDefinition/Package_1514.uml deleted file mode 100644 index 8dd292b..0000000 --- a/NA200H/ModBus.Net.Modeling/ModelDefinition/Package_1514.uml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/NA200H/ModBus.Net.Modeling/ReverseEngineering.Log.xml b/NA200H/ModBus.Net.Modeling/ReverseEngineering.Log.xml deleted file mode 100644 index 824fd84..0000000 --- a/NA200H/ModBus.Net.Modeling/ReverseEngineering.Log.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NA200H/ModBus.Net/CRC16.cs b/NA200H/ModBus.Net/CRC16.cs new file mode 100644 index 0000000..ec84f6d --- /dev/null +++ b/NA200H/ModBus.Net/CRC16.cs @@ -0,0 +1,608 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ModBus.Net +{ + public class Crc16 + { + /// + /// CRC验证表 + /// + public byte[] crc_table = new byte[512]; + + private static Crc16 _crc16 = null; + + public static Crc16 GetInstance() + { + if (_crc16 == null) + { + _crc16 = new Crc16(); + } + return _crc16; + } + + private Crc16() + { + crc_table[0] = 0x0; + crc_table[1] = 0xC1; + crc_table[2] = 0x81; + crc_table[3] = 0x40; + crc_table[4] = 0x1; + crc_table[5] = 0xC0; + crc_table[6] = 0x80; + crc_table[7] = 0x41; + crc_table[8] = 0x1; + crc_table[9] = 0xC0; + crc_table[10] = 0x80; + crc_table[11] = 0x41; + crc_table[12] = 0x0; + crc_table[13] = 0xC1; + crc_table[14] = 0x81; + crc_table[15] = 0x40; + crc_table[16] = 0x1; + crc_table[17] = 0xC0; + crc_table[18] = 0x80; + crc_table[19] = 0x41; + crc_table[20] = 0x0; + crc_table[21] = 0xC1; + crc_table[22] = 0x81; + crc_table[23] = 0x40; + crc_table[24] = 0x0; + crc_table[25] = 0xC1; + crc_table[26] = 0x81; + crc_table[27] = 0x40; + crc_table[28] = 0x1; + crc_table[29] = 0xC0; + crc_table[30] = 0x80; + crc_table[31] = 0x41; + crc_table[32] = 0x1; + crc_table[33] = 0xC0; + crc_table[34] = 0x80; + crc_table[35] = 0x41; + crc_table[36] = 0x0; + crc_table[37] = 0xC1; + crc_table[38] = 0x81; + crc_table[39] = 0x40; + crc_table[40] = 0x0; + crc_table[41] = 0xC1; + crc_table[42] = 0x81; + crc_table[43] = 0x40; + crc_table[44] = 0x1; + crc_table[45] = 0xC0; + crc_table[46] = 0x80; + crc_table[47] = 0x41; + crc_table[48] = 0x0; + crc_table[49] = 0xC1; + crc_table[50] = 0x81; + crc_table[51] = 0x40; + crc_table[52] = 0x1; + crc_table[53] = 0xC0; + crc_table[54] = 0x80; + crc_table[55] = 0x41; + crc_table[56] = 0x1; + crc_table[57] = 0xC0; + crc_table[58] = 0x80; + crc_table[59] = 0x41; + crc_table[60] = 0x0; + crc_table[61] = 0xC1; + crc_table[62] = 0x81; + crc_table[63] = 0x40; + crc_table[64] = 0x1; + crc_table[65] = 0xC0; + crc_table[66] = 0x80; + crc_table[67] = 0x41; + crc_table[68] = 0x0; + crc_table[69] = 0xC1; + crc_table[70] = 0x81; + crc_table[71] = 0x40; + crc_table[72] = 0x0; + crc_table[73] = 0xC1; + crc_table[74] = 0x81; + crc_table[75] = 0x40; + crc_table[76] = 0x1; + crc_table[77] = 0xC0; + crc_table[78] = 0x80; + crc_table[79] = 0x41; + crc_table[80] = 0x0; + crc_table[81] = 0xC1; + crc_table[82] = 0x81; + crc_table[83] = 0x40; + crc_table[84] = 0x1; + crc_table[85] = 0xC0; + crc_table[86] = 0x80; + crc_table[87] = 0x41; + crc_table[88] = 0x1; + crc_table[89] = 0xC0; + crc_table[90] = 0x80; + crc_table[91] = 0x41; + crc_table[92] = 0x0; + crc_table[93] = 0xC1; + crc_table[94] = 0x81; + crc_table[95] = 0x40; + crc_table[96] = 0x0; + crc_table[97] = 0xC1; + crc_table[98] = 0x81; + crc_table[99] = 0x40; + crc_table[100] = 0x1; + crc_table[101] = 0xC0; + crc_table[102] = 0x80; + crc_table[103] = 0x41; + crc_table[104] = 0x1; + crc_table[105] = 0xC0; + crc_table[106] = 0x80; + crc_table[107] = 0x41; + crc_table[108] = 0x0; + crc_table[109] = 0xC1; + crc_table[110] = 0x81; + crc_table[111] = 0x40; + crc_table[112] = 0x1; + crc_table[113] = 0xC0; + crc_table[114] = 0x80; + crc_table[115] = 0x41; + crc_table[116] = 0x0; + crc_table[117] = 0xC1; + crc_table[118] = 0x81; + crc_table[119] = 0x40; + crc_table[120] = 0x0; + crc_table[121] = 0xC1; + crc_table[122] = 0x81; + crc_table[123] = 0x40; + crc_table[124] = 0x1; + crc_table[125] = 0xC0; + crc_table[126] = 0x80; + crc_table[127] = 0x41; + crc_table[128] = 0x1; + crc_table[129] = 0xC0; + crc_table[130] = 0x80; + crc_table[131] = 0x41; + crc_table[132] = 0x0; + crc_table[133] = 0xC1; + crc_table[134] = 0x81; + crc_table[135] = 0x40; + crc_table[136] = 0x0; + crc_table[137] = 0xC1; + crc_table[138] = 0x81; + crc_table[139] = 0x40; + crc_table[140] = 0x1; + crc_table[141] = 0xC0; + crc_table[142] = 0x80; + crc_table[143] = 0x41; + crc_table[144] = 0x0; + crc_table[145] = 0xC1; + crc_table[146] = 0x81; + crc_table[147] = 0x40; + crc_table[148] = 0x1; + crc_table[149] = 0xC0; + crc_table[150] = 0x80; + crc_table[151] = 0x41; + crc_table[152] = 0x1; + crc_table[153] = 0xC0; + crc_table[154] = 0x80; + crc_table[155] = 0x41; + crc_table[156] = 0x0; + crc_table[157] = 0xC1; + crc_table[158] = 0x81; + crc_table[159] = 0x40; + crc_table[160] = 0x0; + crc_table[161] = 0xC1; + crc_table[162] = 0x81; + crc_table[163] = 0x40; + crc_table[164] = 0x1; + crc_table[165] = 0xC0; + crc_table[166] = 0x80; + crc_table[167] = 0x41; + crc_table[168] = 0x1; + crc_table[169] = 0xC0; + crc_table[170] = 0x80; + crc_table[171] = 0x41; + crc_table[172] = 0x0; + crc_table[173] = 0xC1; + crc_table[174] = 0x81; + crc_table[175] = 0x40; + crc_table[176] = 0x1; + crc_table[177] = 0xC0; + crc_table[178] = 0x80; + crc_table[179] = 0x41; + crc_table[180] = 0x0; + crc_table[181] = 0xC1; + crc_table[182] = 0x81; + crc_table[183] = 0x40; + crc_table[184] = 0x0; + crc_table[185] = 0xC1; + crc_table[186] = 0x81; + crc_table[187] = 0x40; + crc_table[188] = 0x1; + crc_table[189] = 0xC0; + crc_table[190] = 0x80; + crc_table[191] = 0x41; + crc_table[192] = 0x0; + crc_table[193] = 0xC1; + crc_table[194] = 0x81; + crc_table[195] = 0x40; + crc_table[196] = 0x1; + crc_table[197] = 0xC0; + crc_table[198] = 0x80; + crc_table[199] = 0x41; + crc_table[200] = 0x1; + crc_table[201] = 0xC0; + crc_table[202] = 0x80; + crc_table[203] = 0x41; + crc_table[204] = 0x0; + crc_table[205] = 0xC1; + crc_table[206] = 0x81; + crc_table[207] = 0x40; + crc_table[208] = 0x1; + crc_table[209] = 0xC0; + crc_table[210] = 0x80; + crc_table[211] = 0x41; + crc_table[212] = 0x0; + crc_table[213] = 0xC1; + crc_table[214] = 0x81; + crc_table[215] = 0x40; + crc_table[216] = 0x0; + crc_table[217] = 0xC1; + crc_table[218] = 0x81; + crc_table[219] = 0x40; + crc_table[220] = 0x1; + crc_table[221] = 0xC0; + crc_table[222] = 0x80; + crc_table[223] = 0x41; + crc_table[224] = 0x1; + crc_table[225] = 0xC0; + crc_table[226] = 0x80; + crc_table[227] = 0x41; + crc_table[228] = 0x0; + crc_table[229] = 0xC1; + crc_table[230] = 0x81; + crc_table[231] = 0x40; + crc_table[232] = 0x0; + crc_table[233] = 0xC1; + crc_table[234] = 0x81; + crc_table[235] = 0x40; + crc_table[236] = 0x1; + crc_table[237] = 0xC0; + crc_table[238] = 0x80; + crc_table[239] = 0x41; + crc_table[240] = 0x0; + crc_table[241] = 0xC1; + crc_table[242] = 0x81; + crc_table[243] = 0x40; + crc_table[244] = 0x1; + crc_table[245] = 0xC0; + crc_table[246] = 0x80; + crc_table[247] = 0x41; + crc_table[248] = 0x1; + crc_table[249] = 0xC0; + crc_table[250] = 0x80; + crc_table[251] = 0x41; + crc_table[252] = 0x0; + crc_table[253] = 0xC1; + crc_table[254] = 0x81; + crc_table[255] = 0x40; + crc_table[256] = 0x0; + crc_table[257] = 0xC0; + crc_table[258] = 0xC1; + crc_table[259] = 0x1; + crc_table[260] = 0xC3; + crc_table[261] = 0x3; + crc_table[262] = 0x2; + crc_table[263] = 0xC2; + crc_table[264] = 0xC6; + crc_table[265] = 0x6; + crc_table[266] = 0x7; + crc_table[267] = 0xC7; + crc_table[268] = 0x5; + crc_table[269] = 0xC5; + crc_table[270] = 0xC4; + crc_table[271] = 0x4; + crc_table[272] = 0xCC; + crc_table[273] = 0xC; + crc_table[274] = 0xD; + crc_table[275] = 0xCD; + crc_table[276] = 0xF; + crc_table[277] = 0xCF; + crc_table[278] = 0xCE; + crc_table[279] = 0xE; + crc_table[280] = 0xA; + crc_table[281] = 0xCA; + crc_table[282] = 0xCB; + crc_table[283] = 0xB; + crc_table[284] = 0xC9; + crc_table[285] = 0x9; + crc_table[286] = 0x8; + crc_table[287] = 0xC8; + crc_table[288] = 0xD8; + crc_table[289] = 0x18; + crc_table[290] = 0x19; + crc_table[291] = 0xD9; + crc_table[292] = 0x1B; + crc_table[293] = 0xDB; + crc_table[294] = 0xDA; + crc_table[295] = 0x1A; + crc_table[296] = 0x1E; + crc_table[297] = 0xDE; + crc_table[298] = 0xDF; + crc_table[299] = 0x1F; + crc_table[300] = 0xDD; + crc_table[301] = 0x1D; + crc_table[302] = 0x1C; + crc_table[303] = 0xDC; + crc_table[304] = 0x14; + crc_table[305] = 0xD4; + crc_table[306] = 0xD5; + crc_table[307] = 0x15; + crc_table[308] = 0xD7; + crc_table[309] = 0x17; + crc_table[310] = 0x16; + crc_table[311] = 0xD6; + crc_table[312] = 0xD2; + crc_table[313] = 0x12; + crc_table[314] = 0x13; + crc_table[315] = 0xD3; + crc_table[316] = 0x11; + crc_table[317] = 0xD1; + crc_table[318] = 0xD0; + crc_table[319] = 0x10; + crc_table[320] = 0xF0; + crc_table[321] = 0x30; + crc_table[322] = 0x31; + crc_table[323] = 0xF1; + crc_table[324] = 0x33; + crc_table[325] = 0xF3; + crc_table[326] = 0xF2; + crc_table[327] = 0x32; + crc_table[328] = 0x36; + crc_table[329] = 0xF6; + crc_table[330] = 0xF7; + crc_table[331] = 0x37; + crc_table[332] = 0xF5; + crc_table[333] = 0x35; + crc_table[334] = 0x34; + crc_table[335] = 0xF4; + crc_table[336] = 0x3C; + crc_table[337] = 0xFC; + crc_table[338] = 0xFD; + crc_table[339] = 0x3D; + crc_table[340] = 0xFF; + crc_table[341] = 0x3F; + crc_table[342] = 0x3E; + crc_table[343] = 0xFE; + crc_table[344] = 0xFA; + crc_table[345] = 0x3A; + crc_table[346] = 0x3B; + crc_table[347] = 0xFB; + crc_table[348] = 0x39; + crc_table[349] = 0xF9; + crc_table[350] = 0xF8; + crc_table[351] = 0x38; + crc_table[352] = 0x28; + crc_table[353] = 0xE8; + crc_table[354] = 0xE9; + crc_table[355] = 0x29; + crc_table[356] = 0xEB; + crc_table[357] = 0x2B; + crc_table[358] = 0x2A; + crc_table[359] = 0xEA; + crc_table[360] = 0xEE; + crc_table[361] = 0x2E; + crc_table[362] = 0x2F; + crc_table[363] = 0xEF; + crc_table[364] = 0x2D; + crc_table[365] = 0xED; + crc_table[366] = 0xEC; + crc_table[367] = 0x2C; + crc_table[368] = 0xE4; + crc_table[369] = 0x24; + crc_table[370] = 0x25; + crc_table[371] = 0xE5; + crc_table[372] = 0x27; + crc_table[373] = 0xE7; + crc_table[374] = 0xE6; + crc_table[375] = 0x26; + crc_table[376] = 0x22; + crc_table[377] = 0xE2; + crc_table[378] = 0xE3; + crc_table[379] = 0x23; + crc_table[380] = 0xE1; + crc_table[381] = 0x21; + crc_table[382] = 0x20; + crc_table[383] = 0xE0; + crc_table[384] = 0xA0; + crc_table[385] = 0x60; + crc_table[386] = 0x61; + crc_table[387] = 0xA1; + crc_table[388] = 0x63; + crc_table[389] = 0xA3; + crc_table[390] = 0xA2; + crc_table[391] = 0x62; + crc_table[392] = 0x66; + crc_table[393] = 0xA6; + crc_table[394] = 0xA7; + crc_table[395] = 0x67; + crc_table[396] = 0xA5; + crc_table[397] = 0x65; + crc_table[398] = 0x64; + crc_table[399] = 0xA4; + crc_table[400] = 0x6C; + crc_table[401] = 0xAC; + crc_table[402] = 0xAD; + crc_table[403] = 0x6D; + crc_table[404] = 0xAF; + crc_table[405] = 0x6F; + crc_table[406] = 0x6E; + crc_table[407] = 0xAE; + crc_table[408] = 0xAA; + crc_table[409] = 0x6A; + crc_table[410] = 0x6B; + crc_table[411] = 0xAB; + crc_table[412] = 0x69; + crc_table[413] = 0xA9; + crc_table[414] = 0xA8; + crc_table[415] = 0x68; + crc_table[416] = 0x78; + crc_table[417] = 0xB8; + crc_table[418] = 0xB9; + crc_table[419] = 0x79; + crc_table[420] = 0xBB; + crc_table[421] = 0x7B; + crc_table[422] = 0x7A; + crc_table[423] = 0xBA; + crc_table[424] = 0xBE; + crc_table[425] = 0x7E; + crc_table[426] = 0x7F; + crc_table[427] = 0xBF; + crc_table[428] = 0x7D; + crc_table[429] = 0xBD; + crc_table[430] = 0xBC; + crc_table[431] = 0x7C; + crc_table[432] = 0xB4; + crc_table[433] = 0x74; + crc_table[434] = 0x75; + crc_table[435] = 0xB5; + crc_table[436] = 0x77; + crc_table[437] = 0xB7; + crc_table[438] = 0xB6; + crc_table[439] = 0x76; + crc_table[440] = 0x72; + crc_table[441] = 0xB2; + crc_table[442] = 0xB3; + crc_table[443] = 0x73; + crc_table[444] = 0xB1; + crc_table[445] = 0x71; + crc_table[446] = 0x70; + crc_table[447] = 0xB0; + crc_table[448] = 0x50; + crc_table[449] = 0x90; + crc_table[450] = 0x91; + crc_table[451] = 0x51; + crc_table[452] = 0x93; + crc_table[453] = 0x53; + crc_table[454] = 0x52; + crc_table[455] = 0x92; + crc_table[456] = 0x96; + crc_table[457] = 0x56; + crc_table[458] = 0x57; + crc_table[459] = 0x97; + crc_table[460] = 0x55; + crc_table[461] = 0x95; + crc_table[462] = 0x94; + crc_table[463] = 0x54; + crc_table[464] = 0x9C; + crc_table[465] = 0x5C; + crc_table[466] = 0x5D; + crc_table[467] = 0x9D; + crc_table[468] = 0x5F; + crc_table[469] = 0x9F; + crc_table[470] = 0x9E; + crc_table[471] = 0x5E; + crc_table[472] = 0x5A; + crc_table[473] = 0x9A; + crc_table[474] = 0x9B; + crc_table[475] = 0x5B; + crc_table[476] = 0x99; + crc_table[477] = 0x59; + crc_table[478] = 0x58; + crc_table[479] = 0x98; + crc_table[480] = 0x88; + crc_table[481] = 0x48; + crc_table[482] = 0x49; + crc_table[483] = 0x89; + crc_table[484] = 0x4B; + crc_table[485] = 0x8B; + crc_table[486] = 0x8A; + crc_table[487] = 0x4A; + crc_table[488] = 0x4E; + crc_table[489] = 0x8E; + crc_table[490] = 0x8F; + crc_table[491] = 0x4F; + crc_table[492] = 0x8D; + crc_table[493] = 0x4D; + crc_table[494] = 0x4C; + crc_table[495] = 0x8C; + crc_table[496] = 0x44; + crc_table[497] = 0x84; + crc_table[498] = 0x85; + crc_table[499] = 0x45; + crc_table[500] = 0x87; + crc_table[501] = 0x47; + crc_table[502] = 0x46; + crc_table[503] = 0x86; + crc_table[504] = 0x82; + crc_table[505] = 0x42; + crc_table[506] = 0x43; + crc_table[507] = 0x83; + crc_table[508] = 0x41; + crc_table[509] = 0x81; + crc_table[510] = 0x80; + crc_table[511] = 0x40; + } + + #region 生成CRC码 + + /// + /// 生成CRC码 + /// + /// 发送或返回的命令,CRC码除外 + /// 生成的CRC码 + public short GetCRC(byte[] message, ref byte[] Rcvbuf) + { + int IX,IY,CRC; + int Len = message.Length; + CRC=0xFFFF; + //set all 1 + if (Len<=0) + CRC = 0; + else + { + Len--; + for (IX=0;IX<=Len;IX++) + { + CRC=CRC^(message[IX]); + for(IY=0;IY<=7;IY++) + { + if ((CRC&1)!=0 ) + CRC=(CRC>>1)^0xA001; + else + CRC=CRC>>1; + // + } + } + } + Rcvbuf[1] = (byte)((CRC & 0xff00)>>8);//高位置 + Rcvbuf[0] = (byte)(CRC & 0x00ff); //低位置 + CRC= Rcvbuf[0]<<8; + CRC+= Rcvbuf[1]; + return (short)CRC; + } + + #endregion + + #region CRC验证 + + /// + /// CRC校验 + /// + /// ST开头,&&结尾 + /// 十六进制数 + public bool CrcEfficacy(byte[] byteframe) + { + byte[] recvbuff = new byte[2]; + byte[] byteArr = new byte[byteframe.Length - 2]; + Array.Copy(byteframe, 0, byteArr, 0, byteArr.Length); + GetCRC(byteArr, ref recvbuff); + if (recvbuff[0] == byteframe[byteframe.Length - 2] && recvbuff[1] == byteframe[byteframe.Length - 1]) + { + return true; + } + else + { + return false; + } + } + + #endregion + } +} diff --git a/NA200H/ModBus.Net/ComConnector.cs b/NA200H/ModBus.Net/ComConnector.cs new file mode 100644 index 0000000..5840324 --- /dev/null +++ b/NA200H/ModBus.Net/ComConnector.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ModBus.Net +{ + public class ComConnector : Connector, IDisposable + { + private SerialPort serialPort1 = new SerialPort(); + + public delegate byte[] getDate(byte[] bts); + + private getDate mygetDate; + private string com; + + public ComConnector(string com) + { + this.com = com; + serialPort1.PortName = com; //端口号 + serialPort1.BaudRate = 9600; //比特率 + serialPort1.Parity = Parity.None; //奇偶校验 + serialPort1.StopBits = StopBits.One; //停止位 + serialPort1.DataBits = 8; + serialPort1.ReadTimeout = 1000; //读超时,即在1000内未读到数据就引起超时异常 + } + + #region 发送接收数据 + + public override bool Connect() + { + if (serialPort1 != null) + { + try + { + serialPort1.Open(); + return true; + } + catch + { + return false; + } + } + return false; + } + + public override bool Disconnect() + { + if (serialPort1 != null) + { + try + { + serialPort1.Close(); + return true; + } + catch + { + return false; + } + } + return false; + } + + public void SendMsg(string senStr) + { + byte[] myByte = StringToByte_2(senStr); + + SendMsg(myByte); + + } + + public override byte[] SendMsg(byte[] sendbytes) + { + try + { + if (!serialPort1.IsOpen) + { + serialPort1.Open(); + } + serialPort1.Write(sendbytes, 0, sendbytes.Length); + return ReadMsg(); + } + catch + { + return null; + } + } + + public override bool SendMsgWithoutReturn(byte[] sendbytes) + { + try + { + serialPort1.Write(sendbytes, 0, sendbytes.Length); + return true; + } + catch (Exception) + { + return false; + } + + } + + public string ReadMsgStr() + { + string rd = ""; + + byte[] data = ReadMsg(); + + rd = ByteToString(data); + return rd; + + } + + public byte[] ReadMsg() + { + if (!serialPort1.IsOpen) + { + serialPort1.Open(); + } + + byte[] data = new byte[200]; + int i = serialPort1.Read(data, 0, serialPort1.BytesToRead); + byte[] returndata = new byte[i]; + Array.Copy(data, 0, returndata, 0, i); + serialPort1.Close(); + return returndata; + + } + + #endregion + + /// + /// 串口读(非阻塞方式读串口,直到串口缓冲区中没有数据 + /// + /// 串口数据缓冲 + /// 串口数据缓冲空间大小 + /// 设置串口读放弃时间 + /// 字节间隔最大时间 + /// 串口实际读入数据个数 + public int ReadComm(out Byte[] readBuf, int bufRoom, int HowTime, int ByteTime) + { + //throw new System.NotImplementedException(); + readBuf = new Byte[64]; + Array.Clear(readBuf, 0, readBuf.Length); + + int nReadLen, nBytelen; + if (serialPort1.IsOpen == false) + return -1; + nBytelen = 0; + serialPort1.ReadTimeout = HowTime; + + + try + { + readBuf[nBytelen] = (byte) serialPort1.ReadByte(); + byte[] bTmp = new byte[1023]; + Array.Clear(bTmp, 0, bTmp.Length); + + nReadLen = ReadBlock(out bTmp, bufRoom - 1, ByteTime); + + if (nReadLen > 0) + { + Array.Copy(bTmp, 0, readBuf, 1, nReadLen); + nBytelen = 1 + nReadLen; + + } + + else if (nReadLen == 0) + nBytelen = 1; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + + } + + return nBytelen; + } + + /// + /// 串口同步读(阻塞方式读串口,直到串口缓冲区中没有数据,靠字符间间隔超时确定没有数据) + /// + /// 串口数据缓冲 + /// 串口数据缓冲空间大小 + /// 字节间隔最大时间 + /// 从串口实际读入的字节个数 + public int ReadBlock(out byte[] ReadBuf, int ReadRoom, int ByteTime) + { + //throw new System.NotImplementedException(); + ReadBuf = new byte[1024]; + Array.Clear(ReadBuf, 0, ReadBuf.Length); + + sbyte nBytelen; + //long nByteRead; + + if (serialPort1.IsOpen == false) + return 0; + nBytelen = 0; + serialPort1.ReadTimeout = ByteTime; + + while (nBytelen < (ReadRoom - 1)) + { + try + { + ReadBuf[nBytelen] = (byte) serialPort1.ReadByte(); + nBytelen++; // add one + } + catch (Exception ex) + { + throw new Exception(ex.Message); + break; + } + } + ReadBuf[nBytelen] = 0x00; + return nBytelen; + + } + + + /// + /// 字符数组转字符串16进制 + /// + /// 二进制字节 + /// 类似"01 02 0F" + public static string ByteToString(byte[] InBytes) + { + string StringOut = ""; + foreach (byte InByte in InBytes) + { + StringOut = StringOut + String.Format("{0:X2}", InByte) + " "; + } + + return StringOut.Trim(); + } + + /// + /// strhex 转字节数组 + /// + /// 类似"01 02 0F" 用空格分开的 + /// + public static byte[] StringToByte(string InString) + { + string[] ByteStrings; + ByteStrings = InString.Split(" ".ToCharArray()); + byte[] ByteOut; + ByteOut = new byte[ByteStrings.Length]; + for (int i = 0; i <= ByteStrings.Length - 1; i++) + { + ByteOut[i] = byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber); + } + return ByteOut; + } + + /// + /// strhex 转字节数组 + /// + /// 类似"01 02 0F" 中间无空格 + /// + public static byte[] StringToByte_2(string InString) + { + byte[] ByteOut; + InString = InString.Replace(" ", ""); + try + { + string[] ByteStrings = new string[InString.Length/2]; + int j = 0; + for (int i = 0; i < ByteStrings.Length; i++) + { + + ByteStrings[i] = InString.Substring(j, 2); + j += 2; + } + + ByteOut = new byte[ByteStrings.Length]; + for (int i = 0; i <= ByteStrings.Length - 1; i++) + { + ByteOut[i] = byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber); + } + } + catch (Exception ex) + { + + throw new Exception(ex.Message); + } + + return ByteOut; + } + + /// + /// 字符串 转16进制字符串 + /// + /// unico + /// 类似“01 0f” + public static string Str_To_0X(string InString) + { + return ByteToString(UnicodeEncoding.Default.GetBytes(InString)); + } + + public void Dispose() + { + if (serialPort1 != null) + { + serialPort1.Close(); + serialPort1.Dispose(); + } + } + } +} diff --git a/NA200H/ModBus.Net/ComProtocalLinker.cs b/NA200H/ModBus.Net/ComProtocalLinker.cs new file mode 100644 index 0000000..f397213 --- /dev/null +++ b/NA200H/ModBus.Net/ComProtocalLinker.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ModBus.Net +{ + public abstract class ComProtocalLinker : ProtocalLinker + { + protected ComProtocalLinker() + { + //初始化连对象 + _baseConnector = new ComConnector(ConfigurationManager.COM); + } + + protected ComProtocalLinker(string com) + { + _baseConnector = new ComConnector(com); + } + } +} diff --git a/NA200H/ModBus.Net/ConfigurationManager.Designer.cs b/NA200H/ModBus.Net/ConfigurationManager.Designer.cs index bc83c37..198b10d 100644 --- a/NA200H/ModBus.Net/ConfigurationManager.Designer.cs +++ b/NA200H/ModBus.Net/ConfigurationManager.Designer.cs @@ -60,6 +60,15 @@ namespace ModBus.Net { } } + /// + /// 查找类似 COM3 的本地化字符串。 + /// + internal static string COM { + get { + return ResourceManager.GetString("COM", resourceCulture); + } + } + /// /// 查找类似 192.168.3.247 的本地化字符串。 /// diff --git a/NA200H/ModBus.Net/ConfigurationManager.resx b/NA200H/ModBus.Net/ConfigurationManager.resx index bef5369..27a0a6c 100644 --- a/NA200H/ModBus.Net/ConfigurationManager.resx +++ b/NA200H/ModBus.Net/ConfigurationManager.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + COM3 + 192.168.3.247 diff --git a/NA200H/ModBus.Net/Connector.cs b/NA200H/ModBus.Net/Connector.cs new file mode 100644 index 0000000..fc29bcf --- /dev/null +++ b/NA200H/ModBus.Net/Connector.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ModBus.Net +{ + public abstract class Connector + { + public abstract bool Connect(); + public abstract bool Disconnect(); + public abstract bool SendMsgWithoutReturn(byte[] message); + public abstract byte[] SendMsg(byte[] message); + } +} diff --git a/NA200H/ModBus.Net/ModBus.Net.csproj b/NA200H/ModBus.Net/ModBus.Net.csproj index e05fee2..4e8073b 100644 --- a/NA200H/ModBus.Net/ModBus.Net.csproj +++ b/NA200H/ModBus.Net/ModBus.Net.csproj @@ -43,24 +43,29 @@ + + True True ConfigurationManager.resx + + + + - - + - + Code - + diff --git a/NA200H/ModBus.Net/ModbusComProtocal.cs b/NA200H/ModBus.Net/ModbusComProtocal.cs new file mode 100644 index 0000000..7aed19f --- /dev/null +++ b/NA200H/ModBus.Net/ModbusComProtocal.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ModBus.Net +{ + public class ModbusComProtocal : ModbusProtocal + { + public ModbusComProtocal() + { + _protocalLinker = new ModbusComProtocalLinker(); + } + + public ModbusComProtocal(string com) + { + _protocalLinker = new ModbusComProtocalLinker(com); + } + } +} diff --git a/NA200H/ModBus.Net/ModbusComProtocalLinker.cs b/NA200H/ModBus.Net/ModbusComProtocalLinker.cs new file mode 100644 index 0000000..f1cc29b --- /dev/null +++ b/NA200H/ModBus.Net/ModbusComProtocalLinker.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ModBus.Net +{ + class ModbusComProtocalLinker : ComProtocalLinker + { + public override bool CheckRight(byte[] content) + { + if (!Crc16.GetInstance().CrcEfficacy(content)) + { + throw new ModbusProtocalErrorException(501); + } + if (content[1] > 127) + { + throw new ModbusProtocalErrorException(content[2]); + } + return true; + } + + public ModbusComProtocalLinker() : base() + { + + } + + public ModbusComProtocalLinker(string com) : base(com) + { + + } + } +} diff --git a/NA200H/ModBus.Net/ModbusProtocal.cs b/NA200H/ModBus.Net/ModbusProtocal.cs index 58b5bda..8815260 100644 --- a/NA200H/ModBus.Net/ModbusProtocal.cs +++ b/NA200H/ModBus.Net/ModbusProtocal.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; public enum ModbusProtocalReg { @@ -782,4 +783,35 @@ namespace ModBus.Net } } + + public class ProtocalErrorException : Exception + { + public ProtocalErrorException(string message) + : base(message) + { + + } + } + + public class ModbusProtocalErrorException : ProtocalErrorException + { + public int ErrorMessageNumber { get; private set; } + private static readonly Dictionary ProtocalErrorDictionary = new Dictionary() + { + {1, "ILLEGAL_FUNCTION"}, + {2, "ILLEGAL_DATA_ACCESS"}, + {3, "ILLEGAL_DATA_VALUE"}, + {4, "SLAVE_DEVICE_FAILURE"}, + {5, "ACKNOWLWDGE"}, + {6, "SLAVE_DEVICE_BUSY"}, + {500, "TCP_ILLEGAL_LENGTH"}, + {501, "RTU_ILLEGAL_CRC"}, + }; + + public ModbusProtocalErrorException(int messageNumber) + : base(ProtocalErrorDictionary[messageNumber]) + { + ErrorMessageNumber = messageNumber; + } + } } \ No newline at end of file diff --git a/NA200H/ModBus.Net/ModbusTCPProtocal.cs b/NA200H/ModBus.Net/ModbusTCPProtocal.cs index d98a113..2f6f284 100644 --- a/NA200H/ModBus.Net/ModbusTCPProtocal.cs +++ b/NA200H/ModBus.Net/ModbusTCPProtocal.cs @@ -13,9 +13,9 @@ namespace ModBus.Net _protocalLinker = new ModbusTcpProtocalLinker(); } - public ModbusTcpProtocal(string IP) + public ModbusTcpProtocal(string ip) { - _protocalLinker = new ModbusTcpProtocalLinker(IP); + _protocalLinker = new ModbusTcpProtocalLinker(ip); } } } \ No newline at end of file diff --git a/NA200H/ModBus.Net/ModbusTcpProtocalLinker.cs b/NA200H/ModBus.Net/ModbusTcpProtocalLinker.cs index b8ebe32..c4ebd84 100644 --- a/NA200H/ModBus.Net/ModbusTcpProtocalLinker.cs +++ b/NA200H/ModBus.Net/ModbusTcpProtocalLinker.cs @@ -10,7 +10,11 @@ namespace ModBus.Net { public override bool CheckRight(byte[] content) { - if (content[1] > 127) + if (content[5] != content.Length - 6) + { + throw new ModbusProtocalErrorException(500); + } + if (content[7] > 127) { throw new ModbusProtocalErrorException(content[2]); } @@ -22,7 +26,7 @@ namespace ModBus.Net } - public ModbusTcpProtocalLinker(string IP) : base(IP) + public ModbusTcpProtocalLinker(string ip) : base(ip) { } diff --git a/NA200H/ModBus.Net/ProtocalLinker.cs b/NA200H/ModBus.Net/ProtocalLinker.cs index 2c6f107..3547b0c 100644 --- a/NA200H/ModBus.Net/ProtocalLinker.cs +++ b/NA200H/ModBus.Net/ProtocalLinker.cs @@ -7,19 +7,32 @@ namespace ModBus.Net /// public abstract class ProtocalLinker { + protected Connector _baseConnector; + /// /// 发送并接收数据 /// /// 发送协议的内容 /// 接收协议的内容 - public abstract byte[] SendReceive(byte[] content); + public virtual byte[] SendReceive(byte[] content) + { + //接收数据 + byte[] receiveBytes = _baseConnector.SendMsg(BytesExtend(content)); + //容错处理 + if (!CheckRight(receiveBytes)) return null; + //返回数据 + return BytesDecact(receiveBytes); + } /// /// 仅发送数据 /// /// 发送协议的内容 /// 协议是否正确发送 - public abstract bool SendOnly(byte[] content); + public virtual bool SendOnly(byte[] content) + { + return _baseConnector.SendMsgWithoutReturn(BytesExtend(content)); + } /// /// 检查接收的数据是否正确 diff --git a/NA200H/ModBus.Net/ProtocalLinkerBytesExtend.cs b/NA200H/ModBus.Net/ProtocalLinkerBytesExtend.cs index 508537f..02ad441 100644 --- a/NA200H/ModBus.Net/ProtocalLinkerBytesExtend.cs +++ b/NA200H/ModBus.Net/ProtocalLinkerBytesExtend.cs @@ -51,4 +51,26 @@ namespace ModBus.Net return newContent; } } + + public class ModbusComProtocalLinkerBytesExtend : ProtocalLinkerBytesExtend + { + public override byte[] BytesExtend(byte[] content) + { + byte[] crc = new byte[2]; + //Modbus/Tcp协议扩张,增加CRC校验 + byte[] newFormat = new byte[content.Length + 2]; + Crc16.GetInstance().GetCRC(content, ref crc); + Array.Copy(content, 0, newFormat, 0, content.Length); + Array.Copy(crc, 0, newFormat, newFormat.Length - 2, crc.Length); + return newFormat; + } + + public override byte[] BytesDecact(byte[] content) + { + //Modbus/Com协议收缩,抛弃后面1个字节的内容 + byte[] newContent = new byte[content.Length - 2]; + Array.Copy(content, 0, newContent, 0, newContent.Length); + return newContent; + } + } } diff --git a/NA200H/ModBus.Net/TCPProtocalLinker.cs b/NA200H/ModBus.Net/TCPProtocalLinker.cs index 3230d97..7ab3fcd 100644 --- a/NA200H/ModBus.Net/TCPProtocalLinker.cs +++ b/NA200H/ModBus.Net/TCPProtocalLinker.cs @@ -9,62 +9,16 @@ namespace ModBus.Net /// /// 连接对象 /// - private TcpSocket _socket; protected TcpProtocalLinker() { //初始化连对象 - _socket = new TcpSocket(ConfigurationManager.IP, int.Parse(ConfigurationManager.Port), false); + _baseConnector = new TcpSocket(ConfigurationManager.IP, int.Parse(ConfigurationManager.Port), false); } - protected TcpProtocalLinker(string IP) + protected TcpProtocalLinker(string ip) { - _socket = new TcpSocket(IP, int.Parse(ConfigurationManager.Port), false); + _baseConnector = new TcpSocket(ip, int.Parse(ConfigurationManager.Port), false); } - - public override byte[] SendReceive(byte[] content) - { - //接收数据 - byte[] receiveBytes = BytesDecact(_socket.SendMsg(BytesExtend(content))); - //容错处理 - if (!CheckRight(receiveBytes)) return null; - //返回数据 - return receiveBytes; - } - - - public override bool SendOnly(byte[] content) - { - return _socket.SendMsgWithoutReturn(BytesExtend(content)); - } - - } - - - public class ProtocalErrorException : Exception - { - public ProtocalErrorException(string message):base(message) - { - - } - } - - public class ModbusProtocalErrorException : ProtocalErrorException - { - public int ErrorMessageNumber { get; private set; } - private static readonly Dictionary ProtocalErrorDictionary = new Dictionary() - { - {1, "ILLEGAL_FUNCTION"}, - {2, "ILLEGAL_DATA_ACCESS"}, - {3, "ILLEGAL_DATA_VALUE"}, - {4, "SLAVE_DEVICE_FAILURE"}, - {5, "ACKNOWLWDGE"}, - {6, "SLAVE_DEVICE_BUSY"}, - }; - - public ModbusProtocalErrorException(int messageNumber) : base(ProtocalErrorDictionary[messageNumber]) - { - ErrorMessageNumber = messageNumber; - } - } + } } \ No newline at end of file diff --git a/NA200H/ModBus.Net/TCPSocket.cs b/NA200H/ModBus.Net/TCPSocket.cs index 3cf96ab..9922d66 100644 --- a/NA200H/ModBus.Net/TCPSocket.cs +++ b/NA200H/ModBus.Net/TCPSocket.cs @@ -21,7 +21,7 @@ namespace ModBus.Net /// Socket收发类 /// 作者:本类来源于CSDN,并由罗圣(Chris L.)根据实际需要修改 /// - public class TcpSocket : IDisposable + public class TcpSocket : Connector, IDisposable { public delegate void ErrorShutdownEventHandler(object sender, EventArgs e); @@ -70,7 +70,7 @@ namespace ModBus.Net } } - public bool Connect() + public override bool Connect() { if (m_socketClient != null) { @@ -99,23 +99,25 @@ namespace ModBus.Net } } - public void Disconnect() + public override bool Disconnect() { lock (this) { if (m_socketClient == null) { - return; + return true; } try { m_socketClient.Close(); AddInfo("client disconnected successfully."); + return true; } catch (Exception err) { AddInfo("client disconnected exception: " + err.Message); + return false; } finally { @@ -134,7 +136,7 @@ namespace ModBus.Net /// /// 发送的信息 /// 是否发送成功 - public bool SendMsgWithoutReturn(byte[] message) + public override bool SendMsgWithoutReturn(byte[] message) { byte[] datagram = message; @@ -159,7 +161,7 @@ namespace ModBus.Net /// /// 发送的数据 /// 是否发送成功 - public byte[] SendMsg(byte[] message) + public override byte[] SendMsg(byte[] message) { byte[] datagram = message; diff --git a/NA200H/NA200H.UI.Console/Program.cs b/NA200H/NA200H.UI.Console/Program.cs index 31fdf64..b254173 100644 --- a/NA200H/NA200H.UI.Console/Program.cs +++ b/NA200H/NA200H.UI.Console/Program.cs @@ -20,7 +20,7 @@ namespace NA200H.UI.ConsoleApp BaseProtocal wrapper = new ModbusTcpProtocal(ip); Console.WriteLine("link ip is {0}",ip); //第一步:先生成一个输入信息的object数组 - object[] inputObjects = new object[] {(byte) 0x11, (byte) 0x01, (short) 0x13, (short) 0x25}; + object[] inputObjects = new object[] {(byte) 0x02, (byte) 0x01, (short) 0x13, (short) 0x25}; //第二步:向仪器发送这个信息,并接收信息 byte[] outputBytes = wrapper.SendReceive(inputObjects); //第三步:输出信息 @@ -38,7 +38,7 @@ namespace NA200H.UI.ConsoleApp */ - string ip = "192.168.3.246"; + /*string ip = "192.168.3.246"; try { Console.WriteLine("link ip is {0}",ip); @@ -66,15 +66,34 @@ namespace NA200H.UI.ConsoleApp Console.WriteLine("prodave link failed"); } Console.Read(); - + */ //先初始化一个协议转换器,这里构造Modbus/Tcp协议。 - /*BaseProtocal wrapper = new ModbusTcpProtocal(); + //BaseProtocal wrapper = new ModbusTcpProtocal(); + + /* + //调用方法一:手动构造 + //第一步:先生成一个输入信息的object数组 + object[] inputObjects = new object[]{(byte)0x02,(byte)0x01,(short)0x13,(short)0x25}; + //第二步:向仪器发送这个信息,并接收信息 + byte[] outputBytes = wrapper.SendReceive(inputObjects); + //第三步:输出信息 + for (int i = 0; i < outputBytes.Length; i++) + { + Console.WriteLine(outputBytes[i]); + } + Console.WriteLine(); + Console.Read(); + Console.Read(); + */ + + //先初始化一个协议转换器,这里构造Modbus/Rtu协议。 + BaseProtocal wrapper = new ModbusComProtocal(); //调用方法一:手动构造 //第一步:先生成一个输入信息的object数组 - object[] inputObjects = new object[]{(byte)0x11,(byte)0x01,(short)0x13,(short)0x25}; + object[] inputObjects = new object[]{(byte)0x02,(byte)0x01,(short)0x00,(short)0x03}; //第二步:向仪器发送这个信息,并接收信息 byte[] outputBytes = wrapper.SendReceive(inputObjects); //第三步:输出信息 @@ -86,9 +105,10 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); + /* //调用方法二:自动构造 //第一步:先生成一个输入结构体,然后向这个结构体中填写数据 - ReadCoilStatusModbusProtocal.ReadCoilStatusInputStruct readCoilStatusInputStruct = new ReadCoilStatusModbusProtocal.ReadCoilStatusInputStruct(0x11, "Q20", 0x25); + ReadCoilStatusModbusProtocal.ReadCoilStatusInputStruct readCoilStatusInputStruct = new ReadCoilStatusModbusProtocal.ReadCoilStatusInputStruct(0x02, "Q20", 0x25); //第二步:再生成一个输出结构体,执行相应协议的发送指令,并将输出信息自动转换到输出结构体中 ReadCoilStatusModbusProtocal.ReadCoilStatusOutputStruct readCoilStatusOutputStruct = (ReadCoilStatusModbusProtocal.ReadCoilStatusOutputStruct)wrapper.SendReceive(wrapper["ReadCoilStatusModbusProtocal"], readCoilStatusInputStruct); //第三步:读取这个输出结构体的信息。 @@ -100,7 +120,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - ReadInputStatusModbusProtocal.ReadInputStatusInputStruct readInputStatusInputStruct = new ReadInputStatusModbusProtocal.ReadInputStatusInputStruct(0x11, "I20", 0x25); + ReadInputStatusModbusProtocal.ReadInputStatusInputStruct readInputStatusInputStruct = new ReadInputStatusModbusProtocal.ReadInputStatusInputStruct(0x02, "I20", 0x25); ReadInputStatusModbusProtocal.ReadInputStatusOutputStruct readInputStatusOutputStruct = (ReadInputStatusModbusProtocal.ReadInputStatusOutputStruct)wrapper.SendReceive(wrapper["ReadInputStatusModbusProtocal"], readInputStatusInputStruct); for (int i = 0; i < readInputStatusOutputStruct.InputStatus.Length; i++) { @@ -110,7 +130,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct readHoldRegisterInputStruct = new ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct(0x11, "0", 8); + ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct readHoldRegisterInputStruct = new ReadHoldRegisterModbusProtocal.ReadHoldRegisterInputStruct(0x02, "0", 8); ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct readHoldRegisterOutputStruct = (ReadHoldRegisterModbusProtocal.ReadHoldRegisterOutputStruct)wrapper.SendReceive(wrapper["ReadHoldRegisterModbusProtocal"], readHoldRegisterInputStruct); for (int i = 0; i < readHoldRegisterOutputStruct.HoldRegisterStatus.Length; i++) { @@ -120,7 +140,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct readInputRegisterInputStruct = new ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct(0x11, "IW1", 3); + ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct readInputRegisterInputStruct = new ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct(0x02, "IW1", 3); ReadInputRegisterModbusProtocal.ReadInputRegisterOutputStruct readInputRegisterOutputStruct = (ReadInputRegisterModbusProtocal.ReadInputRegisterOutputStruct)wrapper.SendReceive(wrapper["ReadInputRegisterModbusProtocal"], readInputRegisterInputStruct); for (int i = 0; i < readInputRegisterOutputStruct.InputRegisterStatus.Length; i++) { @@ -130,7 +150,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct readInputRegisterInputStruct2 = new ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct(0x11, "E38", 8); + ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct readInputRegisterInputStruct2 = new ReadInputRegisterModbusProtocal.ReadInputRegisterInputStruct(0x02, "E38", 8); ReadInputRegisterModbusProtocal.ReadEventOutputStruct readEventOutputStruct = (ReadInputRegisterModbusProtocal.ReadEventOutputStruct)wrapper.SendReceive(wrapper["ReadInputRegisterModbusProtocal"], readInputRegisterInputStruct2); Console.WriteLine(readEventOutputStruct.SoeEvent); Console.WriteLine(readEventOutputStruct.TestTime); @@ -138,7 +158,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - WriteOneCoilModbusProtocal.WriteOneCoilInputStruct writeOneCoilInputStruct = new WriteOneCoilModbusProtocal.WriteOneCoilInputStruct(0x11, "Q173", true); + WriteOneCoilModbusProtocal.WriteOneCoilInputStruct writeOneCoilInputStruct = new WriteOneCoilModbusProtocal.WriteOneCoilInputStruct(0x02, "Q173", true); WriteOneCoilModbusProtocal.WriteOneCoilOutputStruct writeOneCoilOutputStruct = (WriteOneCoilModbusProtocal.WriteOneCoilOutputStruct)wrapper.SendReceive(wrapper["WriteOneCoilModbusProtocal"], writeOneCoilInputStruct); Console.WriteLine(writeOneCoilOutputStruct.StartAddress); Console.WriteLine(writeOneCoilOutputStruct.WriteValue); @@ -146,7 +166,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - WriteOneRegisterModbusProtocal.WriteOneRegisterInputStruct writeOneRegisterInputStruct = new WriteOneRegisterModbusProtocal.WriteOneRegisterInputStruct(0x11, "NW1", 100); + WriteOneRegisterModbusProtocal.WriteOneRegisterInputStruct writeOneRegisterInputStruct = new WriteOneRegisterModbusProtocal.WriteOneRegisterInputStruct(0x02, "NW1", 100); WriteOneRegisterModbusProtocal.WriteOneRegisterOutputStruct writeOneRegisterOutputStruct = (WriteOneRegisterModbusProtocal.WriteOneRegisterOutputStruct)wrapper.SendReceive(wrapper["WriteOneRegisterModbusProtocal"], writeOneRegisterInputStruct); Console.WriteLine(writeOneRegisterOutputStruct.StartAddress); Console.WriteLine(writeOneRegisterOutputStruct.WriteValue); @@ -154,7 +174,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - WriteMultiCoilModbusProtocal.WriteMultiCoilInputStruct writeMultiCoilInputStruct = new WriteMultiCoilModbusProtocal.WriteMultiCoilInputStruct(0x11, "Q20", new bool[] { true, false, true, true, false, false, true, true, true, false }); + WriteMultiCoilModbusProtocal.WriteMultiCoilInputStruct writeMultiCoilInputStruct = new WriteMultiCoilModbusProtocal.WriteMultiCoilInputStruct(0x02, "Q20", new bool[] { true, false, true, true, false, false, true, true, true, false }); WriteMultiCoilModbusProtocal.WriteMultiCoilOutputStruct writeMultiCoilOutputStruct = (WriteMultiCoilModbusProtocal.WriteMultiCoilOutputStruct)wrapper.SendReceive(wrapper["WriteMultiCoilModbusProtocal"], writeMultiCoilInputStruct); Console.WriteLine(writeMultiCoilOutputStruct.StartAddress); Console.WriteLine(writeMultiCoilOutputStruct.WriteCount); @@ -162,7 +182,7 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - WriteMultiRegisterModbusProtocal.WriteMultiRegisterInputStruct writeMultiRegisterInputStruct = new WriteMultiRegisterModbusProtocal.WriteMultiRegisterInputStruct(0x11, "MW2", new ushort[] { 0x000A, 0x0102 }); + WriteMultiRegisterModbusProtocal.WriteMultiRegisterInputStruct writeMultiRegisterInputStruct = new WriteMultiRegisterModbusProtocal.WriteMultiRegisterInputStruct(0x02, "MW2", new ushort[] { 0x000A, 0x0102 }); WriteMultiRegisterModbusProtocal.WriteMultiRegisterOutputStruct writeMultiRegisterOutputStruct = (WriteMultiRegisterModbusProtocal.WriteMultiRegisterOutputStruct)wrapper.SendReceive(wrapper["WriteMultiRegisterModbusProtocal"], writeMultiRegisterInputStruct); Console.WriteLine(writeMultiRegisterOutputStruct.StartAddress); Console.WriteLine(writeMultiRegisterOutputStruct.WriteCount); @@ -170,13 +190,13 @@ namespace NA200H.UI.ConsoleApp Console.Read(); Console.Read(); - GetSystemTimeModbusProtocal.GetSystemTimeInputStruct getSystemTimeInputStruct = new GetSystemTimeModbusProtocal.GetSystemTimeInputStruct(0x11); + GetSystemTimeModbusProtocal.GetSystemTimeInputStruct getSystemTimeInputStruct = new GetSystemTimeModbusProtocal.GetSystemTimeInputStruct(0x02); GetSystemTimeModbusProtocal.GetSystemTimeOutputStruct getSystemTimeOutputStruct = (GetSystemTimeModbusProtocal.GetSystemTimeOutputStruct)wrapper.SendReceive(wrapper["GetSystemTimeModbusProtocal"], getSystemTimeInputStruct); Console.WriteLine(getSystemTimeOutputStruct.Time); Console.Read(); Console.Read(); - SetSystemTimeModbusProtocal.SetSystemTimeInputStruct setSystemTimeInputStruct = new SetSystemTimeModbusProtocal.SetSystemTimeInputStruct(0x11, DateTime.Now); + SetSystemTimeModbusProtocal.SetSystemTimeInputStruct setSystemTimeInputStruct = new SetSystemTimeModbusProtocal.SetSystemTimeInputStruct(0x02, DateTime.Now); SetSystemTimeModbusProtocal.SetSystemTimeOutputStruct setSystemTimeOutputStruct = (SetSystemTimeModbusProtocal.SetSystemTimeOutputStruct)wrapper.SendReceive(wrapper["SetSystemTimeModbusProtocal"], setSystemTimeInputStruct); Console.WriteLine(setSystemTimeOutputStruct.StartAddress); Console.WriteLine(setSystemTimeOutputStruct.WriteCount); diff --git a/NA200H/NA200H.sln b/NA200H/NA200H.sln index 102fb28..257e12e 100644 --- a/NA200H/NA200H.sln +++ b/NA200H/NA200H.sln @@ -1,14 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30501.0 +VisualStudioVersion = 12.0.30723.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NA200H.UI.ConsoleApp", "NA200H.UI.Console\NA200H.UI.ConsoleApp.csproj", "{D06F6A34-93F6-4139-B485-8F5686E4E2C9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModBus.Net", "ModBus.Net\ModBus.Net.csproj", "{124EBEF2-8960-4447-84CF-1D683B1EF7CC}" EndProject -Project("{F088123C-0E9E-452A-89E6-6BA2F21D5CAC}") = "ModBus.Net.Modeling", "ModBus.Net.Modeling\ModBus.Net.Modeling.modelproj", "{FA929E21-544C-444E-B18D-184E98B427C6}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NA200H.UI.WPF", "NA200H.UI.WPF\NA200H.UI.WPF.csproj", "{78916B03-C910-468E-B593-667A3EFF68BE}" EndProject Global @@ -25,10 +23,6 @@ Global {124EBEF2-8960-4447-84CF-1D683B1EF7CC}.Debug|Any CPU.Build.0 = Debug|Any CPU {124EBEF2-8960-4447-84CF-1D683B1EF7CC}.Release|Any CPU.ActiveCfg = Release|Any CPU {124EBEF2-8960-4447-84CF-1D683B1EF7CC}.Release|Any CPU.Build.0 = Release|Any CPU - {FA929E21-544C-444E-B18D-184E98B427C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FA929E21-544C-444E-B18D-184E98B427C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FA929E21-544C-444E-B18D-184E98B427C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FA929E21-544C-444E-B18D-184E98B427C6}.Release|Any CPU.Build.0 = Release|Any CPU {78916B03-C910-468E-B593-667A3EFF68BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {78916B03-C910-468E-B593-667A3EFF68BE}.Debug|Any CPU.Build.0 = Debug|Any CPU {78916B03-C910-468E-B593-667A3EFF68BE}.Release|Any CPU.ActiveCfg = Release|Any CPU