using Modbus.Device; using Sunny.UI; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Resources; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace 鞋子止滑性能测试仪 { public partial class Form_Form : UIForm { Modbus_connect mc_PLC; IModbusSerialMaster master_PLC; SerialPort sp_PLC; Modbus_connect mc_ADC; IModbusSerialMaster master_ADC; SerialPort sp_ADC; Data_Change dc=new Data_Change(); Thread thread_ADC_Read; Thread thread_PLC_Read; Thread thread_RefshUI; public static string zhengyali_jiaozhunzhi; public static string zhengyali_xishu; public static string moca_1_jiaozhunzhi; public static string moca_1_xishu; public static string moca_2_jiaozhunzhi; public static string moca_2_xishu; float moca_agv;//摩擦力 public Form_Form() { InitializeComponent(); mc_PLC = new Modbus_connect("COM7", 115200); mc_ADC = new Modbus_connect("COM8", 115200); master_PLC = mc_PLC.GetModbusMaster(); master_ADC = mc_ADC.GetModbusMaster(); sp_PLC = mc_PLC.GetSerialPort(); sp_ADC = mc_ADC.GetSerialPort(); //获取配置文件中的配置 zhengyali_jiaozhunzhi = ConfigurationManager.AppSettings["正压力校准值"].ToString(); zhengyali_xishu = ConfigurationManager.AppSettings["正压力校准系数"].ToString(); moca_1_jiaozhunzhi = ConfigurationManager.AppSettings["摩擦1校准值"].ToString(); moca_1_xishu = ConfigurationManager.AppSettings["摩擦1校准系数"].ToString(); moca_2_jiaozhunzhi = ConfigurationManager.AppSettings["摩擦2校准值"].ToString(); moca_2_xishu = ConfigurationManager.AppSettings["摩擦2校准系数"].ToString(); //启动线程 thread_ADC_Read = new Thread(new ThreadStart(Read_ADC_Data)); thread_PLC_Read = new Thread(new ThreadStart(Read_PLC_Data)); thread_RefshUI = new Thread(new ThreadStart(RefshUI)); thread_ADC_Read.IsBackground = true; thread_PLC_Read.IsBackground = true; thread_RefshUI.IsBackground = true; thread_ADC_Read.Start(); thread_PLC_Read.Start(); thread_RefshUI.Start(); this.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width; this.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height; } ushort[] data_ADC_Read = new ushort[10]; float ADC_Value_1 = 0; float ADC_Value_2=0; float ADC_Value_3=0; private void Read_ADC_Data() { // string erro; while (true) { try { data_ADC_Read = master_ADC.ReadHoldingRegisters(1, 0, 8); ADC_Value_3 = dc.Change_ADC_ToFloat(dc.UshortToInt1(data_ADC_Read[0], data_ADC_Read[1]),zhengyali_jiaozhunzhi.ToInt() , zhengyali_xishu.ToFloat()); ADC_Value_1 = dc.Change_ADC_ToFloat(dc.UshortToInt1(data_ADC_Read[6], data_ADC_Read[7]), moca_1_jiaozhunzhi.ToInt(), moca_2_xishu.ToFloat()); ADC_Value_2 = dc.Change_ADC_ToFloat(dc.UshortToInt1(data_ADC_Read[2], data_ADC_Read[3]), moca_2_jiaozhunzhi.ToInt(), moca_1_xishu.ToFloat()); zhengyali_xishu.ToFloat(); moca_agv = (ADC_Value_1 + ADC_Value_2)*(-1.0F); Thread.Sleep(10); } catch { // erro = ex.Message; // goto 退出; } } // 退出: // MessageBox.Show("读取ADC数据失败!"+erro); } ushort[] data_PLC_Read = new ushort[10]; bool[] bools_Read = new bool[10]; float PLC_Value_weiyi = 0; private void Read_PLC_Data() { while (true) { try { //读取PLC数据 data_PLC_Read = master_PLC.ReadHoldingRegisters(1, 402, 2); bools_Read = master_PLC.ReadCoils(1,81,10); PLC_Value_weiyi = dc.UshortToFloat(data_PLC_Read[1], data_PLC_Read[0]); } catch { } } } private void RefshUI() { while (true) { if (this.IsHandleCreated) { this.Invoke(new Action(() => { lb_mocali.Text = moca_agv.ToString("F2"); lb_zhengyali.Text = ADC_Value_3.ToString("F2"); if (bools_Read[0]) { btn_ceshi.Text = "停止"; btn_ceshi.FillColor = Color.Red; } else { btn_ceshi.Text = "测试"; btn_ceshi.FillColor = Color.FromArgb(80, 160, 255); } if (bools_Read[9]) { btn_fuwei.Text = "复位中"; btn_fuwei.FillColor = Color.Red; } else { btn_fuwei.Text = "复位"; btn_fuwei.FillColor = Color.FromArgb(80, 160, 255); } })); Thread.Sleep(10); } } } private void btn_fuwei_Click(object sender, EventArgs e) { try { master_PLC.WriteSingleCoil(1,90,true); master_PLC.WriteSingleCoil(1, 90, false); } catch { MessageBox.Show("写入失败!"); } } private void Form_Form_FormClosing(object sender, FormClosingEventArgs e) { if (sp_ADC.IsOpen) sp_ADC.Close(); if (sp_PLC.IsOpen) sp_PLC.Close(); thread_ADC_Read?.Abort(); thread_PLC_Read?.Abort(); thread_RefshUI?.Abort(); master_ADC?.Dispose(); master_PLC?.Dispose(); } float count = 0; List value_X=new List() { }; List value_Y1 = new List() { }; List value_Y2 = new List() { }; List value_Y3 = new List() { }; List value_Y4 = new List() { }; Random rd = new Random(); private void timer1_Tick(object sender, EventArgs e) { if (bools_Read[0]) { value_X.Add(count.ToString("F2")); value_Y1.Add(ADC_Value_3); value_Y2.Add(moca_agv); value_Y3.Add(PLC_Value_weiyi); if (ADC_Value_3 != 0) { value_Y4.Add(moca_agv / ADC_Value_3); } else { value_Y4.Add(0); } count += 0.01f; } } private void btn_huitu_Click(object sender, EventArgs e) { try { chart1.Series[0].Points.DataBindXY(value_X, value_Y1); chart1.Series[1].Points.DataBindXY(value_X, value_Y2); chart1.Series[2].Points.DataBindXY(value_X, value_Y3); chart1.Series[3].Points.DataBindXY(value_X, value_Y4); } catch (Exception EX) { MessageBox.Show(EX.Message); } } private void btn_zhengjiaozhun_Click(object sender, EventArgs e) { dc.ChangeData("正压力校准值", dc.UshortToInt1(data_ADC_Read[0], data_ADC_Read[1]).ToString()); zhengyali_jiaozhunzhi = ConfigurationManager.AppSettings["正压力校准值"].ToString(); } private void btn_mocajiaozhun_Click(object sender, EventArgs e) { dc.ChangeData("摩擦1校准值", dc.UshortToInt1(data_ADC_Read[2], data_ADC_Read[3]).ToString()); dc.ChangeData("摩擦2校准值", dc.UshortToInt1(data_ADC_Read[6], data_ADC_Read[7]).ToString()); moca_1_jiaozhunzhi = ConfigurationManager.AppSettings["摩擦1校准值"].ToString(); moca_2_jiaozhunzhi = ConfigurationManager.AppSettings["摩擦2校准值"].ToString(); } private void btn_ceshi_Click(object sender, EventArgs e) { try { if (bools_Read[0]) { master_PLC.WriteSingleCoil(1, 83, true); master_PLC.WriteSingleCoil(1, 83, false); } else { master_PLC.WriteSingleCoil(1, 80, true); master_PLC.WriteSingleCoil(1, 80, false); value_X.Clear(); value_Y1.Clear(); value_Y2.Clear(); value_Y3.Clear(); value_Y4.Clear(); count = 0.0F; } } catch { MessageBox.Show("写入失败!"); } } private void btn_setting_Click(object sender, EventArgs e) { Form_Setting frm_set = new Form_Setting(mc_PLC); frm_set.ShowDialog(); } private void btn_daochu_Click(object sender, EventArgs e) { dc.ExportDataTableToExcel(value_X,value_Y1, value_Y2, value_Y3, value_Y4); } } }