Program.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. using CCDCount.DLL.Tools;
  2. using LogClass;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace ModbusTest
  12. {
  13. internal class Program
  14. {
  15. static void Main(string[] args)
  16. {
  17. timeBeginPeriod(1);
  18. GC.Collect();
  19. //ShuLiMoNi2();
  20. ShuLiMoNi();
  21. //TimeTest();
  22. //var client = new ModbusTcpClient();
  23. //if(client.Connect("127.0.0.1"))
  24. //if (client.Connect("192.168.0.88"))
  25. //{
  26. //var result = client.ReadHoldingRegistersAsLReal(1, 3192, 1, "BADC");
  27. //Console.WriteLine(result[0]);
  28. //client.WriteSingleLReal(1, 3192, 80, "BADC");
  29. //var result = client.ReadHoldingRegisters(1, 3224, 1);
  30. //Console.WriteLine(result[0]);
  31. //client.WriteSingleRegister(1, 3184, 50);
  32. //}
  33. }
  34. public static void ShuLiMoNi()
  35. {
  36. List<ushort> ushorts = new List<ushort>();
  37. int runnum = 0;
  38. int OkNum = 0;
  39. int NgNum = 0;
  40. Console.WriteLine("输入运行次数:");
  41. runnum = Convert.ToInt32(Console.ReadLine());
  42. ushort WriteCount = 1;
  43. long runcount = 0;
  44. long TongCount = 0;
  45. long OutTimeCount = 0;
  46. var client = new ModbusTcpClient();
  47. if (client.Connect("192.168.0.88"))
  48. {
  49. Stopwatch sw = Stopwatch.StartNew();
  50. Random random = new Random();
  51. ushort nowReturnValue = 10;
  52. ushort[] ReturnValue = null;
  53. while (runnum >= 0)
  54. {
  55. ushort[] result = new ushort[20];
  56. ushort value1 = 0;
  57. int Value0 = random.Next(10);
  58. if (Value0 < 4)
  59. {
  60. value1 |= (ushort)(1 << (WriteCount % 8));
  61. ushorts.Add(value1);
  62. OkNum++;
  63. }
  64. else
  65. {
  66. NgNum++;
  67. }
  68. WriteCount++;
  69. runnum--;
  70. sw.Restart();
  71. if (nowReturnValue == 10)
  72. {
  73. client.ReadHoldingRegisters(slaveId: 1, startAddress: 0, numRegisters: 1, out ReturnValue);
  74. TongCount++;
  75. }
  76. if (ReturnValue == null)
  77. {
  78. continue;
  79. }
  80. //发送带值数据
  81. if (ReturnValue[0] == 0)
  82. {
  83. nowReturnValue = ReturnValue[0];
  84. if (ushorts.Count > 0)
  85. {
  86. for (int i = 0; i < (ushorts.Count > 10 ? 10 : ushorts.Count); i++)
  87. {
  88. result[i] = ushorts[i];
  89. DateTime nowtime = DateTime.Now;
  90. Console.WriteLine("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]);
  91. LOG.log(string.Format("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]), 6);
  92. ushorts.Remove(ushorts[i]);
  93. }
  94. //写入数据
  95. client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: result);
  96. TongCount++;
  97. //client.WriteSingleRegister(slaveId: 1, registerAddress: 0, value: 1);
  98. //TongCount++;
  99. sw.Stop();
  100. LOG.log(string.Format("SendMess1Ok:{0},SendMess1Ng:{1},SendMess2Ok:{2},SendMess2Ng:{3}," +
  101. "\nSendMessage3Ok:{4},SendMessage3Ng:{5},SendMessage4Ok:{6},SendMessage4Ng:{7}," +
  102. "\nSendMessage5Ok:{8},SendMessage5Ng:{9},SendMessage6Ok:{10},SendMessage6Ng:{11}," +
  103. "\nSendMessage7Ok:{12},SendMessage7Ng:{13},SendMessage8Ok:{14},SendMessage8Ng:{15}," +
  104. "\nSendMessage9Ok:{16},SendMessage9Ng:{17},SendMessage10Ok:{18},SendMessage10Ng:{19}," +
  105. "\n此次写值耗时:{20},此次写入writecount:{21}",
  106. result[0], result[1], result[2], result[3],
  107. result[4], result[5], result[6], result[7],
  108. result[8], result[9], result[10], result[11],
  109. result[12], result[13], result[14], result[15],
  110. result[16], result[17], result[18], result[19],
  111. sw.Elapsed, WriteCount), 6);
  112. nowReturnValue = 10;
  113. if (sw.ElapsedMilliseconds > 5)
  114. {
  115. LOG.error("单次通讯超时");
  116. OutTimeCount++;
  117. }
  118. }
  119. }
  120. runcount++;
  121. if (5 - sw.ElapsedMilliseconds > 0)
  122. {
  123. Thread.Sleep(5 - (int)sw.ElapsedMilliseconds);
  124. }
  125. }
  126. }
  127. Console.WriteLine("有效数据:{0},无效数据:{1},总通讯次数:{2},超时周期数量:{3}", OkNum, NgNum, TongCount, OutTimeCount);
  128. LOG.log(string.Format("有效数据:{0},无效数据:{1},总通讯次数:{2},超时周期数量{3}", OkNum, NgNum, TongCount, OutTimeCount), 6);
  129. Console.ReadKey();
  130. }
  131. public static void ShuLiMoNi2()
  132. {
  133. List<ushort> ushorts = new List<ushort>();
  134. int runnum = 0;
  135. int OkNum = 0;
  136. int NgNum = 0;
  137. Console.WriteLine("输入运行次数:");
  138. runnum = Convert.ToInt32(Console.ReadLine());
  139. ushort WriteCount = 1;
  140. long runcount = 0;
  141. long TongCount = 0;
  142. long OutTimeCount = 0;
  143. var client = new ModbusTcpClient();
  144. if (client.Connect("192.168.0.88"))
  145. {
  146. Stopwatch sw = Stopwatch.StartNew();
  147. Random random = new Random();
  148. ushort nowReturnValue = 10;
  149. ushort[] ReturnValue = null;
  150. while (runnum >= 0)
  151. {
  152. ushort[] result = new ushort[20];
  153. ushort value1 = 0;
  154. int Value0 = random.Next(10);
  155. if (Value0 < 4)
  156. {
  157. value1 |= (ushort)(1 << (WriteCount % 8));
  158. ushorts.Add(value1);
  159. OkNum++;
  160. }
  161. else
  162. {
  163. NgNum++;
  164. }
  165. WriteCount++;
  166. runnum--;
  167. sw.Restart();
  168. if (nowReturnValue == 10)
  169. {
  170. client.ReadHoldingRegisters(slaveId: 1, startAddress: 0, numRegisters: 1, out ReturnValue);
  171. TongCount++;
  172. }
  173. if (ReturnValue == null)
  174. {
  175. continue;
  176. }
  177. //发送带值数据
  178. if (ReturnValue[0] == 0)
  179. {
  180. nowReturnValue = ReturnValue[0];
  181. bool IsOKValue = false;
  182. if (ushorts.Count > 0)
  183. {
  184. Console.WriteLine("1");
  185. IsOKValue = true;
  186. for (int i = 0; i < (ushorts.Count > 10 ? 10 : ushorts.Count); i++)
  187. {
  188. result[i] = ushorts[i];
  189. DateTime nowtime = DateTime.Now;
  190. Console.WriteLine("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]);
  191. LOG.log(string.Format("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]), 6);
  192. ushorts.Remove(ushorts[i]);
  193. }
  194. //写入数据
  195. if (OkNum % 100 < 70 && IsOKValue)
  196. {
  197. client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: result);
  198. TongCount++;
  199. client.WriteSingleRegister(slaveId: 1, registerAddress: 0, value: 1);
  200. TongCount++;
  201. sw.Stop();
  202. LOG.log(string.Format("SendMess1Ok:{0},SendMess1Ng:{1},SendMess2Ok:{2},SendMess2Ng:{3}," +
  203. "\nSendMessage3Ok:{4},SendMessage3Ng:{5},SendMessage4Ok:{6},SendMessage4Ng:{7}," +
  204. "\nSendMessage5Ok:{8},SendMessage5Ng:{9},SendMessage6Ok:{10},SendMessage6Ng:{11}," +
  205. "\nSendMessage7Ok:{12},SendMessage7Ng:{13},SendMessage8Ok:{14},SendMessage8Ng:{15}," +
  206. "\nSendMessage9Ok:{16},SendMessage9Ng:{17},SendMessage10Ok:{18},SendMessage10Ng:{19}," +
  207. "\n此次写值耗时:{20},此次写入writecount:{21}",
  208. result[0], result[1], result[2], result[3],
  209. result[4], result[5], result[6], result[7],
  210. result[8], result[9], result[10], result[11],
  211. result[12], result[13], result[14], result[15],
  212. result[16], result[17], result[18], result[19],
  213. sw.Elapsed, WriteCount), 6);
  214. nowReturnValue = 10;
  215. if (sw.ElapsedMilliseconds > 5)
  216. {
  217. OutTimeCount++;
  218. LOG.error("单次通讯超时");
  219. }
  220. }
  221. }
  222. }
  223. runcount++;
  224. if (5 - sw.ElapsedMilliseconds > 0)
  225. {
  226. Thread.Sleep(5 - (int)sw.ElapsedMilliseconds);
  227. }
  228. }
  229. client.Disconnect();
  230. }
  231. Console.WriteLine("有效数据:{0},无效数据:{1},总通讯次数:{2},超时次数:{3}", OkNum, NgNum, TongCount,OutTimeCount);
  232. LOG.log(string.Format("有效数据:{0},无效数据:{1},总通讯次数:{2},超时次数{3}", OkNum, NgNum, TongCount,OutTimeCount), 6);
  233. Console.ReadKey();
  234. }
  235. public void SwitchStatic()
  236. {
  237. var client = new ModbusTcpClient();
  238. ushort Mask1 = (ushort)(1 << 0);
  239. ushort Mask2 = (ushort)(1 << 8);
  240. //if (client.Connect("127.0.0.1"))
  241. if (client.Connect("192.168.0.88"))
  242. {
  243. while (true)
  244. {
  245. Console.WriteLine("输入需要切换状态的闸板");
  246. string inMessage = Console.ReadLine();
  247. if (inMessage == "Esc") break;
  248. client.ReadHoldingRegisters(1, 400, 4, out ushort[] readmessage);
  249. int cla = Convert.ToInt32(inMessage);
  250. if (cla >= 8)
  251. {
  252. Console.WriteLine("无指定闸板");
  253. continue;
  254. }
  255. ushort sendmessage = readmessage[cla / 2];
  256. if (cla % 2 == 0)
  257. {
  258. sendmessage = (ushort)(sendmessage ^ Mask1);
  259. }
  260. else
  261. {
  262. sendmessage = (ushort)(sendmessage ^ Mask2);
  263. }
  264. client.WriteSingleRegister(1, (ushort)(400 + (cla / 2)), sendmessage);
  265. }
  266. //client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: sendMessage);
  267. }
  268. }
  269. static void TimeTest()
  270. {
  271. var client = new ModbusTcpClient();
  272. List<long> times = new List<long>();
  273. List<long> OutTime = new List<long>();
  274. var sendMessage = new ushort[20];
  275. Stopwatch stopwatch = Stopwatch.StartNew();
  276. Stopwatch stopwatch2 = Stopwatch.StartNew();
  277. if (client.Connect("192.168.0.88"))
  278. //if (client.Connect("127.0.0.1"))
  279. {
  280. //float[] test = client.ReadHoldingRegistersAsReal(1, 1198, 1, "BADC");
  281. //Console.WriteLine($"{test[0]}");
  282. int num = 0;
  283. Console.WriteLine("输入次数:");
  284. num = Convert.ToInt32(Console.ReadLine());
  285. for (int i = 0; i < num; i++)
  286. {
  287. for (int j = 0; j < 20; j++)
  288. {
  289. sendMessage[j] |= (ushort)(1 << ((i * 20 + j) % 8));
  290. }
  291. stopwatch.Restart();
  292. //bool[] ReadResult = client.ReadCoilsRegister(slaveId: 1, startAddress: 0, numRegisters: 1);
  293. //client.ReadHoldingRegisters(slaveId: 1, startAddress: 100, numRegisters: 2);
  294. client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: sendMessage);
  295. //client.WriteSingleRegister(slaveId: 1, registerAddress: 100, value: sendMessage);
  296. //client.WriteCoilsRegister(slaveId: 1, CoilsAddress: 0, values: true);
  297. //ushort[] registers = client.ReadHoldingRegisters(1, 100, 1);
  298. stopwatch.Stop();
  299. times.Add(stopwatch.ElapsedMilliseconds);
  300. if (stopwatch.ElapsedMilliseconds > 5)
  301. {
  302. OutTime.Add(stopwatch.ElapsedMilliseconds);
  303. }
  304. Console.WriteLine($"i:{i},times:{stopwatch.ElapsedMilliseconds}ms");
  305. //Thread.Sleep(20);
  306. }
  307. Console.WriteLine($"{stopwatch2.ElapsedMilliseconds}ms");
  308. Console.WriteLine($"平均:{times.Average()}ms");
  309. Console.WriteLine($"最大:{times.Max()}ms");
  310. Console.WriteLine($"超时数量:{OutTime.Count}");
  311. Console.WriteLine($"异常百分比:{((double)OutTime.Count / times.Count) * 100}%");
  312. }
  313. else
  314. {
  315. Console.WriteLine("Failed to connect to Modbus TCP server.");
  316. }
  317. Console.ReadKey();
  318. }
  319. static UInt32 GetInt32FromRegisters(ushort[] registers)
  320. {
  321. ushort highRegister = registers[0];
  322. ushort lowRegister = registers[1];
  323. // 根据字节序组合成32位值
  324. byte[] bytes = new byte[4];
  325. if (BitConverter.IsLittleEndian)
  326. {
  327. bytes[3] = (byte)((highRegister >> 8) & 0xFF);
  328. bytes[2] = (byte)(highRegister & 0xFF);
  329. bytes[1] = (byte)((lowRegister >> 8) & 0xFF);
  330. bytes[0] = (byte)(lowRegister & 0xFF);
  331. }
  332. else
  333. {
  334. bytes[0] = (byte)((highRegister >> 8) & 0xFF);
  335. bytes[1] = (byte)(highRegister & 0xFF);
  336. bytes[2] = (byte)((lowRegister >> 8) & 0xFF);
  337. bytes[3] = (byte)(lowRegister & 0xFF);
  338. }
  339. // 转换为float
  340. return (UInt32)BitConverter.ToInt32(bytes, 0);
  341. }
  342. static float GetFloatFromRegisters(ushort[] registers)
  343. {
  344. string byteOrder = "ABCD";
  345. ushort highRegister = registers[0];
  346. ushort lowRegister = registers[1];
  347. byte[] bytes = ConvertToByteArray(lowRegister, highRegister, byteOrder);
  348. return BitConverter.ToSingle(bytes, 0); ;
  349. }
  350. static byte[] ConvertToByteArray(ushort lowRegister, ushort highRegister, string byteOrder)
  351. {
  352. byte[] bytes = new byte[4];
  353. switch (byteOrder.ToUpper())
  354. {
  355. case "ABCD": // 大端序
  356. bytes[0] = (byte)(highRegister >> 8);
  357. bytes[1] = (byte)(highRegister & 0xFF);
  358. bytes[2] = (byte)(lowRegister >> 8);
  359. bytes[3] = (byte)(lowRegister & 0xFF);
  360. break;
  361. case "CDAB": // 小端序
  362. bytes[0] = (byte)(lowRegister >> 8);
  363. bytes[1] = (byte)(lowRegister & 0xFF);
  364. bytes[2] = (byte)(highRegister >> 8);
  365. bytes[3] = (byte)(highRegister & 0xFF);
  366. break;
  367. case "BADC":
  368. bytes[0] = (byte)(highRegister & 0xFF);
  369. bytes[1] = (byte)(highRegister >> 8);
  370. bytes[2] = (byte)(lowRegister & 0xFF);
  371. bytes[3] = (byte)(lowRegister >> 8);
  372. break;
  373. case "DCBA":
  374. bytes[0] = (byte)(lowRegister & 0xFF);
  375. bytes[1] = (byte)(lowRegister >> 8);
  376. bytes[2] = (byte)(highRegister & 0xFF);
  377. bytes[3] = (byte)(highRegister >> 8);
  378. break;
  379. default:
  380. // 默认使用ABCD顺序
  381. bytes[0] = (byte)(highRegister >> 8);
  382. bytes[1] = (byte)(highRegister & 0xFF);
  383. bytes[2] = (byte)(lowRegister >> 8);
  384. bytes[3] = (byte)(lowRegister & 0xFF);
  385. break;
  386. }
  387. return bytes;
  388. }
  389. [DllImport("winmm.dll")]
  390. static extern uint timeBeginPeriod(uint period);
  391. }
  392. }