boardtest/ControlcBoardsTest/MainWindow.xaml.cs
2025-03-05 11:21:04 +08:00

525 lines
21 KiB
C#

using Modbus.Device;
using System;
using System.IO.Ports;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace ControlcBoardsTest
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
this.Closing += MainWindow_Closing;
}
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//停止通道
for (int i = 0; i < 24; i++)
{
ModbusHelper.WriteSingleCoil(stationNo, (ushort)i, false);
}
ModbusHelper.WriteSingleCoil(stationNo, 16, false);
ModbusHelper.WriteSingleCoil(stationNo, 18, false);
ModbusHelper.WriteSingleCoil(stationNo, 20, false);
ModbusHelper.WriteSingleCoil(stationNo, 22, false);
ModbusHelper.WriteSingleCoil(stationNo, 17, false);
ModbusHelper.WriteSingleCoil(stationNo, 19, false);
ModbusHelper.WriteSingleCoil(stationNo, 21, false);
ModbusHelper.WriteSingleCoil(stationNo, 23, false);
ModbusHelper.master.Close();
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
foreach (var item in SerialPort.GetPortNames())
{
com_port.Items.Add(item);
if (com_port.Items.Count > 0)
com_port.SelectedIndex = 0;
}
}
private byte stationNo;
private void connButton_Click(object sender, RoutedEventArgs e)
{
//打开串口
if (!ModbusHelper.master.IsOpen())
{
//创建ModbusRTU主站实例
ModbusHelper.master.SerialPortInni(serialPort =>
{
//设定串口参数
serialPort.PortName = com_port.SelectedItem.ToString();
serialPort.BaudRate = Convert.ToInt32(txt_baudRate.Text.ToString());
serialPort.Parity = 0;
serialPort.DataBits = Convert.ToInt32(txt_sataBits.Text.ToString());
serialPort.StopBits = ModbusHelper.GetSelectedStopBits(Convert.ToDouble(txt_stopBits.Text.ToString()));
stationNo = Convert.ToByte(txt_stationNo.Text);
});
ModbusHelper.master.Open();
if (ModbusHelper.master.IsOpen())
{
btn_conn.Content = "断开";
for (int i = 0; i < 24; i++)
{
ModbusHelper.WriteSingleCoil(stationNo, (ushort)i, false);
Thread.Sleep(100);
}
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 0, 24);
foreach (var item in warp_channel.Children)
{
if (item is Button)
{
var c = (Button)item;
c.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(c.Tag)] ? Colors.Green : Colors.Red);
}
}
btn_ElectricMotor1Front.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(16)] ? Colors.Green : Colors.Red);
btn_ElectricMotor1Back.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(17)] ? Colors.Green : Colors.Red);
btn_ElectricMotor2Front.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(18)] ? Colors.Green : Colors.Red);
btn_ElectricMotor2Back.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(19)] ? Colors.Green : Colors.Red);
btn_ElectricMotor3Front.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(20)] ? Colors.Green : Colors.Red);
btn_ElectricMotor3Back.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(21)] ? Colors.Green : Colors.Red);
btn_ElectricMotor4Front.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(22)] ? Colors.Green : Colors.Red);
btn_ElectricMotor4Back.Background = new SolidColorBrush(CoilsRes[Convert.ToUInt16(23)] ? Colors.Green : Colors.Red);
}
else
{
btn_conn.Content = "连接";
}
}
else
{
ModbusHelper.master.Close();
if (ModbusHelper.master.IsOpen())
{
btn_conn.Content = "断开";
}
else
{
btn_conn.Content = "连接";
}
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
//读取当前状态
DateTime dt = DateTime.Now;
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, Convert.ToUInt16(btn.Tag), 1);
Console.WriteLine("=================="+DateTime.Now.Subtract(dt).TotalMilliseconds);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, Convert.ToUInt16(btn.Tag), !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, Convert.ToUInt16(btn.Tag), 1);
btn.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机1正传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_1(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 17, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 16, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 16, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 16, 1);
btn_ElectricMotor1Front.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机1反传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_2(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 16, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 17, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 17, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 17, 1);
btn_ElectricMotor1Back.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机2正传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_3(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 19, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 18, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 18, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 18, 1);
btn_ElectricMotor2Front.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机2反传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_4(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 18, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 19, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 19, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 19, 1);
btn_ElectricMotor2Back.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机3正传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_5(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 21, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 20, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 20, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 20, 1);
btn_ElectricMotor3Front.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机3反传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_6(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 20, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 21, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 21, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 21, 1);
btn_ElectricMotor3Back.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机4正传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_7(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 23, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 22, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 22, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 22, 1);
btn_ElectricMotor4Front.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 电机4反传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_8(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleCoil(stationNo, 22, false);
Thread.Sleep(100);
//读取当前状态
var CoilsResBefor = ModbusHelper.ReadCoils(stationNo, 23, 1);
Thread.Sleep(100);
//写入线圈
ModbusHelper.WriteSingleCoil(stationNo, 23, !CoilsResBefor[0]);
Thread.Sleep(100);
//读取写入后状态
var CoilsRes = ModbusHelper.ReadCoils(stationNo, 23, 1);
btn_ElectricMotor4Back.Background = new SolidColorBrush(CoilsRes[0] ? Colors.Green : Colors.Red);
}
/// <summary>
/// 通道1速度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_9(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleRegister(stationNo, 23, Convert.ToUInt16(txt_channel1Speed.Text));
Thread.Sleep(100);
var res = ModbusHelper.ReadHoldingRegisters(stationNo, 23, 1);
txt_channel1Speed.Text = res[0].ToString();
}
/// <summary>
/// 通道2速度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_10(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleRegister(stationNo, 27, Convert.ToUInt16(txt_channel2Speed.Text));
Thread.Sleep(100);
var res = ModbusHelper.ReadHoldingRegisters(stationNo, 27, 1);
txt_channel2Speed.Text = res[0].ToString();
}
/// <summary>
/// 通道3速度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_11(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleRegister(stationNo, 31, Convert.ToUInt16(txt_channel3Speed.Text));
Thread.Sleep(100);
var res = ModbusHelper.ReadHoldingRegisters(stationNo, 31, 1);
txt_channel3Speed.Text = res[0].ToString();
}
/// <summary>
/// 通道4速度
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_12(object sender, RoutedEventArgs e)
{
ModbusHelper.WriteSingleRegister(stationNo, 35, Convert.ToUInt16(txt_channel4Speed.Text));
Thread.Sleep(100);
var res = ModbusHelper.ReadHoldingRegisters(stationNo, 35, 1);
txt_channel4Speed.Text = res[0].ToString();
}
bool isStill = true;
Thread alwaysThread;
private void Button_Click_13(object sender, RoutedEventArgs e)
{
if (btn_always.Content.ToString() == "循环测试开始")
{
isStill = true;
btn_always.Content = "循环测试停止";
alwaysThread= new Thread(() =>
{
while (isStill)
{
for (int i = 0; i < 24; i++)
{
if (i == 17 || i == 19 || i == 21 || i == 23)
continue;
ModbusHelper.WriteSingleCoil(stationNo, (ushort)i, true);
Thread.Sleep(500);
}
Thread.Sleep(5000);
for (int i = 0; i < 24; i++)
{
ModbusHelper.WriteSingleCoil(stationNo, (ushort)i, false);
Thread.Sleep(500);
}
Thread.Sleep(5000);
}
});
alwaysThread.Start();
}
else
{
isStill = false;
btn_always.Content = "循环测试开始";
alwaysThread.Abort();
}
}
Thread FrontBackThread;
private void btn_FrontBack_Click(object sender, RoutedEventArgs e)
{
if (btn_FrontBack.Content.ToString() == "正反转测试开始")
{
isStill = true;
btn_FrontBack.Content = "正反转测试停止";
FrontBackThread= new Thread(() =>
{
while (isStill)
{
//启动通道
for (int i = 0; i < 16; i++)
{
ModbusHelper.WriteSingleCoil(stationNo, (ushort)i, true);
}
//正转测试
ModbusHelper.WriteSingleRegister(stationNo, 23, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 16,true);
ModbusHelper.WriteSingleRegister(stationNo, 23, 100);
ModbusHelper.WriteSingleRegister(stationNo, 27, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 18, true);
ModbusHelper.WriteSingleRegister(stationNo, 27, 100);
ModbusHelper.WriteSingleRegister(stationNo, 31, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 20, true);
ModbusHelper.WriteSingleRegister(stationNo, 31, 100);
ModbusHelper.WriteSingleRegister(stationNo, 35, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 22, true);
ModbusHelper.WriteSingleRegister(stationNo, 35, 100);
Thread.Sleep(2000);
//关闭正转
ModbusHelper.WriteSingleCoil(stationNo, 16, false);
ModbusHelper.WriteSingleCoil(stationNo, 18, false);
ModbusHelper.WriteSingleCoil(stationNo, 20, false);
ModbusHelper.WriteSingleCoil(stationNo, 22, false);
Thread.Sleep(1000);
//反转测试
ModbusHelper.WriteSingleRegister(stationNo, 23, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 17, true);
ModbusHelper.WriteSingleRegister(stationNo, 23, 100);
ModbusHelper.WriteSingleRegister(stationNo, 27, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 19, true);
ModbusHelper.WriteSingleRegister(stationNo, 27, 100);
ModbusHelper.WriteSingleRegister(stationNo, 31, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 21, true);
ModbusHelper.WriteSingleRegister(stationNo, 31, 100);
ModbusHelper.WriteSingleRegister(stationNo, 35, 30);
Thread.Sleep(1000);
ModbusHelper.WriteSingleCoil(stationNo, 23, true);
ModbusHelper.WriteSingleRegister(stationNo, 35, 100);
Thread.Sleep(2000);
//关闭通道
for (int i = 0; i < 16; i++)
{
ModbusHelper.WriteSingleCoil(stationNo, (ushort)i, false);
}
//关闭反转
Thread.Sleep(2000);
ModbusHelper.WriteSingleCoil(stationNo, 17, false);
ModbusHelper.WriteSingleCoil(stationNo, 19, false);
ModbusHelper.WriteSingleCoil(stationNo, 21, false);
ModbusHelper.WriteSingleCoil(stationNo, 23, false);
Thread.Sleep(1000);
}
});
FrontBackThread.Start();
}
else
{
isStill = false;
btn_FrontBack.Content = "正反转测试开始";
FrontBackThread.Abort();
//停止通道
for (int i = 0; i < 24; i++)
{
ModbusHelper.WriteSingleCoil(stationNo, (ushort)i, false);
}
ModbusHelper.WriteSingleCoil(stationNo, 16, false);
ModbusHelper.WriteSingleCoil(stationNo, 18, false);
ModbusHelper.WriteSingleCoil(stationNo, 20, false);
ModbusHelper.WriteSingleCoil(stationNo, 22, false);
ModbusHelper.WriteSingleCoil(stationNo, 17, false);
ModbusHelper.WriteSingleCoil(stationNo, 19, false);
ModbusHelper.WriteSingleCoil(stationNo, 21, false);
ModbusHelper.WriteSingleCoil(stationNo, 23, false);
}
}
}
}