using Pms.DataLibrary.Order; using ProjectManagementSystem.Common.Config; using ProjectManagementSystem.Common.Core; using ProjectManagementSystem.Common.Extenions; using ProjectManagementSystem.Common.WebApi; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProjectManagementSystem.TaskBookEvent { /// /// IO交互行为码,使用类似PLC地址的方式,输出Y1-Y8,输入X1-X8 /// public class TaskBookBehavior_IOAddress : TaskBookBehavior_PLC { //private static readonly object locker = new object(); public TaskBookBehavior_IOAddress(int behavior) : base(behavior) { } protected override bool Interaction(int flag, string[] addrArray, string valueArray, TaskData taskDetailInfo, StepData taskStepInfo, bool logicBit) { if (addrArray.Length <= 0) return true; var routeConfig = ExcelConfig.Instance.GetRouteConfig(taskStepInfo.WareHouseID); if (routeConfig == null) { Log(taskDetailInfo, taskStepInfo, "查找库位配置信息失败"); return false; } if (routeConfig.IOTransID <= 0) { Log(taskDetailInfo, taskStepInfo, "获取库位对接盒ID失败"); return false; } int id = routeConfig.IOTransID; if (!DeviceControl.Instance.Communication.InfoIODictionary.ContainsKey(id)) { Log(taskDetailInfo, taskStepInfo, $"获取库位对接盒{id},没有此盒子数据,检查盒子是否连接网络"); return false; } var infoIO = DeviceControl.Instance.Communication.InfoIODictionary[id]; if (!infoIO.DataValid) { Log(taskDetailInfo, taskStepInfo, $"获取库位对接盒{id},盒子已掉线!"); return false; } //构造地址数组 string[] realAddrArray = new string[addrArray.Length]; for (int i = 0; i < addrArray.Length; i++) { string addrDesc = addrArray[i]; string plcAddr = taskStepInfo.WareHouseID.GetPlcTaskAddr(addrDesc); if (string.IsNullOrEmpty(plcAddr)) { Log(taskDetailInfo, taskStepInfo, $"查找地址失败:“{addrDesc}”"); return false; } realAddrArray[i] = plcAddr; } //构造地址值数组 var tempRealValues = valueArray.ToValueArray(); var realValues = new bool[realAddrArray.Length]; for (int i = 0; i < realValues.Length; i++) { realValues[i] = GetArrayValue(tempRealValues, i); //根据逻辑位来确定写的值 if (PlcBehavior.LogicBitTrue > 0 && logicBit == false) { realValues[i] = false; } } if (flag == 0) { //写入 var result = DeviceControl.Instance.SetOutputIO_ThenCheck(id, realAddrArray, realValues, out string setMsg); if(!result) { Log(taskDetailInfo, taskStepInfo, setMsg); return result; } //DeviceControl.Instance.SetOutputIO(id, realAddrArray, realValues); //System.Threading.Thread.Sleep(100); //for (int i = 0; i < realAddrArray.Length; i++) //{ // string plcAddr = realAddrArray[i]; // bool plcValue = realValues[i]; // bool result = DeviceControl.Instance.GetOutputIO(id, realAddrArray[i]); // if (result != plcValue) // { // Log(taskDetailInfo, taskStepInfo, $"写入失败({plcAddr}写入{plcValue})"); // return false; // } //} } else { //读取 var result = DeviceControl.Instance.CheckInputIO(id, realAddrArray, realValues, out string setMsg); if (!result) { Log(taskDetailInfo, taskStepInfo, setMsg); return result; } //for (int i = 0; i < realAddrArray.Length; i++) //{ // string plcAddr = realAddrArray[i]; // bool plcValue = realValues[i]; // bool result2 = DeviceControl.Instance.GetInputIO(id, realAddrArray[i]); // if (result2 != plcValue) // { // Log(taskDetailInfo, taskStepInfo, $"等待信号({plcAddr}={plcValue})"); // return false; // } //} } return true; } private bool GetArrayValue(bool[] array, int index) { if (array.Length == 0) return false; return array.Length > index ? array[index] : array[array.Length - 1]; } } }