using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using FLY.FeedbackRenZiJia.OBJ_INTERFACE; using FObjBase; using System.Collections.ObjectModel; using FLY.FeedbackRenZiJia.Common; using FLY.Thick.Base.IService; using FLY.FeedbackRenZiJia.IService; namespace FLY.FeedbackRenZiJia.Client { public class FeedbackHeatServiceClient:FObj,IFeedbackHeat { IFConn mConn; UInt32 mServerID; /// /// 连接到服务器 /// public bool IsConnected { get; set; } #region IFeedbackHeat 成员 #region 参数 /// /// 自动控制使能 /// public bool IsAuto { get; set; } /// /// 加热后起效延时(s) /// public int Delay { get; set; } = 10; /// /// 检测功能使能 /// public bool HasCheck { get; set; } /// /// 检测线速度 使能 /// public bool HasCheckFilmVelocity { get; set; } /// /// 手动加热步进 /// public int Step { get; set; } = 5; #endregion #region 动态数据 private int channelcnt = 44; /// /// 通道数, 从测厚仪获取的!!!! /// public int ChannelCnt { get; protected set; } = 44; public int NBolts { get; protected set; } = 88; /// /// 保存的加热策略名称 /// public string HeatsProductName { get; protected set; } = "default"; /// /// 连接到PLC? /// public bool IsConnectedWithPLC { get; set; } /// /// 上一次加热修改时间 /// public DateTime LastChangedTime { get; set; } = DateTime.MinValue; #endregion #region 异常检测 /// /// 烧了的加热棒 /// public bool[] Bads { get; private set; } /// /// 当前风机启动中 /// public bool HasFan { get; set; } /// /// 加热棒有电流 /// public bool HasElectricity { get; set; } /// /// 当前正在检测的加热通道 /// public int CheckNo { get; set; } = -2; /// /// 正在检测中 /// public bool CheckEnable { get; set; } #endregion #endregion public FeedbackHeatServiceClient() { mServerID = OBJ_INTERFACE_ID.FEEDBACK_ID; } #region IFeedbackHeat 函数 public void Apply() { FObjSys.Current.SetValueEx( mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.SET_PARAMS, new FEEDBACK_OBJ_INTERFACE.Pack_Params() { step = Step, delay = Delay, hasCheck = HasCheck, HasCheckFilmVelocity = HasCheckFilmVelocity }.ToBytes()); } /// /// 保存当前加热量 /// /// public void SaveHeats(string productname) { FEEDBACK_OBJ_INTERFACE.Pack_String p = new FEEDBACK_OBJ_INTERFACE.Pack_String(); p.data = productname; FObjSys.Current.CallFunctionEx( mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.CALL_SAVEHEATS, p.ToBytes()); } /// /// 获取保存的加热量文件列表 返回类型为 List<string> /// /// /// public void GetHeatsFileList(AsyncCBHandler AsyncDelegate, object AsyncState) { CurrObjSys.CallFunctionEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.CALL_GETLIST, null, AsyncDelegate, AsyncState); } /// /// 删除 加热量文件 /// /// public void DelHeatsFile(string productname) { FEEDBACK_OBJ_INTERFACE.Pack_String p = new FEEDBACK_OBJ_INTERFACE.Pack_String(); p.data = productname; FObjSys.Current.CallFunctionEx( mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.CALL_DEL, p.ToBytes()); } /// /// 加载 加热量文件 /// /// public void LoadHeatsFile(string productname) { FEEDBACK_OBJ_INTERFACE.Pack_String p = new FEEDBACK_OBJ_INTERFACE.Pack_String(); p.data = productname; FObjSys.Current.CallFunctionEx( mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.CALL_LOADHEATS, p.ToBytes()); } public void SetCheckEnable(bool enable) { CheckEnable = enable; FObjSys.Current.SetValueEx( mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.SET_CHECKENABLE, new FEEDBACK_OBJ_INTERFACE.Pack_Enable() { enable = enable }.ToBytes()); } public void SetEnable(bool enable) { IsAuto = enable; FObjSys.Current.SetValueEx( mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.SET_ENABLE, new FEEDBACK_OBJ_INTERFACE.Pack_Enable() { enable = enable }.ToBytes()); } #endregion #region IFObj public override void ConnectNotify(IFConn from) { mConn = from; IsConnected = from.IsConnected; if (from.IsConnected) { FObjSys.Current.GetValueEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.GET_PARAMS); FObjSys.Current.GetValueEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.GET_STATE); FObjSys.Current.GetValueEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.GET_CHECKENABLE); FObjSys.Current.GetValueEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.GET_ENABLE); FObjSys.Current.GetValueEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.GET_ERROR); FObjSys.Current.GetValueEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.GET_PRODUCTNAME); FObjSys.Current.GetValueEx(mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.GET_UNDOIDX); FObjSys.Current.SenseConfigEx(mConn, mServerID, ID, 0xffffffff, SENSE_CONFIG.ADD); } } public override void PushGetValue(IFConn from, uint srcid, ushort memid, byte[] infodata) { switch (memid) { case FEEDBACK_OBJ_INTERFACE.GET_PARAMS: { FEEDBACK_OBJ_INTERFACE.Pack_Params p = new FEEDBACK_OBJ_INTERFACE.Pack_Params(); if (!p.TryParse(infodata)) return; Step = p.step; Delay = p.delay; HasCheck = p.hasCheck; HasCheckFilmVelocity = p.HasCheckFilmVelocity; } break; case FEEDBACK_OBJ_INTERFACE.GET_STATE: { FEEDBACK_OBJ_INTERFACE.Pack_Status p = new FEEDBACK_OBJ_INTERFACE.Pack_Status(); if (!p.TryParse(infodata)) return; IsConnectedWithPLC = p.isConnected; ChannelCnt = p.channelcnt; NBolts = p.nbolts; LastChangedTime = p.lastChangedTime; } break; case FEEDBACK_OBJ_INTERFACE.GET_CHECKENABLE: { FEEDBACK_OBJ_INTERFACE.Pack_Enable p = new FEEDBACK_OBJ_INTERFACE.Pack_Enable(); if (!p.TryParse(infodata)) return; CheckEnable = p.enable; }break; case FEEDBACK_OBJ_INTERFACE.GET_ENABLE: { FEEDBACK_OBJ_INTERFACE.Pack_Enable p = new FEEDBACK_OBJ_INTERFACE.Pack_Enable(); if (!p.TryParse(infodata)) return; IsAuto = p.enable; } break; case FEEDBACK_OBJ_INTERFACE.GET_ERROR: { FEEDBACK_OBJ_INTERFACE.Pack_Error p = new FEEDBACK_OBJ_INTERFACE.Pack_Error(); if (!p.TryParse(infodata)) return; HasFan = p.hasFan; HasElectricity = p.hasEletric; CheckNo = p.checkno; Bads = p.bads; NotifyPropertyChanged("Bads"); }break; case FEEDBACK_OBJ_INTERFACE.GET_PRODUCTNAME: { FEEDBACK_OBJ_INTERFACE.Pack_String p = new FEEDBACK_OBJ_INTERFACE.Pack_String(); if (!p.TryParse(infodata)) return; HeatsProductName = p.data; }break; case FEEDBACK_OBJ_INTERFACE.GET_UNDOIDX: { FEEDBACK_OBJ_INTERFACE.Pack_Undo p = new FEEDBACK_OBJ_INTERFACE.Pack_Undo(); if (!p.TryParse(infodata)) return; UndoIdx = p.undo_idx; } break; } } public override void PushCallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] retdata, object AsyncDelegate, object AsyncState) { switch (funcid) { case FEEDBACK_OBJ_INTERFACE.CALL_GETLIST: { FEEDBACK_OBJ_INTERFACE.Pack_StringList p = new FEEDBACK_OBJ_INTERFACE.Pack_StringList(); if (!p.TryParse(retdata)) return; ((AsyncCBHandler)AsyncDelegate)(AsyncState, p.list); } break; } } public override void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata) { PushGetValue(from, srcid, infoid, infodata); } public override void Dispose() { FObjSys.Current.SenseConfigEx(mConn, mServerID, ID, 0xffffffff, SENSE_CONFIG.REMOVE); base.Dispose(); } #endregion #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; protected void NotifyPropertyChanged(string propertyname) { if (PropertyChanged != null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyname)); } } #endregion #region 撤销 private int undoidx = 0; /// /// undo 的序号 /// public int UndoIdx { get { return undoidx; } protected set { if (undoidx != value) { undoidx = value; NotifyPropertyChanged("UndoIdx"); } } } //读取 UndoIdx 的 加热 public void Undo() { FObjSys.Current.CallFunctionEx( mConn, mServerID, ID, FEEDBACK_OBJ_INTERFACE.CALL_UNDO, null ); } #endregion } }