plc_led_data.ashx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <%@ WebHandler Language="C#" Class="plc_led_data" %>
  2. using System;
  3. using System.Web;
  4. using System.Collections.Generic;
  5. using Curtain.Net.Sockets;
  6. using DK.XuWei.WebMes;
  7. using Curtain.DataAccess;
  8. using Curtain.Log;
  9. using System.Data;
  10. using Newtonsoft.Json.Linq;
  11. using System.Collections;
  12. /// <summary>
  13. /// 对接LED看板,用于成检显示产品属性信息
  14. /// xuwei
  15. /// 2023-08-08
  16. /// </summary>
  17. public class plc_led_data : IHttpHandler
  18. {
  19. public struct LedData
  20. {
  21. public int goodscode;
  22. public int goodsspecification;
  23. public int goodstype;
  24. public string barcode;
  25. }
  26. //输入参数 【条码】
  27. public string barCode = "";
  28. string procedure_no;
  29. string fentiprocedure_no;
  30. string procedure_in;
  31. string road_no;
  32. string rack;
  33. string position;
  34. //返回失败提示
  35. public string message = "";
  36. public void ProcessRequest(HttpContext context)
  37. {
  38. try
  39. {
  40. context.Response.ContentType = "text/plain";
  41. //输入输出参数初始化 计件
  42. barCode = context.Request["barcode"] is object ? context.Request["barcode"] : "";
  43. procedure_no = context.Request["procedure_no"] is object ? context.Request["procedure_no"] : "1_1_1";
  44. fentiprocedure_no = "1_1_2";
  45. procedure_in = "1";
  46. road_no = "0";
  47. rack = "";
  48. position = "";
  49. DataTable infoDt = new DataTable();
  50. //写入PLC
  51. //SiemensS7.Open("172.19.26.244", 102);
  52. //正式
  53. SiemensS7.Open("172.19.26.152", 102);
  54. if (context.Request["barcode"] is object)
  55. {
  56. using (IDataAccess conn = DataAccess.Create())
  57. {
  58. infoDt = conn.ExecuteDatatable(@"
  59. SELECT g.seatcovercode
  60. ,CASE
  61. WHEN instr(g.goodsspecification, '305') = 1 THEN 1
  62. WHEN instr(g.goodsspecification, '400') = 1 THEN 2
  63. WHEN instr(g.goodsspecification, '地排') = 1 THEN 3
  64. WHEN instr(g.goodsspecification, '横排') = 1 THEN 4
  65. WHEN instr(g.goodsspecification, '295') = 1 THEN 5
  66. WHEN instr(g.goodsspecification, '220') = 1 THEN 6
  67. WHEN instr(g.goodsspecification, '300') = 1 THEN 7
  68. END AS goodsspecification
  69. ,CASE
  70. WHEN instr(gt.goodstypename, '连体') = 1 THEN 1
  71. WHEN instr(gt.goodstypename, '智能') = 1 THEN 2
  72. END AS goodstypename
  73. ,CASE WHEN g.goodsid in (178,177,164,163,166,150,149,182,183,190,191,186,187) THEN '分体'
  74. when g.goodsid in(158,159,167) and gdd.logoid in (7,14) THEN '分体'
  75. when g.goodsid in(188,189) and gdd.logoid in (7,17) THEN '分体'
  76. when g.goodsid in(146,147) and gdd.logoid in (1) THEN '分体'
  77. ELSE '大件' END AS pritetype
  78. ,gdd.barcode
  79. ,g.goodscode
  80. FROM tp_pm_groutingdailydetail gdd
  81. LEFT JOIN tp_mst_goods g
  82. ON gdd.goodsid = g.goodsid
  83. LEFT JOIN tp_mst_goodstype gt
  84. ON gt.goodstypeid = g.goodstypeid
  85. WHERE gdd.barcode = @barcode@
  86. ",
  87. new CDAParameter("barcode", context.Request["barcode"])
  88. );
  89. if (infoDt != null && infoDt.Rows.Count > 0 && infoDt.Rows[0] != null)
  90. {
  91. SiemensS7.Write<short>("400.2", Convert.ToInt16(infoDt.Rows[0]["seatcovercode"]));
  92. SiemensS7.Write<short>("400.4", Convert.ToInt16(infoDt.Rows[0]["goodsspecification"]));
  93. SiemensS7.Write<short>("400.6", Convert.ToInt16(infoDt.Rows[0]["goodstypename"]));
  94. SiemensS7.Write<string>("400.10", infoDt.Rows[0]["barcode"].ToString());
  95. SiemensS7.Write<string>("400.24", infoDt.Rows[0]["goodscode"].ToString());
  96. //写标识位-扫描结果
  97. //写标识位-扫描结果
  98. SiemensS7.Write<short>("400.0", Convert.ToInt16(1));
  99. }
  100. context.Response.Write(SiemensS7.Read<short>("400.0"));
  101. context.Response.Write(SiemensS7.Read<short>("400.2"));
  102. context.Response.Write(SiemensS7.Read<short>("400.4"));
  103. context.Response.Write(SiemensS7.Read<short>("400.6"));
  104. context.Response.Write(SiemensS7.Read<string>("400.24", 11));
  105. if (infoDt != null && infoDt.Rows.Count > 0 && infoDt.Rows[0] != null)
  106. {
  107. if (Convert.ToInt16(infoDt.Rows[0]["seatcovercode"]) != Convert.ToInt16(SiemensS7.Read<short>("400.2"))
  108. || Convert.ToInt16(infoDt.Rows[0]["goodsspecification"]) != Convert.ToInt16(SiemensS7.Read<short>("400.4"))
  109. || Convert.ToInt16(infoDt.Rows[0]["goodstypename"]) != Convert.ToInt16(SiemensS7.Read<short>("400.6"))
  110. || Convert.ToInt16(1) != Convert.ToInt16(SiemensS7.Read<short>("400.0")))
  111. {
  112. SiemensS7.Write<short>("400.2", Convert.ToInt16(infoDt.Rows[0]["seatcovercode"]));
  113. SiemensS7.Write<short>("400.4", Convert.ToInt16(infoDt.Rows[0]["goodsspecification"]));
  114. SiemensS7.Write<short>("400.6", Convert.ToInt16(infoDt.Rows[0]["goodstypename"]));
  115. SiemensS7.Write<string>("400.10", infoDt.Rows[0]["barcode"].ToString());
  116. SiemensS7.Write<string>("400.24", infoDt.Rows[0]["goodscode"].ToString());
  117. //写标识位-扫描结果
  118. SiemensS7.Write<short>("400.0", Convert.ToInt16(1));
  119. }
  120. }
  121. Logger.Info("写入数据完成!barcode:" + context.Request["barcode"].ToString() + "五位数据位:" + SiemensS7.Read<short>("400.0") + "," + SiemensS7.Read<short>("400.2")
  122. + "," + SiemensS7.Read<short>("400.4") + "," + SiemensS7.Read<short>("400.6") + "," + SiemensS7.Read<short>("400.10") + "," + SiemensS7.Read<string>("400.24", 11) + ";数据:" + new JsonResult(infoDt).ToJson());
  123. }
  124. //调用标准计件方法===============================
  125. if (infoDt != null && infoDt.Rows.Count > 0 && infoDt.Rows[0] != null)
  126. {
  127. if (infoDt.Rows[0]["pritetype"].ToString() == "分体")
  128. {
  129. procedure_no = fentiprocedure_no;
  130. }
  131. WCF wcf = new WCF();
  132. wcf.Para.Add(new JProperty("barcode", barCode.ToString()));
  133. wcf.Para.Add(new JProperty("procedure_no", procedure_no));
  134. wcf.Para.Add(new JProperty("road_no", road_no));
  135. wcf.Para.Add(new JProperty("rack", rack));
  136. wcf.Para.Add(new JProperty("position", position));
  137. wcf.Para.Add(new JProperty("procedure_in", procedure_in));
  138. string jsonStr = wcf.Get("/DKService/ExHGS3QR/AddWorkInfoHGS3_QR");
  139. //这个接口很小的机率会带出html标签===============================================
  140. if (jsonStr.IndexOf("<html>") > 0) jsonStr = jsonStr.Substring(0, jsonStr.IndexOf("<html>"));
  141. if (jsonStr.IndexOf("<!DOCTYPEhtml>") > 0) jsonStr = jsonStr.Substring(0, jsonStr.IndexOf("<!DOCTYPEhtml>"));
  142. //xuwei fix 2022-05-28 有时会带出 DOCTYPEhtml标签
  143. jsonStr = jsonStr.Replace("<!DOCTYPEhtml>", "");
  144. jsonStr = jsonStr.Replace("\\u000d\\u000a", "")
  145. .Replace("\\n", "").Replace("\\", "").Replace(" ", "")
  146. .Replace("产品编码:", " 产品编码 ")
  147. .Replace("当前工序:", " 当前工序 ")
  148. .Replace("可到工序:", " 可到工序 ")
  149. .Replace("{\"d\":\"", "")
  150. .Replace("\"}\"}", "\"}")
  151. .Replace("<!DOCTYPEhtml>", "")
  152. ;
  153. Curtain.Log.Logger.Debug(context.Request.UserHostAddress + "\r\n" + context.Request.Url + "\r\n" + jsonStr);
  154. string apiResult = "";
  155. //处理输出结果 OK开头成功 NOK开头失败
  156. JObject json = JObject.Parse(jsonStr);
  157. bool apiStatus = false;
  158. apiStatus = Convert.ToBoolean(json["success"]);
  159. apiResult = jsonStr;
  160. //HttpContext.Current.Response.Write(apiResult);
  161. //记录接口调用日志
  162. Hashtable ht = new Hashtable();
  163. ht.Add("barcode", barCode.ToString());
  164. ht.Add("procedure_no", procedure_no);
  165. ht.Add("road_no", road_no);
  166. ht.Add("rack", rack);
  167. ht.Add("position", position);
  168. ht.Add("procedure_in", procedure_in);
  169. int apiId = Convert.ToInt32(procedure_no.Replace("_", "") + road_no + Math.Abs(Convert.ToInt32(procedure_in)));
  170. barCode = barCode.Replace("2c%", ",");
  171. int apiBarcodeCount = barCode.Split(',').Length;
  172. string apiUrl = "http://" + HttpContext.Current.Request.Url.Host + ":" + HttpContext.Current.Request.Url.Port.ToString() + "/api/DKService/ExHGS3QR/AddWorkInfoHGS3_QR/?" + JsonClient.ParaToString(ht);
  173. ApiLog.WriteApiLog("PLC_扫码", apiUrl, apiStatus, apiResult, apiId, apiBarcodeCount);
  174. //===============================================
  175. int i = 0;
  176. //包装打印是否成功
  177. if (Convert.ToBoolean(json["success"]) == true)
  178. {
  179. SiemensS7.Write<short>("420.0", Convert.ToInt16(1));
  180. }
  181. else
  182. {
  183. SiemensS7.Write<short>("420.0", Convert.ToInt16(2));
  184. }
  185. context.Response.Write(SiemensS7.Read<short>("420.0"));
  186. i = Convert.ToInt16(SiemensS7.Read<short>("420.0"));
  187. if (i == 2)
  188. {
  189. //PLC补推
  190. SiemensS7.Write<short>("420.0", Convert.ToInt16(2));
  191. }
  192. else if(i==1){
  193. //PLC补推
  194. SiemensS7.Write<short>("420.0", Convert.ToInt16(1));
  195. }
  196. Logger.Info("写入数据完成!barcode:" + context.Request["barcode"].ToString() + "一位数据位:" + SiemensS7.Read<short>("420.0"));
  197. }
  198. }
  199. else
  200. {
  201. //写标识位-扫描结果
  202. SiemensS7.Write<short>("400.0", Convert.ToInt16(2));
  203. context.Response.Write(SiemensS7.Read<short>("400.0"));
  204. Logger.Info("无条码!");
  205. }
  206. context.Response.Write(new JsonResult(infoDt).ToJson());
  207. SiemensS7.Close();
  208. }
  209. catch (Exception ex )
  210. {
  211. Logger.Info("异常!:"+ex);
  212. throw ex ;
  213. }
  214. }
  215. public bool IsReusable
  216. {
  217. get
  218. {
  219. return false;
  220. }
  221. }
  222. }