using CCDCount.DLL.Tools; using LogClass; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ModbusTest { internal class Program { static void Main(string[] args) { timeBeginPeriod(1); GC.Collect(); //ShuLiMoNi2(); ShuLiMoNi(); //TimeTest(); //var client = new ModbusTcpClient(); //if(client.Connect("127.0.0.1")) //if (client.Connect("192.168.0.88")) //{ //var result = client.ReadHoldingRegistersAsLReal(1, 3192, 1, "BADC"); //Console.WriteLine(result[0]); //client.WriteSingleLReal(1, 3192, 80, "BADC"); //var result = client.ReadHoldingRegisters(1, 3224, 1); //Console.WriteLine(result[0]); //client.WriteSingleRegister(1, 3184, 50); //} } public static void ShuLiMoNi() { List ushorts = new List(); int runnum = 0; int OkNum = 0; int NgNum = 0; Console.WriteLine("输入运行次数:"); runnum = Convert.ToInt32(Console.ReadLine()); ushort WriteCount = 1; long runcount = 0; long TongCount = 0; long OutTimeCount = 0; var client = new ModbusTcpClient(); if (client.Connect("192.168.0.88")) { Stopwatch sw = Stopwatch.StartNew(); Random random = new Random(); ushort nowReturnValue = 10; ushort[] ReturnValue = null; while (runnum >= 0) { ushort[] result = new ushort[20]; ushort value1 = 0; int Value0 = random.Next(10); if (Value0 < 4) { value1 |= (ushort)(1 << (WriteCount % 8)); ushorts.Add(value1); OkNum++; } else { NgNum++; } WriteCount++; runnum--; sw.Restart(); if (nowReturnValue == 10) { client.ReadHoldingRegisters(slaveId: 1, startAddress: 0, numRegisters: 1, out ReturnValue); TongCount++; } if (ReturnValue == null) { continue; } //发送带值数据 if (ReturnValue[0] == 0) { nowReturnValue = ReturnValue[0]; if (ushorts.Count > 0) { for (int i = 0; i < (ushorts.Count > 10 ? 10 : ushorts.Count); i++) { result[i] = ushorts[i]; DateTime nowtime = DateTime.Now; Console.WriteLine("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]); LOG.log(string.Format("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]), 6); ushorts.Remove(ushorts[i]); } //写入数据 client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: result); TongCount++; //client.WriteSingleRegister(slaveId: 1, registerAddress: 0, value: 1); //TongCount++; sw.Stop(); LOG.log(string.Format("SendMess1Ok:{0},SendMess1Ng:{1},SendMess2Ok:{2},SendMess2Ng:{3}," + "\nSendMessage3Ok:{4},SendMessage3Ng:{5},SendMessage4Ok:{6},SendMessage4Ng:{7}," + "\nSendMessage5Ok:{8},SendMessage5Ng:{9},SendMessage6Ok:{10},SendMessage6Ng:{11}," + "\nSendMessage7Ok:{12},SendMessage7Ng:{13},SendMessage8Ok:{14},SendMessage8Ng:{15}," + "\nSendMessage9Ok:{16},SendMessage9Ng:{17},SendMessage10Ok:{18},SendMessage10Ng:{19}," + "\n此次写值耗时:{20},此次写入writecount:{21}", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15], result[16], result[17], result[18], result[19], sw.Elapsed, WriteCount), 6); nowReturnValue = 10; if (sw.ElapsedMilliseconds > 5) { LOG.error("单次通讯超时"); OutTimeCount++; } } } runcount++; if (5 - sw.ElapsedMilliseconds > 0) { Thread.Sleep(5 - (int)sw.ElapsedMilliseconds); } } } Console.WriteLine("有效数据:{0},无效数据:{1},总通讯次数:{2},超时周期数量:{3}", OkNum, NgNum, TongCount, OutTimeCount); LOG.log(string.Format("有效数据:{0},无效数据:{1},总通讯次数:{2},超时周期数量{3}", OkNum, NgNum, TongCount, OutTimeCount), 6); Console.ReadKey(); } public static void ShuLiMoNi2() { List ushorts = new List(); int runnum = 0; int OkNum = 0; int NgNum = 0; Console.WriteLine("输入运行次数:"); runnum = Convert.ToInt32(Console.ReadLine()); ushort WriteCount = 1; long runcount = 0; long TongCount = 0; long OutTimeCount = 0; var client = new ModbusTcpClient(); if (client.Connect("192.168.0.88")) { Stopwatch sw = Stopwatch.StartNew(); Random random = new Random(); ushort nowReturnValue = 10; ushort[] ReturnValue = null; while (runnum >= 0) { ushort[] result = new ushort[20]; ushort value1 = 0; int Value0 = random.Next(10); if (Value0 < 4) { value1 |= (ushort)(1 << (WriteCount % 8)); ushorts.Add(value1); OkNum++; } else { NgNum++; } WriteCount++; runnum--; sw.Restart(); if (nowReturnValue == 10) { client.ReadHoldingRegisters(slaveId: 1, startAddress: 0, numRegisters: 1, out ReturnValue); TongCount++; } if (ReturnValue == null) { continue; } //发送带值数据 if (ReturnValue[0] == 0) { nowReturnValue = ReturnValue[0]; bool IsOKValue = false; if (ushorts.Count > 0) { Console.WriteLine("1"); IsOKValue = true; for (int i = 0; i < (ushorts.Count > 10 ? 10 : ushorts.Count); i++) { result[i] = ushorts[i]; DateTime nowtime = DateTime.Now; Console.WriteLine("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]); LOG.log(string.Format("{0}:输出的编号为{1},数据为{2}", nowtime, runcount, result[i]), 6); ushorts.Remove(ushorts[i]); } //写入数据 if (OkNum % 100 < 70 && IsOKValue) { client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: result); TongCount++; client.WriteSingleRegister(slaveId: 1, registerAddress: 0, value: 1); TongCount++; sw.Stop(); LOG.log(string.Format("SendMess1Ok:{0},SendMess1Ng:{1},SendMess2Ok:{2},SendMess2Ng:{3}," + "\nSendMessage3Ok:{4},SendMessage3Ng:{5},SendMessage4Ok:{6},SendMessage4Ng:{7}," + "\nSendMessage5Ok:{8},SendMessage5Ng:{9},SendMessage6Ok:{10},SendMessage6Ng:{11}," + "\nSendMessage7Ok:{12},SendMessage7Ng:{13},SendMessage8Ok:{14},SendMessage8Ng:{15}," + "\nSendMessage9Ok:{16},SendMessage9Ng:{17},SendMessage10Ok:{18},SendMessage10Ng:{19}," + "\n此次写值耗时:{20},此次写入writecount:{21}", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15], result[16], result[17], result[18], result[19], sw.Elapsed, WriteCount), 6); nowReturnValue = 10; if (sw.ElapsedMilliseconds > 5) { OutTimeCount++; LOG.error("单次通讯超时"); } } } } runcount++; if (5 - sw.ElapsedMilliseconds > 0) { Thread.Sleep(5 - (int)sw.ElapsedMilliseconds); } } client.Disconnect(); } Console.WriteLine("有效数据:{0},无效数据:{1},总通讯次数:{2},超时次数:{3}", OkNum, NgNum, TongCount,OutTimeCount); LOG.log(string.Format("有效数据:{0},无效数据:{1},总通讯次数:{2},超时次数{3}", OkNum, NgNum, TongCount,OutTimeCount), 6); Console.ReadKey(); } public void SwitchStatic() { var client = new ModbusTcpClient(); ushort Mask1 = (ushort)(1 << 0); ushort Mask2 = (ushort)(1 << 8); //if (client.Connect("127.0.0.1")) if (client.Connect("192.168.0.88")) { while (true) { Console.WriteLine("输入需要切换状态的闸板"); string inMessage = Console.ReadLine(); if (inMessage == "Esc") break; client.ReadHoldingRegisters(1, 400, 4, out ushort[] readmessage); int cla = Convert.ToInt32(inMessage); if (cla >= 8) { Console.WriteLine("无指定闸板"); continue; } ushort sendmessage = readmessage[cla / 2]; if (cla % 2 == 0) { sendmessage = (ushort)(sendmessage ^ Mask1); } else { sendmessage = (ushort)(sendmessage ^ Mask2); } client.WriteSingleRegister(1, (ushort)(400 + (cla / 2)), sendmessage); } //client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: sendMessage); } } static void TimeTest() { var client = new ModbusTcpClient(); List times = new List(); List OutTime = new List(); var sendMessage = new ushort[20]; Stopwatch stopwatch = Stopwatch.StartNew(); Stopwatch stopwatch2 = Stopwatch.StartNew(); if (client.Connect("192.168.0.88")) //if (client.Connect("127.0.0.1")) { //float[] test = client.ReadHoldingRegistersAsReal(1, 1198, 1, "BADC"); //Console.WriteLine($"{test[0]}"); int num = 0; Console.WriteLine("输入次数:"); num = Convert.ToInt32(Console.ReadLine()); for (int i = 0; i < num; i++) { for (int j = 0; j < 20; j++) { sendMessage[j] |= (ushort)(1 << ((i * 20 + j) % 8)); } stopwatch.Restart(); //bool[] ReadResult = client.ReadCoilsRegister(slaveId: 1, startAddress: 0, numRegisters: 1); //client.ReadHoldingRegisters(slaveId: 1, startAddress: 100, numRegisters: 2); client.WriteMultipleRegisters(slaveId: 1, startAddress: 100, values: sendMessage); //client.WriteSingleRegister(slaveId: 1, registerAddress: 100, value: sendMessage); //client.WriteCoilsRegister(slaveId: 1, CoilsAddress: 0, values: true); //ushort[] registers = client.ReadHoldingRegisters(1, 100, 1); stopwatch.Stop(); times.Add(stopwatch.ElapsedMilliseconds); if (stopwatch.ElapsedMilliseconds > 5) { OutTime.Add(stopwatch.ElapsedMilliseconds); } Console.WriteLine($"i:{i},times:{stopwatch.ElapsedMilliseconds}ms"); //Thread.Sleep(20); } Console.WriteLine($"{stopwatch2.ElapsedMilliseconds}ms"); Console.WriteLine($"平均:{times.Average()}ms"); Console.WriteLine($"最大:{times.Max()}ms"); Console.WriteLine($"超时数量:{OutTime.Count}"); Console.WriteLine($"异常百分比:{((double)OutTime.Count / times.Count) * 100}%"); } else { Console.WriteLine("Failed to connect to Modbus TCP server."); } Console.ReadKey(); } static UInt32 GetInt32FromRegisters(ushort[] registers) { ushort highRegister = registers[0]; ushort lowRegister = registers[1]; // 根据字节序组合成32位值 byte[] bytes = new byte[4]; if (BitConverter.IsLittleEndian) { bytes[3] = (byte)((highRegister >> 8) & 0xFF); bytes[2] = (byte)(highRegister & 0xFF); bytes[1] = (byte)((lowRegister >> 8) & 0xFF); bytes[0] = (byte)(lowRegister & 0xFF); } else { bytes[0] = (byte)((highRegister >> 8) & 0xFF); bytes[1] = (byte)(highRegister & 0xFF); bytes[2] = (byte)((lowRegister >> 8) & 0xFF); bytes[3] = (byte)(lowRegister & 0xFF); } // 转换为float return (UInt32)BitConverter.ToInt32(bytes, 0); } static float GetFloatFromRegisters(ushort[] registers) { string byteOrder = "ABCD"; ushort highRegister = registers[0]; ushort lowRegister = registers[1]; byte[] bytes = ConvertToByteArray(lowRegister, highRegister, byteOrder); return BitConverter.ToSingle(bytes, 0); ; } static byte[] ConvertToByteArray(ushort lowRegister, ushort highRegister, string byteOrder) { byte[] bytes = new byte[4]; switch (byteOrder.ToUpper()) { case "ABCD": // 大端序 bytes[0] = (byte)(highRegister >> 8); bytes[1] = (byte)(highRegister & 0xFF); bytes[2] = (byte)(lowRegister >> 8); bytes[3] = (byte)(lowRegister & 0xFF); break; case "CDAB": // 小端序 bytes[0] = (byte)(lowRegister >> 8); bytes[1] = (byte)(lowRegister & 0xFF); bytes[2] = (byte)(highRegister >> 8); bytes[3] = (byte)(highRegister & 0xFF); break; case "BADC": bytes[0] = (byte)(highRegister & 0xFF); bytes[1] = (byte)(highRegister >> 8); bytes[2] = (byte)(lowRegister & 0xFF); bytes[3] = (byte)(lowRegister >> 8); break; case "DCBA": bytes[0] = (byte)(lowRegister & 0xFF); bytes[1] = (byte)(lowRegister >> 8); bytes[2] = (byte)(highRegister & 0xFF); bytes[3] = (byte)(highRegister >> 8); break; default: // 默认使用ABCD顺序 bytes[0] = (byte)(highRegister >> 8); bytes[1] = (byte)(highRegister & 0xFF); bytes[2] = (byte)(lowRegister >> 8); bytes[3] = (byte)(lowRegister & 0xFF); break; } return bytes; } [DllImport("winmm.dll")] static extern uint timeBeginPeriod(uint period); } }