plc_led_data.ashx 11 KB

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