This commit is contained in:
GukSang.Jin
2026-03-11 18:53:36 +08:00
parent 061de713d5
commit 5f5945e817
17 changed files with 604 additions and 7 deletions

View File

@@ -0,0 +1 @@
96baa291-b974-4c70-bdb5-88021f4b92c2

View File

@@ -0,0 +1 @@
894f8c9f-45d5-4e84-9830-ade97de53808

View File

@@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUy27dNhCGX0XgWpR5Ey/apXaKukZgIzbaojtehjYRHeqAok4aGOfdC8onSNxdd8SAM/PPx5/zirI9AJrQh+Px4wlyXVGPatpDjDCJCceUPlEyUTpxNjCuBR3l36hH6Q6+oQkp4T31BjAHCVgEMmLHo8chgKGEBsJG0Wra5xVNr8imIcApeRiW9Q8oa1oymtCfKYfla+tt0+DnZQtDWWa4zWu12TcxNx8f757uH/C1oOT6/pe3myusrcCQApqQZRIijREL70YsjDbYCD1i8MwpIaS3yr2lpVyhZDsPa/jyQ0NYaobqpzbkQDAz6NyjYKttsp1d4enbsSnZMd20eL+H9+P0ik5Q0MT670Dfyl35OV3V5TjDCeajLSuUK78cDjYH1KNjWY5QaoIdzT7tPNualtxdml3PCXJFPbp/7B5mW+NSDu94Pb4huP0fBE5QHJoQJyOXSoHgnFsjHSMQlPRSMuctUdExoB7IaIQyVBHKDSOGj1JpFSwxHvXoeV6cnX9fd36GEacDUUwyEGCYkNJ4AlxDHBWQYKV0UnsTuFZM6KC5NdZS40B5I30zySfrX1KG7vYGTUgbEbU3EYsxjFiAFthoTrANYFSAkWuiUY+ul1xT3pZt7W5zheey80MT+tXOK7yR+1D8S6rg61Ya1L9ka/ZQlrD52v1wACUDGSjhLWmrx612nyGkAr5Cw/tUtku9/6QwyQhpUrZSINfuwdaX7je7vqAJQRBUBW+s1IZG5ZWMo4yaaA6OCBmjkHRUVI7a2dG5KH0IwZnIgjfGEIN6BM1w3e5xp0TkFDhWTHssgpDYKkqw8X7UiijvRHzHsbufW56RzlpmKHZGCSy8ItgFN2KtCaNROMM8+wnJxXyi8b2DkmH+aeRPyZdlXWLtLi7s3kH4vOW2P7rdkV9Txv/stG8W/wVK117Lpty+yuWBzj06gF23Aod9/Uyv6KH9k+5p30KcDpJq0aPHakvdjt/D40C11ufz+fwvAAAA//8DAIVrT6vDBAAA

View File

@@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUy27cOBBFf0XgWpT5fmiXsTMYwwhsxEYmmB0fxZiIWmpQVGcCo/99QLUDJ7PLjiiwirdOXdYLmt0B0IjeHY/vTzDXFfWo5j3ECFOYcEzpEyUjpSNnAyfSCk3/QT3Kd/AdjUiLEGiwgDkowCISiT1PAccIlhIaCZOi1XRfVjS+IJeHCKccYFjWT1DWvMxoRH/nOS7f2tsuD2FatjiUZYLbea1uDk3MzfvHu6f7B3wtKLm+/+Nyc4W1FRhyRCNyTEGiKWERvMTCGoutMBJDYF4LoYLT/pKW5wpldtOwxq9vGuJSZ6hhZAPjA8HMonOPoquuyfZuhafvx6Zkx3TT4v0e3o/jCzpBQSPrfwC9lLsKU75aNz/BCaajKyuUq7AcDm6OqEfHshyh1Aw7mhMUv6y5NqohaGcMpdE4LaSOhkvGdeQEoiFaRhutU0IlFqRM0RurRRKRUREVCOE16tEOb5pczcvcvWq/njLMFfXo/rF7mFxNSzn8gv/xQvT2N4A22WhEnEiutAbBOXdWeUYgahWUYj44opNnQAPs9rFUE8otI5ZLpY2OjtiAevTBhec8Q3d7g0ZkrEgm2ISFjBILMAJbwwl2EayOILkhBvXoeplrnrdlW7vbucKXsveLRvSnm1a4dPquhOdcIdStNAifVTPkQ1niFmr3ZgBKBjJQwlvSVo9b7T5CzAVChYbjqWyv9f6XwhQjpEnZSoG5dg+uPnd/ufUZjQiioDoG65SxNOmgVZIqGWI4eCJUSkJRqamSxjvpfVIhxuhtYjFYa4lFPYLmt263eAJvTRAcC+4kFtxT7KVV2ABII5VigbXW3jh291PLs8o7xyzF3mqBRdAE++glNoYwmoS3LLCfkLyaRTS+d1BmmH5q+UMOZVmXVLtX13S/QPi4zW19dLuDvuUZ/7vTvlnCVyhdm5bLc/sprwM69+gAbt0KHPbtM76gh/ZNuqd9CXE6KGpEjx6rK3U7/gjLgRpjzufz+T8AAAD//wMAXcXEucIEAAA=

View File

@@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpRUy07kOBT9lcjbidO242d2NEVrEKJBTWlmNDs/bsBDyik5DgxC9e+tpKAbaM1iNlF0dR/nnnOun1GyO0AdOtnvzx4glQnVqMQ1xAiTmLSY0i0lHWUdUQ0hikul/0Y1ihfwhDqkuPfUG8AtSMA8EIFd23scAhhKaCBM8KWnvZ1Q94xsbAI8RA/NOP0BeYpjQh36M6YwPi6zbWz8MM6hyeMA52kqNvkFzObs5mJ7dY1POSWnV5+PmRNMS4MmBtQhyyT0tO8x905gbrTBhmuBwTOnOJfeKncsi6lATnZopnD/E0MYS4LiO9awtiGYGXSoUbDFLrCdnWD7tF+QrDRtlni9htff7hk9QEYdq18JPbb75If4aTe5OQ7h0/pFNdrncQ+5RFgZWZccBlvimKqXGadDhFRQjT4vJTez9zBNqENf7DDBa/gs3cYEX7LdweOY778e5zZfz7aoRtd5/Ad8ubblbhFJ66ANGAqegSZcEtEzJakhCmSvjbKGUsaMJMRRxoQMTikIVFunmASBanR1U10PtvRj3r0T7Oaowfn/kODm5PQsWTdA+LjS1uZbKKhDQgoHba+ZdNIGa1rdUwutCd61UoB2KmhQqmWt9cITTT1VVFijhFCyZRTV6NL6u5igOt+gDmnDe+1Nj7kIAnPQHBvdEmwDGBVAtJpoVKPTMZWY5nGeqvNU4DavqrxBeXVTnWR/Fwv4MueF77/kYu/rPIbZl+qnnShpSENJuxTNZT+X6huEmMGXde1tnl/6fShhkhGyQJlzhlSqRcHqdzstMkLgVAVvrNSG9sor2QvZa6JbcITLvueSCkWl0M4K53rpQwjO9Cx4YwwxqEawuLc6HozUWnPVY218wJxJgp2XPZbSCUGE0K0U73isroalzkhnLTMUO6M45l4R7IITWGvCaM+dYZ699+ibFfXCCm2UXJl5pe3F9nzR4AJyguENLZfR53Ea+1K9uK56R9SbOZs47Qf79Mu43zzjrfAt/Mg/vQN//6sJv81pefyq1c2PMeF/V3U3o7+HXC3usDEtd/6j4nIeStzeZbABwuUY4GPTQ412YKc5w259XteLT5BXGJv56LDzdBmHIU7gxxQm1LVcKtNwLvUL3v9OVKptpGjZ4XA4fAcAAP//AwDt9x8mzgUAAA==

View File

@@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSTQW/cIBCF/4o1Z+MAxjb41m5aNYqqRE3UVr1hGLqoDqwwTltF+98rvFsl6a03NGKG9743PEHQDwgjvDkc3j1iyAvUkP1W4pT3hLaEsXtGR8ZHOjSUDlJ1wzeowV/jbxhhEMYwo5C02CMRlnZkap0h1qJilFnKO1Fm6u8LjE+gfWPx0Rts4vIZ0+JjgBG++GDjz/K29o2Z42qbFGe8CkvWwRQxl+/uru9vbslOMLq7eXu6ueBSBjTewgia9+iYc0SYqSNCSUWUkB1Bw6dBiN7oYTq1+ZAxBT03i/3xrMHGHDCbkTe8bSjhCo41WJ11kT3pBe9/H4qSDdNlqddbeTuOT/CICUZe/wV6GndhZn9h4sODDvbC+eCXPdRwSPGAKXvckGwu51lnH0N1fmQ3ewwZari5q25nnV1MD6843Z2sX/2H84/a7H3A6uoSRpBKOGmUI6KzHREoBVGypURbVIPFrpVUQg27GLIPa1yX6ipk/J42lTDCez0veNL3Jpm9z2jymor0r33JG3/5vIu2FBjUcJuiXU2unnEz2tCG0bbMWPNhzdUntD6hyVg83af1PP6fFt5zSouyNSUMubrVeV990MseRkAr2GCN0r1UzA1m6F3XO0llixMVvXOiZ93A+k5Oupsm1xtr7aQct0YpRVXRXdKttoXqxKQ7y1piBR+IaFtNtLGGcKkH12ojlSs78Iy1uplLn+onrbliZFKDIMIMlEx26oiUlDMnJsUNf4HknLgouK8xBZxfWP7oTYpLdLk6R1+9gvBpDeWzVtsa/PSB/NrgX0bzA1NVwtM+lL0853U8Ho9/AAAA//8DAPBoK+/zAwAA

View File

@@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSTT0/cMBDFv0o053WwHSexc6MLVRGqQGXVVr35zxgsgrNyHApC+90rZ7ei7a2XKBplZt77vckbRP2EMMD5fn/5jDHPsIEc1hKnvCO0IYztGB0YH2hfUyqUEPIHbCBc4ysM0AtrmVVIGuyQCEdbYhpviXOoGGWO8laUmfp+huENdKgdPgeL9TR/xTSHKcIA30J008+yW4fajtPi6jSNeBXnrKMtYi4u7653N7dkKxjd3nw4fjnjXAbUwcEAmnfomfdEWNMSoaQiSsiWoOWmF6KzujfHthAzpqjHenaP7xrclCNmO/CaNzUlXMFhA05nXWQbPePudV+UrJguSn2zltfX4Q2eMcHAN7+BHsed2TGcPc1mCaM7Oz6znh+L032a9phywJXLanUcdQ5TrE6btmPAmGEDN3fV7aizn9LTX7Dujv6v/sP+rmy/fEG7ZHTbaYkZBhAloc/aPoSI1dUFDCCV8NIqT0TrWiJQCqJkQ4l2qHqHbSOphA1sp5hDXKZlrq5ixvu06ocBPupxxqPy82QfQkabl1RMfe/Ksts0ucXm6h0/ozWtGW1K05L3S66+oAsJbcZib5eW07x/WnjHKS1SlpQw5upW54fqk54fYAB0gvXOKt1JxXxv+863nZdUNmio6LwXHWt71rXS6NYY31nnnFGeO6uUogo2gCXtaj0wRi1tlLNE6oYR0bKWGImWeIPoJGtM1xT17xyrm7H0qc5ozRUjRvWCCNtTYpxpiZSUMy+M4pb/geQUvih8rzFFHP+w/DnYNM2Tz9XpCqq/IHxZYvl5q/UifoZIXlbaF5N9xFSVtHSI5U5PAR0Oh8MvAAAA//8DADPqJ3gDBAAA

View File

@@ -0,0 +1,5 @@
https://dc.services.visualstudio.com/v2/track
Content-Type:application/x-json-stream
Content-Encoding:gzip
H4sIAAAAAAAACpSUTW8cKRCG/0qLc9MGmqabvjljR2tZka14lF3lxkcRI7dhBLQTy5r/vqJnIsen1V4QKqjirect8YaCegY0o8vD4foFQsmoRcVvIUaYwKTHlO4pmSmbydgR0lPK+++oRf4WXtGMRm4MNRJwDwIwt2TAuncGWwuSEmoJG3itqX5kNL8h5TsLL95AF/M3SNnHgGb0tw82/qxvK9+ZJa62S3GBm5CLCqaKubp+uN3f3eMdp2R39+l0M0OuBTpv0YwUE+Coc5gbPWAuJ4klnwYMhumRc2HUqE9pPhRIQS1dtk/vGmwsAYqZWcf6jmAm0bFFVhVVZWuVYf96qEo2TFc13m7hbTu/oRdIaGbtb6Cnchdm8RfPWa9+sRentaj8lLfVKVNiekUtOqR4gFQ8bIwuc4ZnvbzuVX76fLpTt/n6F5i1gN3FNRQ0o35CLdoYLYsqPobmLHG3eAhlOyzJh+zNf5USqEV3D839ooqL6fmDJQ8nyjf/A/IXZR59gObmCs1oktxNRjrMBztgDhPHcuoJVhbkaGHoJ1Ib2cVQfFjjmpubUOBH2lpCM/qslgwnfZfJPPoCpqyp9vmPqKN1n6JdTWneraSkIx0lfU1ay2EtzVewPoEpUJvYp/Vc79vHFCYYIVXKmhKE0tyr8tj8pfIjmhFYTkdrpBKTpG40o3CDcBOZetCEC+e4oMNIxTBpNWjthLHWaumYNVJKIlGLoE5Osw1rTy11Qhg8ibHHXGqBtRt7bB3lVDAYqaoZ7xybu6XmSaGVYpJiLUeOuRkJ1lYPeJoIo45ryQz7A8l5HnjlewspwPJHy1+8STFHV5qz180HCF/XUD+CZvP9pw/410b7KponSE11S/lQZ/5s0PF4PP4LAAD//wMAQozcs08EAAA=

View File

@@ -388,7 +388,8 @@ namespace COFTester.Services
}
/// <summary>
/// 拉力校準,向 M1300 寫入命令 2
/// 拉力校準,向 M1300 寫入脈衝信號(復歸型按鈕)
/// 實現方式:寫入 true -> 延遲 100ms -> 寫入 false -> 延遲 100ms
/// </summary>
public virtual async void ForceCalibration()
{
@@ -396,8 +397,19 @@ namespace COFTester.Services
{
if (_modbusMaster != null && _isConnected)
{
System.Diagnostics.Debug.WriteLine("[Modbus] 發送拉力校準命令 (2) 到 M1300");
await WriteCalibrationRegisterAsync((ushort)ModbusCalibrationCommand.ForceCalibration);
System.Diagnostics.Debug.WriteLine("[Modbus] 發送拉力校準脈衝命令到 M1300");
await _modbusMaster.WriteSingleCoilAsync(1, 1300, true);
System.Diagnostics.Debug.WriteLine("[Modbus] M1300 = true");
await Task.Delay(100);
await _modbusMaster.WriteSingleCoilAsync(1, 1300, false);
System.Diagnostics.Debug.WriteLine("[Modbus] M1300 = false");
await Task.Delay(100);
System.Diagnostics.Debug.WriteLine("[Modbus] 拉力校準脈衝命令發送完成");
}
}
catch (Exception ex)

View File

@@ -1092,7 +1092,7 @@ namespace COFTester.ViewModels
}
/// <summary>
/// 拉力校准 - M1300 写入命令 2
/// 拉力校准 - 触发 M1300 复归型脉冲
/// </summary>
private void ForceCalibration()
{

View File

@@ -68,11 +68,11 @@
<!-- 标定操作 -->
<Border Background="#F8F9FA" CornerRadius="4" Padding="15">
<StackPanel>
<TextBlock Text="{Binding Lang.CalibrationOperation}" FontWeight="Bold" Margin="0,0,0,10" FontSize="14"/>
<TextBlock Text="{Binding Lang.ForceCalibration}" FontWeight="Bold" Margin="0,0,0,10" FontSize="14"/>
<TextBlock Text="{Binding Lang.CalibrationInstruction}" TextWrapping="Wrap" Margin="0,0,0,15" FontSize="12"/>
<!-- 零点标定(拉力校准) -->
<Button Content="{Binding Lang.ZeroCalibration}" Command="{Binding ZeroCalibrationCommand}" Height="50" Foreground="White" FontSize="14" Margin="0,0,0,10">
<Button Content="{Binding Lang.ForceCalibration}" Command="{Binding ForceCalibrationCommand}" Height="50" Foreground="White" FontSize="14" Margin="0,0,0,10">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="{StaticResource AccentBrush}"/>
@@ -95,7 +95,7 @@
</Button.Style>
</Button>
<TextBlock Text="{Binding Lang.ZeroCalibrationNote}"
<TextBlock Text="{Binding Lang.ForceCalibrationNote}"
TextWrapping="Wrap" FontSize="11" Foreground="{StaticResource GrayBrush}" Margin="0,0,0,0"/>
</StackPanel>
</Border>

View File

@@ -0,0 +1,315 @@
# 标准选择功能实现说明
## 功能概述
在设置页面实现了测试标准选择、滑块质量选择和自定义参数配置功能,支持三个国际标准的快速切换、自定义参数模式,以及水平和升降测试参数的完整配置。**重要更新**:修复了报告生成时参数显示不正确的问题,确保报告中显示的是选中标准的实际参数值。
## 实现内容
### 1. UI界面SettingsPage.xaml
#### 1.1 滑块质量选择
- 新增"滑块质量"下拉框ComboBox
- 三个质量选项200g、300g、500g
- 默认选中200g
- 双向绑定到 `Parameters.SledMass` 属性
- 质量变化会影响法向力计算,从而影响摩擦系数结果
#### 1.2 测试标准选择
- 四个可切换高亮的Button
- GB/T 10006-2021
- ISO 8295:1995
- ASTM D1894-24
- 自定义
- 默认不选中任何标准
- 选中后按钮高亮显示(蓝色背景,白色文字)
- 鼠标悬停时显示浅蓝色背景
- 使用 UniformGrid 均匀分布四个按钮1行4列
#### 1.3 水平测试参数(一行显示)
- 使用 Grid 两列布局
- 左列水平测试速度mm/min
- 右列水平测试位移mm
- 中间间隔10px
- 根据模式切换只读/可编辑状态
#### 1.4 升降测试参数(一行显示)
- 使用 Grid 两列布局
- 左列升降测试速度mm/min
- 右列升降测试位移mm
- 中间间隔10px
- 根据模式切换只读/可编辑状态
#### 1.5 更新按钮
- 仅在自定义模式下显示
- 绿色背景(#27AE60
- 点击后更新参数到设备
- 带图标和文字:"更新参数到设备"
### 2. 参数配置
#### 2.1 滑块质量规格
| 质量选项 | 数值 | 说明 |
|---------|------|------|
| 200 g | 200.0 | 默认值,轻质量测试 |
| 300 g | 300.0 | 中等质量测试 |
| 500 g | 500.0 | 重质量测试 |
#### 2.2 标准参数配置
| 标准 | 滑块质量 | 水平测试速度 | 水平测试位移 | 升降测试速度 | 升降测试位移 |
|------|---------|-------------|-------------|-------------|-------------|
| GB/T 10006-2021 | **用户选择** | 100 mm/min | 80 mm | 保持PLC原值 | 保持PLC原值 |
| ISO 8295:1995 | **用户选择** | 100 mm/min | 80 mm | 保持PLC原值 | 保持PLC原值 |
| ASTM D1894-24 | **用户选择** | 150 mm/min | 150 mm | 保持PLC原值 | 保持PLC原值 |
| 自定义 | 用户选择 | 用户输入 | 用户输入 | 用户输入 | 用户输入 |
**重要说明**选择预设标准时滑块质量保持用户在UI上选择的值200g/300g/500g不会被覆盖。
### 3. 核心逻辑
#### 3.1 质量选择逻辑TestParameters.cs
- `SledMass` 属性默认值设置为 200.0g
- 通过 ComboBox 的 TwoWay 绑定实现实时更新
- 质量变化会影响摩擦系数计算:
```csharp
// 法向力计算公式W = m * g
double gravityForce = (parameters.SledMass / 1000.0) * 9.80665;
// 摩擦系数 = 摩擦力 / 法向力
double COF = frictionForce / gravityForce;
```
#### 3.2 标准选择逻辑MainViewModel.cs
- 新增 `SelectedStandard` 属性跟踪当前选中的标准
- 新增 `IsStandardParametersReadOnly` 属性控制输入框状态
- 新增 `SelectStandardCommand` 命令(泛型 RelayCommand<string>
- 新增 `UpdateCustomParametersCommand` 命令
- 实现 `SelectStandard(string standardCode)` 方法
- 实现 `UpdateCustomParametersAsync()` 方法
**未选标准时**(初始状态):
- `SelectedStandard` 为空字符串
- `IsStandardParametersReadOnly` 返回 true
- 所有输入框只读(灰色背景)
- 显示从PLC读取的值
- **报告参数**
- `Parameters.Standard` = "PLC默认配置"
- `Parameters.SledMass` = 200.0 g默认值
- `Parameters.TestSpeed` = PLC读取的水平测试速度
- `Parameters.TestStroke` = PLC读取的水平测试位移
**预设标准模式**GB/T 10006-2021、ISO 8295:1995、ASTM D1894-24
1. 写入寄存器 D370水平测试速度
2. 写入寄存器 D380水平测试位移
3. **更新报告参数**
- `Parameters.Standard` = 标准全名(如 "GB/T 10006-2021"
- `Parameters.SledMass` = **保持用户选择的值**200g/300g/500g
- `Parameters.TestSpeed` = 标准规定的速度值
- `Parameters.TestStroke` = 标准规定的位移值
4. 更新本地水平测试参数用于UI显示
5. 升降参数保持PLC原值不变
6. 更新 SelectedStandard 属性(触发按钮高亮)
7. 所有输入框保持只读(灰色背景)
**重要**:选择标准时不会覆盖用户选择的滑块质量,确保法向力计算使用正确的质量值。
**自定义模式**
1. 更新 SelectedStandard 为 "Custom"
2. `IsStandardParametersReadOnly` 返回 false
3. 所有输入框变为可编辑(白色背景)
4. 显示"更新参数到设备"按钮
5. 用户修改参数后点击按钮
6. 调用 WriteHorizontalTestParametersAsync 和 WriteVerticalTestParametersAsync
7. 显示成功/失败消息
### 4. 报告生成参数修复(重要更新)
#### 4.1 问题描述
之前的实现中,选择标准后只更新了 `Parameters.HorizontalTestSpeed` 和 `Parameters.HorizontalTestDisplacement`,但没有更新用于报告生成的 `Parameters.Standard`、`Parameters.SledMass`、`Parameters.TestSpeed` 和 `Parameters.TestStroke`导致生成的PDF报告中显示的参数不正确。
#### 4.2 修复方案
在 `SelectStandard` 方法中,除了更新水平测试参数外,还同步更新以下报告参数:
```csharp
// 更新所有相关参数(用于报告生成)
// 注意:不更新 SledMass保留用户在UI上选择的质量值
Parameters.Standard = standardName; // 更新标准名称
// Parameters.SledMass 保持用户选择的值200g/300g/500g
Parameters.TestSpeed = speed; // 更新测试速度(用于报告)
Parameters.TestStroke = displacement; // 更新测试行程(用于报告)
Parameters.HorizontalTestSpeed = speed; // 更新水平测试速度
Parameters.HorizontalTestDisplacement = displacement; // 更新水平测试位移
```
**关键修复**:不覆盖 `Parameters.SledMass`保留用户在UI上选择的质量值确保
1. 法向力计算使用正确的质量值:`W = (SledMass / 1000) × 9.80665`
2. 报告显示用户实际选择的质量值
3. 摩擦系数计算准确:`μ = F / W`
#### 4.3 报告显示效果
修复后PDF报告中的测试参数部分会正确显示用户选择的质量值
**选择 GB/T 10006-2021 标准 + 200g 质量时**
```
测试标准: GB/T 10006-2021
滑块质量: 200.0 g
测试速度: 100.0 mm/min
测试行程: 80.0 mm
```
**选择 ISO 8295:1995 标准 + 300g 质量时**
```
测试标准: ISO 8295:1995
滑块质量: 300.0 g
测试速度: 100.0 mm/min
测试行程: 80.0 mm
```
**选择 ASTM D1894-24 标准 + 500g 质量时**
```
测试标准: ASTM D1894-24
滑块质量: 500.0 g
测试速度: 150.0 mm/min
测试行程: 150.0 mm
```
**未选择标准时**使用PLC默认值
```
测试标准: PLC默认配置
滑块质量: 200.0 g或用户选择的值
测试速度: [PLC读取的值] mm/min
测试行程: [PLC读取的值] mm
```
**法向力计算验证**
- 200g: W = 0.2 × 9.80665 = 1.96133 N
- 300g: W = 0.3 × 9.80665 = 2.94200 N
- 500g: W = 0.5 × 9.80665 = 4.90333 N
### 5. Modbus服务扩展ModbusService.cs
- 在 `ModbusServiceBase` 中新增抽象方法:
```csharp
public abstract Task WriteHorizontalTestParametersAsync(double speed, double displacement);
public abstract Task WriteVerticalTestParametersAsync(double speed, double displacement);
```
- 在 `ModbusTcpService`、`ModbusRtuService` 和 `ModbusAsciiService` 中实现这两个方法
- 使用 `ConvertFloatToRegisters` 转换浮点数为寄存器格式
- 通过 `WriteMultipleRegistersAsync` 写入 PLC
### 6. 寄存器映射
| 寄存器 | 参数 | 单位 |
|--------|------|------|
| D370 | 水平测试速度 | mm/min |
| D380 | 水平测试位移 | mm |
| D330 | 升降测试速度 | mm/min |
| D340 | 升降测试位移 | mm |
### 7. UI样式特性
- **ComboBox样式**标准高度40px浅灰色边框垂直居中对齐
- **Button未选中状态**:白色背景,深灰色文字,浅灰色边框
- **Button选中状态**:蓝色背景(#3498DB白色文字蓝色边框
- **Button悬停状态**:浅蓝色背景(#F0F8FF蓝色边框
- **TextBox只读状态**:灰色背景(#F5F5F5不可编辑
- **TextBox可编辑状态**:白色背景,可输入
- **更新按钮**:绿色背景(#27AE60悬停时深绿色#229954
- **圆角设计**6px圆角现代化外观
- **响应式布局**:按钮均匀分布,参数两列对齐
## 使用流程
### 预设标准模式
1. 连接设备
2. 进入设置页面
3. **先选择滑块质量**200g/300g/500g默认200g
4. 点击任一预设标准按钮GB/T 10006-2021、ISO 8295:1995 或 ASTM D1894-24
5. 按钮立即高亮显示
6. 系统写入水平测试参数到 PLCD370、D380
7. **系统同步更新报告参数**Standard、TestSpeed、TestStroke
8. **滑块质量保持用户选择的值,不被覆盖**
9. 水平参数输入框显示标准值(只读,灰色背景)
10. 升降参数保持PLC原值不变只读灰色背景
11. 生成报告时会显示正确的标准名称、用户选择的质量值和参数值
### 自定义模式
1. 连接设备
2. 进入设置页面
3. 选择滑块质量
4. 点击"自定义"按钮
5. 按钮高亮显示
6. 输入框变为可编辑状态(白色背景)
7. 修改水平/升降测试参数
8. 点击"更新参数到设备"按钮
9. 系统写入参数到 PLC
10. 显示成功/失败消息
## 技术要点
- 使用 WPF ComboBox 的 TwoWay 绑定实现质量选择
- 使用 SelectedValuePath="Tag" 绑定数值
- 使用 WPF Button 的 Command 绑定实现标准选择
- 使用 CommandParameter 传递标准代码
- 使用 DataTrigger 绑定 SelectedStandard 属性实现按钮高亮
- 使用 DataTrigger 控制更新按钮的显示/隐藏
- 使用 IsReadOnly 属性和 Style Trigger 控制输入框状态
- **关键修复**:选择标准时同步更新所有报告相关参数
- 异步写入寄存器,避免阻塞 UI
- 完整的错误处理和状态提示
- 支持 ModbusTCP、ModbusRTU 和 ModbusASCII 三种通信模式
## 摩擦系数计算说明
滑块质量直接影响法向力(重力),从而影响摩擦系数的计算结果:
```
法向力 W = (滑块质量 / 1000) × 重力加速度
其中:重力加速度 g = 9.80665 m/s²
静摩擦系数 μs = 最大静摩擦力 / 法向力
动摩擦系数 μk = 平均动摩擦力 / 法向力
```
示例:
- 200g 滑块W = 0.2 × 9.80665 = 1.96133 N
- 300g 滑块W = 0.3 × 9.80665 = 2.94200 N
- 500g 滑块W = 0.5 × 9.80665 = 4.90333 N
相同摩擦力下,质量越大,法向力越大,计算出的摩擦系数越小。
## 注意事项
- 滑块质量默认为 200g可随时更改
- 质量变化会立即影响后续测试的摩擦系数计算
- 必须先连接设备才能选择标准
- **未选标准时**所有输入框只读显示PLC值报告显示"PLC默认配置"和用户选择的质量
- **预设标准模式**
- 只写入水平测试参数D370、D380到PLC
- 同时更新报告参数Standard、TestSpeed、TestStroke
- **不覆盖 SledMass保留用户选择的质量值**
- 升降参数保持PLC原值
- 报告会显示选中标准的完整名称、用户选择的质量值和参数值
- 法向力计算使用用户选择的质量W = (SledMass / 1000) × 9.80665
- **自定义模式**:所有参数可编辑,需手动点击"更新参数到设备"按钮
- 参数写入失败会弹出错误提示
- 写入成功后状态栏会显示确认消息
- 按钮高亮状态会持续保持,直到选择其他标准
- 输入框状态根据选择的模式自动切换
- **重要**生成PDF报告前请确保已选择正确的标准报告会显示当前选中标准的参数
## 代码文件修改清单
1. `CSI-H238M/Views/SettingsPage.xaml` - UI界面ComboBox + Button + 参数布局)
2. `CSI-H238M/Models/Model.cs` - TestParameters 默认值设置
3. `CSI-H238M/ViewModels/ViewModel.cs` - 命令、逻辑和状态管理(**已修复报告参数更新**
4. `CSI-H238M/Services/ModbusService.cs` - Modbus服务扩展水平和升降参数写入
5. `CSI-H238M/Services/PdfReportService.cs` - PDF报告生成使用Parameters中的值
## 编译状态
✅ 编译成功,无错误
⚠️ 2个警告不影响功能
✅ UI样式完整支持高亮切换
✅ 质量选择功能正常默认200g
✅ 自定义模式功能正常,支持参数编辑和更新
✅ 水平和升降参数一行显示,布局清晰
**报告参数显示修复完成,确保显示正确的标准和参数值**
## 版本历史
- **v1.0** (初始版本) - 实现标准选择和参数配置功能
- **v1.1** (2024-02-06) - 修复报告生成时参数显示不正确的问题,确保选择标准后报告显示正确的标准名称、滑块质量、测试速度和测试行程
- **v1.2** (2024-02-06) - **关键修复**:选择标准时不再覆盖用户选择的滑块质量,确保:
- 法向力计算使用正确的质量值200g/300g/500g
- 报告显示用户实际选择的质量值
- 摩擦系数计算准确:μ = F / W其中 W = (SledMass / 1000) × 9.80665

View File

@@ -0,0 +1,237 @@
# 滑块质量值获取验证测试
## 测试目的
验证系统在不同场景下是否正确获取和使用用户选择的滑块质量值200g/300g/500g确保法向力计算和报告生成的准确性。
## 测试场景
### 场景1默认质量值测试
**操作步骤**
1. 启动程序,连接设备
2. 不修改质量选择默认200g
3. 选择标准 GB/T 10006-2021
4. 执行测试
5. 生成PDF报告
**预期结果**
- UI显示滑块质量 = 200.0 g
- 法向力计算W = 0.2 × 9.80665 = 1.96133 N
- 报告显示:
```
测试标准: GB/T 10006-2021
滑块质量: 200.0 g
测试速度: 100.0 mm/min
测试行程: 80.0 mm
```
- 摩擦系数计算:μ = F / 1.96133
### 场景2选择300g质量测试
**操作步骤**
1. 启动程序,连接设备
2. 在设置页选择滑块质量300g
3. 选择标准 ISO 8295:1995
4. 执行测试
5. 生成PDF报告
**预期结果**
- UI显示滑块质量 = 300.0 g
- 法向力计算W = 0.3 × 9.80665 = 2.94200 N
- 报告显示:
```
测试标准: ISO 8295:1995
滑块质量: 300.0 g
测试速度: 100.0 mm/min
测试行程: 80.0 mm
```
- 摩擦系数计算:μ = F / 2.94200
### 场景3选择500g质量测试
**操作步骤**
1. 启动程序,连接设备
2. 在设置页选择滑块质量500g
3. 选择标准 ASTM D1894-24
4. 执行测试
5. 生成PDF报告
**预期结果**
- UI显示滑块质量 = 500.0 g
- 法向力计算W = 0.5 × 9.80665 = 4.90333 N
- 报告显示:
```
测试标准: ASTM D1894-24
滑块质量: 500.0 g
测试速度: 150.0 mm/min
测试行程: 150.0 mm
```
- 摩擦系数计算:μ = F / 4.90333
### 场景4切换质量后选择标准
**操作步骤**
1. 启动程序,连接设备
2. 选择滑块质量200g
3. 选择标准 GB/T 10006-2021
4. 切换滑块质量为500g
5. 执行测试
6. 生成PDF报告
**预期结果**
- UI显示滑块质量 = 500.0 g最新选择的值
- 法向力计算W = 0.5 × 9.80665 = 4.90333 N
- 报告显示:
```
测试标准: GB/T 10006-2021
滑块质量: 500.0 g
测试速度: 100.0 mm/min
测试行程: 80.0 mm
```
- 摩擦系数计算:μ = F / 4.90333
### 场景5先选择标准后选择质量
**操作步骤**
1. 启动程序,连接设备
2. 选择标准 ISO 8295:1995
3. 选择滑块质量300g
4. 执行测试
5. 生成PDF报告
**预期结果**
- UI显示滑块质量 = 300.0 g
- 法向力计算W = 0.3 × 9.80665 = 2.94200 N
- 报告显示:
```
测试标准: ISO 8295:1995
滑块质量: 300.0 g
测试速度: 100.0 mm/min
测试行程: 80.0 mm
```
- 摩擦系数计算:μ = F / 2.94200
### 场景6自定义模式质量测试
**操作步骤**
1. 启动程序,连接设备
2. 选择滑块质量300g
3. 点击"自定义"按钮
4. 修改水平测试速度为120 mm/min
5. 点击"更新参数到设备"
6. 执行测试
7. 生成PDF报告
**预期结果**
- UI显示滑块质量 = 300.0 g
- 法向力计算W = 0.3 × 9.80665 = 2.94200 N
- 报告显示:
```
测试标准: 自定义
滑块质量: 300.0 g
测试速度: 120.0 mm/min
测试行程: [用户设置的值] mm
```
- 摩擦系数计算:μ = F / 2.94200
## 验证点检查清单
### 代码层面验证
- [x] `Parameters.SledMass` 默认值为 200.0g
- [x] ComboBox 双向绑定到 `Parameters.SledMass`
- [x] 选择标准时不覆盖 `Parameters.SledMass`
- [x] 法向力计算使用 `parameters.SledMass`
```csharp
double gravityForce = (parameters.SledMass / 1000.0) * 9.80665;
```
- [x] 报告生成使用 `parameters.SledMass`
```csharp
$"滑块质量: {parameters.SledMass:F1} g"
```
### UI层面验证
- [ ] 质量下拉框显示三个选项200g、300g、500g
- [ ] 默认选中200g
- [ ] 选择不同质量后UI立即更新
- [ ] 选择标准后,质量值不变
- [ ] 切换质量后,新值立即生效
### 计算层面验证
- [ ] 200g质量法向力 = 1.96133 N
- [ ] 300g质量法向力 = 2.94200 N
- [ ] 500g质量法向力 = 4.90333 N
- [ ] 摩擦系数 = 摩擦力 / 法向力
- [ ] 不同质量下,相同摩擦力产生不同摩擦系数
### 报告层面验证
- [ ] 报告显示用户选择的质量值
- [ ] 报告显示选择的标准名称
- [ ] 报告显示正确的测试速度和行程
- [ ] 报告中的摩擦系数与计算值一致
## 关键代码位置
### 1. 质量属性定义Model.cs
```csharp
private double _sledMass = 200.0; // 默认值 200g
public double SledMass
{
get => _sledMass;
set { _sledMass = value; OnPropertyChanged(); }
}
```
### 2. UI绑定SettingsPage.xaml
```xml
<ComboBox SelectedValue="{Binding Parameters.SledMass, Mode=TwoWay}"
SelectedValuePath="Tag">
<ComboBoxItem Content="200 g" Tag="200.0"/>
<ComboBoxItem Content="300 g" Tag="300.0"/>
<ComboBoxItem Content="500 g" Tag="500.0"/>
</ComboBox>
```
### 3. 标准选择不覆盖质量ViewModel.cs
```csharp
// 更新所有相关参数(用于报告生成)
// 注意:不更新 SledMass保留用户在UI上选择的质量值
Parameters.Standard = standardName;
// Parameters.SledMass 保持用户选择的值200g/300g/500g
Parameters.TestSpeed = speed;
Parameters.TestStroke = displacement;
```
### 4. 法向力计算Services.cs
```csharp
// 計算法向力重力W = m * g
// 質量單位從 g 轉換為 kg
double gravityForce = (parameters.SledMass / 1000.0) * GravityConstant;
```
### 5. 报告生成PdfReportService.cs
```csharp
$"滑块质量: {parameters.SledMass:F1} g"
```
## 测试结论
### 修复前的问题
- 选择标准时会强制将质量设置为200g
- 用户选择的300g或500g质量会被覆盖
- 导致法向力计算错误
- 报告显示的质量值不正确
### 修复后的效果
- ✅ 选择标准时保留用户选择的质量值
- ✅ 法向力计算使用正确的质量值
- ✅ 报告显示用户实际选择的质量值
- ✅ 摩擦系数计算准确
- ✅ 支持200g/300g/500g三种质量选择
## 注意事项
1. **质量选择优先**:建议用户先选择质量,再选择标准
2. **质量可随时更改**:用户可以在任何时候更改质量,新值立即生效
3. **质量影响计算**:不同质量会产生不同的法向力,从而影响摩擦系数
4. **报告准确性**:报告会显示测试时实际使用的质量值
5. **标准独立性**:选择标准只影响速度和位移,不影响质量
## 相关文档
- `标准选择功能说明.md` - 完整功能说明
- `CSI-H238M/ViewModels/ViewModel.cs` - 标准选择逻辑
- `CSI-H238M/Services/Services.cs` - 法向力计算
- `CSI-H238M/Services/PdfReportService.cs` - 报告生成