This commit is contained in:
279
Window6.xaml.cs
279
Window6.xaml.cs
@@ -30,6 +30,7 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
/// </summary>
|
||||
public partial class Window6 : Window
|
||||
{
|
||||
private readonly string _lang = ConfigurationManager.AppSettings["Language"] ?? "zh-CN";
|
||||
DataChange c = new DataChange();
|
||||
#region 寄存器/线圈地址定义(按功能分组,标注物理意义)
|
||||
// 控制线圈(M代码)
|
||||
@@ -132,19 +133,19 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
{
|
||||
if (isTestRunning)
|
||||
{
|
||||
ResetBtn.Content = "复位成功";
|
||||
ResetBtn.Content = _lang == "en-US" ? "Reset Success" : "复位成功";
|
||||
ResetBtn.Foreground = Brushes.LightGreen;
|
||||
}
|
||||
else
|
||||
{
|
||||
ResetBtn.Content = "复位";
|
||||
ResetBtn.Content = _lang == "en-US" ? "Reset" : "复位";
|
||||
ResetBtn.Foreground = Brushes.White;
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"读取线圈或更新UI失败:{ex.Message}");
|
||||
Console.WriteLine(_lang == "en-US" ? $"Read coil failed: {ex.Message}" : $"读取线圈或更新UI失败:{ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,21 +227,18 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
{
|
||||
if (!IsModbusConnected())
|
||||
{
|
||||
updateAction("离线");
|
||||
updateAction(_lang == "en-US" ? "Offline" : "离线");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
ushort[] data = _modbusMaster?.ReadHoldingRegisters(0x01, address, isFloat ? (ushort)2 : (ushort)1);
|
||||
object value = isFloat
|
||||
? Convert.ToSingle(c.UshortToFloat(data[1], data[0])) // 浮点数(需转换)
|
||||
: data[0]; // 整数
|
||||
object value = isFloat ? Convert.ToSingle(c.UshortToFloat(data[1], data[0])) : data[0];
|
||||
updateAction(value);
|
||||
}
|
||||
catch
|
||||
{
|
||||
updateAction("读取失败");
|
||||
updateAction(_lang == "en-US" ? "Read Failed" : "读取失败");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,22 +257,22 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
{
|
||||
_plotModel = new PlotModel
|
||||
{
|
||||
Title = "呼气流量与吸气流量",
|
||||
Background = OxyColor.FromRgb(240, 240, 240) // 设置背景色
|
||||
Title = _lang == "en-US" ? "Exhalation & Inhalation Flow" : "呼气流量与吸气流量",
|
||||
Background = OxyColor.FromRgb(240, 240, 240)
|
||||
};
|
||||
|
||||
_exhalationSeries = new LineSeries
|
||||
{
|
||||
Title = "呼气流量 (D5016)",
|
||||
Title = _lang == "en-US" ? "Exhalation Flow (D5016)" : "呼气流量 (D5016)",
|
||||
Color = OxyColor.FromRgb(255, 0, 0),
|
||||
StrokeThickness = 2, // 设置线条宽度
|
||||
MarkerType = MarkerType.Circle, // 添加标记
|
||||
StrokeThickness = 2,
|
||||
MarkerType = MarkerType.Circle,
|
||||
MarkerSize = 4
|
||||
};
|
||||
|
||||
_inhalationSeries = new LineSeries
|
||||
{
|
||||
Title = "吸气流量 (D5014)",
|
||||
Title = _lang == "en-US" ? "Inhalation Flow (D5014)" : "吸气流量 (D5014)",
|
||||
Color = OxyColor.FromRgb(0, 0, 255),
|
||||
StrokeThickness = 2,
|
||||
MarkerType = MarkerType.Circle,
|
||||
@@ -287,30 +285,16 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
_plotModel.Series.Add(_exhalationSeries);
|
||||
_plotModel.Series.Add(_inhalationSeries);
|
||||
|
||||
// 添加轴标签
|
||||
_plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = "时间 (秒)" });
|
||||
_plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Title = "流量 (单位)" });
|
||||
|
||||
|
||||
// 在InitializePlot方法的轴配置中添加
|
||||
_plotModel.Axes.Add(new LinearAxis
|
||||
{
|
||||
Position = AxisPosition.Bottom,
|
||||
Title = "时间 (秒)",
|
||||
IsZoomEnabled = false, // 禁用手动缩放
|
||||
IsPanEnabled = false, // 禁用手动平移
|
||||
MaximumPadding = 0.1, // 轴最大值留10%余量
|
||||
MinimumPadding = 0.1 // 轴最小值留10%余量
|
||||
});
|
||||
|
||||
// 添加图例
|
||||
_plotModel.IsLegendVisible = true; // 设置图例可见
|
||||
_plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, Title = _lang == "en-US" ? "Time (s)" : "时间 (秒)" });
|
||||
_plotModel.Axes.Add(new LinearAxis { Position = AxisPosition.Left, Title = _lang == "en-US" ? "Flow" : "流量" });
|
||||
|
||||
_plotModel.IsLegendVisible = true;
|
||||
plotView.Model = _plotModel;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void StartDataUpdate()
|
||||
{
|
||||
DispatcherTimer timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
|
||||
@@ -435,10 +419,10 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
{
|
||||
UpdateUiSafely(() =>
|
||||
{
|
||||
positionTxt.Text = IsModbusConnected() ? a : "连接断开";
|
||||
pressTxt.Text = IsModbusConnected() ? b : "连接断开";
|
||||
OutFowTxt.Text = IsModbusConnected() ? c : "连接断开";
|
||||
InFlowTxt.Text = IsModbusConnected() ? d : "连接断开";
|
||||
positionTxt.Text = IsModbusConnected() ? a : (_lang == "en-US" ? "Disconnected" : "连接断开");
|
||||
pressTxt.Text = IsModbusConnected() ? b : (_lang == "en-US" ? "Disconnected" : "连接断开");
|
||||
OutFowTxt.Text = IsModbusConnected() ? c : (_lang == "en-US" ? "Disconnected" : "连接断开");
|
||||
InFlowTxt.Text = IsModbusConnected() ? d : (_lang == "en-US" ? "Disconnected" : "连接断开");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -602,11 +586,10 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
inputControl.Text = _lang == "en-US" ? "Processing..." : "操作中...";
|
||||
|
||||
try
|
||||
{
|
||||
inputControl.Text = "操作中...";
|
||||
|
||||
Function ma = new Function(_modbusMaster);
|
||||
ma.WriteToPLCForNew("", registerAddress, Function.DataType.浮点型);
|
||||
@@ -634,7 +617,7 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
{
|
||||
if (!IsModbusConnected())
|
||||
{
|
||||
ShowError("Modbus TCP 未连接");
|
||||
// ShowError("Modbus TCP 未连接");
|
||||
return;
|
||||
}
|
||||
try
|
||||
@@ -645,19 +628,10 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
await _modbusMaster.WriteSingleCoilAsync(0x01, registerAddress, false);
|
||||
await Task.Delay(100); // 等待PLC处理
|
||||
|
||||
//var data = _modbusMaster?.ReadHoldingRegisters(0x01, registerAddress, 1);
|
||||
//if (data != null && data.Length > 0 && data[0] == 1)
|
||||
//{
|
||||
// ShowSuccess("写入成功,读取验证值为 1");
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// ShowSuccess("写入成功,但读取验证值异常,建议检查");
|
||||
//}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError($"设置失败: {ex.Message}");
|
||||
ShowError(_lang == "en-US" ? $"Set failed: {ex.Message}" : $"设置失败: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -673,10 +647,10 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
return _modbusMaster != null && _tcpClient?.Connected == true;
|
||||
}
|
||||
|
||||
// 消息提示封装(统一风格)
|
||||
private void ShowSuccess(string message) => MessageBox.Show(message, "成功", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
private void ShowWarning(string message) => MessageBox.Show(message, "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
private void ShowError(string message) => MessageBox.Show(message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
private void ShowSuccess(string msg) => MessageBox.Show(msg, _lang == "en-US" ? "Success" : "成功", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
private void ShowWarning(string msg) => MessageBox.Show(msg, _lang == "en-US" ? "Warning" : "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
private void ShowError(string msg) => MessageBox.Show(msg, _lang == "en-US" ? "Error" : "错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -710,86 +684,36 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
Close();
|
||||
}
|
||||
|
||||
private async void Button_Click_4(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteSingleRegisterWithOutUI(
|
||||
|
||||
registerAddress: _OutBreathUpAddress,
|
||||
successMessage: value => $"呼上: {value}");
|
||||
}
|
||||
|
||||
private async void Button_Click_5(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteSingleRegisterWithOutUI(
|
||||
registerAddress: _OutBreathDownAddress,
|
||||
successMessage: value => $"呼下: {value}");
|
||||
}
|
||||
|
||||
private async void Button_Click_6(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteSingleRegisterWithOutUI(
|
||||
registerAddress: _InBreathUpAddress,
|
||||
successMessage: value => $"吸上: {value}");
|
||||
}
|
||||
|
||||
private async void Button_Click_7(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteSingleRegisterWithOutUI(
|
||||
registerAddress: _InBreathDownAddress,
|
||||
successMessage: value => $"吸下: {value}");
|
||||
}
|
||||
|
||||
private async void Button_Click_8(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteSingleRegisterWithOutUI(
|
||||
registerAddress: _HandInBreathUpAddress,
|
||||
successMessage: value => $"手动吸: {value}");
|
||||
}
|
||||
|
||||
private async void Button_Click_9(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteSingleRegisterWithOutUI(
|
||||
registerAddress: _HandInBreathDownAddress,
|
||||
successMessage: value => $"手动呼: {value}");
|
||||
}
|
||||
private async void Button_Click_4(object sender, RoutedEventArgs e) => await WriteSingleRegisterWithOutUI(_OutBreathUpAddress, v => $"Exhale Up: {v}");
|
||||
private async void Button_Click_5(object sender, RoutedEventArgs e) => await WriteSingleRegisterWithOutUI(_OutBreathDownAddress, v => $"Exhale Down: {v}");
|
||||
private async void Button_Click_6(object sender, RoutedEventArgs e) => await WriteSingleRegisterWithOutUI(_InBreathUpAddress, v => $"Inhale Up: {v}");
|
||||
private async void Button_Click_7(object sender, RoutedEventArgs e) => await WriteSingleRegisterWithOutUI(_InBreathDownAddress, v => $"Inhale Down: {v}");
|
||||
private async void Button_Click_8(object sender, RoutedEventArgs e) => await WriteSingleRegisterWithOutUI(_HandInBreathUpAddress, v => $"Manual Inhale: {v}");
|
||||
private async void Button_Click_9(object sender, RoutedEventArgs e) => await WriteSingleRegisterWithOutUI(_HandInBreathDownAddress, v => $"Manual Exhale: {v}");
|
||||
|
||||
private async void Button_Click_10(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (!IsModbusConnected())
|
||||
{
|
||||
UpdateResetButtonStatus("连接断开", Brushes.Red);
|
||||
ShowError("Modbus TCP 未连接");
|
||||
UpdateResetButtonStatus(_lang == "en-US" ? "Disconnected" : "连接断开", Brushes.Red);
|
||||
ShowError(_lang == "en-US" ? "Modbus TCP not connected" : "Modbus TCP 未连接");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
UpdateResetButtonStatus("正在复位...", Brushes.LightGreen);
|
||||
|
||||
// 写入复位线圈
|
||||
await Task.Run(() =>
|
||||
_modbusMaster.WriteSingleCoil(0x01, _resetAddress, true)
|
||||
);
|
||||
|
||||
UpdateResetButtonStatus(_lang == "en-US" ? "Resetting..." : "正在复位...", Brushes.LightGreen);
|
||||
await Task.Run(() => _modbusMaster.WriteSingleCoil(0x01, _resetAddress, true));
|
||||
fc.BtnClickFunctionForNew(Function.ButtonType.复位型, _resetAddress);
|
||||
await Task.Delay(100);
|
||||
// 写入复位线圈
|
||||
await Task.Run(() =>
|
||||
_modbusMaster.WriteSingleCoil(0x01, _resetAddress, false)
|
||||
);
|
||||
|
||||
|
||||
await Task.Run(() => _modbusMaster.WriteSingleCoil(0x01, _resetAddress, false));
|
||||
fc.BtnClickFunctionForNew(Function.ButtonType.复位型, _resetAddress);
|
||||
|
||||
|
||||
UpdateResetButtonStatus("复位成功", Brushes.LightGreen);
|
||||
|
||||
UpdateResetButtonStatus(_lang == "en-US" ? "Reset Success" : "复位成功", Brushes.LightGreen);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"复位异常: {ex.Message}");
|
||||
UpdateResetButtonStatus("复位失败", Brushes.Red);
|
||||
ShowError($"操作异常: {ex.Message}");
|
||||
Console.WriteLine(_lang == "en-US" ? $"Reset error: {ex.Message}" : $"复位异常: {ex.Message}");
|
||||
UpdateResetButtonStatus(_lang == "en-US" ? "Reset Failed" : "复位失败", Brushes.Red);
|
||||
ShowError(_lang == "en-US" ? $"Operation error: {ex.Message}" : $"操作异常: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -807,96 +731,49 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
|
||||
private async void Button_Click_11(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteCoilWithCheck(
|
||||
coilAddress: _BreathUpAddress,
|
||||
value: true,
|
||||
successMsg: "校准指令已被设备接收并执行(二次验证通过)",
|
||||
failMsg: "校准执行超时,状态异常",
|
||||
logMsg: "校准指令执行成功");
|
||||
await WriteCoilWithCheck(_BreathUpAddress, true,
|
||||
_lang == "en-US" ? "Calibration success" : "校准指令已被设备接收并执行",
|
||||
_lang == "en-US" ? "Calibration timeout" : "校准执行超时,状态异常",
|
||||
_lang == "en-US" ? "Calibration executed" : "校准指令执行成功");
|
||||
}
|
||||
|
||||
|
||||
private async void Button_Click_12(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteCoilWithCheck(
|
||||
coilAddress: _BreathDownAddress,
|
||||
value: true,
|
||||
successMsg: "校准指令已被设备接收并执行(二次验证通过)",
|
||||
failMsg: "校准执行超时,状态异常",
|
||||
logMsg: "校准指令执行成功"
|
||||
);
|
||||
await WriteCoilWithCheck(_BreathDownAddress, true,
|
||||
_lang == "en-US" ? "Calibration success" : "校准指令已被设备接收并执行",
|
||||
_lang == "en-US" ? "Calibration timeout" : "校准执行超时,状态异常",
|
||||
_lang == "en-US" ? "Calibration executed" : "校准指令执行成功");
|
||||
}
|
||||
|
||||
private async void Button_Click_13(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await WriteCoilWithCheck(
|
||||
coilAddress: _PressCheckAddress,
|
||||
value: true,
|
||||
successMsg: "校准指令已被设备接收并执行(二次验证通过)",
|
||||
failMsg: "校准执行超时,状态异常",
|
||||
logMsg: "校准指令执行成功"
|
||||
);
|
||||
await WriteCoilWithCheck(_PressCheckAddress, true,
|
||||
_lang == "en-US" ? "Calibration success" : "校准指令已被设备接收并执行",
|
||||
_lang == "en-US" ? "Calibration timeout" : "校准执行超时,状态异常",
|
||||
_lang == "en-US" ? "Calibration executed" : "校准指令执行成功");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 写入线圈并验证状态
|
||||
/// </summary>
|
||||
private async Task WriteCoilWithCheck(
|
||||
ushort coilAddress,
|
||||
bool value,
|
||||
string successMsg,
|
||||
string failMsg,
|
||||
string logMsg)
|
||||
{
|
||||
if (!IsModbusConnected())
|
||||
{
|
||||
ShowError("Modbus TCP 未连接");
|
||||
return;
|
||||
}
|
||||
|
||||
private async Task WriteCoilWithCheck(ushort coil, bool val, string ok, string err, string log)
|
||||
{
|
||||
if (!IsModbusConnected()) { ShowError(_lang == "en-US" ? "Modbus TCP not connected" : "Modbus TCP 未连接"); return; }
|
||||
try
|
||||
{
|
||||
// 写入线圈
|
||||
await Task.Run(() =>
|
||||
_modbusMaster.WriteSingleCoilAsync(0x01, coilAddress, value)
|
||||
);
|
||||
await Task.Run(() => _modbusMaster.WriteSingleCoilAsync(0x01, coil, val));
|
||||
Thread.Sleep(200);
|
||||
if (failMsg != null && (failMsg.Contains("停止") || failMsg.Contains("校准")))
|
||||
{
|
||||
// 写入线圈
|
||||
await Task.Run(() =>
|
||||
_modbusMaster.WriteSingleCoilAsync(0x01, coilAddress, false)
|
||||
);
|
||||
}
|
||||
|
||||
if (err.Contains("Calib") || err.Contains("校准")) await Task.Run(() => _modbusMaster.WriteSingleCoilAsync(0x01, coil, false));
|
||||
Thread.Sleep(100);
|
||||
|
||||
|
||||
// 等待并验证
|
||||
await Task.Delay(500);
|
||||
bool[] status = await _modbusMaster?.ReadCoilsAsync(0x01, coilAddress, 1);
|
||||
|
||||
|
||||
if (failMsg != null && !failMsg.Contains("停止") && !failMsg.Contains("校准"))
|
||||
{
|
||||
if (status[0] == value)
|
||||
{
|
||||
// 写入日志
|
||||
WriteLog($"{logMsg} - 地址:{coilAddress},状态:{value}");
|
||||
if (!string.IsNullOrEmpty(successMsg))
|
||||
{
|
||||
ShowSuccess(successMsg);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowError(failMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError($"通信错误: {ex.Message}");
|
||||
bool[] status = await _modbusMaster?.ReadCoilsAsync(0x01, coil, 1);
|
||||
if (status != null && status[0] == val) { WriteLog(log); ShowSuccess(ok); }
|
||||
else ShowError(err);
|
||||
}
|
||||
catch (Exception ex) { ShowError(_lang == "en-US" ? $"Communication error: {ex.Message}" : $"通信错误: {ex.Message}"); }
|
||||
}
|
||||
|
||||
|
||||
@@ -922,31 +799,7 @@ namespace ShanghaiEnvironmentalTechnology
|
||||
}
|
||||
|
||||
|
||||
//public void Hertbean()
|
||||
//{
|
||||
// while (true)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// if (!IsModbusConnected())
|
||||
// { // 断线检测
|
||||
// string plcIp = ConfigurationManager.AppSettings["PLC2_IP"];
|
||||
// int plcPort = int.Parse(ConfigurationManager.AppSettings["PLC2_Port"]);
|
||||
|
||||
// _tcpClient = new TcpClient(plcIp, plcPort);
|
||||
// _modbusMaster = ModbusIpMaster.CreateIp(_tcpClient);
|
||||
// }
|
||||
// // 执行读写操作(如 master.ReadHoldingRegisters )
|
||||
// Thread.Sleep(100); // 控制采集频率
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Console.WriteLine($"断线/异常: {ex.Message},尝试重连...");
|
||||
// _tcpClient.Close(); // 清理旧连接
|
||||
// Thread.Sleep(1000); // 间隔重连
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
private async void Button_Click_14(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user