This commit is contained in:
@@ -7,145 +7,212 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace 口罩泄露定制款
|
||||
{
|
||||
public class ExperData: INotifyPropertyChanged
|
||||
public class ExperData : INotifyPropertyChanged
|
||||
{
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
#region 实验属性
|
||||
static string experName = "";
|
||||
/// <summary>
|
||||
/// 实验人员
|
||||
/// </summary>
|
||||
public string ExperName { get { return experName; } set { experName = value; } }
|
||||
|
||||
|
||||
static string experDate = "";
|
||||
/// <summary>
|
||||
/// 实验日期
|
||||
/// </summary>
|
||||
public string ExperDate { get { return experDate; } set { experDate = value; } }
|
||||
|
||||
|
||||
static string experNum = "";
|
||||
/// <summary>
|
||||
/// 实验编号
|
||||
/// </summary>
|
||||
public string ExperNum { get { return experNum; } set { experNum = value; } }
|
||||
|
||||
|
||||
static string experType = " ";
|
||||
/// <summary>
|
||||
/// 实验种类
|
||||
/// </summary>
|
||||
public string ExperType { get { return experType; } set { experType = value; } }
|
||||
|
||||
static float experMaskType = 2.0f;
|
||||
/// <summary>
|
||||
/// 口罩类型
|
||||
/// 口罩类型泄漏率标准
|
||||
/// </summary>
|
||||
public float ExperMaskType { get { return experMaskType; } set { experMaskType = value; } }
|
||||
|
||||
/// <summary>
|
||||
/// 面罩类型
|
||||
/// </summary>
|
||||
static string maskType;
|
||||
public string MaskType { get { return maskType; } set { maskType = value; } }
|
||||
static float _yangPinXiShu = 1.0f;
|
||||
|
||||
static float _testDuration = 120f; // 测试时间改为120秒
|
||||
/// <summary>
|
||||
/// 样品系数
|
||||
/// 测试时长(秒)
|
||||
/// </summary>
|
||||
public float YangPinXiShu { get { return _yangPinXiShu; } set { _yangPinXiShu = value; } }
|
||||
public float TestDuration { get { return _testDuration; } set { _testDuration = value; } }
|
||||
|
||||
static string _testStatus = "";
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 实验状态
|
||||
/// </summary>
|
||||
public string TestStatus { get { return _testStatus; } set { _testStatus = value; } }
|
||||
|
||||
static float benDiNongDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 本底浓度
|
||||
/// 本底浓度(mg/m³)
|
||||
/// </summary>
|
||||
public float BenDiNongDu { get { return benDiNongDu; } set { benDiNongDu = value; } }
|
||||
|
||||
|
||||
static float huanJingWenDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 环境温度
|
||||
/// </summary>
|
||||
public float HuanJingWenDu { get { return huanJingWenDu; } set { huanJingWenDu = value; } }
|
||||
|
||||
|
||||
|
||||
static float huanJingShiDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 环境湿度
|
||||
/// </summary>
|
||||
public float HuanJingShiDu { get { return huanJingShiDu; } set { huanJingShiDu = value; } }
|
||||
|
||||
|
||||
static float o2NongDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 环境氧浓度
|
||||
/// </summary>
|
||||
public float O2NongDu { get { return o2NongDu; } set { o2NongDu = value; } }
|
||||
|
||||
|
||||
static float cO2NongDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 环境C02浓度
|
||||
/// 环境CO2浓度
|
||||
/// </summary>
|
||||
public float CO2NongDu_Indoor { get { return cO2NongDu; } set { cO2NongDu = value; } }
|
||||
|
||||
|
||||
static float inDoor_TSINongDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 环境气溶胶浓度
|
||||
/// 环境气溶胶浓度(mg/m³)
|
||||
/// </summary>
|
||||
public float InDoor_TSINongDu { get { return inDoor_TSINongDu; } set { inDoor_TSINongDu = value; } }
|
||||
|
||||
|
||||
static float mask_CO2NongDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 口罩内CO2浓度
|
||||
/// </summary>
|
||||
public float Mask_CO2NongDu { get { return mask_CO2NongDu; } set { mask_CO2NongDu = value; } }
|
||||
|
||||
|
||||
static float mask_TSINongDu = 0.00f;
|
||||
/// <summary>
|
||||
/// 口罩内气溶胶浓度
|
||||
/// 口罩内气溶胶浓度(mg/m³)
|
||||
/// </summary>
|
||||
public float Mask_TSINongDu { get { return mask_TSINongDu; } set { mask_TSINongDu = value; } }
|
||||
|
||||
static float _liuLiang = 0.00f;
|
||||
/// <summary>
|
||||
/// 流量
|
||||
/// 流量(L/min)
|
||||
/// </summary>
|
||||
public float LiuLiang { get { return _liuLiang; } set { _liuLiang = value; } }
|
||||
|
||||
static float _xieloulv = 0.00f;
|
||||
/// <summary>
|
||||
/// 泄露率
|
||||
/// 泄露率(%)
|
||||
/// </summary>
|
||||
public float XieLouLv { get { return _xieloulv; } set { _xieloulv = value; } }
|
||||
|
||||
// 新增:采样流量和干燥气流流量(根据YY/T 0866-2024标准)
|
||||
static float _samplingFlowRate = 2.0f; // 默认采样流量2L/min
|
||||
public float SamplingFlowRate { get { return _samplingFlowRate; } set { _samplingFlowRate = value; } }
|
||||
|
||||
static float _dryingFlowRate = 1.0f; // 默认干燥气流1L/min
|
||||
public float DryingFlowRate { get { return _dryingFlowRate; } set { _dryingFlowRate = value; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region 泄露率计算
|
||||
//单独动作泄露率
|
||||
public float CumulativeLeakageRate(List<float> inDoor_Tsi,List<float> out_Door_Tsi,float benDiNongdu,float xiShu)
|
||||
#region 泄漏率计算方法(根据YY/T 0866-2024标准)
|
||||
|
||||
/// <summary>
|
||||
/// 连续采样法泄漏率计算(公式2)
|
||||
/// P = 1.25 * ((C2 - C0) / C1) * ((S + D) / S) * 100
|
||||
/// </summary>
|
||||
public float ContinuousSamplingLeakageRate(List<float> indoorData, List<float> outdoorData,
|
||||
float backgroundConcentration,
|
||||
float samplingFlow, float dryingFlow)
|
||||
{
|
||||
if (inDoor_Tsi.Count != 0 && out_Door_Tsi.Count != 0)
|
||||
{
|
||||
//计算室内Tsi浓度平均值
|
||||
float inDoor_Tsi_Avg = inDoor_Tsi.Average();
|
||||
//计算室外Tsi浓度平均值
|
||||
float out_Door_Tsi_Avg = out_Door_Tsi.Average();
|
||||
//计算泄露率
|
||||
float leakageRate = ((out_Door_Tsi_Avg - benDiNongdu ) * xiShu)*100 / inDoor_Tsi_Avg;
|
||||
return leakageRate;
|
||||
}
|
||||
else
|
||||
if (indoorData.Count == 0 || outdoorData.Count == 0)
|
||||
return 0.0f;
|
||||
|
||||
// 使用最后100秒的数据(标准要求)
|
||||
int dataCount = Math.Min(indoorData.Count, outdoorData.Count);
|
||||
int startIndex = Math.Max(0, dataCount - 100); // 取最后100个数据点
|
||||
|
||||
// 计算最后100秒的平均值
|
||||
float C1 = 0, C2 = 0;
|
||||
int validCount = 0;
|
||||
|
||||
for (int i = startIndex; i < dataCount; i++)
|
||||
{
|
||||
return 0.00f;
|
||||
C1 += indoorData[i];
|
||||
C2 += outdoorData[i];
|
||||
validCount++;
|
||||
}
|
||||
|
||||
}
|
||||
//全部动作泄露率
|
||||
public float CumulativeLeakageRate_All(List<float> All_Cv_List)
|
||||
|
||||
if (validCount == 0)
|
||||
return 0.0f;
|
||||
|
||||
C1 /= validCount;
|
||||
C2 /= validCount;
|
||||
|
||||
// 应用连续采样法公式
|
||||
if (C1 <= 0)
|
||||
return 0.0f;
|
||||
|
||||
// P = 1.25 * ((C2 - C0) / C1) * ((S + D) / S) * 100
|
||||
float leakageRate = 1.25f * ((C2 - backgroundConcentration) / C1) *
|
||||
((samplingFlow + dryingFlow) / samplingFlow) * 100;
|
||||
|
||||
return Math.Max(0, leakageRate); // 确保非负
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 脉冲式采样法泄漏率计算(公式1) - 备用
|
||||
/// </summary>
|
||||
public float PulsedSamplingLeakageRate(List<float> indoorData, List<float> outdoorData,
|
||||
float backgroundConcentration,
|
||||
float samplingFlow, float dryingFlow,
|
||||
float totalInhaleTime, float totalExhaleTime)
|
||||
{
|
||||
return All_Cv_List.Average();
|
||||
}
|
||||
#endregion
|
||||
if (indoorData.Count == 0 || outdoorData.Count == 0 || totalInhaleTime <= 0)
|
||||
return 0.0f;
|
||||
|
||||
// 使用最后100秒的数据
|
||||
int dataCount = Math.Min(indoorData.Count, outdoorData.Count);
|
||||
int startIndex = Math.Max(0, dataCount - 100);
|
||||
|
||||
float C1 = 0, C2 = 0;
|
||||
int validCount = 0;
|
||||
|
||||
for (int i = startIndex; i < dataCount; i++)
|
||||
{
|
||||
C1 += indoorData[i];
|
||||
C2 += outdoorData[i];
|
||||
validCount++;
|
||||
}
|
||||
|
||||
if (validCount == 0 || C1 <= 0)
|
||||
return 0.0f;
|
||||
|
||||
C1 /= validCount;
|
||||
C2 /= validCount;
|
||||
|
||||
// P = ((C2 - C0) / C1) * ((t_w + t_cm) / t_w) * ((S + D) / S) * 100
|
||||
float leakageRate = ((C2 - backgroundConcentration) / C1) *
|
||||
((totalInhaleTime + totalExhaleTime) / totalInhaleTime) *
|
||||
((samplingFlow + dryingFlow) / samplingFlow) * 100;
|
||||
|
||||
return Math.Max(0, leakageRate);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
}
|
||||
36
口罩泄露定制款/Data/UserData.json
Normal file
36
口罩泄露定制款/Data/UserData.json
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"High": "191",
|
||||
"Weight": "59",
|
||||
"FaceWidth": "4",
|
||||
"FaceLength": "2",
|
||||
"EyesDistance": "5",
|
||||
"Customer": "7",
|
||||
"IsNeedRun": false,
|
||||
"MaskType": "KN95",
|
||||
"Category": "NaCl浓度",
|
||||
"Threshold": "10.0",
|
||||
"Concentration": "5",
|
||||
"ParticleSize": "1.7",
|
||||
"ContentString": "篇三",
|
||||
"ScreenValue": "[1:选型决策树]\"问1:环境有缺氧风险吗?是→选正压式呼吸器!否→下一步!问2:危害物是粉尘/烟雾?是→选KN100/KP100口罩!否→下一步!问3:危害物是毒气/蒸气?是→选对应滤毒罐全面罩!——科学选型是防护第一步!\"[2:佩戴全流程]\"步骤1:预检查•滤棉无破损,头带弹性足!步骤2:规范佩戴•双手托口罩→下巴先入→拉紧下头带→再拉紧上头带!步骤3:密合检测•正压检测:手掌堵呼气阀,口罩应鼓起!•负压检测:捂住滤棉吸气,口罩应塌陷!\"[3:致命误区解析]\"误区1:'纱布口罩也能防尘'真相:PM2.5穿透率高达90%!误区2:'滤棉变黑才需换'真相:呼吸阻力增大就要换!误区3:'胡须长不影响密封'真相:胡须者必须用电动送风面罩!\"[4:法规与创新]\"GB2626-2019规定:KN95口罩盐性粉尘过滤率≥95%!新技术:智能口罩可监测呼吸阻力,报警提醒更换!——合规是底线,科技向未来!\"",
|
||||
"CustomScreenValue": "1`2`3`4`5`6`7`8`9",
|
||||
"Name": "qw",
|
||||
"Sex": "男",
|
||||
"Age": "30",
|
||||
"IdNumber": "25",
|
||||
"Company": "南京",
|
||||
"CompanyAge": "3",
|
||||
"No": "CSI-665B",
|
||||
"FullMaskType": "随弃式面罩TIL-KN95",
|
||||
"BenDiNongdu": 0.374,
|
||||
"SamplingFlowRate": 2.0,
|
||||
"DryingFlowRate": 1.0,
|
||||
"MaskStandards": {
|
||||
"KN90": 13.0,
|
||||
"KP90": 13.0,
|
||||
"KN95": 11.0,
|
||||
"KP95": 11.0,
|
||||
"KN100": 5.0,
|
||||
"KP100": 5.0
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user