using System; using System.Collections.Generic; using System.Linq; using System.Threading; using SimpleLite.RCS; using SimpleLite.RCS.CarTypes; using SimpleCore; using Newtonsoft.Json; using SimpleLite.CADTools; using SimpleLite.Props; using SimpleLite.UI; using SimpleCore.Library; using System.Threading.Tasks; using System.Diagnostics; using IoTClient.Clients.PLC; using IoTClient.Enums; using SimpleCore.Traffic; using SimpleCore.PropType; using System.Net.Http; using System.Reflection; using LessokajiWeaverUtilities.Utilities; namespace StandardScene.Scheduler { [MissionType(Name = "安全信号交互", editor = typeof(SecuritySignalMission))] [I18N.DocumentTranslation(Name = "Security Signal Mission", locale = "en")] public class SecuritySignalMission : Mission { public static Mission Create() { return new SecuritySignalMission(); } public int[] stringToInt(string str) { return str.Split(' ').Select(s => (int)Convert.ToInt16(s, 10)).ToArray(); } public class NOdeIsEnableMissionStatus : MissionStatus { public static List staions = new List() { "One","Two","Three","Four","Five"}; public static List signalDB = new List() { "beat", "request", "allowRequest", "entering", "inplace","requestLeave" ,"allowLeave","leaving","safeLeave","AGVAlarm","PlcAlarm"}; public List One = Enumerable.Repeat(false, signalDB.Count()).ToList(); public Dictionary> signal = new Dictionary>(); public List Two = Enumerable.Repeat(false, signalDB.Count()).ToList(); public List Three = Enumerable.Repeat(false, signalDB.Count()).ToList(); public List Four = Enumerable.Repeat(false, signalDB.Count()).ToList(); public List Five = Enumerable.Repeat(false, signalDB.Count()).ToList(); public List Six = Enumerable.Repeat(false, signalDB.Count()).ToList(); public List Seven = Enumerable.Repeat(false, signalDB.Count()).ToList(); public List Eight = Enumerable.Repeat(false, signalDB.Count()).ToList(); public float readOnceTime = 0; public float readAllDataTime = 0; public float writeOnceTime = 0; public float writeAllDataTime = 0; } public override MissionStatus status { get; set; } = new NOdeIsEnableMissionStatus(); [JsonIgnore] public Thread myThread; [JsonIgnore] private bool started = false; [JsonIgnore] private int iterationComm = 0; [JsonIgnore] private object sync = new(); [JsonIgnore] public static HttpClient hc = new HttpClient() { Timeout = TimeSpan.FromSeconds(2) }; [MethodMember(Name = "启动进程", Description = "开始处理上下料队列")] public override void Execute() { started = true; Task.Factory.StartNew(() => { HttpPostData httpPostData = new HttpPostData(); Dictionary> Allsignal = new Dictionary>(); //Dictionary stationSignals = new Dictionary(); while (started) { try { foreach (var station in NOdeIsEnableMissionStatus.staions) { Dictionary stationSignals = new Dictionary(); foreach (var signalName in NOdeIsEnableMissionStatus.signalDB) { // 根据station和signalName获取对应的bool值 bool signalValue; switch (station) { case "One": signalValue = ((NOdeIsEnableMissionStatus)status).One[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; case "Two": signalValue = ((NOdeIsEnableMissionStatus)status).Two[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; case "Three": signalValue = ((NOdeIsEnableMissionStatus)status).Three[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; case "Four": signalValue = ((NOdeIsEnableMissionStatus)status).Four[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; case "Five": signalValue = ((NOdeIsEnableMissionStatus)status).Five[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; case "Six": signalValue = ((NOdeIsEnableMissionStatus)status).Six[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; case "Seven": signalValue = ((NOdeIsEnableMissionStatus)status).Seven[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; case "Eight": signalValue = ((NOdeIsEnableMissionStatus)status).Eight[(NOdeIsEnableMissionStatus.signalDB).IndexOf(signalName)]; break; default: throw new Exception("Invalid station name"); } // 检查字典中是否存在指定的键,如果存在则修改其值,否则添加新的键值对 if (stationSignals.ContainsKey(signalName)) { stationSignals[signalName] = signalValue; } else { stationSignals.Add(signalName, signalValue); } } if (Allsignal.ContainsKey(station)) { Allsignal[station] = stationSignals; } else { Allsignal.Add(station, stationSignals); } } string result=JsonConvert.SerializeObject(Allsignal); //string result = GetListsAsStrings((NOdeIsEnableMissionStatus)status); Diagnosis.Log($"向迷毂提供安全信号---{result}", "signalinfo", true); httpPostData.UploadSignal(result); Thread.Sleep(500); } catch (Exception e) { Diagnosis.Post($"{ExceptionFormatter.FormatEx(e)}", "安全信号"); } } }); } [MethodMember(Name = "关闭机构进程", Description = "关闭机构进程")] public void Stop() { started = false; status.status = $"已停止-循环"; } Stopwatch stopwatch3 = new Stopwatch(); Stopwatch stopwatch2 = new Stopwatch(); public static string GetListsAsStrings(object obj) { Dictionary result = new Dictionary(); Type type = obj.GetType(); FieldInfo[] fieldInfo= type.GetFields(); foreach (FieldInfo property in fieldInfo) { if (property.FieldType== typeof(List)) { List list = (List)property.GetValue(obj); result[property.Name] = String.Join(",", list.Select(b => b ? "1" : "0")); } } return JsonConvert.SerializeObject(result); } } }