using PmsSecondaryPackaging.Interface.Model.Carrier;
using PmsSecondaryPackaging.Interface.Model.StepBook;
using PmsSecondaryPackaging.Interface.Model.TaskBook;
using PmsSecondaryPackaging.TaskManager.TaskBookBehavior;
using ProjectManagementSystem.Common.Config;
using ProjectManagementSystem.Common.Log;
using ProjectManagementSystem.Common.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectManagementSystem.TaskBookEvent
{
///
/// PLC交互行为码,对接地址动态扩展
///
public class TaskBookBehavior_PLC : BaseTaskBookBehavior
{
private DateTime LastStepBookExecuting { get; set; }
public PlcBehavior PlcBehavior { get; set; }
public TaskBookBehavior_PLC(int behavior) : base(behavior)
{
PlcBehavior = ExcelConfig.Instance.PlcBehaviorList.FirstOrDefault(d => d.Behavior == behavior);
}
public override bool TaskBookOperator(TaskDetailInfoModel taskDetailInfo, List taskStepInfoList, CarrierInfoModel carrierInfo)
{
try
{
if (Math.Abs((DateTime.Now - LastStepBookExecuting).TotalSeconds) < 1) return false;
LastStepBookExecuting = DateTime.Now;
var stepInfo = TaskBookRegister.GetCurrentStepDetailInfo(taskDetailInfo, taskStepInfoList);
//写入
if (!Interaction(0, PlcBehavior.DbAddressWrite, PlcBehavior.DbValueWrite, taskDetailInfo, stepInfo))
{
return false;
}
//读取
if (!Interaction(1, PlcBehavior.DbAddressRead, PlcBehavior.DbValueRead, taskDetailInfo, stepInfo))
{
return false;
}
//最终写入
if (!Interaction(0, PlcBehavior.DbAddressFinalWrite, PlcBehavior.DbValueFinalWrite, taskDetailInfo, stepInfo))
{
return false;
}
TaskBookRegister.Log(taskDetailInfo, stepInfo, GetLog(taskDetailInfo, stepInfo));
return true;
}
catch (Exception ex)
{
TaskBookRegister.LogException(ex);
}
return false;
}
private bool Interaction(int flag, string[] addrArray, bool[] valueArray, TaskDetailInfoModel taskDetailInfo, StepDetailInfoModel taskStepInfo)
{
if (addrArray.Length <= 0) return true;
var routeConfig = ExcelConfig.Instance.GetRouteConfig(taskStepInfo.WareHouseID);
if (routeConfig == null)
{
TaskBookRegister.Log(taskDetailInfo, taskStepInfo, "查找库位配置信息失败");
return false;
}
if (string.IsNullOrEmpty(routeConfig.PlcIpAddr))
{
TaskBookRegister.Log(taskDetailInfo, taskStepInfo, "PlcIp地址为空");
return false;
}
var plc = PlcControl.Instance.GetPlcReadWrite(routeConfig.PlcIpAddr);
for (int i = 0; i < addrArray.Length; i++)
{
string addrDesc = addrArray[i];
string plcAddr = PlcControl.Instance.GetPlcTaskAddr(taskStepInfo.WareHouseID, addrDesc);
if (string.IsNullOrEmpty(plcAddr))
{
TaskBookRegister.Log(taskDetailInfo, taskStepInfo, $"查找地址失败:“{addrDesc}”");
return false;
}
bool plcValue = GetArrayValue(valueArray, i);
if(flag == 0)
{
if (!WriteBool(plc, plcAddr, plcValue, taskDetailInfo, taskStepInfo))
{
return false;
}
}
else
{
if(!ReadBool(plc, plcAddr, plcValue, taskDetailInfo, taskStepInfo))
{
return false;
}
}
}
return true;
}
private bool WriteBool(HslCommunication.Core.IReadWriteNet plc, string plcAddr, bool plcValue, TaskDetailInfoModel taskDetailInfo, StepDetailInfoModel taskStepInfo)
{
var result = plc.Write(plcAddr, plcValue);
if (!result.IsSuccess)
{
TaskBookRegister.Log(taskDetailInfo, taskStepInfo, $"写入失败({plcAddr}写入{plcValue})");
return false;
}
var readResult = plc.ReadBool(plcAddr);
if (readResult.IsSuccess)
{
if (readResult.Content != plcValue)
{
TaskBookRegister.Log(taskDetailInfo, taskStepInfo, $"写入检查失败(读取{plcAddr}!={plcValue})");
return false;
}
}
else
{
TaskBookRegister.Log(taskDetailInfo, taskStepInfo, $"写入检查失败(读取{plcAddr}失败)");
return false;
}
return true;
}
private bool ReadBool(HslCommunication.Core.IReadWriteNet plc, string plcAddr, bool plcValue, TaskDetailInfoModel taskDetailInfo, StepDetailInfoModel taskStepInfo)
{
var result = plc.ReadBool(plcAddr);
if (!result.IsSuccess
|| result.Content != plcValue)
{
TaskBookRegister.Log(taskDetailInfo, taskStepInfo, $"等待信号({plcAddr}={plcValue})");
return false;
}
return true;
}
private string GetLog(TaskDetailInfoModel taskDetailInfo, StepDetailInfoModel taskStepInfo)
{
StringBuilder sb = new StringBuilder();
sb.Append(PlcBehavior.Remark);
sb.Append("【");
for (int i = 0; i < PlcBehavior.DbAddressWrite.Length; i++)
{
string plcAddr = PlcControl.Instance.GetPlcTaskAddr(taskStepInfo.WareHouseID, PlcBehavior.DbAddressWrite[i]);
bool plcValue = GetArrayValue(PlcBehavior.DbValueWrite, i);
sb.Append($" {plcAddr}已写{plcValue};");
}
for (int i = 0; i < PlcBehavior.DbAddressRead.Length; i++)
{
string plcAddr = PlcControl.Instance.GetPlcTaskAddr(taskStepInfo.WareHouseID, PlcBehavior.DbAddressRead[i]);
bool plcValue = GetArrayValue(PlcBehavior.DbValueRead, i);
sb.Append($" 已等待{plcAddr}={plcValue};");
}
for (int i = 0; i < PlcBehavior.DbAddressFinalWrite.Length; i++)
{
string plcAddr = PlcControl.Instance.GetPlcTaskAddr(taskStepInfo.WareHouseID, PlcBehavior.DbAddressFinalWrite[i]);
bool plcValue = GetArrayValue(PlcBehavior.DbValueFinalWrite, i);
sb.Append($" {plcAddr}已最终写{plcValue};");
}
sb.Append("】");
return sb.ToString();
}
private bool GetArrayValue(bool[] array, int index)
{
if (array.Length == 0) return false;
return array.Length > index ? array[index] : array[array.Length - 1];
}
}
}