皮带秤的计量方式
董建刚
目前煤矿采取皮带方式运煤十分普遍,因为皮带秤只需前期投入资金设备,后续维护运营所需成本非常低,而且设备连续工作时间长、效率高、要求人力少,监控皮带发运数量成了煤炭运销工作的难点和重点。杭州国泰科技有限公司根据煤炭企业皮带发运的特点,结合自身在煤炭运销信息化领域的经验,推出了切合实际的皮带秤远程集中计量系统。该系统能根据皮带现场的实际情况,实现皮带秤的远程计量,不但可以对电子皮带的工作状态进行远程监控,而且可以实现皮带秤运行数据的实时管理和远程传输,达到远程集中管理、远程集中称重和防xx目的。
皮带秤远程集中计量系统采取多种管控方式,针对矿业企业皮带传输的目标客户不一样、运行时间不一样等特点,我们设计了手工/自动两种皮带秤系统计量方式,用户可以随时进行灵活切换。下面详细介绍两种计量方式。
手工计量控制方式。该方式适用于利用皮带进行装船或者有严格时间段进煤的业务类型。皮带秤监磅员在皮带开启前与远程计量中心司磅员进行电话确认,待远程计量人员保存初始重量并确认后方可开启皮带,在关闭皮带后也需与远程计量人员电话沟通并确认保存最终重量,并及时核对远程计量中心打印的磅单。司磅员通过皮带秤远程称重客户端手工保存仪表初始量或者结束量、图片等信息,系统自动完成净重信息的核算。该控制方式操作模式比较简单,一般一个司磅员能同时管控5-8个皮带秤,如下图,皮带秤远程称重客户端集成了5套皮带机,轮询切换各个皮带机运行情况。
自动计量方式。该方式适用于进煤时间段不确定的业务类型,如电厂一般需要全天24小时不定时进煤,那么如果采用远程手工计量控制方式会大大增加员工工作量。在国泰皮带秤远程集中计量系统中,针对每个皮带秤的配置信息,都可以进行参数设置,如自动计量模式启用设定、自动保存初始值时间设定、自动保存结束值时间设定、皮带开停状态对应信号量设置等等(默认系统设置一个时间点,如AM:6表示每天早上6点数据自动保存,当天6点仪表的累计量减去前一日6点仪表的累计量即为前一日的发运量)。系统会根据设定的时间,自动提取消息队列中对应皮带秤的仪表数据,并在数据库中完成自动匹配,计算出该周期内的发运净重,同时截取皮带秤相关视频图片,自动保存仪表数据、当时图片等信息。国泰皮带秤远程集中计量系统同时考虑了自动方式下,如果仪表清零情况的处理,系统针对每个皮带秤设置了仪表数据缓存,当发生清零情况下,系统服务会自动对清零前后的数据进行匹配记录,保证发运数据的正确性。自动保存核心业务逻辑程序如下:
/// <summary>
/// 定时自动保存皮带秤数据,默认采取单一时间
</summary>
/// <param name="hardwareInfo">硬件消息</param>
/// <param name="beltAutoBuffer">皮带秤的缓存信息</param>
public void AutoSaveBeltData(HardwareInfo hardwareInfo, BeltAutoBuffer beltAutoBuffer) {
if (beltAutoBuffer != null && beltAutoBuffer.SaveStyle != null && beltAutoBuffer.SaveStyle.Count > 0) {
string balanceName = hardwareInfo.Balance;
if (beltAutoBuffer.SaveStyle.ContainsKey(balanceName))
{
WeighBdForZKBelt beltBD = new WeighBdForZKBelt();
string startHour;
beltAutoBuffer.StartHour.TryGetValue(balanceName, out startHour);
DateTime startTime= Now.Date.AddHours(Convert.ToDouble(startHour));
TimeSpan startTs = DateTime.Now - startTime;
//处理是否是仪表清零的情况
if (beltAccumulateBuffer.ContainsKey(balanceName))
{
decimal preAccumulateNum = 0;
beltAccumulateBuffer.TryGetValue(balanceName,out preAccumulateNum);
if (hardwareInfo.BeltInfo.AccumulateNum == 0 || preAccumulateNum - hardwareInfo.BeltInfo.AccumulateNum > 1)
{
//出现清零情况,先保存上一毛重,再保存下一皮重
WeighDTO[] preWeighDtos = beltBD.FindUnpairWeigh(balanceName, Now.Date.AddDays(-1)); //查询昨日以后的未匹配记录
if (preWeighDtos != null && preWeighDtos.Length > 0){
//先保存上一毛重
this.AddSecondBeltWeigh(balanceName, preAccumulateNum, preWeighDtos[0]);
}
//再保存下一皮重
this.AddFirstBeltWeigh(balanceName, hardwareInfo.BeltInfo.AccumulateNum);
//处理清零时间缓存
if (beltZeroList.ContainsKey(balanceName))
beltZeroList[balanceName] = DateTime.Now.Date;
else beltZeroList.Add(balanceName, DateTime.Now.Date);
//记录日志
BeltLogBD logBD = new BeltLogBD();
BeltLogDTO logDTO = new BeltLogDTO();
OrganizationBD organizationBD = new OrganizationBD();
QueryParams[] paras = new QueryParams[1];
paras[0] = new QueryParams("Name", balanceName, OperationType.Equal);
BalanceDTO[] balanceDtos = organizationBD.FindBalanceByCondition(paras, null, 0, 1);
logDTO.Balance = balanceDtos[0];
logDTO.Content = balanceName + "于" + DateTime.Now + "仪表清零;清零前重量:" + preAccumulateNum.ToString() + ",清零后重量:" + hardwareInfo.BeltInfo.AccumulateNum.ToString();
logDTO.LogType = BeltLogType.Clear;
logDTO.LogTime = DateTime.Now;
logBD.AddBeltLog(logDTO);
}
beltAccumulateBuffer[balanceName] = hardwareInfo.BeltInfo.AccumulateNum;
}
else beltAccumulateBuffer.Add(balanceName, hardwareInfo.BeltInfo.AccumulateNum);
if (startTs.TotalMinutes > 0 && startTs.TotalMinutes < 5)
{
WeighDTO[] weighDtos = null;
//当日发生过清零情况
if (beltZeroList.ContainsKey(balanceName) &&
beltZeroList[balanceName].Equals(Now.Date))
weighDtos = beltBD.FindUnpairWeigh(balanceName, DateTime.Now.Date);
else //查询昨日或之前的未匹配过皮重
weighDtos = beltBD.FindYesterdayUnpairWeigh(balanceName, startTime);
if (weighDtos != null && weighDtos.Length > 0)
this.AddSecondBeltWeigh(balanceName, hardwareInfo.BeltInfo.AccumulateNum, weighDtos[0]);
//保存当日皮重
WeighDTO[] todayWeighDtos = beltBD.FindUnpairWeigh(balanceName, startTime);
if (todayWeighDtos == null || todayWeighDtos.Length <= 0)
this.AddFirstBeltWeigh(balanceName, hardwareInfo.BeltInfo.AccumulateNum);
}
}
}
}