using FLY.Thick.Blowing.IService; using FLY.Thick.Blowing.OBJ_INTERFACE; using FObjBase; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; namespace FLY.Thick.Blowing.Client { /// /// 旋转架及膜位置检测模拟 /// public class BlowingDetectServiceClient: FObj, IBlowingDetect { IFConn mConn; UInt32 mServerID; #region IBlowingDetect 成员 #region 参数 /// /// 离开限位 到 撞下一个限位 的 旋转架转动总角度 单位° /// public double RAngle { get; set; } = 350; /// /// 人字架 旋转1周 设置 时间。 /// 刚开机时,RenZiJiaPeriod = DefaultRPeriod; /// 异常时,RenZiJiaPeriod = DefaultRPeriod; /// public TimeSpan DefaultRPeriod { get; set; } /// /// 加速减速时间, 加速减速时间+正反转冷却时间 = 撞限位 到 离开限位 的时间 /// public TimeSpan AccDecTime { get; set; } /// /// 信号0 撞2次。 这个能自动设置。 两个撞同一信号 间隔30秒内,算一个换向信号。 /// 当为2次撞时: StartTime = 第1次撞的StartTime, EndTime = 第2次撞的EndTime /// public bool IsSign0Double { get; set; } /// /// 信号1 撞2次。 这个能自动设置。 两个撞同一信号 间隔30秒内,算一个换向信号。 /// 当为2次撞时: StartTime = 第1次撞的StartTime, EndTime = 第2次撞的EndTime /// public bool IsSign1Double { get; set; } /// /// 信号模式, 短信号模式(只撞一下),长信号模式(只要是转着,信号就长亮,直到换向) /// public BlowingSignType SignType { get; set; } = BlowingSignType.Short; /// /// 撞限位 到 离开限位 的时间, 需要初始值,以后测量出来的 /// public TimeSpan LimitSignTime { get; set; } /// /// 人字架到测厚仪膜长 单位m /// public double FilmLength { get; set; } = 26; /// /// 辊周长,单位mm /// public double RollPerimeter { get; set; } = 314; /// /// 转向信号100ms 滤波 /// public bool IsSignFilter { get; set; } /// /// 缺少信号模式 /// 正反信号线接得不好,有时候会丢失了。 /// 当前的旋转时间是上一次的1.1倍时,在以前的位置增加信号!!!! /// 当有连续两次相同的信号,且信号差刚好是旋转时间的1.9~2.1倍时,证明真的是缺少信号 /// public bool IsLackSignMode { get; set; } /// /// 旋转架为立式,测厚仪安装在二牵引前面,膜距离 与 旋转角度 一起变化, 旋转角度越大 膜距离越大 /// public bool Is3D { get; set; } #endregion #region 状态 /// /// 当前旋转架旋转角度 /// public double Angle { get; private set; } private Misc.DIRECTION direction = Misc.DIRECTION.FORWARD; /// /// 当前方向 /// public Misc.DIRECTION Direction { get; private set; } = Misc.DIRECTION.FORWARD; /// /// 当前缓冲区数量 /// public int RotationCnt { get; set; } /// /// 最新的限位信号序号 /// public int LastLimitNo { get; set; } /// /// 最后一次撞限位,或离开限位信号 到当前已经消耗的时间 /// public TimeSpan PastTime { get; set; } /// /// 当前线速度,单位 m/min /// public double FilmVelocity { get; private set; } = 0; /// /// 离开限位 到 撞下一个限位 的 旋转架转动时间, 需要初始值,以后测量出来的 /// public TimeSpan RenZiJiaPeriod { get; private set; } /// /// 正反转冷却时间, 加速减速时间 * 2 +正反转冷却时间 = 撞限位 到 离开限位 的时间 /// public TimeSpan SwapCoolTime { get; private set; } /// /// 缓冲区拥有数据的时间长度,1s更新一次 /// public TimeSpan BufTotalTime { get; private set; } #endregion #endregion /// /// /// public BlowingDetectServiceClient(UInt32 serverid) { mServerID = serverid;// FLY.Thick.Blowing.OBJ_INTERFACE.OBJ_INTERFACE_ID.BDETECT_ID; } #region IBlowingDetect 函数 #region 功能 /// /// 应用 /// public void Apply() { string json = Newtonsoft.Json.JsonConvert.SerializeObject(new BLOWING_DETECT_OBJ_INTERFACE.Pack_Params() { rangle = RAngle, period = DefaultRPeriod, rollPerimeter = RollPerimeter, filmLength = FilmLength, accDecTime = AccDecTime, limitSignTime = LimitSignTime, isSign0Double = IsSign0Double, isSign1Double = IsSign1Double, signType = SignType, isSignFilter = IsSignFilter, isLackSignMode = IsLackSignMode, is3D = Is3D }); CurrObjSys.SetValueEx( mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.SET_PARAMS, Misc.Converter.StringToBytes(json)); } /// /// 获取 信号列表 /// /// retdata = GetBufListReponse /// public void GetSignList(AsyncCBHandler AsyncDelegate, object AsyncState) { CurrObjSys.CallFunctionEx(mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.CALL_GETSIGNLIST, null, AsyncDelegate, AsyncState); } /// /// 获取 转向信号列表 /// /// 开始时间 /// retdata = GetRollListReponse /// public void GetLimitList(DateTime begin, AsyncCBHandler AsyncDelegate, object AsyncState) { string json = Newtonsoft.Json.JsonConvert.SerializeObject(new GetLimitListRequest() { begin = begin }); CurrObjSys.CallFunctionEx(mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.CALL_GETLIMITLIST, Misc.Converter.StringToBytes(json), AsyncDelegate, AsyncState); } /// /// 获取 辊信号列表 /// /// 开始时间 /// retdata = GetRollListReponse /// public void GetRollList(DateTime begin, AsyncCBHandler AsyncDelegate, object AsyncState) { string json = Newtonsoft.Json.JsonConvert.SerializeObject(new GetRollListRequest() { begin = begin }); CurrObjSys.CallFunctionEx(mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.CALL_GETROLLIST, Misc.Converter.StringToBytes(json), AsyncDelegate, AsyncState); } /// /// 获取 立式旋转架 的 膜距离增量 /// /// retdata = GetFilmLength3DReponse /// public void GetFilmLength3D(AsyncCBHandler AsyncDelegate, object AsyncState) { CurrObjSys.CallFunctionEx(mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.CALL_GET_FL_3D, null, AsyncDelegate, AsyncState); } /// /// 设置 立式旋转架 的 膜距离增量 /// /// public void SetFilmLength3D(List data) { string json = Newtonsoft.Json.JsonConvert.SerializeObject(data); CurrObjSys.CallFunctionEx(mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.CALL_SET_FL_3D, Misc.Converter.StringToBytes(json)); } #endregion #endregion #region INotifyPropertyChanged 成员 public event PropertyChangedEventHandler PropertyChanged; #endregion public override void Dispose() { CurrObjSys.ObjRemove( this, mConn); } public override void ConnectNotify(IFConn from) { mConn = from; if (from.IsConnected) { //获取所有数据,设置推送 CurrObjSys.GetValueEx( mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.GET_PARAMS); CurrObjSys.GetValueEx( mConn, mServerID, ID, BLOWING_DETECT_OBJ_INTERFACE.GET_STATE); CurrObjSys.SenseConfigEx( mConn, mServerID, ID, 0xffffffff, SENSE_CONFIG.ADD); } } public override void PushGetValue(IFConn from, uint srcid, ushort memid, byte[] infodata) { switch (memid) { case BLOWING_DETECT_OBJ_INTERFACE.GET_PARAMS: { string json = Misc.Converter.BytesToString(infodata); var p = Newtonsoft.Json.JsonConvert.DeserializeObject(json); RAngle = p.rangle;//旋转架转动角度 DefaultRPeriod = p.period; RollPerimeter = p.rollPerimeter; FilmLength = p.filmLength; AccDecTime = p.accDecTime; LimitSignTime = p.limitSignTime; IsSign0Double = p.isSign0Double; IsSign1Double = p.isSign1Double; SignType = p.signType; IsSignFilter = p.isSignFilter; IsLackSignMode = p.isLackSignMode; Is3D = p.is3D; } break; case BLOWING_DETECT_OBJ_INTERFACE.GET_STATE: { string json = Misc.Converter.BytesToString(infodata); var p = Newtonsoft.Json.JsonConvert.DeserializeObject(json); LastLimitNo = p.limitno; PastTime = p.pasttime; RotationCnt = p.rotationCnt; FilmVelocity = p.filmvelocity; Angle = p.angle; Direction = p.direction; RenZiJiaPeriod = p.period; SwapCoolTime = p.swapCoolTime; BufTotalTime = p.BufTotalTime; } break; } } public override void PushInfo(IFConn from, uint srcid, ushort infoid, byte[] infodata) { switch (infoid) { default: PushGetValue(from, srcid, infoid, infodata); break; } } public override void PushCallFunction(IFConn from, uint srcid, uint magic, ushort funcid, byte[] retdata, object AsyncDelegate, object AsyncState) { switch (funcid) { case BLOWING_DETECT_OBJ_INTERFACE.CALL_GETSIGNLIST: { string json = Misc.Converter.BytesToString(retdata); var p = JsonConvert.DeserializeObject(json); ((AsyncCBHandler)AsyncDelegate)(AsyncState, p); } break; case BLOWING_DETECT_OBJ_INTERFACE.CALL_GETLIMITLIST: { string json = Misc.Converter.BytesToString(retdata); var p = JsonConvert.DeserializeObject(json); ((AsyncCBHandler)AsyncDelegate)(AsyncState, p); } break; case BLOWING_DETECT_OBJ_INTERFACE.CALL_GETROLLIST: { string json = Misc.Converter.BytesToString(retdata); var p =JsonConvert.DeserializeObject(json); ((AsyncCBHandler)AsyncDelegate)(AsyncState, p); } break; case BLOWING_DETECT_OBJ_INTERFACE.CALL_GET_FL_3D: { string json = Misc.Converter.BytesToString(retdata); var p = JsonConvert.DeserializeObject(json); ((AsyncCBHandler)AsyncDelegate)(AsyncState, p); } break; } } } }