| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- 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<ushort> ushorts = new List<ushort>();
- 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<ushort> ushorts = new List<ushort>();
- 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<long> times = new List<long>();
- List<long> OutTime = new List<long>();
- 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);
- }
- }
|