using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using Mesnac.Controls.Base; using System; using Mesnac.Controls.Default; using System.Drawing.Design; using System.Collections; using System.Windows.Forms; using System.ComponentModel.Design; using System.Globalization; using Mesnac.Basic; using Mesnac.Codd.Session; using System.Data; using System.Text; using Mesnac.Compressor.Entity; using System.Threading; using System.Reflection; using Mesnac.Compressor.Station; using PLCManager; using System.IO; namespace Mesnac.Controls.Compressor { [ToolboxBitmap(typeof(System.Windows.Forms.TextBox))] public partial class MachineButton : Mesnac.Controls.Default.TextBox, IPurviewControl { private List _clickActionList = new List(); private List _keyDownActionList = new List(); private List _keyUpActionList = new List(); private bool _mcVisible = true; //保存可见性 private bool _mcEnabled = true; //保存可用性 private bool _isValid = true; //保存有效性 private object _mcvalue; public event EventHandler ReshreshStationData; public MachineButton() { InitializeComponent(); this.ReadOnly = true; this.Multiline = true; this.Size = new Size(150,150); this.BackColor = Color.LightCyan; SetDefautText(); } public MachineButton(IContainer container) { container.Add(this); InitializeComponent(); } public List ClickActionList { get { return this._clickActionList; } set { this._clickActionList = value; } } public List KeyDownActionList { get { return _keyDownActionList; } set { _keyDownActionList = value; } } public List KeyUpActionList { get { return _keyUpActionList; } set { _keyUpActionList = value; } } //业务 public string MCKey { get; set; } /// /// 机台号 /// public string MCMachine { get; set; } private MachineInfo machine; public MachineInfo Machine { get { if (machine == null) { InitMachineInfo(); } return machine; } } public object MCValue { get { return _mcvalue; } set { if (value == null) return; object[] objectarray; if (!TryObject(value, out objectarray)) { return; } _mcvalue = value; DataFormat(objectarray); SetText(); } } private void InitMachineInfo() { if (string.IsNullOrEmpty(MCMachine)) { return; } DbHelper dbHelper = DataSourceFactory.Instance.GetDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Server); try { if (dbHelper == null) { return ; } dbHelper.ClearParameter(); dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = ""; string sql = "Exec SP_Pro_getMachine @MachineID"; dbHelper.AddParameter("@MachineID", MCMachine); dbHelper.CommandText = sql; DataSet ds = (DataSet)dbHelper.ToDataSet(); GetInfoName(ds); } catch (Exception e) { ICSharpCode.Core.LoggingService.Error("网络服务器请求失败"); return ; } } private void GetInfoName(DataSet ds) { machine = new MachineInfo(); //机台表 try { DataTable dt = ds.Tables[0]; if (dt != null && dt.Rows.Count > 0) { machine.MachineID = dt.Rows[0]["ID"].ToString(); machine.MachineName = dt.Rows[0]["machinename"].ToString(); } } catch { } //工位表 DataTable dt2 = ds.Tables[1]; try { if (dt2 != null && dt2.Rows.Count > 0) { ///工位一参数 machine.StationOne.stationID = dt2.Rows[0]["StationID"].ToString(); machine.StationOne.StationName = dt2.Rows[0]["StationName"].ToString(); machine.StationOne.TableName = dt2.Rows[0]["TableName"].ToString(); machine.StationOne.ParaCount = Convert.ToInt32(dt2.Rows[0]["paraCount"]); machine.StationOne.StationType = dt2.Rows[0]["Type_Class"].ToString(); machine.StationOne.PLCName = dt2.Rows[0]["PLCName"].ToString(); machine.StationOne.PLCBlock = Convert.ToInt32(dt2.Rows[0]["PLCBlock"]); machine.StationOne.NGTakeStation = Convert.ToInt32(dt2.Rows[0]["IsNGStation"])>0; } } catch(Exception e) { } try { //工位二参数 if (dt2 != null && dt2.Rows.Count > 1) { machine.StationTwo.stationID = dt2.Rows[1]["StationID"].ToString(); machine.StationTwo.StationName = dt2.Rows[1]["StationName"].ToString(); machine.StationTwo.TableName = dt2.Rows[1]["TableName"].ToString(); machine.StationTwo.ParaCount = Convert.ToInt32(dt2.Rows[1]["paraCount"]); machine.StationTwo.StationType = dt2.Rows[1]["Type_Class"].ToString(); machine.StationOne.PLCName = dt2.Rows[0]["PLCName"].ToString(); machine.StationOne.PLCBlock = Convert.ToInt32(dt2.Rows[0]["PLCBlock"]); machine.StationOne.NGTakeStation = Convert.ToInt32(dt2.Rows[0]["IsNGStation"]) > 0; } } catch(Exception e) { } } public void OnRerefreshData() { //这里怎么弄,需要给plc这个位置置0或1 肯定需要 if (machine.StationOne.Data.NewFlag ) { ResetPLCState(StationOneAdrress); ThreadPool.QueueUserWorkItem(new WaitCallback(SaveStationdata), machine.StationOne); } if(machine.StationTwo.Data.NewFlag) { ResetPLCState(StationTwoAddress); ThreadPool.QueueUserWorkItem(new WaitCallback(SaveStationdata), machine.StationTwo); } if (ReshreshStationData != null) { ReshreshStationData(machine,null); } } private void ResetPLCState(string EquipKey) { object[] data=floatToObject(1); PlcData.Instance.PlcWriteByEquipKey(EquipKey, 4, data); } public void SaveStationdata(object o) { var station = o as StationInfo; if (station == null) { return; } #region 生成动态处理类 string stationType = station.StationType; //根据类型,动态生成业务类 Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集 string AssemName = "Mesnac.Compressor.Station." + stationType; var obj = assembly.CreateInstance(AssemName, true); var stationManager = obj as IStation; //if (stationManager == null) //{ // return; //} #endregion stationManager = ReflectClass(stationType); stationManager.HandleData(station); } private object _stationone; public stationPara station1para { get; set; } private int time = 0; /// /// /// public object StationOne { get { return _stationone; } set { if (value == null) return; Console.WriteLine("读取第"+time.ToString()+"次 时间:"+DateTime.Now.ToString()); time++; object[] objectarray; if (!TryObject(value, out objectarray)) { return; } _stationone = value; machine.StationOne.Data = ParaFormart(objectarray, machine.StationOne.ParaCount); OnRerefreshData(); } } public string StationOneAdrress { get; set; } public string StationTwoAddress { get; set; } public stationPara station2para { get; set; } private object _stationtwo = null; /// /// /// public object StationTwo { get { return _mcvalue; } set { if (value == null) return; object[] objectarray; if (!TryObject(value, out objectarray)) { return; } _mcvalue = value; machine.StationTwo.Data = ParaFormart(objectarray, machine.StationTwo.ParaCount); //OnRerefreshData(); } } /// /// 单工位数据解析 /// /// /// public stationPara ParaFormart(object [] obj,int paraCount) { stationPara sinfo = new stationPara(); int index = 0; int istate=ConvertToInt(obj, index); sinfo.state = stateString(istate); index += 2; sinfo.data = ConvertToString(obj, index); //数据保存区 index += 2; //sinfo.NewFlag = ConvertToInt(obj, index); index += 2; sinfo.ProductOkNg = ConvertToInt(obj, index); index += 2; sinfo.RFIDNo = "123456789012345678901234"; index += 2; sinfo.productDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); index += 4; sinfo.ProductBarcode = "44555666777888999000"; index += 90; for (int i = 0; i < paraCount; i++) { dataUnite du = new dataUnite(); du.actValue = ConvertToString(obj, index); du.MaxValue = ConvertToString(obj, index+2); du.MinValue = ConvertToString(obj, index + 4); du.result = ConvertToInt(obj, index+6); du.Remark = ConvertToString(obj, index + 8); index += 8; sinfo.SavedataList.Add(du); } return sinfo; } private string ConvertToString(object[] obj, int index) { float data = convertTofloat(obj, index); return data.ToString("F2"); } private int ConvertToInt(object[] obj, int index) { try { float fstate = convertTofloat(obj, index); return Convert.ToInt32(fstate); } catch { return 0; } } private string stateString(int state) { switch (state) { case 0: return "停止"; case 1: return "手动"; case 2: return "自动"; default: return "未知"; } } public void DataFormat(object[] obj) { int state=ConvertToInt(obj,0); this.State = stateString(state); float quality = convertTofloat(obj, 2); this.productCount = Convert.ToInt32(quality).ToString(); } /// /// 如果是数组获取第一个字的值,如果是object获取Int值 /// /// /// private int GetValue(object ob) { //bool isArry = false; int IntValue = 0; try { object[] value = (object[])ob; IntValue = Convert.ToInt32(value[0]); } catch { IntValue = Convert.ToInt32(ob); } return IntValue; } private string _machinename=""; public string MachineName { get { return _machinename; } set { _machinename = value; } } private string _state = ""; public string State { get { return _state; } set { _state = value; } } private string _productCount = ""; public string productCount { get { return _productCount; } set { _productCount = value; } } public void SetText() { try { string txt = "机台名称:" + Machine.MachineName + "\r\n"; txt += "机台状态:" + State + "\r\n"; txt += "生产数量:" + productCount; this.Text = txt; } catch { } } private void SetDefautText() { string txt = "工位名称:\r\n"; txt += "工位状态:未知\r\n"; txt += "生产数量:0"; this.Text = txt; } public IBaseControl MCRoot { get { return null; } set { ; } } #region 数据库的屏蔽,现在用不着 [TypeConverter(typeof(DataSourceConverter))] [Description("数据连接"), Category("Data")] public string MCDataSourceID { get; set; } public MCDataSource MCDataSource { get; set; } [Description("是否为数据库控件"), Category("Data")] public bool IsDbControl { get; set; } [Description("初始化SQL"), Category("Data")] public string InitDataSource { get; set; } [Description("执行SQL"), Category("Data")] public string ActionDataSource { get; set; } [Description("绑定数据源"), Category("Data")] public object BindDataSource { get; set; } [Description("操作类型"), Category("Data")] public DbOptionTypes DbOptionType { get; set; } #endregion [Description("是否可见"), Category("Behavior")] public bool MCVisible { get { return this._mcVisible; } set { this._mcVisible = value == null ? true : value; if (this.Site.DesignMode) { this.Visible = true; } else { this.Visible = this._mcVisible; } } } [Description("是否可用"), Category("Behavior")] public bool MCEnabled { get { return this._mcEnabled; } set { this._mcEnabled = value == null ? true : value; if (this.Site.DesignMode) { this.Enabled = true; } else { this.Enabled = this._mcEnabled; } } } [Description("是否控制权限"), Category("Behavior")] public bool MCPurview { get; set; } public bool IsValid { get { return _isValid; } set { _isValid = value; } } private float convertTofloat(object[] buff,int startIndex) { try { int b = Convert.ToInt32(buff[startIndex]); int a = Convert.ToInt32(buff[startIndex + 1]); byte[] low = System.BitConverter.GetBytes(b); byte[] high = System.BitConverter.GetBytes(a); byte[] abc = new byte[4]; for (int i = 0; i < 2; i++) { abc[i] = low[i]; } for (int i = 0; i < 2; i++) { abc[i + 2] = high[i]; } return BitConverter.ToSingle(abc, 0); } catch { return -1; } } public Object[] floatToObject(float ff) { //正负符号,默认为0 byte flag = 0; if (ff < 0) { flag = 128; ff = ff * -1; } byte[] floatByte = BitConverter.GetBytes(ff); byte[] lowhByte = new byte[4]; lowhByte[0] = floatByte[0]; lowhByte[1] = floatByte[1]; lowhByte[2] = 0; lowhByte[3] = 0; byte[] highByte = new byte[4]; highByte[0] = floatByte[2]; highByte[1] = floatByte[3]; highByte[2] = 0; highByte[3] = 0; highByte[1] = (byte)(highByte[1] + flag); UInt32 low = BitConverter.ToUInt32(lowhByte, 0); int high = BitConverter.ToInt16(highByte, 0); object[] buff = new object[2]; buff[0] = low; buff[1] = high; return buff; } private bool TryObject(object value, out object[] arry) { arry = null; try { arry = (object[])value; return true; } catch { return false; } } private IStation ReflectClass(string Name) { string thisPath = this.GetType().Assembly.Location; string assPath = (new FileInfo(thisPath)).Directory + "\\Mesnac.Compressor.Station"; //string dllName = "Mesnac.Compressor.Station"; string path = assPath + ".dll"; string className = "Mesnac.Compressor.Station."+Name; if (!File.Exists(path)) { return null; } Assembly ass = Assembly.LoadFile(path); if (ass == null) { return null; } var classname=ass.CreateInstance(className,true); Type type = ass.GetType(className); if (type == null) { return null; } IStation to = (IStation)Activator.CreateInstance(type); return to; } private void batchFeeder1_Load(object sender, EventArgs e) { } } }