ClsCommandPack.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. using System;
  2. using System.Collections;
  3. using System.Windows.Forms;
  4. using Core.StlMes.Client.LgClassModel;
  5. using CoreFS.CA06;
  6. namespace Core.StlMes.Client.LgCommon
  7. {
  8. /// <summary>
  9. /// 命令发送公用
  10. /// </summary>
  11. public class ClsCommandPack
  12. {
  13. private OpeBase _ob;
  14. private COM_STL_COMMAND _csc; //
  15. private string _HeatProcessNo = ""; //加热处理号
  16. private string _OBJECTPOS = ""; //设备位置 如:LFS01_FRONT
  17. private string _DEVICE_POSITION = ""; //设备编码 如:LFS01
  18. private string[] _HeatProcessBuffer = new string[] { "", "", "", "" }; //各设备位置加热处理号:[0]:IDLE [1]:FRONT [2]DEVICE [3]BACK
  19. private WORKBIT _WorkBit = WORKBIT.NONE; //FRONT:1#小车 BACK:2#小车 DEVICE:精炼位 0不变化
  20. public string strObjectID = "12100000"; //转炉加载默从PPC_STEEL_HEATNO取对应工序最小炉号,脱硫由作业界面生成脱硫号
  21. /// <summary>
  22. /// 切换岗位信息(FRONT:1#小车 BACK:2#小车 DEVICE:精炼位 NONE:不变化)
  23. /// </summary>
  24. public WORKBIT WorkBit
  25. {
  26. get { return _WorkBit; }
  27. }
  28. public ClsCommandPack(OpeBase ob)
  29. {
  30. this._ob = ob;
  31. }
  32. /// <summary>
  33. /// 发送命令
  34. /// </summary>
  35. /// <param name="realDataCommand"></param>
  36. /// <param name="strMsg"></param>
  37. /// <returns></returns>
  38. private bool SendCommand(RealDataCommand realDataCommand, out string strMsg)
  39. {
  40. strMsg = "";
  41. if (realDataCommand == null)
  42. {
  43. strMsg = "指令不能为空!";
  44. return false;
  45. }
  46. ArrayList Args = new ArrayList();
  47. Args.Add(realDataCommand.COMMANDTYPE);
  48. Args.Add(realDataCommand.OBJECTPOS);
  49. Args.Add(realDataCommand.OBJECTID);
  50. Args.Add(realDataCommand.STR_VALUE);
  51. Args.Add(realDataCommand.FLT_VALUE.ToString());
  52. Args.Add(realDataCommand.OBJECTIP);
  53. Args.Add(realDataCommand.SENDTYPE);
  54. CoreClientParam ccp = new CoreClientParam();
  55. try
  56. {
  57. ccp.IfShowErrMsg = false;
  58. ccp.ServerName = "Core.LgMes.Server.LgJobMgt.SchedulingCommandMgt";
  59. ccp.MethodName = "AddNewCommand";
  60. ccp.ServerParams = new object[] { Args };
  61. ccp = _ob.ExecuteNonQuery(ccp, CoreInvokeType.Internal);
  62. strMsg = ccp.ReturnInfo;
  63. }
  64. catch (Exception ex)
  65. {
  66. string strErr = (ccp == null ? "" : ccp.ReturnInfo);
  67. if (string.IsNullOrEmpty(strErr)) strMsg = ex.Message;
  68. else strMsg = strErr;
  69. }
  70. if (string.IsNullOrEmpty(strMsg)) return true;
  71. else return false;
  72. }
  73. /// <summary>
  74. /// 加载炉次计划命令(不能指定炉号,系统自动查找最小排产炉号)
  75. /// </summary>
  76. /// <param name="srcPos">BOF0?_DEVICE、HMP0?_DEVICE</param>
  77. /// <returns></returns>
  78. public bool CommandCharge(string srcPos)
  79. {
  80. bool bSuccess = false;
  81. try
  82. {
  83. RealDataCommand realDataCommand = new RealDataCommand();
  84. realDataCommand.COMMANDTYPE = "SCHEDULE_CHARGE";
  85. realDataCommand.OBJECTID = strObjectID;
  86. realDataCommand.OBJECTPOS = srcPos;
  87. realDataCommand.STR_VALUE = srcPos;
  88. realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP();
  89. realDataCommand.SENDTYPE = "0";
  90. string strMsg = "";
  91. bSuccess = SendCommand(realDataCommand, out strMsg);
  92. if (!bSuccess)
  93. MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  94. }
  95. catch { }
  96. return bSuccess;
  97. }
  98. /// <summary>
  99. /// 发送钢水到目标位置
  100. /// </summary>
  101. /// <param name="HeatProcessNo">原始位置加热处理号</param>
  102. /// <param name="currPos">原始位置 如:BOF01_DEVICE</param>
  103. /// <param name="nextPos">目标位置 如:BOF01_BACK</param>
  104. /// <returns></returns>
  105. public bool CommandMove(string HeatProcessNo, string srcPos, string destPos)
  106. {
  107. bool bSuccess = false;
  108. try
  109. {
  110. RealDataCommand realDataCommand = new RealDataCommand();
  111. realDataCommand.COMMANDTYPE = "SCHEDULE_MOVE";
  112. realDataCommand.OBJECTID = HeatProcessNo;
  113. realDataCommand.OBJECTPOS = srcPos;
  114. realDataCommand.STR_VALUE = destPos;
  115. realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP();
  116. realDataCommand.SENDTYPE = "0";
  117. string strMsg = "";
  118. bSuccess = SendCommand(realDataCommand, out strMsg);
  119. if (!bSuccess)
  120. MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  121. }
  122. catch { }
  123. return bSuccess;
  124. }
  125. /// <summary>
  126. /// 钢包位置交换
  127. /// </summary>
  128. /// <param name="HeatProcessNo">原始位置加热处理号</param>
  129. /// <param name="srcPos">原始位置 如:LFS01_FRONT</param>
  130. /// <param name="HeatProcessBuffer">[0]:IDLE [1]:FRONT [2]DEVICE [3]BACK</param>
  131. public bool CommandTrans(string HeatProcessNo, string srcPos, string[] HeatProcessBuffer)
  132. {
  133. bool bSuccess = false;
  134. if (string.IsNullOrEmpty(srcPos) || srcPos.Length < 5) return false;
  135. if (HeatProcessBuffer == null || HeatProcessBuffer.Length < 4) return false;
  136. string strIdleID = HeatProcessBuffer[0];
  137. string strFrontID = HeatProcessBuffer[1];
  138. string strDeviceID = HeatProcessBuffer[2];
  139. string strBackID = HeatProcessBuffer[3];
  140. string desPos = "";
  141. if (srcPos.IndexOf("_FRONT") > -1)
  142. {
  143. if (!string.IsNullOrEmpty(strDeviceID))
  144. desPos = srcPos.Substring(0, 5) + "_DEVICE"; //FRONT -> DEVICE
  145. if (!string.IsNullOrEmpty(strBackID))
  146. desPos = srcPos.Substring(0, 5) + "_BACK"; //FRONT -> BACK
  147. }
  148. else if (srcPos.IndexOf("_DEVICE") > -1)
  149. {
  150. if (!string.IsNullOrEmpty(strBackID))
  151. desPos = srcPos.Substring(0, 5) + "_BACK"; //DEVICE -> BACK
  152. if (!string.IsNullOrEmpty(strFrontID))
  153. desPos = srcPos.Substring(0, 5) + "_FRONT"; //DEVICE -> FRONT
  154. }
  155. else if (srcPos.IndexOf("_BACK") > -1)
  156. {
  157. if (!string.IsNullOrEmpty(strDeviceID))
  158. desPos = srcPos.Substring(0, 5) + "_DEVICE"; //BACK -> DEVICE
  159. if (!string.IsNullOrEmpty(strFrontID))
  160. desPos = srcPos.Substring(0, 5) + "_FRONT"; //BACK -> FRONT
  161. }
  162. if (string.IsNullOrEmpty(desPos))
  163. {
  164. MessageBox.Show("无可置换位置的钢水!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  165. return false;
  166. }
  167. try
  168. {
  169. RealDataCommand realDataCommand = new RealDataCommand();
  170. realDataCommand.COMMANDTYPE = "SCHEDULE_TRANS";
  171. realDataCommand.OBJECTID = HeatProcessNo;
  172. realDataCommand.OBJECTPOS = srcPos;
  173. realDataCommand.STR_VALUE = desPos;
  174. realDataCommand.OBJECTIP = ClsBusinessPack.GetLocalMachineIP();
  175. realDataCommand.SENDTYPE = "0";
  176. string strMsg = "";
  177. bSuccess = SendCommand(realDataCommand, out strMsg);
  178. if (!bSuccess)
  179. MessageBox.Show("命令发送失败!\n" + strMsg, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  180. }
  181. catch { }
  182. return bSuccess;
  183. }
  184. /// <summary>
  185. /// 手动执行操作
  186. /// </summary>
  187. /// <param name="ObjectPos">设备位置 如:LFS01_FRONT</param>
  188. /// <param name="HeatProcessBuffer">各设备位置加热处理号:[0]:IDLE [1]:FRONT [2]DEVICE [3]BACK</param>
  189. /// <param name="CC">当前岗位手动操作配置集合</param>
  190. public void BeginManualOperate(string ObjectPos, string[] HeatProcessBuffer, CommandCollection CC)
  191. {
  192. ObjectPos = ObjectPos.Trim().ToUpper();
  193. if (string.IsNullOrEmpty(ObjectPos) || ObjectPos.Length <= 6) return;
  194. if (HeatProcessBuffer == null || HeatProcessBuffer.Length < 4) return;
  195. string strPos = ObjectPos.Substring(5);
  196. if (strPos.Equals("_IDLE")) this._HeatProcessNo = HeatProcessBuffer[0];
  197. else if (strPos.Equals("_FRONT")) this._HeatProcessNo = HeatProcessBuffer[1];
  198. else if (strPos.Equals("_DEVICE")) this._HeatProcessNo = HeatProcessBuffer[2];
  199. else if (strPos.Equals("_BACK")) this._HeatProcessNo = HeatProcessBuffer[3];
  200. else
  201. {
  202. this._HeatProcessNo = "";
  203. MessageBox.Show("设备位置:" + ObjectPos + " 无法识别!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  204. return;
  205. }
  206. if (ObjectPos.Substring(0, 3).Equals("HMP"))
  207. {
  208. if (ClsBusinessPack.HudwProcessNoValid(_HeatProcessNo)) _HeatProcessNo = _HeatProcessNo.Substring(0, (int)OBJLEN.nHudwProcessNo);
  209. else _HeatProcessNo = "";
  210. }
  211. else
  212. {
  213. if (ClsBusinessPack.HeatProccessNoValid(_HeatProcessNo)) _HeatProcessNo = _HeatProcessNo.Substring(0, (int)OBJLEN.nHeatProcessNo);
  214. else _HeatProcessNo = "";
  215. }
  216. if (string.IsNullOrEmpty(_HeatProcessNo))
  217. {
  218. MessageBox.Show("当前岗位无生产任务,无法操作!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  219. return;
  220. }
  221. this._WorkBit = WORKBIT.NONE; //默认不切换工位显示
  222. this._OBJECTPOS = ObjectPos; //设备位置
  223. this._DEVICE_POSITION = ObjectPos.Substring(0, 5); //设备编码
  224. this._HeatProcessBuffer = HeatProcessBuffer; //各工位加热处理号
  225. frmManualOperate frm = new frmManualOperate(_DEVICE_POSITION, _OBJECTPOS, CC);
  226. frm.Location = ClsControlPack.GetChildWindowLocation(frm.Size);
  227. if (frm.ShowDialog() == DialogResult.OK)
  228. {
  229. this._csc = frm.CSC;
  230. this.AnaliseCommand();
  231. }
  232. }
  233. /// <summary>
  234. /// 解析操作
  235. /// </summary>
  236. private void AnaliseCommand()
  237. {
  238. if (_csc == null) return;
  239. try
  240. {
  241. string strMsg = "";
  242. string destPos = "";
  243. string destID = "";
  244. bool Successfull = false;
  245. string ConfirmMsg = AnaliseDevide(_DEVICE_POSITION) + GetHeatNo(_DEVICE_POSITION) + " ";
  246. if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.ARRIVE ||
  247. _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.ASSIGNEDPOS ||
  248. _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.TAPPING ||
  249. _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.MELTDOWN ||
  250. _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.OVER) //进站、上台、指定位置、出钢、回炉、强制结束
  251. {
  252. ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?";
  253. if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return;
  254. destPos = (_csc.OBJECTPOS.IndexOf("%") > -1 ? _csc.OBJECTPOS.Replace("%", _DEVICE_POSITION) : _csc.OBJECTPOS);
  255. if (_csc.OPTCOMMANDTYPE != COM_STL_COMMAND_CMDTYPE.MELTDOWN && _csc.OPTCOMMANDTYPE != COM_STL_COMMAND_CMDTYPE.OVER && !AssignedPosValid(destPos)) return;
  256. Successfull = CommandMove(_HeatProcessNo, _OBJECTPOS, destPos);
  257. }
  258. else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.LEAVE ||
  259. _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.GONEXT) //出站、去下道工序
  260. {
  261. Successfull = ClsBusinessPack.GetNextPos(_HeatProcessNo, out destPos, out destID, out strMsg, _ob);
  262. if (!Successfull) return;
  263. strMsg = AnaliseObjectPos(destPos);
  264. if (!string.IsNullOrEmpty(destID))
  265. {
  266. strMsg = AnaliseObjectPos(destPos);
  267. MessageBox.Show(strMsg + "有任务生产,请稍后再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  268. return;
  269. }
  270. if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.LEAVE) ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?";
  271. else ConfirmMsg += "去 " + strMsg + "\n是否确认?";
  272. if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return;
  273. Successfull = CommandMove(_HeatProcessNo, _OBJECTPOS, destPos);
  274. }
  275. else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.TRANS) //钢包位置对换
  276. {
  277. ConfirmMsg += _csc.OPTCAPTION + "\n是否确认?";
  278. if (!ClsBusinessPack.QuestionConfirm(ConfirmMsg)) return;
  279. Successfull = CommandTrans(_HeatProcessNo, _OBJECTPOS, _HeatProcessBuffer);
  280. }
  281. else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.OPENCAST ||
  282. _csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.STOPCAST) //开浇、停浇
  283. {
  284. Successfull = true;//无钢水调动操作、只需要更新相关字段
  285. }
  286. else if (_csc.OPTCOMMANDTYPE == COM_STL_COMMAND_CMDTYPE.SWITCH) //显示工位切换
  287. {
  288. if (_csc.OBJECTPOS.Contains("FRONT")) _WorkBit = WORKBIT.FRONT;
  289. else if (_csc.OBJECTPOS.Contains("DEVICE")) _WorkBit = WORKBIT.DEVICE;
  290. else if (_csc.OBJECTPOS.Contains("BACK")) _WorkBit = WORKBIT.BACK;
  291. else _WorkBit = WORKBIT.NONE;
  292. }
  293. //设置关键时间
  294. if (Successfull) ClsBusinessPack.UpdateTimeNode(_csc, _HeatProcessNo, _ob);
  295. }
  296. catch { }
  297. }
  298. /// <summary>
  299. /// 验证指定设备位置是否空闲
  300. /// </summary>
  301. /// <param name="destPos"></param>
  302. /// <returns></returns>
  303. private bool AssignedPosValid(string ObjectPos)
  304. {
  305. if (string.IsNullOrEmpty(ObjectPos))
  306. {
  307. MessageBox.Show("目标位置未指定!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  308. return false;
  309. }
  310. string strMsg = "";
  311. bool bSuccess = false;
  312. string ObjectID = ClsBusinessPack.GetDesignatedObjectID(ObjectPos, out bSuccess, out strMsg, this._ob);
  313. string str = AnaliseObjectPos(ObjectPos);
  314. if (!bSuccess)
  315. {
  316. MessageBox.Show(str + "生产信息获取失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  317. return false;
  318. }
  319. if (!string.IsNullOrEmpty(ObjectID))
  320. {
  321. MessageBox.Show(str + "有任务生产,请稍后再试!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  322. return false;
  323. }
  324. return true;
  325. }
  326. /// <summary>
  327. /// 根据设备位置获取炉号类别
  328. /// </summary>
  329. /// <param name="DEVICE_POSITION"></param>
  330. /// <returns></returns>
  331. private string AnaliseDevide(string DEVICE_POSITION)
  332. {
  333. return (DEVICE_POSITION.Substring(0, 3) == "HMP" ? "脱硫号" : "炉号") + ":";
  334. }
  335. /// <summary>
  336. /// 获取脱硫号或者炉号
  337. /// </summary>
  338. /// <param name="DEVICE_POSITION"></param>
  339. /// <returns></returns>
  340. private string GetHeatNo(string DEVICE_POSITION)
  341. {
  342. if (DEVICE_POSITION.Substring(0, 3) == "HMP") return ClsBusinessPack.getHudwIdID(this._HeatProcessNo);
  343. else return ClsBusinessPack.getSmeltingID(this._HeatProcessNo);
  344. }
  345. /// <summary>
  346. /// 证设备位置为中文名称
  347. /// </summary>
  348. /// <param name="ObjectPos"></param>
  349. /// <returns></returns>
  350. private string AnaliseObjectPos(string ObjectPos)
  351. {
  352. try
  353. {
  354. ObjectPos = ObjectPos.Trim().ToUpper();
  355. if (string.IsNullOrEmpty(ObjectPos)) return "";
  356. if (!ObjectPos.Contains("_")) return "";
  357. string[] str = ObjectPos.Split(new string[] { "_" }, StringSplitOptions.None);
  358. str[0] = ClsBusinessPack.GetDeviceChineseName(str[0]);
  359. str[1] = ClsBusinessPack.analysPosName(ObjectPos);
  360. return str[0] + str[1] + "";
  361. }
  362. catch { }
  363. return "";
  364. }
  365. }
  366. /// <summary>
  367. /// 工位显示(主要为LF、RH、VD设备提供)
  368. /// </summary>
  369. public enum WORKBIT : int
  370. {
  371. /// <summary>
  372. /// 不变化
  373. /// </summary>
  374. NONE = 0,
  375. /// <summary>
  376. /// 切换到FRONT(1#小车位)
  377. /// </summary>
  378. FRONT = 1,
  379. /// <summary>
  380. /// 切换到BACK(2#小车位)
  381. /// </summary>
  382. BACK = 2,
  383. /// <summary>
  384. /// 切换到DEVICE(处理位)
  385. /// </summary>
  386. DEVICE = 3,
  387. /// <summary>
  388. /// 切换到IDLE(缓冲位)
  389. /// </summary>
  390. IDLE = 4
  391. }
  392. public enum DeviceCode : int
  393. {
  394. MIS = 20,
  395. MIS01 = 1,
  396. MIS02 = 2,
  397. HMP = 21,
  398. HMP01 = 1,
  399. HMP02 = 2,
  400. HMP03 = 3,
  401. BOF = 22,
  402. BOF01 = 1,
  403. BOF02 = 2,
  404. BOF03 = 3,
  405. BOF04 = 4,
  406. BOF05 = 5,
  407. CAS = 23,
  408. CAS01 = 1,
  409. CAS02 = 2,
  410. CAS03 = 3,
  411. CAS04 = 4,
  412. CAS05 = 5,
  413. LFS = 24,
  414. LFS01 = 1,
  415. LFS02 = 2,
  416. LFS03 = 3,
  417. RHS = 25,
  418. RHS01 = 1,
  419. RHS02 = 2,
  420. RHS03 = 3,
  421. CCM = 26,
  422. CCM01 = 1,
  423. CCM02 = 2,
  424. CCM03 = 3,
  425. CCM04 = 4,
  426. CCM05 = 5
  427. }
  428. }