winform空压机控制流程(学习笔记)
1.自定义控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MS_UI
{
/// <summary>
/// 冷却泵
/// </summary>
public partial class LQB : UserControl
{
public LQB()
{
InitializeComponent();
mytimer = new Timer();
mytimer.Interval = 10;
mytimer.Tick += Mytimer_Tick;
mytimer.Enabled = true;
}
private void Mytimer_Tick(object sender, EventArgs e)
{
if (this.DeviceStateName != null)
{
if (CommonMethods.CurrentValue != null && CommonMethods.CurrentValue.ContainsKey(DeviceStateName))
{
Start = CommonMethods.CurrentValue[DeviceStateName] == "1" ? true : false;
}
}
if (Start)
{
if (this.index < this.indexMax)
{
this.index++;
}
else
{
this.index = 0;
}
}
this.change();
}
private void change()
{
switch (this.index)
{
case 0: this.MainPic.Image = Properties.Resources._1; break;
case 1: this.MainPic.Image = Properties.Resources._2; break;
case 2: this.MainPic.Image = Properties.Resources._3; break;
case 3: this.MainPic.Image = Properties.Resources._4; break;
case 4: this.MainPic.Image = Properties.Resources._5; break;
case 5: this.MainPic.Image = Properties.Resources._6; break;
case 6: this.MainPic.Image = Properties.Resources._7; break;
case 7: this.MainPic.Image = Properties.Resources._8; break;
case 8: this.MainPic.Image = Properties.Resources._9; break;
case 9: this.MainPic.Image = Properties.Resources._10; break;
case 10: this.MainPic.Image = Properties.Resources._11; break;
default: this.MainPic.Image = Properties.Resources._1; break;
}
}
//当前选择的图片序号
private int index;
//定义一个定时器
private Timer mytimer;
//定义定时器的时间间隔
private int interval = 10;
/// <summary>
/// 定义设备状态变量
/// </summary>
public string DeviceStateName { get; set; }
/// <summary>
/// 定义设备启动变量
/// </summary>
public string DeviceStartName { get; set; }
/// <summary>
/// 定义设备停止变量
/// </summary>
public string DeviceStopName { get; set; }
/// <summary>
/// 定义设备名称
/// </summary>
public string DeviceName { get; set; }
public int Interval
{
get { return mytimer.Interval; }
set
{
if (value != mytimer.Interval)
{
mytimer.Interval = value;
}
}
}
//定义控件的转动属性
private bool start = false;
public bool Start
{
get { return start; }
set { start = value; }
}
//最大图片数目
private int indexMax = 11;
public int IndexMax
{
get { return indexMax; }
set { indexMax = value; }
}
public delegate void PumpClickDelegate(object sender, EventArgs e);
public event PumpClickDelegate UserControlClick;
//自定义控件的双击事件
private void MainPic_DoubleClick(object sender, EventArgs e)
{
if (UserControlClick != null)
{
UserControlClick(this, new EventArgs());//把自身传入
}
}
}
}
2,主程序运行的时候读取配置信息,把这两个通过键值对的方式储存
private void InitialTxt()
{
//第一步:通讯接口信息
CommonMethods.objModbusEntity = CommonMethods.GetConfigInfo(FilePath + "Modbus.ini");
//第二步:变量集合信息
CommonMethods.VarModbusList = CommonMethods.LoadXML(FilePath + "Variable_Modbus.xml");
//第三部:存储区域集合
CommonMethods.StoreAreaList = CommonMethods.LoadStoreAreaXML(FilePath + "StoreArea.xml");
//第四步:报警变量集合
CommonMethods.VarAlarmModbusList = CommonMethods.LoadAlarmXML(FilePath + "VarAlarm_Modbus.xml");
//第五步:其他初始化
foreach (Variable_Modbus item in CommonMethods.VarModbusList)
{
if (!CommonMethods.CurrentValue.ContainsKey(item.VarName))//如果不包含
{
CommonMethods.CurrentValue.Add(item.VarName, "");//新加一个键值对
CommonMethods.CurrentVarAddress.Add(item.VarName, item.Address);
}
if (item.StoreArea == "01 Coil Status(0x)")
{
objComm.List_0x.Add(item);
}
if (item.StoreArea == "02 Input Status(1x)")
{
objComm.List_1x.Add(item);
}
if (item.StoreArea == "03 Holding Register(4x)")
{
objComm.List_4x.Add(item);
}
if (item.StoreArea == "04 Input Register(3x)")
{
objComm.List_3x.Add(item);
}
if (item.IsFiling == "1")//如果要归档
{
CommonMethods.FileVarModbusList.Add(item);
CommonMethods.CurrentVarNote.Add(item.VarName, item.Note);
CommonMethods.FileVarNameList.Add(item.Note);
}
if (item.IsReport == "1")//如果要参与报表
{
CommonMethods.ReportVarModbusList.Add(item);
}
}
}

3,在控制的窗口添加自定义控件,自定义的控件 开始和停止 的名称和上面 变量的名称一致

3.1 在控制的窗口代码添加方法
private void Device_DoubleClick(object sender, EventArgs e)
{
string DeviceName = string.Empty;
string StartAddress = string.Empty;
string StopAddress = string.Empty;
string DeviceStartName = string.Empty;
string DeviceStopName = string.Empty;
//设备判断
if (sender is LQB)//如果是冷却泵
{
LQB item = (LQB)sender;
DeviceName = item.DeviceName;//获取 冷却泵 控件的属性值
DeviceStartName = item.DeviceStartName;
DeviceStopName = item.DeviceStopName;
}
else if ( sender is Tap)//如果是冷却泵
{
Tap item = (Tap)sender;
DeviceName = item.DeviceName;
DeviceStartName = item.DeviceStartName;
DeviceStopName = item.DeviceStopName;
}
if (!string.IsNullOrEmpty(DeviceName) && !string.IsNullOrEmpty(DeviceStartName) &&
!string.IsNullOrEmpty(DeviceStopName))
{
//采集参数(获取开始地址和停止地址)
if (CommonMethods.CurrentVarAddress.ContainsKey(DeviceStartName))//CommonMethods.CurrentVarAddress在主窗体加载的时候传值的
{
StartAddress = CommonMethods.CurrentVarAddress[DeviceStartName];
}
if (CommonMethods.CurrentVarAddress.ContainsKey(DeviceStopName))
{
StopAddress = CommonMethods.CurrentVarAddress[DeviceStopName];
}
}
else
{
MessageBox.Show("该控件未绑定需要的属性值");
}
//调用 设备控制的 窗体
Frm_DeviceControl objFrm = new Frm_DeviceControl(DeviceName,StartAddress,StopAddress);
objFrm.ShowDialog();
}
自定义空间的事件 绑定 控制窗体中写的方法

分析上面的代码

4,控制窗体接收上面传过来的值,Modbus写入

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MS_UI
{
public partial class Frm_DeviceControl : Form
{
public Frm_DeviceControl()
{
InitializeComponent();
}
string StartAddress = string.Empty;
string StopAddress = string.Empty;
/// <summary>
/// 构造方法(通过构造方法传参)
/// </summary>
/// <param name="DeviceName"></param>
/// <param name="StartAddress">开始地址</param>
/// <param name="StopAddress">停止地址</param>
public Frm_DeviceControl(string DeviceName, string StartAddress, string StopAddress)
{
InitializeComponent();
this.StartAddress = StartAddress;
this.StopAddress = StopAddress;
this.lbl_StartName.Text = "开启" + DeviceName;
this.lbl_StopName.Text = "关闭" + DeviceName;
}
//开启按钮
private void btn_Start_Click(object sender, EventArgs e)
{
CommonMethods.IsWriting = true;//表示我现在要写数据了
Thread.Sleep(500);//防止我这边要写了,你那边还在干点什么,停止一会,让那边有足够的时间干完
bool res1 = CommonMethods.objMod.PreSetKeepReg(CommonMethods.Address, int.Parse(this.StartAddress), 256);//预值寄存器
bool res2 = CommonMethods.objMod.PreSetKeepReg(CommonMethods.Address, int.Parse(this.StartAddress), 0);//预值寄存器
if (res1 && res2)
{
MessageBox.Show(this.lbl_StartName.Text + "成功!", "设备开启");
}
else
{
MessageBox.Show(this.lbl_StartName.Text + "失败!", "设备开启");
}
CommonMethods.IsWriting = false;//写完数据之后,要设置为false,表示我没有在写数据了,不然那边就读取不了数据
}
//停止按钮
private void btn_Stop_Click(object sender, EventArgs e)
{
CommonMethods.IsWriting = true;
Thread.Sleep(500);
bool res1 = CommonMethods.objMod.PreSetKeepReg(CommonMethods.Address, int.Parse(this.StopAddress), 256);
bool res2 = CommonMethods.objMod.PreSetKeepReg(CommonMethods.Address, int.Parse(this.StopAddress), 0);
if (res1 && res2)
{
MessageBox.Show(this.lbl_StopName.Text + "成功!", "设备关闭");
}
else
{
MessageBox.Show(this.lbl_StopName.Text + "失败!", "设备关闭");
}
CommonMethods.IsWriting = false;
}
}
}

浙公网安备 33010602011771号