using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Mesnac.Action.Base;
using Mesnac.Action.Feeding.BasicInfo;
using Mesnac.Codd.Session;
using System.Data;
namespace Mesnac.Action.Feeding.FinishBatch
{
///
/// 设置系统报警
///
public class SetAlarmStatus : FeedingAction , IAction
{
public const int WordLength = 16;
///
/// 胶料秤手动自动
///
private static int RubAutoTag = 2;
///
/// 炭黑秤手动自动
///
private static int CalAutoTag = 2;
///
/// 油秤手动自动
///
private static int OilAutoTag = 2;
///
/// 粉料手动自动
///
private static int FenlAutoTag = 2;
///
/// 密炼机手动自动
///
private static int MixAutoTag = 2;
private static bool[] _isSaveAlarm1 = new bool[WordLength] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; //是否保存过报警记录
private static bool[] _isSaveAlarm2 = new bool[WordLength] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; //是否保存过报警记录
private static bool[] _isSaveAlarm3 = new bool[WordLength] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; //是否保存过报警记录
private static bool[] _isSaveAlarm4 = new bool[WordLength] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }; //是否保存过报警记录
///
/// 业务入口
///
///
public void Run(RuntimeParameter runtime)
{
base.RunIni(runtime);
this.SaveAlarm(PlcData.Instance.AlarmData1, ref _isSaveAlarm1);
this.SaveAlarm(PlcData.Instance.AlarmData2, ref _isSaveAlarm2);
this.SaveAlarm(PlcData.Instance.AlarmData3, ref _isSaveAlarm3);
this.SaveAlarm(PlcData.Instance.AlarmData4, ref _isSaveAlarm4);
//胶秤手动、自动日志
if (PlcData.Instance.PloyAuto.LastValue.ToInt() != SetAlarmStatus.RubAutoTag)
{
if (SetAlarmStatus.RubAutoTag != 2)
{
SetAlarmStatus.RubAutoTag = PlcData.Instance.PloyAuto.LastValue.ToInt();
if (SetAlarmStatus.RubAutoTag == 1)
{
base.DBLog("基本操作", "胶秤手动转自动", "");
}
else
{
base.DBLog("基本操作", "胶秤自动转手动", "");
}
}
else
{
SetAlarmStatus.RubAutoTag = PlcData.Instance.PloyAuto.LastValue.ToInt();
}
}
//炭黑秤手动、自动日志
if (PlcData.Instance.CarbonAuto.LastValue.ToInt() != SetAlarmStatus.CalAutoTag)
{
if (SetAlarmStatus.CalAutoTag != 2)
{
SetAlarmStatus.CalAutoTag = PlcData.Instance.CarbonAuto.LastValue.ToInt();
if (SetAlarmStatus.CalAutoTag == 1)
{
base.DBLog("基本操作", "炭黑秤手动转自动", "");
}
else
{
base.DBLog("基本操作", "炭黑秤自动转手动", "");
}
}
else
{
SetAlarmStatus.CalAutoTag = PlcData.Instance.CarbonAuto.LastValue.ToInt();
}
}
//油秤手动自动日志
if (PlcData.Instance.OilAuto.LastValue.ToInt() != SetAlarmStatus.OilAutoTag)
{
if (SetAlarmStatus.OilAutoTag != 2)
{
SetAlarmStatus.OilAutoTag = PlcData.Instance.OilAuto.LastValue.ToInt();
if (SetAlarmStatus.OilAutoTag == 1)
{
base.DBLog("基本操作", "油秤手动转自动", "");
}
else
{
base.DBLog("基本操作", "油秤自动转手动", "");
}
}
else
{
SetAlarmStatus.OilAutoTag = PlcData.Instance.OilAuto.LastValue.ToInt();
}
}
//粉料手动自动日志
if (PlcData.Instance.FenLiaoAuto.LastValue.ToInt() != SetAlarmStatus.FenlAutoTag)
{
if (SetAlarmStatus.FenlAutoTag != 2)
{
SetAlarmStatus.FenlAutoTag = PlcData.Instance.FenLiaoAuto.LastValue.ToInt();
if (SetAlarmStatus.FenlAutoTag == 1)
{
base.DBLog("基本操作", "粉料秤手动转自动", "");
}
else
{
base.DBLog("基本操作", "粉料秤手动转自动", "");
}
}
else
{
SetAlarmStatus.FenlAutoTag = PlcData.Instance.FenLiaoAuto.LastValue.ToInt();
}
}
//密炼机手动自动日志
if (PlcData.Instance.MixerAuto.LastValue.ToInt() != SetAlarmStatus.MixAutoTag)
{
if (SetAlarmStatus.MixAutoTag != 2)
{
SetAlarmStatus.MixAutoTag = PlcData.Instance.MixerAuto.LastValue.ToInt();
if (SetAlarmStatus.MixAutoTag == 1)
{
base.DBLog("基本操作", "密炼机本控转遥控", "");
}
else
{
base.DBLog("基本操作", "密炼机遥控转本控", "");
}
}
else
{
SetAlarmStatus.MixAutoTag = PlcData.Instance.MixerAuto.LastValue.ToInt();
}
}
}
#region 辅助方法
#region 保存系统报警日志
///
/// 保存系统报警日志
///
///
public void SaveAlarm(PlcData.DataKeyValue dataKeyValue , ref bool[] isSaveAlarm)
{
int[] alarmData = Global.ParseBinaryValue(dataKeyValue.LastValue.ToInt(), WordLength);
for (int i = 0; i < WordLength; i++)
{
if (alarmData[i] == 0)
{
isSaveAlarm[i] = false;
}
if (isSaveAlarm[i] == false && alarmData[i] == 1)
{
//数据保存
this.AlarmStr(dataKeyValue.EquipData.Start, i, true);
isSaveAlarm[i] = true;
}
}
}
#endregion
#region 保存报警信息至数据库表
///
/// 保存报警信息至数据库表
///
/// 报警信息地址
/// 报警信息位
/// 是否记录日志
public void AlarmStr(int alarm_address, int alarm_bit, bool logFlag)
{
string templotbar = String.Empty; //下一车的架子号
if (!this.IsExistsAlarmInfo(alarm_address,alarm_bit))
{
return;
}
if (RecipeCache.Instance.PlanInfo == null || string.IsNullOrEmpty(RecipeCache.Instance.PlanInfo.PlanID))
{
return;
}
templotbar = RecipeCache.Instance.PlanInfo.PlanID.Trim() + (PlcData.Instance.MixingFinishedCount.LastValue.ToInt() + 1).ToString("D4");
//1、获取下一车的架子号
//templotbar:=sctm(barfirst,false)
//2、如果PLC连接正常
//If plccon=1 Then
//if tempstr='密炼机超时' then
// OvertimeAlarm:=1;
// tastr:= SumCheckAlarm(tempstr);
// AlarmBatchStr:=tastr;
// Frm_main.AlarmList.Items.Add(tempstr+'报警');
// Frm_main.panalarm.Caption:= tempstr+'报警';
if (logFlag)
{
DbHelper localHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Local);
if (localHelper == null)
{
ICSharpCode.Core.LoggingService.Error("获取本地数据连接失败,无法记录系统报警...");
return;
}
AlarmInfo info = this.GetAlarmInfo(alarm_address, alarm_bit);
try
{
localHelper.CommandType = System.Data.CommandType.Text;
localHelper.ClearParameter();
string strSql = "insert into PmtAlarmCode(acdetail,acbz1,acbz2,Recordtime) values(@acdetail,@acbz1,@acbz2,getdate())";
localHelper.CommandText = strSql;
localHelper.AddParameter("@acdetail", templotbar);
localHelper.AddParameter("@acbz1", info.AlarmName);
localHelper.AddParameter("@acbz2", String.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now));
localHelper.ExecuteNonQuery();
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("保存本地报警日志错误:" + ex.Message, ex);
}
if (base.FarControlType == 1 || base.NetType == NetTypes.Net)
{
string netMsg = Global.ProtocalHeader.ReceiveAlarmDataIpNumber + ":" + info.AlarmName + "/";
Mesnac.Communication.TcpService.Instance.NetSendMsg(netMsg);
}
if (base.NetType == NetTypes.Net)
{
try
{
DbHelper serverHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Server);
if (serverHelper == null)
{
ICSharpCode.Core.LoggingService.Error("获取网络数据连接失败,无法记录系统报警...");
return;
}
serverHelper.CommandType = CommandType.Text;
serverHelper.ClearParameter();
#region 玲珑故障保存
//string strSql3 = "insert into EqmMixerFault(FaultCode,FaultName,FaultPosition,AlarmState,FaultDate,FaultType,EquipCode,WorkShopCode) Values(@FaultCode,@FaultName,@FaultPosition,@AlarmState,GetDate(),@FaultType,@EquipCode,@WorkShopCode)";
//serverHelper.CommandText = strSql3;
//serverHelper.AddParameter("@FaultCode", info.SerialId);
//serverHelper.AddParameter("@FaultName", info.AlarmName);
//serverHelper.AddParameter("@FaultPosition", info.SerialId);
//serverHelper.AddParameter("@AlarmState", info.MemNote);
//serverHelper.AddParameter("@FaultType", info.MemNote);
//serverHelper.AddParameter("@EquipCode", base.CurrEquipCode);
//serverHelper.AddParameter("@WorkShopCode", this.GetWorkShopCode());
//serverHelper.ExecuteNonQuery();
#endregion
#region 清泉故障保存
string strSql3 = "insert into ppt_alarm(barcode,alarmStr,opertime,EquipCode) values (@barcode,@alarmStr,@opertime,@EquipCode)";
serverHelper.CommandText = strSql3;
serverHelper.AddParameter("@barcode", templotbar);
serverHelper.AddParameter("@alarmStr", info.AlarmName);
serverHelper.AddParameter("@opertime", DateTime.Now.ToString());
serverHelper.AddParameter("@EquipCode", base.CurrEquipCode);
serverHelper.ExecuteNonQuery();
#endregion
}
catch (Exception ex)
{
ICSharpCode.Core.LoggingService.Error("保存网络报警日志错误:" + ex.Message, ex);
}
}
}
}
#endregion
#region 判断本地报警信息表中是否存在对应地址位的报警信息
///
/// 判断本地报警信息表中是否存在对应地址位的报警信息
///
/// 报警地址
/// 数据位
/// 如果存在返回true,否则返回false
public bool IsExistsAlarmInfo(int alarm_address, int alarm_bit)
{
DbHelper localHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Local);
if (localHelper == null)
{
ICSharpCode.Core.LoggingService.Error("获取本地数据连接失败!");
return false;
}
localHelper.CommandType = CommandType.Text;
localHelper.ClearParameter();
string strSql = "Select count(*) from [Pmt_AlarmInfo] where [Alarm_address] = @Alarm_address and [Alarm_bit] = @Alarm_bit";
localHelper.CommandText = strSql;
localHelper.AddParameter("@Alarm_address", alarm_address);
localHelper.AddParameter("@Alarm_bit", alarm_bit);
object result = localHelper.ToScalar();
if (result == null || result == System.DBNull.Value)
{
return false;
}
if (Convert.ToInt32(result) > 0)
{
return true;
}
else
{
return false;
}
}
#endregion
#region 根据报警地址和报警位,获取报警信息
///
/// 根据报警地址和报警位,获取报警信息
///
/// 报警地址
/// 报警位
/// 返回报警信息
public AlarmInfo GetAlarmInfo(int alarm_address, int alarm_bit)
{
DbHelper localHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Local);
if (localHelper == null)
{
ICSharpCode.Core.LoggingService.Error("获取本地数据连接失败!");
return null;
}
localHelper.CommandType = CommandType.Text;
localHelper.ClearParameter();
string strSql = "Select [objid],[Alarm_address],[Alarm_bit],[Alarm_Code],[Alarm_Name],[Alarm_Position],[mem_note] From [Pmt_AlarmInfo] where [Alarm_address] = @Alarm_address and [Alarm_bit] = @Alarm_bit";
localHelper.CommandText = strSql;
localHelper.AddParameter("@Alarm_address", alarm_address);
localHelper.AddParameter("@Alarm_bit", alarm_bit);
DataTable table = localHelper.ToDataTable();
AlarmInfo info = null;
if (table != null && table.Rows.Count > 0)
{
info = new AlarmInfo();
info.SerialId = Convert.ToInt32(table.Rows[0]["objid"]);
info.AlarmAddress = Convert.ToInt32(table.Rows[0]["Alarm_address"]);
info.AlarmBit = Convert.ToInt32(table.Rows[0]["Alarm_bit"]);
info.AlarmCode = table.Rows[0]["Alarm_Code"] as string;
info.AlarmName = table.Rows[0]["Alarm_Name"] as string;
info.AlarmPosition = table.Rows[0]["Alarm_Position"] as string;
info.MemNote = table.Rows[0]["mem_note"] as string;
}
return info;
}
#endregion
#region 获取本机台对应的车间编号
///
/// 获取本机台对应的车间编号
///
/// 返回本机台对应的车间编号,获取失败返回0
public int GetWorkShopCode()
{
DbHelper serverHelper = base.NewDbHelper(Basic.DataSourceFactory.MCDbType.Server);
if (serverHelper == null)
{
ICSharpCode.Core.LoggingService.Error("获取网络数据连接失败,无法记录系统报警...");
return 0;
}
serverHelper.CommandType = CommandType.Text;
serverHelper.ClearParameter();
string strSql = "select WorkShop_Code from Pmt_equip where Equip_Code = @EquipCode";
serverHelper.CommandText = strSql;
serverHelper.AddParameter("@EquipCode", base.CurrEquipCode);
object result = serverHelper.ToScalar();
if (result == null && result == System.DBNull.Value)
{
return 0;
}
else
{
return Convert.ToInt32(result);
}
}
#endregion
#endregion
}
#region 报警信息类
///
/// 报警信息类
///
[Serializable]
public class AlarmInfo
{
private int _serialId;
private int _alarmAddress;
private int _alarmBit;
private string _alarmCode;
private string _alarmName;
private string _alarmPosition;
private string _memNote;
public int SerialId
{
get { return _serialId; }
set { _serialId = value; }
}
public int AlarmAddress
{
get { return _alarmAddress; }
set { _alarmAddress = value; }
}
public int AlarmBit
{
get { return _alarmBit; }
set { _alarmBit = value; }
}
public string AlarmCode
{
get { return _alarmCode; }
set { _alarmCode = value; }
}
public string AlarmName
{
get { return _alarmName; }
set { _alarmName = value; }
}
public string AlarmPosition
{
get { return _alarmPosition; }
set { _alarmPosition = value; }
}
public string MemNote
{
get { return _memNote; }
set { _memNote = value; }
}
}
#endregion
}