JobService.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*using HslCommunication.Profinet.Siemens;
  2. using HslCommunication;
  3. using Newtonsoft.Json;
  4. using Quartz;
  5. using WCS.DeviceProtocol;
  6. using WCS.Entitys;
  7. using WCS.Model;
  8. using WCS.Services;
  9. using WCS.Utils;
  10. using StackExchange.Redis;
  11. namespace WCS.Service.Impl
  12. {
  13. public class JobService : IJob
  14. {
  15. private readonly IConnectionMultiplexer _redis;
  16. private readonly IDeviceService _deviceService;
  17. private readonly IWcsTagValueService _wcsTagValueService;
  18. private string wcs_redis_key = "WCS:";
  19. private string LOG_TITLE_S7 = "S7采集";
  20. public JobService(IConnectionMultiplexer redisService, IDeviceService deviceService)
  21. {
  22. this._redis = redisService;
  23. this._deviceService = deviceService;
  24. }
  25. public async Task Execute(IJobExecutionContext context)
  26. {
  27. try
  28. {
  29. Console.WriteLine($"Job executed at {DateTime.Now}");
  30. await this.getDeviceList();
  31. }
  32. catch (Exception ex)
  33. {
  34. // 记录异常
  35. Console.WriteLine($"An error occurred: {ex.Message}");
  36. // 你可以选择记录到日志文件或其他日志系统
  37. }
  38. }
  39. /// <summary>
  40. /// 采集数据S7
  41. /// </summary>
  42. /// <returns></returns>
  43. public async Task<string> DataCollectS7Job()
  44. {
  45. try
  46. {
  47. List<WcsDevice> deviceList = await getDeviceList();
  48. deviceList = deviceList.Where(x => x.ProtocolType.Equals(ProtocalTypeEnum.S7_1500.ToString()) && x.State).ToList();
  49. foreach (WcsDevice device in deviceList)
  50. {
  51. List<WcsTagValue> tagValues = new List<WcsTagValue>();
  52. string redis_key = "WCS:" + device.Ip + ":" + device.ProtocolType;
  53. var data = await _redis.GetDatabase().StringGetAsync(redis_key);
  54. if (data.IsNullOrEmpty)
  55. {
  56. WcsTagValue tagQuery = new WcsTagValue();
  57. tagQuery.ProtocolType = device.ProtocolType;
  58. tagQuery.Ip = device.Ip;
  59. tagValues = _wcsTagValueService.GetList(tagQuery);
  60. //首次设置redis
  61. if (tagValues != null && tagValues.Count > 0)
  62. {
  63. await _redis.GetDatabase().StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  64. }
  65. }
  66. else
  67. {
  68. tagValues = JsonConvert.DeserializeObject<List<WcsTagValue>>(data);
  69. }
  70. if (tagValues != null && tagValues.Count > 0)
  71. {
  72. tagValues = JsonConvert.DeserializeObject<List<WcsTagValue>>(data);
  73. List<WcsTagValue> changTagValues = new List<WcsTagValue>();
  74. //Plc s7 = DevicePlcS7.S7(device.ServerUrl, ProtocalTypeEnum.S7_1500.ToString());
  75. SiemensS7Net s7 = DevicePlcS7.SiemensS7(device.Ip);
  76. OperateResult ConnectionResult = s7.ConnectServer();
  77. if (!ConnectionResult.IsSuccess)
  78. {
  79. device.State = false;
  80. await _deviceService.UpdateDevice(device);
  81. s7.ConnectClose();
  82. Log.Instance.WriteLogAdd("S7采集异常,plc连不上==>" + device.Ip, LOG_TITLE_S7);
  83. return "采集失败,plc连不上";
  84. }
  85. else
  86. {
  87. foreach (WcsTagValue tagValueData in tagValues)
  88. {
  89. string operateResult = "";
  90. if (tagValueData.Type.Equals(TagValueReadTypeEnum.BOOL.ToString()))
  91. {
  92. operateResult = s7.ReadBool(tagValueData.Address).Content.ToString();
  93. }
  94. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.SHORT.ToString()))
  95. {
  96. operateResult = s7.ReadInt16(tagValueData.Address).Content.ToString();
  97. }
  98. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.String.ToString()))
  99. {
  100. operateResult = s7.ReadString(tagValueData.Address).Content.ToString();
  101. }
  102. else if (tagValueData.Type.Equals(TagValueReadTypeEnum.Array.ToString()))
  103. {
  104. operateResult = ToolUtils.ReturnStringByBytes(s7.Read(tagValueData.Address, 40).Content);
  105. }
  106. if (!string.IsNullOrEmpty(operateResult) && tagValueData.TagValue != operateResult)
  107. {
  108. tagValueData.TagValue = operateResult.ToString();
  109. tagValueData.UpdateTime = DateTime.Now;
  110. changTagValues.Add(tagValueData);
  111. Log.Instance.WriteLogAdd("S7采集,Ip:" + tagValueData.Ip + " 地址:" + tagValueData.Address + ",值:" + tagValueData.TagValue + ",发生变化", LOG_TITLE_S7);
  112. //有变化更新数据库
  113. await _wcsTagValueService.Update(tagValueData);
  114. }
  115. Thread.Sleep(50);
  116. }
  117. s7.ConnectClose();
  118. //值有变化,重新设置一次redis
  119. if (changTagValues != null && changTagValues.Count > 0)
  120. {
  121. await _redis.GetDatabase().StringSetAsync(redis_key, JsonConvert.SerializeObject(tagValues));
  122. }
  123. //存储采集数据
  124. CollectDataLog.Instance.WriteLogAdd(data, LOG_TITLE_S7);
  125. }
  126. }
  127. }
  128. return "S7采集成功";
  129. }
  130. catch (Exception ex)
  131. {
  132. Log.Instance.WriteLogAdd("S7采集异常===>>" + ex.Message, LOG_TITLE_S7);
  133. return "S7采集失败";
  134. }
  135. }
  136. /// <summary>
  137. /// 获取redis 设备在线列表
  138. /// </summary>
  139. /// <param name="strData"></param>
  140. /// <returns></returns>
  141. private async Task<List<WcsDevice>> getDeviceList()
  142. {
  143. List<WcsDevice> deviceList = new List<WcsDevice>();
  144. var deviceListData = await _redis.GetDatabase().StringGetAsync(wcs_redis_key + RedisKeyEnum.DeviceList);
  145. if (deviceListData.IsNullOrEmpty || deviceListData.Length() == 0)
  146. {
  147. deviceList = _deviceService.GetDeviceList();
  148. await _redis.GetDatabase().StringSetAsync(wcs_redis_key + RedisKeyEnum.DeviceList, JsonConvert.SerializeObject(deviceList));
  149. }
  150. else
  151. {
  152. deviceList = JsonConvert.DeserializeObject<List<WcsDevice>>(deviceListData);
  153. }
  154. return deviceList;
  155. }
  156. }
  157. }
  158. */