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