You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lj_plc/Actions/ChemicalWeighing/Mesnac.Action.ChemicalWeighing/FinishBatch/SaveHelper/AlarmSaveHelper.cs

194 lines
9.8 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using DevExpress.Xpo.DB;
using FastReport.Export.Dbf;
using HslCommunication;
using Mesnac.Codd.Session;
using Mesnac.DoUtils;
using Mesnac.PlcUtils;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
namespace Mesnac.Action.ChemicalWeighing.FinishBatch.SaveHelper
{
public class AlarmSaveHelper
{
/// <summary>
/// 报警保存事件定义
/// </summary>
public static event EventHandler OnAlarmSave;
public static event EventHandler OnAlarmSaveExtend;
public static object sender = null;
public static object senderExtend = null;
private static int WordLength = 16; //定义字长
private static PlcBusiness plcBusiness = PlcBusiness.Instance;
private static DoControl doControl = DoControl.Instance;
/// <summary>
/// 保存报警信息
/// </summary>
public static void Save()
{
List<Entity.AlarmInfo> _alarmInfoList = Cache.CacheHelper.AlarmInfoList;
List<Entity.SimpleAlarmInfo> _alarmBlockWordList = Cache.CacheHelper.BlockWordList;
ICSharpCode.Core.LoggingService<AlarmSaveHelper>.Debug("报警参数-实时刷新自动保存报警...");
#region 读取PLC的报警数据 原方法 Delete By wenjy 2023-08-07 17:10:07
//foreach (Entity.AlarmInfo info in _alarmInfoList)
//{
// Int16[] buff = null;
// if (BasePlcHelper.Instance.PlcRead(info.AlarmPLC, info.AlarmBlock, info.Start, info.Length, out buff))
// {
// foreach (Entity.SimpleAlarmInfo sai in _alarmBlockWordList)
// {
// if (sai.AlramPLC == info.AlarmPLC && sai.AlarmBlock == info.AlarmBlock) //匹配数据块
// {
// sai.AlarmData = buff[sai.AlarmAddress - info.Start]; //对起始字偏移,为当前字的报警值
// sai.AlarmData = Mesnac.Basic.DataProcessor.Swap(sai.AlarmData); //注意西门子PLC需要高低位转换
// }
// }
// }
// else
// {
// ICSharpCode.Core.LoggingService<AlarmSaveHelper>.Warn(String.Format("从PLC读取报警数据失败:PLC={0},Block={1},Start={2},Len={3}", info.AlarmPLC, info.AlarmBlock, info.Start, info.Length));
// }
//}
#endregion
#region 保存报警数据 原方法 Delete By wenjy 2023-08-07 18:05:06
//foreach (Entity.SimpleAlarmInfo sai in _alarmBlockWordList)
//{
// int[] binaryAlarmData = Mesnac.Basic.DataProcessor.ParseBinaryValue(sai.AlarmData, WordLength);
// for (int i = 0; i < WordLength; i++)
// {
// if (sai.IsSaveAlarm[i] == true && binaryAlarmData[i] == 0)
// {
// //更新报警状态
// Entity.PmtAlarmInfo alarmInfo = Cache.CacheHelper.GetPmtAlarmInfoFromCache(sai.AlramPLC, sai.AlarmBlock, sai.AlarmAddress, i);
// if (alarmInfo != null)
// {
// Alarm.AlarmHelper.UpdateAlarmLogData(alarmInfo.Alarm_ID,DateTime.Now.ToString());
// //清除显示的报警列表信息
// if(Global.PublicVar.Instance.AlarmStrList.Exists(x => x == alarmInfo.AlarmName))
// {
// Global.PublicVar.Instance.AlarmStrList.Remove(alarmInfo.AlarmName);
// Global.PublicVar.Instance.isFlashFlag = true;
// Global.PublicVar.Instance.isFlashFlagExtend = true;
// }
// }
// }
// if (binaryAlarmData[i] == 0)
// {
// sai.IsSaveAlarm[i] = false;
// }
// if (sai.IsSaveAlarm[i] == false && binaryAlarmData[i] == 1)
// {
// sai.IsSaveAlarm[i] = true;
// //数据保存
// Entity.PmtAlarmInfo alarmInfo = Cache.CacheHelper.GetPmtAlarmInfoFromCache(sai.AlramPLC, sai.AlarmBlock, sai.AlarmAddress, i);
// if (alarmInfo != null)
// {
// Entity.LR_Alarmlog alarmLogData = new Entity.LR_Alarmlog();
// alarmLogData.Equip_Code = alarmInfo.Equip_Code;
// alarmLogData.Alarm_ID = alarmInfo.Alarm_ID;
// alarmLogData.Alarm_OccurTime = DateTime.Now.ToString();
// alarmLogData.Alarm_ClearTime = String.Empty;
// alarmLogData.Alarm_Status = 1;
// alarmLogData.Alarm_GUID = Guid.NewGuid().ToString().ToUpper();
// Alarm.AlarmHelper.InsertAlarmLogData(alarmLogData);
// Global.PublicVar.Instance.AlarmStrList.Add(alarmInfo.AlarmName);
// Global.PublicVar.Instance.isFlashFlag = true;
// Global.PublicVar.Instance.isFlashFlagExtend = true;
// }
// }
// }
//}
#endregion
foreach (Entity.AlarmInfo info in _alarmInfoList)
{
string address = $"DB{info.AlarmBlock}.DBX{info.AlarmWord}.{info.AlarmBit}";
OperateResult<bool> result = plcBusiness.readBoolValue(address);
ICSharpCode.Core.LoggingService<AlarmSaveHelper>.Debug(string.Format("{0}读取{1}", address, result.IsSuccess == true ? $"成功;读取结果:{result.Content}" : "失败"));
if (result.IsSuccess == true)
{
if (result.Content)
{
foreach (Entity.SimpleAlarmInfo sai in _alarmBlockWordList)
{
if (sai.AlramPLC == info.AlarmPLC && sai.AlarmBlock == info.AlarmBlock && sai.AlarmBit == info.AlarmBit) //匹配数据块
{
sai.AlarmData = Convert.ToInt16(result.Content); //对起始字偏移,为当前字的报警值
//打开报警灯:FIRST 关闭绿灯 SECOND 打开红灯
doControl.DOControl(DoUtils.enumInfo.DOName.Green, DoUtils.enumInfo.DOOnOff.Off);
doControl.DOControl(DoUtils.enumInfo.DOName.Red, DoUtils.enumInfo.DOOnOff.On);
//更新报警状态
Entity.PmtAlarmInfo alarmInfo = Cache.CacheHelper.GetPmtAlarmInfoFromCache(sai.AlramPLC, sai.AlarmBlock, sai.AlarmAddress, Convert.ToInt32(sai.AlarmBit));
if (alarmInfo != null)
{
Alarm.AlarmHelper.UpdateAlarmLogData(alarmInfo.Alarm_ID, DateTime.Now.ToString());
//清除显示的报警列表信息
if (Global.PublicVar.Instance.AlarmStrList.Exists(x => x == alarmInfo.AlarmName))
{
Global.PublicVar.Instance.AlarmStrList.Remove(alarmInfo.AlarmName);
Global.PublicVar.Instance.isFlashFlag = true;
Global.PublicVar.Instance.isFlashFlagExtend = true;
}
//保存报警信息
Entity.LR_Alarmlog alarmLogData = new Entity.LR_Alarmlog();
alarmLogData.Equip_Code = alarmInfo.Equip_Code;
alarmLogData.Alarm_ID = alarmInfo.Alarm_ID;
alarmLogData.Alarm_OccurTime = DateTime.Now.ToString();
alarmLogData.Alarm_ClearTime = String.Empty;
alarmLogData.Alarm_Status = 1;
alarmLogData.Alarm_GUID = Guid.NewGuid().ToString().ToUpper();
Alarm.AlarmHelper.InsertAlarmLogData(alarmLogData);
Global.PublicVar.Instance.AlarmStrList.Add(alarmInfo.AlarmName);
Global.PublicVar.Instance.isFlashFlag = true;
Global.PublicVar.Instance.isFlashFlagExtend = true;
}
}
}
}
else
{
// 关闭报警灯:FIRST 打开红灯 SECOND 关闭绿灯
doControl.DOControl(DoUtils.enumInfo.DOName.Red, DoUtils.enumInfo.DOOnOff.Off);
doControl.DOControl(DoUtils.enumInfo.DOName.Green, DoUtils.enumInfo.DOOnOff.On);
}
}
else
{
doControl.DOControl(DoUtils.enumInfo.DOName.Red, DoUtils.enumInfo.DOOnOff.Off);
}
}
#region 触发事件
if (OnAlarmSave != null && Global.PublicVar.Instance.isFlashFlag)
{
OnAlarmSave(sender, System.EventArgs.Empty);
}
if (OnAlarmSaveExtend != null && Global.PublicVar.Instance.isFlashFlagExtend)
{
OnAlarmSaveExtend(senderExtend, System.EventArgs.Empty);
}
#endregion
}
}
}