IBlowingDetect.cs 9.92 KB
using FObjBase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace FLY.Thick.Blowing.IService
{
    /// <summary>
    /// 旋转架及膜位置检测模拟
    /// </summary>
    public interface IBlowingDetect:INotifyPropertyChanged
    {
        #region 参数

        /// <summary>
        /// 离开限位 到 撞下一个限位 的 旋转架转动总角度 单位°
        /// </summary>
        double RAngle { get; set; }

        /// <summary>
        /// 人字架 旋转1周 设置 时间。 
        /// 刚开机时,RenZiJiaPeriod = DefaultRPeriod;
        /// 异常时,RenZiJiaPeriod = DefaultRPeriod;
        /// </summary>
        TimeSpan DefaultRPeriod { get; set; }

        /// <summary>
        /// 加速减速时间,  默认1s  加速减速时间 * 2 +正反转冷却时间 = 撞限位 到 离开限位 的时间
        /// </summary>
        TimeSpan AccDecTime { get; set; }

        /// <summary>
        /// 信号0 撞2次。 这个能自动设置。 两个撞同一信号 间隔30秒内,算一个换向信号。 
        /// 当为2次撞时:  StartTime = 第1次撞的StartTime, EndTime = 第2次撞的EndTime
        /// </summary>
        bool IsSign0Double { get; set; }

        /// <summary>
        /// 信号1 撞2次。 这个能自动设置。 两个撞同一信号 间隔30秒内,算一个换向信号。 
        /// 当为2次撞时:  StartTime = 第1次撞的StartTime, EndTime = 第2次撞的EndTime
        /// </summary>
        bool IsSign1Double { get; set; }

        /// <summary>
        /// 信号模式, 短信号模式(只撞一下),长信号模式(只要是转着,信号就长亮,直到换向)
        /// </summary>
        BlowingSignType SignType { get; set; }

        /// <summary>
        /// 撞限位 到 离开限位 的时间, 需要初始值,以后测量出来的
        /// </summary>
        TimeSpan LimitSignTime { get; set; }

        /// <summary>
        /// 人字架到测厚仪膜长 单位m
        /// 当旋转架为立式时, 膜长为人字架复位时,的最短膜距离
        /// </summary>
        double FilmLength { get; set; }

        /// <summary>
        /// 辊周长,单位mm
        /// </summary>
        double RollPerimeter { get; set; }

        /// <summary>
        /// 转向信号100ms 滤波
        /// </summary>
        bool IsSignFilter { get; set; }

        /// <summary>
        /// 缺少信号模式
        /// 正反信号线接得不好,有时候会丢失了。 
        /// 当前的旋转时间是上一次的1.1倍时,在以前的位置增加信号!!!!
        /// 当有连续两次相同的信号,且信号差刚好是旋转时间的1.9~2.1倍时,证明真的是缺少信号
        /// </summary>
        bool IsLackSignMode { get; set; }

        /// <summary>
        /// 旋转架为立式,测厚仪安装在二牵引前面,膜距离 与 旋转角度 一起变化, 旋转角度越大 膜距离越大
        /// </summary>
        bool Is3D { get; set; }



        #endregion

        #region 状态
        /// <summary>
        /// 当前旋转架旋转角度
        /// </summary>
        double Angle { get; }

        /// <summary>
        /// 当前方向
        /// </summary>
        Misc.DIRECTION Direction { get; }

        /// <summary>
        /// 旋转次数
        /// </summary>
        int RotationCnt { get; }

        /// <summary>
        /// 最新的限位信号序号
        /// </summary>
        int LastLimitNo { get; }

        /// <summary>
        /// 最后一次撞限位,或离开限位信号 到当前已经消耗的时间
        /// </summary>
        TimeSpan PastTime { get; }

        /// <summary>
        /// 当前线速度,单位 m/min
        /// </summary>
        double FilmVelocity { get; }

        /// <summary>
        /// 离开限位 到 撞下一个限位  的 旋转架转动时间, 需要初始值,以后测量出来的
        /// </summary>
        TimeSpan RenZiJiaPeriod { get; }

        /// <summary>
        /// 正反转冷却时间, 加速减速时间 * 2 +正反转冷却时间 = 撞限位 到 离开限位 的时间 
        /// </summary>
        TimeSpan SwapCoolTime { get; }

        /// <summary>
        /// 缓冲区拥有数据的时间长度,1s更新一次
        /// </summary>
        TimeSpan BufTotalTime { get; }
        #endregion

        #region 功能
        /// <summary>
        /// 参数应用
        /// </summary>
        void Apply();

        /// <summary>
        /// 获取 信号列表
        /// </summary>
        /// <param name="AsyncDelegate">retdata = GetBufListReponse</param>
        /// <param name="AsyncState"></param>
        void GetSignList(AsyncCBHandler AsyncDelegate, object AsyncState);

        /// <summary>
        /// 获取 辊信号列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="AsyncDelegate">retdata = GetRollListReponse</param>
        /// <param name="AsyncState"></param>
        void GetRollList(DateTime begin, AsyncCBHandler AsyncDelegate, object AsyncState);

        /// <summary>
        /// 获取 转向信号列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="AsyncDelegate">retdata = GetRollListReponse</param>
        /// <param name="AsyncState"></param>
        void GetLimitList(DateTime begin, AsyncCBHandler AsyncDelegate, object AsyncState);

        /// <summary>
        /// 获取 立式旋转架 的 膜距离增量
        /// </summary>
        /// <param name="AsyncDelegate">retdata = GetFilmLength3DReponse</param>
        /// <param name="AsyncState"></param>
        void GetFilmLength3D(AsyncCBHandler AsyncDelegate, object AsyncState);

        /// <summary>
        /// 设置 立式旋转架 的 膜距离增量
        /// </summary>
        /// <param name="data"></param>
        void SetFilmLength3D(List<double> data);
        #endregion

    }


    /// <summary>
    /// 正反转信号类型
    /// </summary>
    public enum BlowingSignType
    {
        /// <summary>
        /// 短信号模式, 撞输入口 为0, 离开输入口为1
        /// </summary>
        Short,
        /// <summary>
        /// 长信号模式,撞输入口 为0,直到切换为下一个信号,才恢复为1
        /// </summary>
        Long
    }

    /// <summary>
    /// 信号
    /// </summary>
    public class SignData : INotifyPropertyChanged
    {

        /// <summary>
        /// 信号序号
        /// </summary>
        public int No { get; set; }


        /// <summary>
        /// 时间
        /// </summary>
        public DateTime Time { get; set; }

        /// <summary>
        /// on? off?
        /// </summary>
        public bool On { get; set; }


        /// <summary>
        /// 与上一次的时间间隔
        /// </summary>
        public TimeSpan Interval { get; set; }


        public event PropertyChangedEventHandler PropertyChanged;
    }

    /// <summary>
    /// 辊信号时间
    /// </summary>
    public class RollCell
    {
        /// <summary>
        /// 创建副本
        /// </summary>
        /// <returns></returns>
        public RollCell Clone()
        {
            RollCell r = new RollCell();
            r.dt = dt;
            return r;
        }
        public DateTime dt;
        public override string ToString()
        {
            return dt.ToString();
        }
    }

    /// <summary>
    /// 撞向信号
    /// </summary>
    public class LimitCell
    {
        /// <summary>
        /// 信号开始
        /// </summary>
        public DateTime dt_begin = DateTime.MinValue;
        /// <summary>
        /// 信号结束
        /// </summary>
        public DateTime dt_end = DateTime.MinValue;
        /// <summary>
        /// 信号序号 0 或 1
        /// </summary>
        public int no = 0;
        /// <summary>
        /// 两次撞转向 = 1次信号
        /// </summary>
        public bool isDouble = false;
        /// <summary>
        /// 当为两次撞转向, 第1次撞结束时间。用于当两次信号发生时间间隔很长,现在肯定就只有一次撞转向而已
        /// </summary>
        public DateTime dt_mid = DateTime.MinValue;

        /// <summary>
        /// 这是一个虚拟的信号
        /// </summary>
        public bool isVirtual = false;

        /// <summary>
        /// 创建副本
        /// </summary>
        /// <returns></returns>
        public LimitCell Clone()
        {
            LimitCell l = new LimitCell();

            l.dt_begin = dt_begin;
            l.dt_end = dt_end;
            l.dt_mid = dt_mid;
            l.isDouble = isDouble;
            l.isVirtual = isVirtual;
            l.no = no;
            return l;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return no.ToString() + " " + ((isDouble) ? "D" : "S") + " (" + dt_begin.ToString() + "-" + dt_end.ToString() + ") " + (isVirtual ? "V" : "");
        }
    }


    /// <summary>
    /// GetSignList 返回
    /// </summary>
    public class GetSignListReponse 
    {
        public List<SignData> datas;
    }

    /// <summary>
    /// GetRollList 参数
    /// </summary>
    public class GetRollListRequest
    {
        public DateTime begin;
    }
    /// <summary>
    /// GetRollList 返回
    /// </summary>
    public class GetRollListReponse
    {
        public List<RollCell> datas;
    }


    /// <summary>
    /// GetFilmLength3D 返回
    /// </summary>
    public class GetFilmLength3DReponse
    {
        public List<double> datas;
    }

    /// <summary>
    /// 
    /// </summary>
    public class GetLimitListRequest
    {
        public DateTime begin;
    }

    /// <summary>
    /// 
    /// </summary>
    public class GetLimitListReponse
    {
        public List<LimitCell> datas;
    }

}