From c02235a381b499d79b6d7385db540576220f728c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=94=84=E5=A4=B4?= Date: Wed, 14 Aug 2024 16:50:31 +0800 Subject: [PATCH 1/5] fix --- NDSD-Screwdriver/read.json | 2 + NDSD-TouchSocket/SerialPortClient.cs | 72 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 NDSD-Screwdriver/read.json create mode 100644 NDSD-TouchSocket/SerialPortClient.cs diff --git a/NDSD-Screwdriver/read.json b/NDSD-Screwdriver/read.json new file mode 100644 index 0000000..d543c6b --- /dev/null +++ b/NDSD-Screwdriver/read.json @@ -0,0 +1,2 @@ +00 03 08 E0 04 01 50 B8 C0 51 2F 43 AE +00 03 00 1C 00 04 84 1E \ No newline at end of file diff --git a/NDSD-TouchSocket/SerialPortClient.cs b/NDSD-TouchSocket/SerialPortClient.cs new file mode 100644 index 0000000..889d395 --- /dev/null +++ b/NDSD-TouchSocket/SerialPortClient.cs @@ -0,0 +1,72 @@ +using System; +using System.Text; +using System.Threading.Tasks; +using NewLife; +using TouchSocket.Core; +using TouchSocket.SerialPorts; +using TouchSocket.Sockets; + +namespace NDSD_TouchSocket +{ + public class SerialPortClientFactory + { + static SerialPortClient client = new SerialPortClient(); + + public static void Send(string str) + { + client.Send(str); + } + + + public static void Send(ReadOnlyMemory memory) + { + client.Send(memory); + } + + public static void Init() + { + + client.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即将连接到端口 + client.Connected = (client, e) => { return EasyTask.CompletedTask; };//成功连接到端口 + client.Received = (c, e) => + { + var mes = e.ByteBlock.Span.ToArray(); + byte[] subArray = null; + if (mes.Length == 12) + { + var i = mes[1].ToInt(); + subArray = new byte[i]; + Array.Copy(mes, 1, subArray, 3, i); + } + + if (mes.Length == 13) + { + var i = mes[2].ToInt(); + subArray = new byte[i]; + Array.Copy(mes, 2, subArray, 2, i); + } + + if (subArray != null) + { + string message = subArray.ToHex(" "); + } + + return Task.CompletedTask; + + }; + + client.Setup(new TouchSocket.Core.TouchSocketConfig() + .SetSerialPortOption(new SerialPortOption() + { + BaudRate = 9600,//波特率 + DataBits = 8,//数据位 + Parity = System.IO.Ports.Parity.None,//校验位 + PortName = "COM13",//COM + StopBits = System.IO.Ports.StopBits.One//停止位 + })); + + client.Connect(); + Console.WriteLine("连接成功"); + } + } +} \ No newline at end of file From 246e0423f1b5ac2ea605850fb5e8b9430297a7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=94=84=E5=A4=B4?= Date: Wed, 14 Aug 2024 16:50:57 +0800 Subject: [PATCH 2/5] fix --- ConsoleApplication/ConsoleApplication.csproj | 59 ++++++++++++ ConsoleApplication/Program.cs | 84 ++++++++++++++++++ ConsoleApplication/Properties/AssemblyInfo.cs | 35 ++++++++ DNSD_DB/DNSD_DB.csproj | 11 ++- DNSD_DB/packages.config | 5 ++ Dll/nmodbuspc.dll | Bin 0 -> 76288 bytes NDSD-Screwdriver/App.config | 4 + NDSD-Screwdriver/FrmSetting.Designer.cs | 57 +++++++----- NDSD-Screwdriver/FrmSetting.cs | 20 ++++- NDSD-Screwdriver/NDSD_Screwdriver.csproj | 39 +++++++- NDSD-Screwdriver/packages.config | 13 ++- NDSD-TouchSocket/NDSD_TouchSocket.csproj | 22 ++++- NDSD-TouchSocket/SerialPortClient.cs | 72 --------------- NDSD-TouchSocket/Utils.cs | 37 ++++++++ NDSD-TouchSocket/packages.config | 7 +- 15 files changed, 353 insertions(+), 112 deletions(-) create mode 100644 ConsoleApplication/ConsoleApplication.csproj create mode 100644 ConsoleApplication/Program.cs create mode 100644 ConsoleApplication/Properties/AssemblyInfo.cs create mode 100644 DNSD_DB/packages.config create mode 100644 Dll/nmodbuspc.dll delete mode 100644 NDSD-TouchSocket/SerialPortClient.cs diff --git a/ConsoleApplication/ConsoleApplication.csproj b/ConsoleApplication/ConsoleApplication.csproj new file mode 100644 index 0000000..c635f07 --- /dev/null +++ b/ConsoleApplication/ConsoleApplication.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {D090275D-5272-4408-A97F-96DA24D568A4} + Exe + Properties + ConsoleApplication + ConsoleApplication + v4.8 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + C:\Program Files\IIS\Microsoft Web Deploy V3\Newtonsoft.Json.dll + + + + + + + + + + + + + + + diff --git a/ConsoleApplication/Program.cs b/ConsoleApplication/Program.cs new file mode 100644 index 0000000..896b4c0 --- /dev/null +++ b/ConsoleApplication/Program.cs @@ -0,0 +1,84 @@ +using System; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Security.Cryptography; +using System.Text; +using System.Threading; + +namespace ConsoleApplication +{ + internal class Program + { + + static string GetTimestamp() + { + long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds(); + return milliseconds.ToString(); + } + + static string GenerateMD5(string input) + { + using (MD5 md5 = MD5.Create()) + { + byte[] inputBytes = Encoding.UTF8.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < hashBytes.Length; i++) + { + sb.Append(hashBytes[i].ToString("x2")); + } + + return sb.ToString(); + } + } + + public static void Main(string[] args) + { + //创建 HttpClient 实例 + using (HttpClient client = new HttpClient()) + { + // 设置请求的基础地址 + client.BaseAddress = new Uri("http://IP/jd/services/sendReceiveCollectionBag"); + string timeStamp = GetTimestamp(); + // 设置请求头 + client.DefaultRequestHeaders.Accept.Clear(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + client.DefaultRequestHeaders.Add("JD-MachineCode", "channel-machine-test-rk-001"); + client.DefaultRequestHeaders.Add("JD-Timestamp", timeStamp); + client.DefaultRequestHeaders.Add("JD-Signature", GenerateMD5("channel-machine-test-rk-001" + timeStamp + "08F68F890E91838CE6C5D08347F17F58")); + + object parameters = new object(); + + var jsonContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(parameters), Encoding.UTF8, "application/json"); + + // 选择请求方式 + HttpResponseMessage response; + try + { + // 发送 POST 请求 + response = client.PostAsync("/api/endpoint", jsonContent).GetAwaiter().GetResult(); + + // 处理响应 + if (response.IsSuccessStatusCode) + { + string responseData = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();; + Console.WriteLine("Response: " + responseData); + } + else + { + Console.WriteLine("Error: " + response.ReasonPhrase); + } + } + catch (Exception e) + { + Console.WriteLine("Exception: " + e.Message); + } + } + + + Thread.Sleep(-1); + + } + } +} \ No newline at end of file diff --git a/ConsoleApplication/Properties/AssemblyInfo.cs b/ConsoleApplication/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e283a35 --- /dev/null +++ b/ConsoleApplication/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ConsoleApplication")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApplication")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("D090275D-5272-4408-A97F-96DA24D568A4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/DNSD_DB/DNSD_DB.csproj b/DNSD_DB/DNSD_DB.csproj index c67b71e..717ec3b 100644 --- a/DNSD_DB/DNSD_DB.csproj +++ b/DNSD_DB/DNSD_DB.csproj @@ -36,14 +36,14 @@ - - ..\packages\Chloe.5.25.0\lib\net46\Chloe.dll + + ..\packages\Chloe.5.26.0\lib\net46\Chloe.dll ..\packages\Chloe.Extension.5.25.0\lib\net46\Chloe.Extension.dll - - ..\packages\Chloe.SQLite.5.25.0\lib\net46\Chloe.SQLite.dll + + ..\packages\Chloe.SQLite.5.26.0\lib\net46\Chloe.SQLite.dll @@ -64,5 +64,8 @@ + + + \ No newline at end of file diff --git a/DNSD_DB/packages.config b/DNSD_DB/packages.config new file mode 100644 index 0000000..f656bf6 --- /dev/null +++ b/DNSD_DB/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Dll/nmodbuspc.dll b/Dll/nmodbuspc.dll new file mode 100644 index 0000000000000000000000000000000000000000..7029c09ba1f39b92cc3d24f532e700f8278ad07f GIT binary patch literal 76288 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 literal 0 HcmV?d00001 diff --git a/NDSD-Screwdriver/App.config b/NDSD-Screwdriver/App.config index ce6529a..2154567 100644 --- a/NDSD-Screwdriver/App.config +++ b/NDSD-Screwdriver/App.config @@ -21,6 +21,10 @@ + + + + \ No newline at end of file diff --git a/NDSD-Screwdriver/FrmSetting.Designer.cs b/NDSD-Screwdriver/FrmSetting.Designer.cs index 2e8773b..e3737d5 100644 --- a/NDSD-Screwdriver/FrmSetting.Designer.cs +++ b/NDSD-Screwdriver/FrmSetting.Designer.cs @@ -29,12 +29,13 @@ private void InitializeComponent() { this.dataGridView1 = new System.Windows.Forms.DataGridView(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.btnSave = new System.Windows.Forms.Button(); this.RfidNo = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Green = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Yellow = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Red = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnSave = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); this.groupBox1.SuspendLayout(); this.SuspendLayout(); @@ -55,26 +56,6 @@ this.dataGridView1.Size = new System.Drawing.Size(693, 788); this.dataGridView1.TabIndex = 0; // - // groupBox1 - // - this.groupBox1.Controls.Add(this.dataGridView1); - this.groupBox1.Location = new System.Drawing.Point(27, 32); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(699, 815); - this.groupBox1.TabIndex = 1; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "报警灯设置"; - // - // btnSave - // - this.btnSave.Location = new System.Drawing.Point(30, 904); - this.btnSave.Name = "btnSave"; - this.btnSave.Size = new System.Drawing.Size(183, 90); - this.btnSave.TabIndex = 2; - this.btnSave.Text = "保存报警灯"; - this.btnSave.UseVisualStyleBackColor = true; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // // RfidNo // this.RfidNo.DataPropertyName = "RfidNo"; @@ -115,11 +96,42 @@ this.Red.Resizable = System.Windows.Forms.DataGridViewTriState.False; this.Red.Width = 80; // + // groupBox1 + // + this.groupBox1.Controls.Add(this.dataGridView1); + this.groupBox1.Location = new System.Drawing.Point(27, 32); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(699, 815); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "报警灯设置"; + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(30, 904); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(183, 90); + this.btnSave.TabIndex = 2; + this.btnSave.Text = "保存报警灯"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(932, 768); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(183, 90); + this.button1.TabIndex = 3; + this.button1.Text = "保存报警灯"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // // FrmSetting // this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(2021, 1124); + this.Controls.Add(this.button1); this.Controls.Add(this.btnSave); this.Controls.Add(this.groupBox1); this.Name = "FrmSetting"; @@ -139,5 +151,6 @@ private System.Windows.Forms.DataGridViewTextBoxColumn Green; private System.Windows.Forms.DataGridViewTextBoxColumn Yellow; private System.Windows.Forms.DataGridViewTextBoxColumn Red; + private System.Windows.Forms.Button button1; } } \ No newline at end of file diff --git a/NDSD-Screwdriver/FrmSetting.cs b/NDSD-Screwdriver/FrmSetting.cs index acf3781..5798b14 100644 --- a/NDSD-Screwdriver/FrmSetting.cs +++ b/NDSD-Screwdriver/FrmSetting.cs @@ -14,6 +14,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using NDSD_TouchSocket; +using NewLife; +using TouchSocket.Core; namespace NDSD_Screwdriver { @@ -22,8 +25,16 @@ namespace NDSD_Screwdriver public FrmSetting() { InitializeComponent(); + + + var body = "00 03 08 E0 04 01 50 B8 C1 39 3A".ToHex(); + + var ssss = CRC16.ToModbus(body).ToHex(" "); + SqlLiteTool.CreateTable(AppTool.GetDb()); Init(); + + SerialPortClientFactory.Init(); } @@ -34,8 +45,7 @@ namespace NDSD_Screwdriver dataGridView1.AutoGenerateColumns = false; var ctx = SqlLiteTool.GetDb(AppTool.GetDb()); var list= ctx.Query().Where(x => x.IsEnable == true).ToList(); - - // dataGridView1.DataSource = list;//DataGridView的行可以添加删除(只有允许添加行、删除行) + dataGridView1.DataSource = new BindingList(list);//DataGridView的行可以添加删除(只有允许添加行、删除行) dataGridView1.AllowUserToAddRows = true; @@ -185,5 +195,11 @@ namespace NDSD_Screwdriver int b = 16; return x >= a && x <= b; } + + private void button1_Click(object sender, EventArgs e) + { + byte [] bytes=new byte[]{0x00,0x03,0x00,0x1C,0x00,0x04,0x84,0x1E}; + SerialPortClientFactory.Send(bytes); + } } } diff --git a/NDSD-Screwdriver/NDSD_Screwdriver.csproj b/NDSD-Screwdriver/NDSD_Screwdriver.csproj index 2f60c7e..e3201cc 100644 --- a/NDSD-Screwdriver/NDSD_Screwdriver.csproj +++ b/NDSD-Screwdriver/NDSD_Screwdriver.csproj @@ -33,26 +33,47 @@ 4 - - ..\packages\Chloe.5.25.0\lib\net46\Chloe.dll + + ..\packages\Chloe.5.26.0\lib\net46\Chloe.dll - - ..\packages\Chloe.SQLite.5.25.0\lib\net46\Chloe.SQLite.dll + + ..\packages\Chloe.SQLite.5.26.0\lib\net46\Chloe.SQLite.dll ..\packages\NewLife.Core.10.10.2024.803\lib\net461\NewLife.Core.dll + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + ..\Dll\System.Data.SQLite.dll + + ..\packages\System.IO.Ports.8.0.0\lib\net462\System.IO.Ports.dll + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll @@ -66,6 +87,12 @@ + + ..\packages\TouchSocket.2.1.0-rc.10\lib\net472\TouchSocket.dll + + + ..\packages\TouchSocket.Core.2.1.0-rc.10\lib\net472\TouchSocket.Core.dll + @@ -139,6 +166,7 @@ + Always @@ -146,5 +174,8 @@ Always + + + \ No newline at end of file diff --git a/NDSD-Screwdriver/packages.config b/NDSD-Screwdriver/packages.config index 28d5a6e..571fcd8 100644 --- a/NDSD-Screwdriver/packages.config +++ b/NDSD-Screwdriver/packages.config @@ -1,7 +1,16 @@  - - + + + + + + + + + + + \ No newline at end of file diff --git a/NDSD-TouchSocket/NDSD_TouchSocket.csproj b/NDSD-TouchSocket/NDSD_TouchSocket.csproj index 7887024..1bd4160 100644 --- a/NDSD-TouchSocket/NDSD_TouchSocket.csproj +++ b/NDSD-TouchSocket/NDSD_TouchSocket.csproj @@ -31,6 +31,10 @@ 4 + + + ..\packages\NewLife.Core.10.10.2024.803\lib\net461\NewLife.Core.dll + ..\NDSD-Screwdriver\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll @@ -39,6 +43,11 @@ ..\NDSD-Screwdriver\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.IO.Ports.8.0.0\lib\net462\System.IO.Ports.dll + + ..\NDSD-Screwdriver\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll @@ -47,11 +56,16 @@ ..\NDSD-Screwdriver\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - ..\NDSD-Screwdriver\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll ..\NDSD-Screwdriver\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + @@ -59,10 +73,10 @@ - ..\packages\TouchSocket.2.1.0-rc.9\lib\net472\TouchSocket.dll + ..\packages\TouchSocket.2.1.0-rc.10\lib\net472\TouchSocket.dll - ..\packages\TouchSocket.Core.2.1.0-rc.9\lib\net472\TouchSocket.Core.dll + ..\packages\TouchSocket.Core.2.1.0-rc.10\lib\net472\TouchSocket.Core.dll @@ -77,7 +91,7 @@ - + \ No newline at end of file diff --git a/NDSD-TouchSocket/SerialPortClient.cs b/NDSD-TouchSocket/SerialPortClient.cs deleted file mode 100644 index 889d395..0000000 --- a/NDSD-TouchSocket/SerialPortClient.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Text; -using System.Threading.Tasks; -using NewLife; -using TouchSocket.Core; -using TouchSocket.SerialPorts; -using TouchSocket.Sockets; - -namespace NDSD_TouchSocket -{ - public class SerialPortClientFactory - { - static SerialPortClient client = new SerialPortClient(); - - public static void Send(string str) - { - client.Send(str); - } - - - public static void Send(ReadOnlyMemory memory) - { - client.Send(memory); - } - - public static void Init() - { - - client.Connecting = (client, e) => { return EasyTask.CompletedTask; };//即将连接到端口 - client.Connected = (client, e) => { return EasyTask.CompletedTask; };//成功连接到端口 - client.Received = (c, e) => - { - var mes = e.ByteBlock.Span.ToArray(); - byte[] subArray = null; - if (mes.Length == 12) - { - var i = mes[1].ToInt(); - subArray = new byte[i]; - Array.Copy(mes, 1, subArray, 3, i); - } - - if (mes.Length == 13) - { - var i = mes[2].ToInt(); - subArray = new byte[i]; - Array.Copy(mes, 2, subArray, 2, i); - } - - if (subArray != null) - { - string message = subArray.ToHex(" "); - } - - return Task.CompletedTask; - - }; - - client.Setup(new TouchSocket.Core.TouchSocketConfig() - .SetSerialPortOption(new SerialPortOption() - { - BaudRate = 9600,//波特率 - DataBits = 8,//数据位 - Parity = System.IO.Ports.Parity.None,//校验位 - PortName = "COM13",//COM - StopBits = System.IO.Ports.StopBits.One//停止位 - })); - - client.Connect(); - Console.WriteLine("连接成功"); - } - } -} \ No newline at end of file diff --git a/NDSD-TouchSocket/Utils.cs b/NDSD-TouchSocket/Utils.cs index efe0755..ff06809 100644 --- a/NDSD-TouchSocket/Utils.cs +++ b/NDSD-TouchSocket/Utils.cs @@ -52,6 +52,8 @@ namespace NDSD_TouchSocket } return builder.ToString().Trim(); } + + } public static class CRC16 @@ -129,5 +131,40 @@ namespace NDSD_TouchSocket return (uchCRCHi << 8) | uchCRCLo; // 返回校验值 } + + + + /// + /// CRC16_Modbus效验 + /// + /// 要进行计算的字节数组 + /// 计算后的数组 + public static byte[] ToModbus(byte[] byteData) + { + byte[] CRC = new byte[2]; + + UInt16 wCrc = 0xFFFF; + for (int i = 0; i < byteData.Length; i++) + { + wCrc ^= Convert.ToUInt16(byteData[i]); + for (int j = 0; j < 8; j++) + { + if ((wCrc & 0x0001) == 1) + { + wCrc >>= 1; + wCrc ^= 0xA001;//异或多项式 + } + else + { + wCrc >>= 1; + } + } + } + + CRC[1] = (byte)((wCrc & 0xFF00) >> 8);//高位在后 + CRC[0] = (byte)(wCrc & 0x00FF); //低位在前 + return CRC; + + } } } diff --git a/NDSD-TouchSocket/packages.config b/NDSD-TouchSocket/packages.config index 0cf70b2..7bf105e 100644 --- a/NDSD-TouchSocket/packages.config +++ b/NDSD-TouchSocket/packages.config @@ -1,11 +1,14 @@  + + - - + + + \ No newline at end of file From 07bb9f4c0b17b282a37530518f34710fb41aa754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=94=84=E5=A4=B4?= Date: Wed, 14 Aug 2024 16:51:34 +0800 Subject: [PATCH 3/5] SerialPortClientFactory --- NDSD-Screwdriver/FrmSetting.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NDSD-Screwdriver/FrmSetting.cs b/NDSD-Screwdriver/FrmSetting.cs index 5798b14..8327c44 100644 --- a/NDSD-Screwdriver/FrmSetting.cs +++ b/NDSD-Screwdriver/FrmSetting.cs @@ -34,7 +34,6 @@ namespace NDSD_Screwdriver SqlLiteTool.CreateTable(AppTool.GetDb()); Init(); - SerialPortClientFactory.Init(); } @@ -199,7 +198,7 @@ namespace NDSD_Screwdriver private void button1_Click(object sender, EventArgs e) { byte [] bytes=new byte[]{0x00,0x03,0x00,0x1C,0x00,0x04,0x84,0x1E}; - SerialPortClientFactory.Send(bytes); + } } } From 72b258db65aa37f02e30671b5bc61ccc1e2a29f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=94=84=E5=A4=B4?= Date: Wed, 14 Aug 2024 17:08:37 +0800 Subject: [PATCH 4/5] SerialPortFactory --- NDSD-Screwdriver/NDSD_Screwdriver.csproj | 6 + NDSD-Screwdriver/Tool/HFIIREADER_PARAMS.cs | 49 + NDSD-Screwdriver/Tool/SerialPortFactory.cs | 58 + NDSD-Screwdriver/Tool/hfIIReader.cs | 1205 ++++++++++++++++++++ 4 files changed, 1318 insertions(+) create mode 100644 NDSD-Screwdriver/Tool/HFIIREADER_PARAMS.cs create mode 100644 NDSD-Screwdriver/Tool/SerialPortFactory.cs create mode 100644 NDSD-Screwdriver/Tool/hfIIReader.cs diff --git a/NDSD-Screwdriver/NDSD_Screwdriver.csproj b/NDSD-Screwdriver/NDSD_Screwdriver.csproj index e3201cc..48468bd 100644 --- a/NDSD-Screwdriver/NDSD_Screwdriver.csproj +++ b/NDSD-Screwdriver/NDSD_Screwdriver.csproj @@ -47,6 +47,9 @@ ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + ..\Dll\nmodbuspc.dll + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll @@ -118,6 +121,9 @@ ScrewdriverTest.cs + + + FrmSetting.cs diff --git a/NDSD-Screwdriver/Tool/HFIIREADER_PARAMS.cs b/NDSD-Screwdriver/Tool/HFIIREADER_PARAMS.cs new file mode 100644 index 0000000..d58f1b5 --- /dev/null +++ b/NDSD-Screwdriver/Tool/HFIIREADER_PARAMS.cs @@ -0,0 +1,49 @@ +using System.Runtime.InteropServices; + +namespace NDSD_Screwdriver.Tool +{ + +// Token: 0x02000002 RID: 2 + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HFIIREADER_PARAMS + { + // Token: 0x04000001 RID: 1 + public ushort addr; + + // Token: 0x04000002 RID: 2 + public ushort br; + + // Token: 0x04000003 RID: 3 + public ushort afiMode; + + // Token: 0x04000004 RID: 4 + public ushort invtTo; + + // Token: 0x04000005 RID: 5 + public ushort trgMode; + + // Token: 0x04000006 RID: 6 + public ushort opTagMode; + + // Token: 0x04000007 RID: 7 + public ushort opBlockRegAddr; + + // Token: 0x04000008 RID: 8 + public ushort opBlockRegNum; + + // Token: 0x04000009 RID: 9 + public ushort trgTimerTick; + + // Token: 0x0400000A RID: 10 + public ushort opFormat; + + // Token: 0x0400000B RID: 11 + public ushort frameHead; + + // Token: 0x0400000C RID: 12 + public ushort keppTimer; + + // Token: 0x0400000D RID: 13 + public ushort tagType; + } +} \ No newline at end of file diff --git a/NDSD-Screwdriver/Tool/SerialPortFactory.cs b/NDSD-Screwdriver/Tool/SerialPortFactory.cs new file mode 100644 index 0000000..7064f51 --- /dev/null +++ b/NDSD-Screwdriver/Tool/SerialPortFactory.cs @@ -0,0 +1,58 @@ +using System.IO.Ports; + + +namespace NDSD_Screwdriver.Tool +{ + public class SerialPortFactory + { + private SerialPort serialPortModbus; + private hfIIReader reader; + public SerialPortFactory(string portName="COM13") + { + reader = new hfIIReader(); + serialPortModbus = new SerialPort(); + serialPortModbus.BaudRate = 9600; + serialPortModbus.PortName = portName; + serialPortModbus.ReadTimeout = 0; + } + + + public string Read() + { + + if (!serialPortModbus.IsOpen) + { + serialPortModbus.Open(); + var b= reader.Connect(serialPortModbus, 2000, 0); + } + + + string str2 = ""; + ushort[] array6 = reader.ReadTagMemory(ref str2, 28, 4); + + string text6 = ""; + for (int j = 0; j < 4; j += 1) + { + text6 += array6[j].ToString("X").PadLeft(4, '0'); + if (text6.Length > 0) + { + text6 += ""; + } + } + + return text6; + } + + + public void Disconnect() + { + if (!serialPortModbus.IsOpen) + { + serialPortModbus.Close(); + } + reader.Disconnect(); + } + + + } +} \ No newline at end of file diff --git a/NDSD-Screwdriver/Tool/hfIIReader.cs b/NDSD-Screwdriver/Tool/hfIIReader.cs new file mode 100644 index 0000000..0eb783d --- /dev/null +++ b/NDSD-Screwdriver/Tool/hfIIReader.cs @@ -0,0 +1,1205 @@ +using System; +using System.IO.Ports; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using Modbus.Device; + +namespace NDSD_Screwdriver.Tool +{ + public class hfIIReader + { + // Token: 0x0600000F RID: 15 RVA: 0x000032BC File Offset: 0x000014BC + public bool Connect(SerialPort serialPort, int timeout, int addr) + { + this.ReaderSetComType(0); + this.master = ModbusSerialMaster.CreateRtu(serialPort); + bool flag = this.master == null; + bool result; + if (flag) + { + result = false; + } + else + { + this.master.Transport.Retries = 1; + this.master.Transport.ReadTimeout = timeout; + this.deviceAddr = (byte)addr; + this.modBusSerialPort = serialPort; + result = true; + } + return result; + } + + // Token: 0x06000010 RID: 16 RVA: 0x0000332C File Offset: 0x0000152C + public void Disconnect() + { + bool flag = this.modBusSerialPort != null; + if (flag) + { + try + { + this.modBusSerialPort.Close(); + } + catch (Exception) + { + } + this.modBusSerialPort = null; + } + bool flag2 = this.master != null; + if (flag2) + { + this.master.Dispose(); + this.master = null; + } + } + + // Token: 0x06000011 RID: 17 RVA: 0x00003398 File Offset: 0x00001598 + private void ClearRxBuffer() + { + bool flag = this.comType == 0; + if (flag) + { + string text = this.modBusSerialPort.ReadExisting(); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + NetworkStream stream = this.clientSocket.GetStream(); + stream.Flush(); + } + } + } + + // Token: 0x06000012 RID: 18 RVA: 0x000033E8 File Offset: 0x000015E8 + public int ReaderConnectTcpServer(string ipStr, string portStr, int device_Addr) + { + int result = -1; + this.ReaderSetComType(1); + try + { + int port = Convert.ToInt32(portStr); + this.clientSocket = new TcpClient(); + IAsyncResult asyncResult = this.clientSocket.BeginConnect(ipStr, port, null, null); + asyncResult.AsyncWaitHandle.WaitOne(1000); + bool flag = !asyncResult.IsCompleted; + if (flag) + { + this.clientSocket.Close(); + this.clientSocket = null; + return -1; + } + this.masterIp = ModbusIpMaster.CreateIp(this.clientSocket); + this.masterIp.Transport.Retries = 1; + this.masterIp.Transport.ReadTimeout = 1000; + this.deviceAddr = (byte)device_Addr; + result = 0; + } + catch (Exception) + { + result = -1; + } + return result; + } + + // Token: 0x06000013 RID: 19 RVA: 0x000034C0 File Offset: 0x000016C0 + public void ReaderCloseTcpServer() + { + try + { + bool flag = this.clientSocket != null; + if (flag) + { + bool connected = this.clientSocket.Connected; + if (connected) + { + try + { + this.clientSocket.Close(); + } + catch (Exception) + { + } + } + this.clientSocket = null; + } + bool flag2 = this.masterIp != null; + if (flag2) + { + this.masterIp.Dispose(); + this.masterIp = null; + } + } + catch (Exception ex) + { + } + } + + // Token: 0x06000014 RID: 20 RVA: 0x00003554 File Offset: 0x00001754 + private void ReaderSetComType(int mode) + { + bool flag = mode == 0; + if (flag) + { + this.Disconnect(); + this.comType = 0; + } + else + { + bool flag2 = mode == 1; + if (flag2) + { + this.ReaderCloseTcpServer(); + this.comType = 1; + } + } + } + + // Token: 0x06000015 RID: 21 RVA: 0x00003594 File Offset: 0x00001794 + public void JmpApp() + { + byte[] array = new byte[] + { + 126, + 85, + 8, + 0, + 0, + byte.MaxValue, + byte.MaxValue, + 3, + 0, + 213, + 123 + }; + bool flag = this.comType == 0; + if (flag) + { + this.modBusSerialPort.Write(array, 0, array.Length); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + NetworkStream stream = this.clientSocket.GetStream(); + bool canWrite = stream.CanWrite; + if (canWrite) + { + stream.Write(array, 0, array.Length); + } + } + } + Thread.Sleep(200); + } + + // Token: 0x06000016 RID: 22 RVA: 0x00003618 File Offset: 0x00001818 + public bool GetParams(ref HFIIREADER_PARAMS devParams, uint deviceType, ushort devieVer, int protocolType) + { + bool result = true; + this.ClearRxBuffer(); + bool flag = (deviceType & 16773120U) == 3358720U && devieVer < 12288; + ushort num; + if (flag) + { + num = 9; + } + else + { + num = 12; + } + try + { + ushort[] array = new ushort[12]; + bool flag2 = this.comType == 0; + if (flag2) + { + array = this.master.ReadHoldingRegisters(this.deviceAddr, 0, num); + } + else + { + bool flag3 = this.comType == 1; + if (flag3) + { + array = this.masterIp.ReadHoldingRegisters(this.deviceAddr, 0, num); + } + } + bool flag4 = array == null; + if (flag4) + { + result = false; + } + else + { + devParams.addr = array[0]; + devParams.br = array[1]; + bool flag5 = protocolType == 0; + if (flag5) + { + devParams.afiMode = array[2]; + } + else + { + devParams.tagType = array[2]; + } + devParams.invtTo = array[3]; + devParams.trgMode = array[4]; + devParams.opTagMode = array[5]; + devParams.opBlockRegAddr = array[6]; + devParams.opBlockRegNum = array[7]; + devParams.trgTimerTick = array[8]; + bool flag6 = num == 12; + if (flag6) + { + devParams.opFormat = array[9]; + devParams.frameHead = array[10]; + devParams.keppTimer = array[11]; + } + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x06000017 RID: 23 RVA: 0x00003794 File Offset: 0x00001994 + public bool GetBlockParams(ref int paramsInfo) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] array = null; + bool flag = this.comType == 0; + if (flag) + { + array = this.master.ReadHoldingRegisters(this.deviceAddr, 12, 1); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + array = this.masterIp.ReadHoldingRegisters(this.deviceAddr, 12, 1); + } + } + bool flag3 = array == null; + if (flag3) + { + result = false; + } + else + { + paramsInfo = (int)array[0]; + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x06000018 RID: 24 RVA: 0x0000383C File Offset: 0x00001A3C + public bool GetRfPower(ref int level) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] array = null; + bool flag = this.comType == 0; + if (flag) + { + array = this.master.ReadHoldingRegisters(this.deviceAddr, 15, 1); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + array = this.masterIp.ReadHoldingRegisters(this.deviceAddr, 15, 1); + } + } + bool flag3 = array == null; + if (flag3) + { + result = false; + } + else + { + level = (int)array[0]; + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x06000019 RID: 25 RVA: 0x000038E4 File Offset: 0x00001AE4 + public bool GetReadTagRspErrMode(ref int mode) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] array = null; + bool flag = this.comType == 0; + if (flag) + { + array = this.master.ReadHoldingRegisters(this.deviceAddr, 16, 1); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + array = this.masterIp.ReadHoldingRegisters(this.deviceAddr, 16, 1); + } + } + bool flag3 = array == null; + if (flag3) + { + result = false; + } + else + { + mode = (int)array[0]; + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x0600001A RID: 26 RVA: 0x0000398C File Offset: 0x00001B8C + public bool SetBlockParams(int paramsInfo) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] data = new ushort[] + { + (ushort)paramsInfo + }; + bool flag = this.comType == 0; + if (flag) + { + this.master.WriteMultipleRegisters(this.deviceAddr, 12, data); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + this.masterIp.WriteMultipleRegisters(this.deviceAddr, 12, data); + } + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x0600001B RID: 27 RVA: 0x00003A28 File Offset: 0x00001C28 + public bool SetM1KeyParams(bool bSave, int type, byte[] key) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] array = new ushort[5]; + if (bSave) + { + array[0] = 1; + } + else + { + array[0] = 0; + } + array[1] = (ushort)(type & 1); + array[2] = (ushort)((int)key[0] * 256 + (int)key[1] & 65535); + array[3] = (ushort)((int)key[2] * 256 + (int)key[3] & 65535); + array[4] = (ushort)((int)key[4] * 256 + (int)key[5] & 65535); + bool flag = this.comType == 0; + if (flag) + { + this.master.WriteMultipleRegisters(this.deviceAddr, 65280, array); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + this.masterIp.WriteMultipleRegisters(this.deviceAddr, 65280, array); + } + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x0600001C RID: 28 RVA: 0x00003B24 File Offset: 0x00001D24 + public bool GetM1KeyParams(ref bool bSave, ref int type, byte[] key) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] array = null; + bool flag = this.comType == 0; + if (flag) + { + array = this.master.ReadHoldingRegisters(this.deviceAddr, 65280, 5); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + array = this.masterIp.ReadHoldingRegisters(this.deviceAddr, 65280, 5); + } + } + bool flag3 = array != null; + if (flag3) + { + bool flag4 = array[0] == 1; + if (flag4) + { + bSave = true; + } + else + { + bSave = false; + } + type = (int)(array[1] & 1); + key[0] = (byte)(array[2] >> 8 & 255); + key[1] = (byte)(array[2] & 255); + key[2] = (byte)(array[3] >> 8 & 255); + key[3] = (byte)(array[3] & 255); + key[4] = (byte)(array[4] >> 8 & 255); + key[5] = (byte)(array[4] & 255); + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x0600001D RID: 29 RVA: 0x00003C38 File Offset: 0x00001E38 + public bool SetRfPower(int lv) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] data = new ushort[] + { + (ushort)lv + }; + bool flag = this.comType == 0; + if (flag) + { + this.master.WriteMultipleRegisters(this.deviceAddr, 15, data); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + this.masterIp.WriteMultipleRegisters(this.deviceAddr, 15, data); + } + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x0600001E RID: 30 RVA: 0x00003CD4 File Offset: 0x00001ED4 + public bool SetReadTagErrMode(int mode) + { + bool result = true; + this.ClearRxBuffer(); + try + { + ushort[] data = new ushort[] + { + (ushort)mode + }; + bool flag = this.comType == 0; + if (flag) + { + this.master.WriteMultipleRegisters(this.deviceAddr, 16, data); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + this.masterIp.WriteMultipleRegisters(this.deviceAddr, 16, data); + } + } + } + catch (Exception ex) + { + string message = ex.Message; + result = false; + } + return result; + } + + // Token: 0x0600001F RID: 31 RVA: 0x00003D70 File Offset: 0x00001F70 + public bool SetParams(HFIIREADER_PARAMS devParams, uint deviceType, ushort devieVer, int protocolType) + { + bool result = true; + this.ClearRxBuffer(); + bool flag = (deviceType & 16773120U) == 3358720U && devieVer < 12288; + ushort num; + if (flag) + { + num = 9; + } + else + { + num = 12; + } + ushort[] array = new ushort[(int)num]; + array[0] = devParams.addr; + array[1] = devParams.br; + bool flag2 = protocolType == 0; + if (flag2) + { + array[2] = devParams.afiMode; + } + else + { + array[2] = devParams.tagType; + } + array[3] = devParams.invtTo; + array[4] = devParams.trgMode; + array[5] = devParams.opTagMode; + array[6] = devParams.opBlockRegAddr; + array[7] = devParams.opBlockRegNum; + array[8] = devParams.trgTimerTick; + bool flag3 = num == 12; + if (flag3) + { + array[9] = devParams.opFormat; + array[10] = devParams.frameHead; + array[11] = devParams.keppTimer; + } + try + { + bool flag4 = this.comType == 0; + if (flag4) + { + this.master.WriteMultipleRegisters(this.deviceAddr, 0, array); + } + else + { + bool flag5 = this.comType == 1; + if (flag5) + { + this.masterIp.WriteMultipleRegisters(this.deviceAddr, 0, array); + } + } + } + catch (Exception ex) + { + result = false; + } + return result; + } + + // Token: 0x06000020 RID: 32 RVA: 0x00003EC0 File Offset: 0x000020C0 + public string GetVersion(ref uint deviceTypeInfo, ref ushort deviceVersionInfo) + { + string text = ""; + this.ClearRxBuffer(); + try + { + ushort[] array = new ushort[1]; + bool flag = this.comType == 0; + if (flag) + { + array = this.master.ReadInputRegisters(this.deviceAddr, 0, 2); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + array = this.masterIp.ReadInputRegisters(this.deviceAddr, 0, 2); + } + } + bool flag3 = array != null; + if (flag3) + { + deviceTypeInfo = (uint)array[0]; + deviceTypeInfo <<= 16; + deviceTypeInfo |= (uint)array[1]; + } + else + { + deviceTypeInfo = 0U; + } + ushort[] array2 = new ushort[1]; + bool flag4 = this.comType == 0; + if (flag4) + { + array2 = this.master.ReadInputRegisters(this.deviceAddr, 2, 1); + } + else + { + bool flag5 = this.comType == 1; + if (flag5) + { + array2 = this.masterIp.ReadInputRegisters(this.deviceAddr, 2, 1); + } + } + bool flag6 = array2 == null; + if (flag6) + { + text = "Null"; + } + else + { + deviceVersionInfo = array2[0]; + text += "获取版本:"; + text = string.Concat(new string[] + { + text, + "V", + (array2[0] >> 12 & 15).ToString("X"), + ".", + (array2[0] >> 8 & 15).ToString("X"), + ".", + (array2[0] >> 4 & 15).ToString("X"), + ".", + ((int)(array2[0] & 15)).ToString("X") + }); + } + } + catch (Exception ex) + { + text = "Error"; + } + return text; + } + + // Token: 0x06000021 RID: 33 RVA: 0x00004098 File Offset: 0x00002298 + public string GetSn() + { + string text = ""; + this.ClearRxBuffer(); + try + { + ushort[] array = new ushort[6]; + bool flag = this.comType == 0; + if (flag) + { + array = this.master.ReadInputRegisters(this.deviceAddr, 13, 6); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + array = this.masterIp.ReadInputRegisters(this.deviceAddr, 13, 6); + } + } + int num; + for (int i = 0; i < 6; i = num + 1) + { + text += array[i].ToString("X").PadLeft(4, '0'); + num = i; + } + } + catch (Exception ex) + { + text = ""; + } + return text; + } + + // Token: 0x06000022 RID: 34 RVA: 0x00004168 File Offset: 0x00002368 + public ushort[] ReadRfInfo() + { + ushort[] result = null; + this.ClearRxBuffer(); + try + { + bool flag = this.comType == 0; + if (flag) + { + result = this.master.ReadInputRegisters(this.deviceAddr, 5, 3); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + result = this.masterIp.ReadInputRegisters(this.deviceAddr, 5, 3); + } + } + } + catch (Exception ex) + { + result = null; + } + return result; + } + + // Token: 0x06000023 RID: 35 RVA: 0x000041EC File Offset: 0x000023EC + public ushort[] ReadTagMemory(ref string strErr, ushort regAddr, ushort regNum) + { + ushort[] result = null; + this.ClearRxBuffer(); + try + { + bool flag = this.comType == 0; + if (flag) + { + result = this.master.ReadHoldingRegisters(this.deviceAddr, regAddr, regNum); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + result = this.masterIp.ReadHoldingRegisters(this.deviceAddr, regAddr, regNum); + } + } + } + catch (Exception ex) + { + string message = ex.Message; + result = null; + } + return result; + } + + // Token: 0x06000024 RID: 36 RVA: 0x00004278 File Offset: 0x00002478 + public bool WriteTagMemory(ushort regAddr, ushort[] reg, bool bWriteTagMulRes) + { + this.ClearRxBuffer(); + try + { + if (bWriteTagMulRes) + { + bool flag = this.comType == 0; + if (flag) + { + this.master.WriteMultipleRegisters(this.deviceAddr, regAddr, reg); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + this.masterIp.WriteMultipleRegisters(this.deviceAddr, regAddr, reg); + } + } + } + else + { + int num; + for (int i = 0; i < reg.Length; i = num + 1) + { + bool flag3 = this.comType == 0; + if (flag3) + { + this.master.WriteSingleRegister(this.deviceAddr, (ushort)((int)regAddr + i), reg[i]); + } + else + { + bool flag4 = this.comType == 1; + if (flag4) + { + this.masterIp.WriteSingleRegister(this.deviceAddr, (ushort)((int)regAddr + i), reg[i]); + } + } + num = i; + } + } + } + catch (Exception ex) + { + return false; + } + return true; + } + + // Token: 0x06000025 RID: 37 RVA: 0x00004378 File Offset: 0x00002578 + public ushort[] RwTagMemory(ushort wRegAddr, ushort[] wReg, ushort rRegAddr, ushort rRegNum) + { + ushort[] result = null; + this.ClearRxBuffer(); + try + { + bool flag = this.comType == 0; + if (flag) + { + result = this.master.ReadWriteMultipleRegisters(this.deviceAddr, rRegAddr, rRegNum, wRegAddr, wReg); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + result = this.masterIp.ReadWriteMultipleRegisters(this.deviceAddr, rRegAddr, rRegNum, wRegAddr, wReg); + } + } + } + catch (Exception ex) + { + } + return result; + } + + // Token: 0x06000026 RID: 38 RVA: 0x00004400 File Offset: 0x00002600 + public bool WriteCoilTrgOpTag() + { + this.ClearRxBuffer(); + try + { + this.master.WriteSingleCoil(this.deviceAddr, 1, true); + } + catch (Exception ex) + { + return false; + } + return true; + } + + // Token: 0x06000027 RID: 39 RVA: 0x00004448 File Offset: 0x00002648 + public string ReadOpTagState() + { + string result = "IDLE"; + this.ClearRxBuffer(); + try + { + ushort[] array = new ushort[1]; + bool flag = this.comType == 0; + if (flag) + { + array = this.master.ReadInputRegisters(this.deviceAddr, 3, 1); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + array = this.masterIp.ReadInputRegisters(this.deviceAddr, 3, 1); + } + } + bool flag3 = array[0] == 0; + if (flag3) + { + result = "OK"; + } + else + { + bool flag4 = array[0] == 1; + if (flag4) + { + result = "FAIL"; + } + else + { + bool flag5 = array[0] == 3; + if (flag5) + { + result = "BUSY"; + } + else + { + result = "ERROR"; + } + } + } + } + catch (Exception ex) + { + result = ""; + } + return result; + } + + // Token: 0x06000028 RID: 40 RVA: 0x00004524 File Offset: 0x00002724 + public string ReceiveAutoTagInfo() + { + string result = ""; + try + { + bool flag = this.comType == 0; + if (flag) + { + result = this.modBusSerialPort.ReadExisting(); + } + else + { + bool flag2 = this.comType == 1; + if (flag2) + { + NetworkStream stream = this.clientSocket.GetStream(); + bool flag3 = stream.CanRead && stream.DataAvailable; + if (flag3) + { + byte[] array = new byte[1024]; + int count = stream.Read(array, 0, array.Length); + result = Encoding.ASCII.GetString(array, 0, count); + } + } + } + } + catch (Exception ex) + { + } + return result; + } + + // Token: 0x04000032 RID: 50 + private ModbusSerialMaster master; + + // Token: 0x04000033 RID: 51 + private ModbusIpMaster masterIp = null; + + // Token: 0x04000034 RID: 52 + private SerialPort modBusSerialPort; + + // Token: 0x04000035 RID: 53 + private byte deviceAddr = 1; + + // Token: 0x04000036 RID: 54 + public const ushort HFIIREADER_TYPE_ADDR_VERSION = 0; + + // Token: 0x04000037 RID: 55 + public const ushort HFIIREADER_TYPE_NUM_VERSION = 2; + + // Token: 0x04000038 RID: 56 + public const ushort HFIIREADER_TYPE_ADDR_SN = 13; + + // Token: 0x04000039 RID: 57 + public const ushort HFIIREADER_TYPE_NUM_SN = 6; + + // Token: 0x0400003A RID: 58 + public const ushort HFIIREADER_REG_ADDR_VERSION = 2; + + // Token: 0x0400003B RID: 59 + public const ushort HFIIREADER_REG_NUM_VERSION = 1; + + // Token: 0x0400003C RID: 60 + public const ushort HFIIREADER_REG_ADDR_OPSTAT = 3; + + // Token: 0x0400003D RID: 61 + public const ushort HFIIREADER_REG_NUM_OPSTAT = 1; + + // Token: 0x0400003E RID: 62 + public const ushort HFIIREADER_BR_9600 = 0; + + // Token: 0x0400003F RID: 63 + public const ushort HFIIREADER_BR_38400 = 1; + + // Token: 0x04000040 RID: 64 + public const ushort HFIIREADER_BR_115200 = 2; + + // Token: 0x04000041 RID: 65 + public const ushort HFIIREADER_BR_19200 = 3; + + // Token: 0x04000042 RID: 66 + public const ushort HFIIREADER_OP_MODE_RBLOCK = 1; + + // Token: 0x04000043 RID: 67 + public const ushort HFIIREADER_OP_MODE_RAFI = 2; + + // Token: 0x04000044 RID: 68 + public const ushort HFIIREADER_OP_MODE_RDSFID = 4; + + // Token: 0x04000045 RID: 69 + public const ushort HFIIREADER_OP_MODE_UID = 0; + + // Token: 0x04000046 RID: 70 + public const ushort READER_RSPFORMAT_NONE = 0; + + // Token: 0x04000047 RID: 71 + public const ushort READER_RSPFORMAT_ASCII = 256; + + // Token: 0x04000048 RID: 72 + public const ushort READER_RSPFORMAT_PULSE = 512; + + // Token: 0x04000049 RID: 73 + public const ushort HFIIREADER_OP_FORMAT_HEADER = 1; + + // Token: 0x0400004A RID: 74 + public const ushort HFIIREADER_OP_FORMAT_ADDRESS = 2; + + // Token: 0x0400004B RID: 75 + public const ushort HFIIREADER_OP_FORMAT_BCC = 4; + + // Token: 0x0400004C RID: 76 + public const ushort HFIIREADER_OP_MODE_MASK = 15; + + // Token: 0x0400004D RID: 77 + public const ushort HFIIREADER_TRG_MODE_TIMER = 0; + + // Token: 0x0400004E RID: 78 + public const ushort HFIIREADER_TRG_MODE_RWREG = 1; + + // Token: 0x0400004F RID: 79 + public const ushort HFIIREADER_TRG_MODE_WCOIL = 2; + + // Token: 0x04000050 RID: 80 + public const ushort HFIIREADER_TRG_MODE_NUM = 3; + + // Token: 0x04000051 RID: 81 + public const ushort HFIIREADER_AFI_MODE_ENABLE = 256; + + // Token: 0x04000052 RID: 82 + public const ushort HFIIREADER_AFI_MODE_DISABLE = 0; + + // Token: 0x04000053 RID: 83 + public const ushort HFIIREADER_INREG_RFINFO_ADDR = 5; + + // Token: 0x04000054 RID: 84 + public const ushort HFIIREADER_INREG_RFINFO_NUM = 3; + + // Token: 0x04000055 RID: 85 + public const ushort READER_RESULT_CLR_AUTO = 0; + + // Token: 0x04000056 RID: 86 + public const ushort READER_RESULT_CLR_KEEP = 256; + + // Token: 0x04000057 RID: 87 + public const ushort HFIIREADER_HOLDREG_PARAMS_ADDR = 0; + + // Token: 0x04000058 RID: 88 + public const ushort HFIIREADER_HOLDREG_PARAMS_NUM = 12; + + // Token: 0x04000059 RID: 89 + public const ushort HFIIREADER_HOLDREG_PARAMS_NUM2 = 9; + + // Token: 0x0400005A RID: 90 + public const ushort HFIIREADER_HOLDREG_BLKPAR_ADDR = 12; + + // Token: 0x0400005B RID: 91 + public const ushort HFIIREADER_HOLDREG_BLKPAR_NUM = 1; + + // Token: 0x0400005C RID: 92 + public const ushort HFIIREADER_HOLDREG_BLKSIZE_MSK = 3; + + // Token: 0x0400005D RID: 93 + public const ushort HFIIREADER_HOLDREG_BLKNUM_MSK = 12; + + // Token: 0x0400005E RID: 94 + public const ushort HFIIREADER_HOLDREG_RFPWR_ADDR = 15; + + // Token: 0x0400005F RID: 95 + public const ushort HFIIREADER_HOLDREG_RFPWR_NUM = 1; + + // Token: 0x04000060 RID: 96 + public const ushort HFIIREADER_HOLDREG_ERRMOD_ADDR = 16; + + // Token: 0x04000061 RID: 97 + public const ushort HFIIREADER_HOLDREG_ERRMOD_NUM = 1; + + // Token: 0x04000062 RID: 98 + public const ushort HFIIREADER_HOLDREG_TAG_START = 26; + + // Token: 0x04000063 RID: 99 + public const ushort HFIIREADER_HOLDREG_DSFID_ADDR = 26; + + // Token: 0x04000064 RID: 100 + public const ushort HFIIREADER_HOLDREG_DSFID_NUM = 1; + + // Token: 0x04000065 RID: 101 + public const ushort HFIIREADER_HOLDREG_AFI_ADDR = 27; + + // Token: 0x04000066 RID: 102 + public const ushort HFIIREADER_HOLDREG_AFI_NUM = 1; + + // Token: 0x04000067 RID: 103 + public const ushort HFIIREADER_HOLDREG_UID_ADDR = 28; + + // Token: 0x04000068 RID: 104 + public const ushort HFIIREADER_HOLDREG_UID_NUM = 4; + + // Token: 0x04000069 RID: 105 + public const ushort HFIIREADER_HOLDREG_BLK_ADDR = 32; + + // Token: 0x0400006A RID: 106 + public const ushort HFIIREADER_HOLDREG_BLK_NUM = 1024; + + // Token: 0x0400006B RID: 107 + public const ushort HFIIREADER_HOLDREG_M1KEY_ADDR = 65280; + + // Token: 0x0400006C RID: 108 + public const ushort HFIIREADER_HOLDREG_M1KEY_NUM = 5; + + // Token: 0x0400006D RID: 109 + public const ushort HFIIREADER_COLIL_REG_NUM = 4; + + // Token: 0x0400006E RID: 110 + public const ushort HFIIREADER_COIL_ADDR_RSTSYS = 0; + + // Token: 0x0400006F RID: 111 + public const ushort HFIIREADER_COIL_ADDR_STARTOP = 1; + + // Token: 0x04000070 RID: 112 + public const ushort HFIIREADER_COIL_ADDR_RSTERR = 2; + + // Token: 0x04000071 RID: 113 + public const ushort HFIIREADER_COIL_ADDR_CFGMODE = 3; + + // Token: 0x04000072 RID: 114 + public const ushort HFIIREADER_COIL_VALUE_SET = 65280; + + // Token: 0x04000073 RID: 115 + public const ushort HFIIREADER_COIL_VALUE_RESET = 0; + + // Token: 0x04000074 RID: 116 + private byte[] txFrame = new byte[1024]; + + // Token: 0x04000075 RID: 117 + private byte[] rxFrame = new byte[1024]; + + // Token: 0x04000076 RID: 118 + private TcpClient clientSocket = null; + + // Token: 0x04000077 RID: 119 + public const int READER_COM_TYPE_UART = 0; + + // Token: 0x04000078 RID: 120 + public const int READER_COM_TYPE_NET = 1; + + // Token: 0x04000079 RID: 121 + public int comType = 0; + } +} \ No newline at end of file From 02bb089ddb0e4f95613a7ddb327501c3057f6daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=94=84=E5=A4=B4?= Date: Wed, 14 Aug 2024 17:13:06 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E9=9B=86=E6=88=90SerialPortFactory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NDSD-Screwdriver/NDSD_Screwdriver.csproj | 1 + NDSD-Screwdriver/TestDataFactory.cs | 27 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 NDSD-Screwdriver/TestDataFactory.cs diff --git a/NDSD-Screwdriver/NDSD_Screwdriver.csproj b/NDSD-Screwdriver/NDSD_Screwdriver.csproj index 48468bd..39e16ec 100644 --- a/NDSD-Screwdriver/NDSD_Screwdriver.csproj +++ b/NDSD-Screwdriver/NDSD_Screwdriver.csproj @@ -121,6 +121,7 @@ ScrewdriverTest.cs + diff --git a/NDSD-Screwdriver/TestDataFactory.cs b/NDSD-Screwdriver/TestDataFactory.cs new file mode 100644 index 0000000..2d390e1 --- /dev/null +++ b/NDSD-Screwdriver/TestDataFactory.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +namespace NDSD_Screwdriver +{ + public class TestDataFactory + { + + + /// + /// 获取Rfid的数据 + /// + /// + public static List GetRfidList() + { + List ls = new List + { + "E0040150B8C12108", + "E0040150B8C1393A", + "E0040150B8C0512F", + "E0040150B8C170F6", + "E0040150B8C12100" + }; + + return ls; + } + } +} \ No newline at end of file