PLCWorkLogic..cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:PLCModuleLogic.cs
  5. * 2.功能描述:发送信息到智能设备。
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 陈晓野 2018/10/18 1.00 新建
  9. *******************************************************************************/
  10. using System;
  11. using System.Collections;
  12. using System.Collections.Generic;
  13. using System.Data;
  14. using System.Net.Sockets;
  15. using System.Text;
  16. using Curtain.DataAccess;
  17. using Curtain.Framework.Json;
  18. using Curtain.Net.Sockets.PLC;
  19. using Curtain.Net.Sockets.PLC.Model.Siemens;
  20. using Dongke.IBOSS.PRD.Basics.BaseResources;
  21. using Dongke.IBOSS.PRD.Basics.DataAccess;
  22. using Dongke.IBOSS.PRD.Service.DataModels;
  23. using Dongke.IBOSS.PRD.WCF.DataModels;
  24. using Microsoft.Win32;
  25. using Newtonsoft.Json.Linq;
  26. namespace Dongke.IBOSS.PRD.Service.CMNModuleService
  27. {
  28. /// <summary>
  29. /// PLC相关处理
  30. /// </summary>
  31. public class PLCModuleLogic
  32. {
  33. #region 恒洁三水三车间工位对应PLC操作
  34. /// <summary>
  35. /// 恒洁三水三车间工位对应PLC操作 xuwei modify 2020-06-29
  36. /// </summary>
  37. /// <param name="sUserInfo"></param>
  38. /// <returns></returns>
  39. public static ServiceResultEntity DoPLCWorkByUser_HEGII_S3(SUserInfo sUserInfo, string barcode,
  40. int procedureid, int workStationType = 0 )
  41. {
  42. using (IDataAccess conn = DataAccess.Create())
  43. {
  44. try
  45. {
  46. //按当前登录用户在工位表中的当前工号查找工位类型
  47. workStationType = getWorkStationType(conn, sUserInfo.UserCode);
  48. //成检交接3211
  49. if (workStationType == 3211)
  50. {
  51. //读取产品型号
  52. object goodsModel = conn.ExecuteScalar(@"
  53. SELECT
  54. g.SEATCOVERCODE
  55. FROM
  56. TP_PM_GROUTINGDAILYDETAIL p
  57. LEFT JOIN TP_MST_GOODS g ON g.GOODSID = p.GOODSID
  58. WHERE
  59. p.VALUEFLAG = '1'
  60. AND p.BARCODE = @BARCODE@
  61. ",
  62. new CDAParameter("BARCODE", barcode)
  63. );
  64. //调用PLC的参数集合
  65. Hashtable plcPara = new Hashtable();
  66. plcPara.Add("barcode", barcode);
  67. plcPara.Add("procedureid", procedureid);
  68. plcPara.Add("goodsmodel", goodsModel);
  69. return plcWrite(conn, sUserInfo.UserCode, workStationType, plcPara);
  70. }
  71. //成检交接3212
  72. if (workStationType == 3212)
  73. {
  74. }
  75. return new ServiceResultEntity() { Status = Constant.ServiceResultStatus.Other, Message = "当前工号无工位信息" };
  76. }
  77. catch (Exception ex)
  78. {
  79. Curtain.Log.Logger.Error(ex);
  80. return new ServiceResultEntity() {
  81. Status = Constant.ServiceResultStatus.Other,
  82. Message = "PLC写入失败!"
  83. };
  84. }
  85. finally
  86. {
  87. conn?.Close();
  88. }
  89. }
  90. }
  91. /// <summary>
  92. /// 获取工位类型ID xuwei add 2020-06-29
  93. /// </summary>
  94. /// <param name="conn"></param>
  95. /// <param name="userCode"></param>
  96. /// <returns></returns>
  97. private static int getWorkStationType(IDataAccess conn,string userCode)
  98. {
  99. return Convert.ToInt32(conn.ExecuteScalar(@"
  100. SELECT
  101. t.WORKSTATIONTYPEID
  102. FROM
  103. TP_MST_WORKSTATION w
  104. LEFT JOIN TP_SYS_WORKSTATIONTYPE t ON w.WORKSTATIONTYPEID = t.WORKSTATIONTYPEID
  105. WHERE
  106. w.USERCODE = @USERCODE@
  107. ",
  108. new CDAParameter("USERCODE", userCode)
  109. ));
  110. }
  111. /// <summary>
  112. /// 写PLC xuwei add 2020-06-29
  113. /// </summary>
  114. /// <param name="conn"></param>
  115. /// <param name="userCode"></param>
  116. /// <param name="workStationType"></param>
  117. /// <param name="plcPara"></param>
  118. /// <returns></returns>
  119. private static ServiceResultEntity plcWrite(IDataAccess conn,string userCode,int workStationType,Hashtable plcPara)
  120. {
  121. //读取工位配置信息
  122. DataTable dataTable = conn.ExecuteDatatable(@"
  123. SELECT
  124. *
  125. FROM
  126. TP_MST_WORKSTATION t
  127. WHERE
  128. t.WORKSTATIONTYPEID = @WORKSTATIONTYPE@
  129. AND USERCODE =@USERCODE@
  130. ",
  131. new CDAParameter("WORKSTATIONTYPE", workStationType),
  132. new CDAParameter("USERCODE", userCode)
  133. );
  134. if (dataTable == null || dataTable.Rows.Count == 0)
  135. {
  136. return new ServiceResultEntity() { Status = Constant.ServiceResultStatus.Other, Message = "当前工号无工位信息" };
  137. }
  138. string ip = dataTable.Rows[0]["PLCIP"] + "";
  139. int port = Convert.ToInt32(dataTable.Rows[0]["PLCPORT"]);
  140. JArray plcObj = JArray.Parse(dataTable.Rows[0]["PLCOBJECT"].ToString());
  141. //写入PLC
  142. using (SocketClient<SiemensS7_1200Model> plc = new SocketClient<SiemensS7_1200Model>())
  143. {
  144. //手动写
  145. //plc.Connect(ip, port);
  146. //plc.Write<string>("D", "102.2", plcPara["barcode"].ToString());
  147. //plc.Write<short>("D", "102.14", Convert.ToInt16(plcPara["goodsmodel"]));
  148. //自动按配置写
  149. plc.Connect(ip, port);
  150. for (int i = 0; i < plcObj.Count; i++)
  151. {
  152. if (plcObj[i]["type"].ToString().ToLower() == "string")
  153. plc.Write<string>(plcObj[i]["code"].ToString(), plcObj[i]["number"].ToString(), plcPara[plcObj[i]["name"].ToString()].ToString());
  154. else if (plcObj[i]["type"].ToString().ToLower() == "int")
  155. plc.Write<short>(plcObj[i]["code"].ToString(), plcObj[i]["number"].ToString(), Convert.ToInt16(plcPara[plcObj[i]["name"].ToString()]));
  156. }
  157. }
  158. //写入操作成功日志
  159. Curtain.Log.Logger.Debug("PLC写入成功!");
  160. //PLC操作成功
  161. return new ServiceResultEntity() {
  162. Status = Constant.ServiceResultStatus.Success,
  163. Message = "" //一定不可以有值,为空时才是提交成功
  164. };
  165. }
  166. #endregion
  167. }
  168. }