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