瀏覽代碼

修改页面显示bug,还要字符串换行

dev-2
永攀 张 1 周之前
父節點
當前提交
3179d77dcc
共有 14 個文件被更改,包括 145 次插入95 次删除
  1. +39
    -6
      ModbusDemo/App.xaml.cs
  2. +4
    -3
      ModbusDemo/Device/ModbusRTU.cs
  3. +1
    -2
      ModbusDemo/ErrorCode/ErrorCode.cs
  4. +2
    -2
      ModbusDemo/MainWindow.xaml
  5. +2
    -1
      ModbusDemo/ModbusDemo.csproj
  6. +0
    -10
      ModbusDemo/Model/ErrorCode.cs
  7. +1
    -1
      ModbusDemo/Uitls/CheckData.cs
  8. +14
    -7
      ModbusDemo/VIew/CoilUC.xaml
  9. +17
    -10
      ModbusDemo/VIew/RegisterUC.xaml
  10. +51
    -51
      ModbusDemo/VIewModel/AttachUCViewModel.cs
  11. +6
    -0
      ModbusDemo/VIewModel/CoilUCViewModel.cs
  12. +1
    -1
      ModbusDemo/VIewModel/MainWindowViewModel.cs
  13. +6
    -0
      ModbusDemo/VIewModel/RegisterUCViewModel.cs
  14. +1
    -1
      ModbusDemo/appsettings.json

+ 39
- 6
ModbusDemo/App.xaml.cs 查看文件

@@ -12,6 +12,8 @@ using System.Data;
using System.DirectoryServices; using System.DirectoryServices;
using System.IO; using System.IO;
using System.IO.Ports; using System.IO.Ports;
using System.Security.Cryptography;
using System.Text;
using System.Windows; using System.Windows;


namespace ModbusDemo namespace ModbusDemo
@@ -48,7 +50,7 @@ namespace ModbusDemo
//将读线圈注册 //将读线圈注册
containerRegistry.Register<ModbusRTU>(); containerRegistry.Register<ModbusRTU>();
//附加功能如何读取单数寄存器; //附加功能如何读取单数寄存器;
containerRegistry.RegisterForNavigation<AttachUC, AttachUCViewModel>();
//containerRegistry.RegisterForNavigation<AttachUC, AttachUCViewModel>();




// 1. 加载配置文件 // 1. 加载配置文件
@@ -56,13 +58,14 @@ namespace ModbusDemo
.SetBasePath(Directory.GetCurrentDirectory()) .SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json") .AddJsonFile("appsettings.json")
.Build(); .Build();

// 2. 配置 DbContextOptions
// 2.解密连接字符串
string decryptedConnection = Decrypt(configuration.GetConnectionString("ConnStr"));
// 3. 配置 DbContextOptions
var options = new DbContextOptionsBuilder<ModbusDbContext>() var options = new DbContextOptionsBuilder<ModbusDbContext>()
.UseSqlServer(configuration.GetConnectionString("ConnStr"))
.UseSqlServer(decryptedConnection)
.Options; .Options;


// 3. 注册 DbContext
// 4. 注册 DbContext
containerRegistry.Register<ModbusDbContext>(() => new ModbusDbContext(options)); containerRegistry.Register<ModbusDbContext>(() => new ModbusDbContext(options));
} }
/// <summary> /// <summary>
@@ -74,10 +77,40 @@ namespace ModbusDemo
mainWindowViewModel!.DefultNaigation(); mainWindowViewModel!.DefultNaigation();
base.OnInitialized(); base.OnInitialized();
} }
//硬编码
private static readonly byte[] Key = Encoding.UTF8.GetBytes("8Jn3pQ7sV9y$B&E)"); // 16字节,AES-128
private static readonly byte[] IV = Encoding.UTF8.GetBytes("2r5u8x/A?D*G-KaP"); // 16字节

/// <summary>
/// 解密字符串
/// </summary>
/// <param name="encryptedText">加密后的Base64字符串</param>
/// <returns>解密后的原始字符串</returns>
public static string Decrypt(string encryptedText)
{
if (string.IsNullOrEmpty(encryptedText))
return string.Empty;


using (Aes aes = Aes.Create())
{
aes.Key = Key;
aes.IV = IV;


// 创建解密器
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);


using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(encryptedText)))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs))
{
return sr.ReadToEnd();
}
}
}
}
}
} }


} }

+ 4
- 3
ModbusDemo/Device/ModbusRTU.cs 查看文件

@@ -19,7 +19,7 @@ namespace ModbusDemo.Device
//用于操作数据库 //用于操作数据库
private ModbusDbContext _modbusDbContext; private ModbusDbContext _modbusDbContext;
//TODO,修改 //TODO,修改
private SerialPortAdapter _portAdapter;
//private SerialPortAdapter _portAdapter;


public ModbusRTU(SerialPort serialPort, ModbusDbContext modbusDbContext) public ModbusRTU(SerialPort serialPort, ModbusDbContext modbusDbContext)
{ {
@@ -72,8 +72,7 @@ namespace ModbusDemo.Device
responseData.Clear(); responseData.Clear();
// 清除输入缓冲区残留数据 // 清除输入缓冲区残留数据
_serialPort.DiscardInBuffer(); _serialPort.DiscardInBuffer();
}
}
try try
{ {
_serialPort.Write(sendByte, 0, sendByte.Length); _serialPort.Write(sendByte, 0, sendByte.Length);
@@ -622,5 +621,7 @@ namespace ModbusDemo.Device


return sb.ToString(); return sb.ToString();
} }


} }
} }

+ 1
- 2
ModbusDemo/ErrorCode/ErrorCode.cs 查看文件

@@ -31,8 +31,7 @@ namespace ModbusDemo.ErrorCode
// 重写 ToString 方法 // 重写 ToString 方法
public override string ToString() => $"Error 0x{Code:X2}: {Description}"; public override string ToString() => $"Error 0x{Code:X2}: {Description}";


// 隐式转换为 byte
public static implicit operator byte(ErrorCode error) => error.Code;


// 根据错误码值查找错误码 // 根据错误码值查找错误码
public static ErrorCode FromByte(byte code) => AllErrors.FirstOrDefault(e => e.Code == code); public static ErrorCode FromByte(byte code) => AllErrors.FirstOrDefault(e => e.Code == code);


+ 2
- 2
ModbusDemo/MainWindow.xaml 查看文件

@@ -10,8 +10,8 @@
xmlns:prism="http://prismlibrary.com/" xmlns:prism="http://prismlibrary.com/"
xmlns:viewmodel="clr-namespace:ModbusDemo.VIewModel" xmlns:viewmodel="clr-namespace:ModbusDemo.VIewModel"
Title="MainWindow" Title="MainWindow"
Width="900"
Height="600"
Width="1000"
Height="800"
d:DataContext="{d:DesignInstance Type=viewmodel:MainWindowViewModel, d:DataContext="{d:DesignInstance Type=viewmodel:MainWindowViewModel,
IsDesignTimeCreatable=True}" IsDesignTimeCreatable=True}"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"


+ 2
- 1
ModbusDemo/ModbusDemo.csproj 查看文件

@@ -10,6 +10,8 @@
</PropertyGroup> </PropertyGroup>


<ItemGroup> <ItemGroup>
<Compile Remove="Device\IStreamResource.cs" />
<Compile Remove="Device\SerialPortAdapter.cs" />
<Compile Remove="ErrorCode\ErrorCodeExtensions.cs" /> <Compile Remove="ErrorCode\ErrorCodeExtensions.cs" />
<Compile Remove="ErrorCode\ErrorInfoAttribute.cs" /> <Compile Remove="ErrorCode\ErrorInfoAttribute.cs" />
</ItemGroup> </ItemGroup>
@@ -25,7 +27,6 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.27" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.27" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.7" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.7" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.7" />
<PackageReference Include="NModbus4" Version="2.1.0" />
<PackageReference Include="Prism.DryIoc" Version="8.1.97" /> <PackageReference Include="Prism.DryIoc" Version="8.1.97" />
<PackageReference Include="System.IO.Ports" Version="9.0.7" /> <PackageReference Include="System.IO.Ports" Version="9.0.7" />
</ItemGroup> </ItemGroup>


+ 0
- 10
ModbusDemo/Model/ErrorCode.cs 查看文件

@@ -1,10 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ModbusDemo.Model
{
}

+ 1
- 1
ModbusDemo/Uitls/CheckData.cs 查看文件

@@ -22,7 +22,7 @@ namespace ModbusDemo.Uitls
return false; return false;
} }
// 检查数组长度是否足够 // 检查数组长度是否足够
if (response.Length > 1)
if (response.Length > 3)
{ {
byte secondByte = response[1]; // 获取第二个字节(索引为1) byte secondByte = response[1]; // 获取第二个字节(索引为1)




+ 14
- 7
ModbusDemo/VIew/CoilUC.xaml 查看文件

@@ -10,8 +10,8 @@
d:DataContext="{d:DesignInstance Type=viewmodel:CoilUCViewModel, d:DataContext="{d:DesignInstance Type=viewmodel:CoilUCViewModel,
IsDesignTimeCreatable=True}" IsDesignTimeCreatable=True}"
d:Background="White" d:Background="White"
d:DesignHeight="450"
d:DesignWidth="800"
d:DesignHeight="800"
d:DesignWidth="1000"
mc:Ignorable="d"> mc:Ignorable="d">
<UserControl.Resources> <UserControl.Resources>
<Style TargetType="TextBox"> <Style TargetType="TextBox">
@@ -25,7 +25,7 @@
</RowDefinition> </RowDefinition>
<RowDefinition> <RowDefinition>
</RowDefinition> </RowDefinition>
<RowDefinition>
<RowDefinition Height="120">
</RowDefinition> </RowDefinition>
<RowDefinition> <RowDefinition>
</RowDefinition> </RowDefinition>
@@ -54,7 +54,7 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition> <RowDefinition>
</RowDefinition> </RowDefinition>
<RowDefinition Height="60">
<RowDefinition>
</RowDefinition> </RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!-- 线圈的读取 --> <!-- 线圈的读取 -->
@@ -79,11 +79,18 @@
</TextBox> </TextBox>
</StackPanel> </StackPanel>


<StackPanel Grid.Row="2" Grid.ColumnSpan="4" HorizontalAlignment="Center" Orientation="Horizontal">
<StackPanel Grid.Row="2" Grid.ColumnSpan="5" HorizontalAlignment="Center" Orientation="Horizontal">


<TextBlock Margin="0,20,0,0" Text="读取结果:" FontWeight="Black" />
<TextBlock Margin="0,50,0,0" Text="读取结果:" FontWeight="Black" />


<TextBox MinWidth="120" Margin="20,0,0,0" Text="{Binding ReadResult}" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
<TextBox
MinWidth="900"
MaxWidth="900"
Margin="20,0,0,0"
AcceptsReturn="True"
VerticalScrollBarVisibility="Auto"
Text="{Binding ReadResult}"
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel> </StackPanel>
<Button <Button
Grid.Column="4" Grid.Column="4"


+ 17
- 10
ModbusDemo/VIew/RegisterUC.xaml 查看文件

@@ -9,9 +9,9 @@
xmlns:viewmodel="clr-namespace:ModbusDemo.VIewModel" xmlns:viewmodel="clr-namespace:ModbusDemo.VIewModel"
d:DataContext="{d:DesignInstance Type=viewmodel:RegisterUCViewModel, d:DataContext="{d:DesignInstance Type=viewmodel:RegisterUCViewModel,
IsDesignTimeCreatable=True}" IsDesignTimeCreatable=True}"
d:DesignHeight="450"
d:DesignHeight="800"
d:Background="White" d:Background="White"
d:DesignWidth="800"
d:DesignWidth="1000"
mc:Ignorable="d"> mc:Ignorable="d">
<UserControl.Resources> <UserControl.Resources>
<Style TargetType="TextBox"> <Style TargetType="TextBox">
@@ -25,7 +25,7 @@
</RowDefinition> </RowDefinition>
<RowDefinition> <RowDefinition>
</RowDefinition> </RowDefinition>
<RowDefinition>
<RowDefinition Height="120">
</RowDefinition> </RowDefinition>
<RowDefinition> <RowDefinition>
</RowDefinition> </RowDefinition>
@@ -54,10 +54,10 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition> <RowDefinition>
</RowDefinition> </RowDefinition>
<RowDefinition Height="60">
<RowDefinition>
</RowDefinition> </RowDefinition>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!--读寄存器-->
<!-- 读寄存器 -->
<StackPanel HorizontalAlignment="Center" Orientation="Vertical"> <StackPanel HorizontalAlignment="Center" Orientation="Vertical">
<TextBlock Margin="20" Text="从站地址"> <TextBlock Margin="20" Text="从站地址">
</TextBlock> </TextBlock>
@@ -79,11 +79,18 @@
</TextBox> </TextBox>
</StackPanel> </StackPanel>


<StackPanel Grid.Row="2" Grid.ColumnSpan="4" HorizontalAlignment="Center" Orientation="Horizontal">
<StackPanel Grid.Row="2" Grid.ColumnSpan="5" HorizontalAlignment="Center" Orientation="Horizontal">


<TextBlock Margin="0,20,0,0" Text="读取结果:" FontWeight="Black" />
<TextBlock Margin="0,50,0,0" Text="读取结果:" FontWeight="Black" />


<TextBox MinWidth="120" Margin="20,0,0,0" Text="{Binding ReadResult}" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
<TextBox
MinWidth="900"
MaxWidth="900"
Margin="20,0,0,0"
AcceptsReturn="True"
VerticalScrollBarVisibility="Auto"
Text="{Binding ReadResult}"
Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel> </StackPanel>
<Button <Button
Grid.Column="4" Grid.Column="4"
@@ -110,7 +117,7 @@
<ColumnDefinition> <ColumnDefinition>
</ColumnDefinition> </ColumnDefinition>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<!--写寄存器-->
<!-- 写寄存器 -->
<StackPanel HorizontalAlignment="Center" Orientation="Vertical"> <StackPanel HorizontalAlignment="Center" Orientation="Vertical">
<TextBlock Margin="20" Text="从站地址"> <TextBlock Margin="20" Text="从站地址">
</TextBlock> </TextBlock>
@@ -152,7 +159,7 @@
</Button> </Button>
</Grid> </Grid>
<Grid Grid.Row="3"> <Grid Grid.Row="3">
<!--数据展示-->
<!-- 数据展示 -->
<DataGrid ItemsSource="{Binding ModbusLogList}" AutoGenerateColumns="False" IsReadOnly="True" ColumnWidth="*"> <DataGrid ItemsSource="{Binding ModbusLogList}" AutoGenerateColumns="False" IsReadOnly="True" ColumnWidth="*">
<DataGrid.Columns> <DataGrid.Columns>
<!-- 操作类型列 --> <!-- 操作类型列 -->


+ 51
- 51
ModbusDemo/VIewModel/AttachUCViewModel.cs 查看文件

@@ -1,4 +1,4 @@
using Modbus.Device;
//using Modbus.Device;
using ModbusDemo.Model; using ModbusDemo.Model;
using ModbusDemo.Uitls; using ModbusDemo.Uitls;
using Prism.Commands; using Prism.Commands;
@@ -50,61 +50,61 @@ namespace ModbusDemo.VIewModel
} }
public AttachUCViewModel(SerialPort serialPort) public AttachUCViewModel(SerialPort serialPort)
{ {
ReadOddRegisterCmm = new DelegateCommand(ReadOddRegister2);
//ReadOddRegisterCmm = new DelegateCommand(ReadOddRegister);
_serialPort = serialPort; _serialPort = serialPort;
} }
/// <summary> /// <summary>
/// 读1000个寄存器 /// 读1000个寄存器
/// </summary> /// </summary>
private void ReadOddRegister()
{
// 创建 Modbus RTU 主站
IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(_serialPort);
byte slaveId = 1;
ushort totalRegisters = 1000;
ushort chunkSize = 100;
int numChunks = (int)Math.Ceiling((double)totalRegisters / chunkSize);
ushort[] allRegisters = new ushort[totalRegisters];
Task[] tasks = new Task[numChunks];
DateTime startTime = DateTime.Now;
for (int i = 0; i < numChunks; i++)
{
ushort startAddress = (ushort)(10300 + i * chunkSize);
ushort currentChunkSize = 100;
int chunkIndex = i;
tasks[i] = Task.Run(() =>
{
try
{
ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, currentChunkSize);
Array.Copy(registers, 0, allRegisters, chunkIndex * chunkSize, currentChunkSize);
}
catch (Exception ex)
{
MessageBox.Show($"线程 {chunkIndex} 读取寄存器时出错: {ex.Message}");
}
});
}
// 等待所有任务完成
Task.WaitAll(tasks);
Time = (int)(DateTime.Now - startTime).TotalMilliseconds;
StringBuilder result = new StringBuilder();
int count = 0;
for (int i = 1; i < totalRegisters; i += 2)
{
result.Append(allRegisters[i].ToString() + " ");
count++;
if (count % 50 == 0)
{
result.AppendLine();
}
}
ReadResult = result.ToString();
}
//private void ReadOddRegister()
//{
// // 创建 Modbus RTU 主站
// IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(_serialPort);
// byte slaveId = 1;
// ushort totalRegisters = 1000;
// ushort chunkSize = 100;
// int numChunks = (int)Math.Ceiling((double)totalRegisters / chunkSize);
// ushort[] allRegisters = new ushort[totalRegisters];
// Task[] tasks = new Task[numChunks];
// DateTime startTime = DateTime.Now;
// for (int i = 0; i < numChunks; i++)
// {
// ushort startAddress = (ushort)(10300 + i * chunkSize);
// ushort currentChunkSize = 100;
// int chunkIndex = i;
// tasks[i] = Task.Run(() =>
// {
// try
// {
// ushort[] registers = master.ReadHoldingRegisters(slaveId, startAddress, currentChunkSize);
// Array.Copy(registers, 0, allRegisters, chunkIndex * chunkSize, currentChunkSize);
// }
// catch (Exception ex)
// {
// MessageBox.Show($"线程 {chunkIndex} 读取寄存器时出错: {ex.Message}");
// }
// });
// }
// // 等待所有任务完成
// Task.WaitAll(tasks);
// Time = (int)(DateTime.Now - startTime).TotalMilliseconds;
// StringBuilder result = new StringBuilder();
// int count = 0;
// for (int i = 1; i < totalRegisters; i += 2)
// {
// result.Append(allRegisters[i].ToString() + " ");
// count++;
// if (count % 50 == 0)
// {
// result.AppendLine();
// }
// }
// ReadResult = result.ToString();
//}
/// <summary> /// <summary>
/// 自己的类 /// 自己的类
/// </summary> /// </summary>


+ 6
- 0
ModbusDemo/VIewModel/CoilUCViewModel.cs 查看文件

@@ -241,10 +241,16 @@ namespace ModbusDemo.VIewModel
} }


string temp = ""; string temp = "";
int count = 0;
foreach (var item in result) foreach (var item in result)
{ {
count++;
temp += item; temp += item;
temp += " "; temp += " ";
if(count %25 == 0)
{
temp += "\n";
}
} }
ReadResult = temp; ReadResult = temp;
MessageBox.Show("读取成功"); MessageBox.Show("读取成功");


+ 1
- 1
ModbusDemo/VIewModel/MainWindowViewModel.cs 查看文件

@@ -66,7 +66,7 @@ namespace ModbusDemo.VIewModel
LeftMenusList.Add(new MenusInfo() { Icon = "AllInclusive", MenuName = "线圈操作", ViewName = "CoilUC" }); LeftMenusList.Add(new MenusInfo() { Icon = "AllInclusive", MenuName = "线圈操作", ViewName = "CoilUC" });
LeftMenusList.Add(new MenusInfo() { Icon = "BlurCircular", MenuName = "寄存器操作", ViewName = "RegisterUC" }); LeftMenusList.Add(new MenusInfo() { Icon = "BlurCircular", MenuName = "寄存器操作", ViewName = "RegisterUC" });
LeftMenusList.Add(new MenusInfo() { Icon = "Settings", MenuName = "串口设置", ViewName = "SettingsUC" }); LeftMenusList.Add(new MenusInfo() { Icon = "Settings", MenuName = "串口设置", ViewName = "SettingsUC" });
LeftMenusList.Add(new MenusInfo() { Icon = "AddCircle", MenuName = "附加功能", ViewName = "AttachUC" });
//LeftMenusList.Add(new MenusInfo() { Icon = "AddCircle", MenuName = "附加功能", ViewName = "AttachUC" });
} }


public void DefultNaigation() public void DefultNaigation()


+ 6
- 0
ModbusDemo/VIewModel/RegisterUCViewModel.cs 查看文件

@@ -232,10 +232,16 @@ namespace ModbusDemo.VIewModel
return; return;
} }
string temp = ""; string temp = "";
int count =0;
foreach (var item in result) foreach (var item in result)
{ {
count++;
temp += item; temp += item;
temp += " "; temp += " ";
if (count % 25 == 0)
{
temp += "\n";
}
} }
ReadResult = temp; ReadResult = temp;
MessageBox.Show("读取成功"); MessageBox.Show("读取成功");


+ 1
- 1
ModbusDemo/appsettings.json 查看文件

@@ -10,5 +10,5 @@
"node_modules", "node_modules",
"wwwroot" "wwwroot"
], ],
"ConnectionStrings": { "ConnStr": "server=.;uid=sa;pwd=123456;database=Modbus;TrustServerCertificate=true" }
"ConnectionStrings": { "ConnStr": "3UiB0x91qCfBGGZJPtN2+6jjYWJL+PmUBwDGk07o3SzhkKx7GbsAJYoj44iejWaPIXfrZZvsvR30gpEgoVxYqVXexcruhQSPCW+B/msrunY=" }
} }

Loading…
取消
儲存