using System; using System.Collections; using System.Windows.Forms; using Core.StlMes.Client.LgClassModel; using CoreFS.CA06; namespace Core.StlMes.Client.LgCommon { /// /// 命令发送公用 /// public class ClsCommandPack { private OpeBase _ob; private COM_STL_COMMAND _csc; // private string _HeatProcessNo = ""; //加热处理号 private string _OBJECTPOS = ""; //设备位置 如:LFS01_FRONT private string _DEVICE_POSITION = ""; //设备编码 如:LFS01 private string[] _HeatProcessBuffer = new string[] { "", "", "", "" }; //各设备位置加热处理号:[0]:IDLE [1]:FRONT [2]DEVICE [3]BACK private WORKBIT _WorkBit = WORKBIT.NONE; //FRONT:1#小车 BACK:2#小车 DEVICE:精炼位 0不变化 public string strObjectID = "12100000"; //转炉加载默从PPC_STEEL_HEATNO取对应工序最小炉号,脱硫由作业界面生成脱硫号 /// /// 切换岗位信息(FRONT:1#小车 BACK:2#小车 DEVICE:精炼位 NONE:不变化) /// public WORKBIT WorkBit { get { return _WorkBit; } } public ClsCommandPack(OpeBase ob) { this._ob = ob; } /// /// 发送命令 /// /// /// /// private bool SendCommand(RealDataCommand realDataCommand, out string strMsg) { strMsg = ""; if (realDataCommand == null) { strMsg = "指令不能为空!"; return false; } ArrayList Args = new ArrayList(); Args.Add(realDataCommand.COMMANDTYPE); Args.Add(realDataCommand.OBJECTPOS); Args.Add(realDataCommand.OBJECTID); Args.Add(realDataCommand.STR_VALUE); Args.Add(realDataCommand.FLT_VALUE.ToString()); Args.Add(realDataCommand.OBJECTIP); Args.Add(realDataCommand.SENDTYPE); CoreClientParam ccp = new CoreClientParam(); try { ccp.IfShowErrMsg = false; ccp.ServerName = "Core.LgMes.Server.LgJobMgt.SchedulingCommandMgt"; ccp.MethodName = "AddNewCommand"; ccp.ServerParams = new object[] { Args }; ccp = _ob.ExecuteNonQuery(ccp, CoreInvokeType.Internal); strMsg = ccp.ReturnInfo; } catch (Exception ex) { string strErr = (ccp == null ? "" : ccp.ReturnInfo); if (string.IsNullOrEmpty(strErr)) strMsg = ex.Message; else strMsg = strErr; } if (string.IsNullOrEmpty(strMsg)) return true; else return false; } /// /// 加载炉次计划命令(不能指定炉号,系统自动查找最小排产炉号) /// /// BOF0?_DEVICE、HMP0?_DEVICE /// public bool CommandCharge(string srcPos) { bool bSuccess = false; try { RealDataCommand realDataCommand = new RealDataCommand(); realDataCommand.COMMANDTYPE = "SCHEDULE_CHARGE"; realDataCommand.OBJECTID = strObjectID; realDataCommand.OBJECTPOS = srcPos; realDataCommand.STR_VALUE = srcPos; realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP(); realDataCommand.SENDTYPE = "0"; string strMsg = ""; bSuccess = SendCommand(realDataCommand, out strMsg); if (!bSuccess) MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } catch { } return bSuccess; } /// /// 发送钢水到目标位置 /// /// 原始位置加热处理号 /// 原始位置 如:BOF01_DEVICE /// 目标位置 如:BOF01_BACK /// public bool CommandMove(string HeatProcessNo, string srcPos, string destPos) { bool bSuccess = false; try { RealDataCommand realDataCommand = new RealDataCommand(); realDataCommand.COMMANDTYPE = "SCHEDULE_MOVE"; realDataCommand.OBJECTID = HeatProcessNo; realDataCommand.OBJECTPOS = srcPos; realDataCommand.STR_VALUE = destPos; realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP(); realDataCommand.SENDTYPE = "0"; string strMsg = ""; bSuccess = SendCommand(realDataCommand, out strMsg); if (!bSuccess) MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } catch { } return bSuccess; } /// /// 钢包位置交换 /// /// 原始位置加热处理号 /// 原始位置 如:LFS01_FRONT /// [0]:IDLE [1]:FRONT [2]DEVICE [3]BACK public bool CommandTrans(string HeatProcessNo, string srcPos, string[] HeatProcessBuffer) { bool bSuccess = false; if (string.IsNullOrEmpty(srcPos) || srcPos.Length < 5) return false; if (HeatProcessBuffer == null || HeatProcessBuffer.Length < 4) return false; string strIdleID = HeatProcessBuffer[0]; string strFrontID = HeatProcessBuffer[1]; string strDeviceID = HeatProcessBuffer[2]; string strBackID = HeatProcessBuffer[3]; string desPos = ""; if (srcPos.IndexOf("_FRONT") > -1) { if (!string.IsNullOrEmpty(strDeviceID)) desPos = srcPos.Substring(0, 5) + "_DEVICE"; //FRONT -> DEVICE if (!string.IsNullOrEmpty(strBackID)) desPos = srcPos.Substring(0, 5) + "_BACK"; //FRONT -> BACK } else if (srcPos.IndexOf("_DEVICE") > -1) { if (!string.IsNullOrEmpty(strBackID)) desPos = srcPos.Substring(0, 5) + "_BACK"; //DEVICE -> BACK if (!string.IsNullOrEmpty(strFrontID)) desPos = srcPos.Substring(0, 5) + "_FRONT"; //DEVICE -> FRONT } else if (srcPos.IndexOf("_BACK") > -1) { if (!string.IsNullOrEmpty(strDeviceID)) desPos = srcPos.Substring(0, 5) + "_DEVICE"; //BACK -> DEVICE if (!string.IsNullOrEmpty(strFrontID)) desPos = srcPos.Substring(0, 5) + "_FRONT"; //BACK -> FRONT } if (string.IsNullOrEmpty(desPos)) { MessageBox.Show("无可置换位置的钢水!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return false; } try { RealDataCommand realDataCommand = new RealDataCommand(); realDataCommand.COMMANDTYPE = "SCHEDULE_TRANS"; realDataCommand.OBJECTID = HeatProcessNo; realDataCommand.OBJECTPOS = srcPos; realDataCommand.STR_VALUE = desPos; realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP(); realDataCommand.SENDTYPE = "0"; string strMsg = ""; bSuccess = SendCommand(realDataCommand, out strMsg); if (!bSuccess) MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } catch { } return bSuccess; } /// /// 手动执行操作 /// /// 设备位置 如:LFS01_FRONT /// 各设备位置加热处理号:[0]:IDLE [1]:FRONT [2]DEVICE [3]BACK /// 当前岗位手动操作配置集合 public void BeginManualOperate(string ObjectPos, string[] HeatProcessBuffer, CommandCollection CC) { ObjectPos = ObjectPos.Trim().ToUpper(); if (string.IsNullOrEmpty(ObjectPos) || ObjectPos.Length <= 6) return; if (HeatProcessBuffer == null || HeatProcessBuffer.Length < 4) return; string strPos = ObjectPos.Substring(5); if (strPos.Equals("_IDLE")) this._HeatProcessNo = HeatProcessBuffer[0]; else if (strPos.Equals("_FRONT")) this._HeatProcessNo = HeatProcessBuffer[1]; else if (strPos.Equals("_DEVICE")) this._HeatProcessNo = HeatProcessBuffer[2]; else if (strPos.Equals("_BACK")) this._HeatProcessNo = HeatProcessBuffer[3]; else { this._HeatProcessNo = ""; MessageBox.Show("设备位置:" + ObjectPos + " 无法识别!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } if (ObjectPos.Substring(0, 3).Equals("HMP")) { if (ClsBusinessPack.HudwProcessNoValid(_HeatProcessNo)) _HeatProcessNo = _HeatProcessNo.Substring(0, (int)OBJLEN.nHudwProcessNo); else _HeatProcessNo = ""; } else { if (ClsBusinessPack.HeatProccessNoValid(_HeatProcessNo)) _HeatProcessNo = _HeatProcessNo.Substring(0, (int)OBJLEN.nHeatProcessNo); else _HeatProcessNo = ""; } if (string.IsNullOrEmpty(_HeatProcessNo)) { MessageBox.Show("当前岗位无生产任务,无法操作!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } this._WorkBit = WORKBIT.NONE; //默认不切换工位显示 this._OBJECTPOS = ObjectPos; //设备位置 this._DEVICE_POSITION = ObjectPos.Substring(0, 5); //设备编码 this._HeatProcessBuffer = HeatProcessBuffer; //各工位加热处理号 frmManualOperate frm = new frmManualOperate(_DEVICE_POSITION, _OBJECTPOS, CC); frm.Location = ClsControlPack.GetChildWindowLocation(frm.Size); if (frm.ShowDialog() == DialogResult.OK) { this._csc = frm.CSC; this.AnaliseCommand(); } } /// /// 解析操作 /// private void AnaliseCommand() { if (_csc == null) return; try { string strMsg = ""; string destPos = ""; string destID = ""; bool Successfull = false; string ConfirmMsg = AnaliseDevide(_DEVICE_POSITION) + GetHeatNo(_DEVICE_POSITION) + " "; if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.ARRIVE || _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.ASSIGNEDPOS || _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.TAPPING || _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.MELTDOWN || _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.OVER) //进站、上台、指定位置、出钢、回炉、强制结束 { ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?"; if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return; destPos = (_csc.OBJECTPOS.IndexOf("%") > -1 ? _csc.OBJECTPOS.Replace("%", _DEVICE_POSITION) : _csc.OBJECTPOS); if (_csc.OPTCOMMANDTYPE != COM_STL_COMMAND_CMDTYPE.MELTDOWN && _csc.OPTCOMMANDTYPE != COM_STL_COMMAND_CMDTYPE.OVER && !AssignedPosValid(destPos)) return; Successfull = CommandMove(_HeatProcessNo, _OBJECTPOS, destPos); } else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.LEAVE || _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.GONEXT) //出站、去下道工序 { Successfull = ClsBusinessPack.GetNextPos(_HeatProcessNo, out destPos, out destID, out strMsg, _ob); if (!Successfull) return; strMsg = AnaliseObjectPos(destPos); if (!string.IsNullOrEmpty(destID)) { strMsg = AnaliseObjectPos(destPos); MessageBox.Show(strMsg + "有任务生产,请稍后再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.LEAVE) ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?"; else ConfirmMsg += "去 " + strMsg + "\n是否确认?"; if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return; Successfull = CommandMove(_HeatProcessNo, _OBJECTPOS, destPos); } else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.TRANS) //钢包位置对换 { ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?"; if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return; Successfull = CommandTrans(_HeatProcessNo, _OBJECTPOS, _HeatProcessBuffer); } else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.OPENCAST || _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.STOPCAST) //开浇、停浇 { Successfull = true;//无钢水调动操作、只需要更新相关字段 } else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.SWITCH) //显示工位切换 { if (_csc.OBJECTPOS.Contains("FRONT")) _WorkBit = WORKBIT.FRONT; else if (_csc.OBJECTPOS.Contains("DEVICE")) _WorkBit = WORKBIT.DEVICE; else if (_csc.OBJECTPOS.Contains("BACK")) _WorkBit = WORKBIT.BACK; else _WorkBit = WORKBIT.NONE; } //设置关键时间 if (Successfull) ClsBusinessPack.UpdateTimeNode(_csc, _HeatProcessNo, _ob); } catch { } } /// /// 验证指定设备位置是否空闲 /// /// /// private bool AssignedPosValid(string ObjectPos) { if (string.IsNullOrEmpty(ObjectPos)) { MessageBox.Show("目标位置未指定!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return false; } string strMsg = ""; bool bSuccess = false; string ObjectID = ClsBusinessPack.GetDesignatedObjectID(ObjectPos, out bSuccess, out strMsg, this._ob); string str = AnaliseObjectPos(ObjectPos); if (!bSuccess) { MessageBox.Show(str + "生产信息获取失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return false; } if (!string.IsNullOrEmpty(ObjectID)) { MessageBox.Show(str + "有任务生产,请稍后再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return false; } return true; } /// /// 根据设备位置获取炉号类别 /// /// /// private string AnaliseDevide(string DEVICE_POSITION) { return (DEVICE_POSITION.Substring(0, 3) == "HMP" ? "脱硫号" : "炉号") + ":"; } /// /// 获取脱硫号或者炉号 /// /// /// private string GetHeatNo(string DEVICE_POSITION) { if (DEVICE_POSITION.Substring(0, 3) == "HMP") return ClsBusinessPack.getHudwIdID(this._HeatProcessNo); else return ClsBusinessPack.getSmeltingID(this._HeatProcessNo); } /// /// 证设备位置为中文名称 /// /// /// private string AnaliseObjectPos(string ObjectPos) { try { ObjectPos = ObjectPos.Trim().ToUpper(); if (string.IsNullOrEmpty(ObjectPos)) return ""; if (!ObjectPos.Contains("_")) return ""; string[] str = ObjectPos.Split(new string[] { "_" }, StringSplitOptions.None); str[0] = ClsBusinessPack.GetDeviceChineseName(str[0]); str[1] = ClsBusinessPack.analysPosName(ObjectPos); return str[0] + str[1] + ""; } catch { } return ""; } } /// /// 工位显示(主要为LF、RH、VD设备提供) /// public enum WORKBIT : int { /// /// 不变化 /// NONE = 0, /// /// 切换到FRONT(1#小车位) /// FRONT = 1, /// /// 切换到BACK(2#小车位) /// BACK = 2, /// /// 切换到DEVICE(处理位) /// DEVICE = 3, /// /// 切换到IDLE(缓冲位) /// IDLE = 4 } public enum DeviceCode : int { MIS = 20, MIS01 = 1, MIS02 = 2, HMP = 21, HMP01 = 1, HMP02 = 2, HMP03 = 3, BOF = 22, BOF01 = 1, BOF02 = 2, BOF03 = 3, BOF04 = 4, BOF05 = 5, CAS = 23, CAS01 = 1, CAS02 = 2, CAS03 = 3, CAS04 = 4, CAS05 = 5, LFS = 24, LFS01 = 1, LFS02 = 2, LFS03 = 3, RHS = 25, RHS01 = 1, RHS02 = 2, RHS03 = 3, CCM = 26, CCM01 = 1, CCM02 = 2, CCM03 = 3, CCM04 = 4, CCM05 = 5 } }