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 { /// /// MainWindow.xaml 的交互逻辑 /// 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); } /// /// 电机1正传 /// /// /// 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); } /// /// 电机1反传 /// /// /// 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); } /// /// 电机2正传 /// /// /// 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); } /// /// 电机2反传 /// /// /// 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); } /// /// 电机3正传 /// /// /// 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); } /// /// 电机3反传 /// /// /// 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); } /// /// 电机4正传 /// /// /// 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); } /// /// 电机4反传 /// /// /// 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); } /// /// 通道1速度 /// /// /// 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(); } /// /// 通道2速度 /// /// /// 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(); } /// /// 通道3速度 /// /// /// 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(); } /// /// 通道4速度 /// /// /// 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); } } } }