using FLY.Thick.Blowing.IService; using FLY.Thick.Blowing.OBJ_INTERFACE; using FObjBase; using FObjBase.Reflect; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; namespace FLY.Thick.Blowing.Client { /// <summary> /// 旋转架及膜位置检测模拟 /// </summary> public class BlowingDetectServiceClient: FObjBase.Reflect.Reflect_SeviceClient, IBlowingDetectService { protected override Type InterfaceType => typeof(IBlowingDetectService); #region IBlowingDetect 成员 #region 参数 /// <summary> /// 离开限位 到 撞下一个限位 的 旋转架转动总角度 单位° /// </summary> public double RAngle { get; set; } = 350; /// <summary> /// 人字架 旋转1周 设置 时间。 /// 刚开机时,RenZiJiaPeriod = DefaultRPeriod; /// 异常时,RenZiJiaPeriod = DefaultRPeriod; /// </summary> public TimeSpan DefaultRPeriod { get; set; } /// <summary> /// 加速减速时间, 加速减速时间+正反转冷却时间 = 撞限位 到 离开限位 的时间 /// </summary> public TimeSpan AccDecTime { get; set; } /// <summary> /// 信号0 撞2次。 这个能自动设置。 两个撞同一信号 间隔30秒内,算一个换向信号。 /// 当为2次撞时: StartTime = 第1次撞的StartTime, EndTime = 第2次撞的EndTime /// </summary> public bool IsSign0Double { get; set; } /// <summary> /// 信号1 撞2次。 这个能自动设置。 两个撞同一信号 间隔30秒内,算一个换向信号。 /// 当为2次撞时: StartTime = 第1次撞的StartTime, EndTime = 第2次撞的EndTime /// </summary> public bool IsSign1Double { get; set; } /// <summary> /// 信号模式, 短信号模式(只撞一下),长信号模式(只要是转着,信号就长亮,直到换向) /// </summary> public BlowingSignType SignType { get; set; } = BlowingSignType.Short; /// <summary> /// 人字架到测厚仪膜长 单位m /// </summary> public double FilmLength { get; set; } = 26; /// <summary> /// 辊周长,单位mm /// </summary> public double RollPerimeter { get; set; } = 314; /// <summary> /// 转向信号100ms 滤波 /// </summary> public bool IsSignFilter { get; set; } /// <summary> /// 缺少信号模式 /// 正反信号线接得不好,有时候会丢失了。 /// 当前的旋转时间是上一次的1.1倍时,在以前的位置增加信号!!!! /// 当有连续两次相同的信号,且信号差刚好是旋转时间的1.9~2.1倍时,证明真的是缺少信号 /// </summary> public bool IsLackSignMode { get; set; } /// <summary> /// 旋转架为立式,测厚仪安装在二牵引前面,膜距离 与 旋转角度 一起变化, 旋转角度越大 膜距离越大 /// </summary> public bool Is3D { get; set; } /// <summary> /// 使用收卷PLC的数据,得到旋转位置,速度数据 /// </summary> public bool IsPlcMode { get; set; } /// <summary> /// 旋转服务地址 /// </summary> public string PlcAddr { get; set; } /// <summary> /// 使用编码器检测旋转架旋转位置模式 /// </summary> public bool IsRPosMode { get; set; } /// <summary> /// 离开限位 到 撞下一个限位 的 旋转架转动总脉冲 单位 脉冲; /// 通过看 转向信号列表,可以看到 /// </summary> public int RPosOfR { get; set; } /// <summary> /// 自定义 输入口 /// </summary> public bool IsInNoCustomized { get; set; } /// <summary> /// 自定义 转向信号 输入口序号 从0开始 默认9-1 /// </summary> public int InNo_Limit0 { get; set; } /// <summary> /// 自定义 转向信号 输入口序号 从0开始 默认10-1 /// </summary> public int InNo_Limit1 { get; set; } /// <summary> /// 自定义 辊速度 输入口序号 从0开始 默认11-1 /// </summary> public int InNo_Roll { get; set; } #endregion #region 状态 /// <summary> /// 当前旋转架旋转角度 /// </summary> public double Angle { get; set; } /// <summary> /// 当前方向 /// </summary> public Misc.DIRECTION Direction { get; set; } = Misc.DIRECTION.FORWARD; /// <summary> /// 当前缓冲区数量 /// </summary> public int RotationCnt { get; set; } /// <summary> /// 最新的限位信号序号 /// </summary> public int LastLimitNo { get; set; } /// <summary> /// 最后一次撞限位,或离开限位信号 到当前已经消耗的时间 /// </summary> public TimeSpan PastTime { get; set; } /// <summary> /// 当前线速度,单位 m/min /// </summary> public double FilmVelocity { get; set; } = 0; /// <summary> /// 离开限位 到 撞下一个限位 的 旋转架转动时间, 需要初始值,以后测量出来的 /// </summary> public TimeSpan RenZiJiaPeriod { get; set; } /// <summary> /// 撞限位 到 离开限位 的时间, 需要初始值,以后测量出来的 /// </summary> public TimeSpan LimitSignTime { get; set; } /// <summary> /// 缓冲区拥有数据的时间长度,1s更新一次 /// </summary> public TimeSpan BufTotalTime { get; set; } /// <summary> /// 上一次撞限位开关0时, 旋转架脉冲 /// </summary> public int OrgRPos { get; set; } /// <summary> ///旋转架全局脉冲, 当前旋转架脉冲 = GlobalRPos - OrgRPos; /// </summary> public int GlobalRPos { get; set; } /// <summary> /// 旋转架脉冲速度, 旋转架角速度 = RSpeed * RAngle / RPosOfR /// </summary> public int RSpeed { get; set; } /// <summary> /// 刚开机,信号列表一个信号都没有,创造一个时间点,作为信号点 /// </summary> public DateTime DefaultTime { get; set; } #endregion #endregion /// <summary> /// /// </summary> public BlowingDetectServiceClient(UInt32 serviceId) : base(serviceId) { } /// <summary> /// /// </summary> /// <param name="serviceId"></param> /// <param name="connName"></param> public BlowingDetectServiceClient(UInt32 serviceId, string connName) : base(serviceId, connName) { } #region 功能 /// <summary> /// 应用 /// </summary> public void Apply() { Call(nameof(Apply)); } /// <summary> /// 获取 信号列表 /// </summary> /// <param name="asyncDelegate"></param> /// <param name="asyncContext"></param> [Call(typeof(GetSignListReponse))] public void GetSignList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) { Call(nameof(GetSignList), new {begin}, asyncDelegate, asyncContext); } /// <summary> /// 获取 辊信号列表 /// </summary> /// <param name="begin">开始时间</param> /// <param name="asyncDelegate"></param> /// <param name="asyncContext"></param> [Call(typeof(GetRollListReponse))] public void GetRollList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) { Call(nameof(GetRollList), new { begin }, asyncDelegate, asyncContext); } /// <summary> /// 获取 转向信号列表 /// </summary> /// <param name="begin">开始时间</param> /// <param name="asyncDelegate"></param> /// <param name="asyncContext"></param> [Call(typeof(GetLimitListReponse))] public void GetLimitList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) { Call(nameof(GetLimitList), new { begin }, asyncDelegate, asyncContext); } /// <summary> /// 获取 立式旋转架 的 膜距离增量 /// </summary> /// <param name="asyncDelegate"></param> /// <param name="asyncContext"></param> [Call(typeof(GetFilmLength3DReponse))] public void GetFilmLength3D(AsyncCBHandler asyncDelegate, object asyncContext) { Call(nameof(GetFilmLength3D), null, asyncDelegate, asyncContext); } /// <summary> /// 设置 立式旋转架 的 膜距离增量 /// </summary> /// <param name="data"></param> public void SetFilmLength3D(List<double> data) { Call(nameof(SetFilmLength3D), new { data }); } /// <summary> /// 获取 旋转位置列表 /// </summary> /// <param name="begin">开始时间</param> /// <param name="asyncDelegate"></param> /// <param name="asyncContext"></param> [Call(typeof(GetRPosListReponse))] public void GetRPosList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext) { Call(nameof(GetRPosList), new { begin }, asyncDelegate, asyncContext); } #endregion } }