PgBlowingVmUt.cs 9.92 KB
using FLY.Thick.Blowing.IService;
using FLY.Thick.BlowingScan.IService;
using FObjBase;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace FLY.Thick.BlowingScan.UI.Client
{
    class PgBlowingVmUt : PgBlowingVm
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public PgBlowingVmUt()
        {
            bDetect = new BlowingDetectUt();
            renZiJiaService = new BlowingScanUt();
        }
    }

    /// <summary>
    /// 旋转架及膜位置检测模拟
    /// </summary>
    class BlowingDetectUt : IBlowingDetectService
    {
        #region 参数

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

        /// <summary>
        /// 人字架 旋转1周 设置 时间。 
        /// 刚开机时,RenZiJiaPeriod = DefaultRPeriod;
        /// 异常时,RenZiJiaPeriod = DefaultRPeriod;
        /// </summary>
        public TimeSpan DefaultRPeriod { 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; }



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

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

        /// <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; } = "127.0.0.1:20004";

        /// <summary>
        /// 使用编码器检测旋转架旋转位置模式
        /// </summary>
        public bool IsRPosMode { get; set; }

        /// <summary>
        /// 离开限位 到 撞下一个限位 的 旋转架转动总脉冲 单位 脉冲;
        /// 通过看 转向信号列表,可以看到
        /// </summary>
        public int RPosOfR { get; set; }

        /// <summary>
        /// 自定义 输入口
        /// </summary>
        public bool IsInNoCustomized { get; set; }

        public int InNo_Limit0 { get; set; } = 9 - 1;
        public int InNo_Limit1 { get; set; } = 10 - 1;
        public int InNo_Roll { get; set; } = 11 - 1;

        #endregion

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

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

        /// <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; }

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

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

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


        /// <summary>
        /// 原点旋转脉冲 是否有效
        /// </summary>
        public bool IsOrgRPosValid { 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; }

        public DateTime DefaultTime { get; set; }


        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

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

        /// <summary>
        /// 获取 信号列表
        /// </summary>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>

        public void GetSignList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext)
        {

        }

        /// <summary>
        /// 获取 辊信号列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        public void GetRollList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext)
        {

        }

        /// <summary>
        /// 获取 转向信号列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>

        public void GetLimitList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext)
        {

        }

        /// <summary>
        /// 获取 旋转位置列表
        /// </summary>
        /// <param name="begin">开始时间</param>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>

        public void GetRPosList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext)
        {

        }

        /// <summary>
        /// 获取 立式旋转架 的 膜距离增量
        /// </summary>
        /// <param name="asyncDelegate"></param>
        /// <param name="asyncContext"></param>
        public void GetFilmLength3D(AsyncCBHandler asyncDelegate, object asyncContext)
        {

        }

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

        }
        #endregion
    }


    class BlowingScanUt : IBlowingScanService
    {
        public int ChannelCnt { get; set; }
        public int BPC { get; set; }

        public int NBolts { get; set; }

        public int OrgBoltNo { get; set; }
        public bool IsUsedMap { get; set; }
        public BoltMapCell[] Map { get; set; }
        public bool IsProbeRight { get; set; }
        /// <summary>
        /// 正方向是顺时钟;
        /// 信号0->信号1 为正方向;
        /// 风环加热棒排列方向为 正方向;
        /// 默认情况 风环加热棒排列是逆时钟
        /// </summary>
        public bool IsForwCW { get; set; }

        public BlowingType BType { get; set; }

        public bool IsUsedEncoder { get; set; }

        public event EventHandler DataEvent;
        public event PropertyChangedEventHandler PropertyChanged;


        /// <summary>
        /// 平滑
        /// </summary>
        public int Smooth { get; set; }


        /// <summary>
        /// 探头宽度,用于解方程,可以与实际不符合 单位脉冲
        /// </summary>
        public int SensorWidth { get; set; }
        /// <summary>
        /// 多少次扫描解一次方程
        /// </summary>
        public int SolveCnt { get; set; }

        /// <summary>
        /// 缓冲区数据量
        /// </summary>
        public int BufListCount { get; set; }
        /// <summary>
        /// 缓冲区最后一个记录序号
        /// </summary>
        public int BufListLastNo { get; set; }

        public void GetBufList(int no, AsyncCBHandler asyncDelegate, object asyncContext) 
        {
        
        }


        public void Apply()
        {
        }

        public void GetADList(DateTime begin, AsyncCBHandler asyncDelegate, object asyncContext)
        {
        }
    }
}