You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

449 lines
11 KiB

using Autofac;
using HslCommunication;
using HybirdFrameworkCore.Autofac;
using HybirdFrameworkCore.Utils;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using Repository.Station;
using Service.Execute.Model;
using Service.Plc.Msg;
6 months ago
namespace Service.Plc.Client;
6 months ago
public class PlcMgr
6 months ago
{
public static PlcClient? PlcClient;
6 months ago
public static readonly HostToPlc HostToPlcData = new HostToPlc();
public static readonly PlcToHost PlcToHostData = new PlcToHost();
6 months ago
public static PlcFault LastPlcFaultData = new PlcFault();
6 months ago
public static readonly PlcFault PlcFaultData = new PlcFault();
public
6 months ago
/// <summary>
/// 数据有效时间。单位秒
/// </summary>
static int DataTimeSeconds = 20;
6 months ago
/// <summary>
/// 数据刷新时间
/// </summary>
public static DateTime DataValidityTime = DateTime.Now;
6 months ago
public static void Init()
{
if (PlcClient == null)
{
PlcClient = AppInfo.Container.Resolve<PlcClient>();
}
Task.Run(() => PlcClient.Connect());
}
6 months ago
6 months ago
/// <summary>
/// 写入口灯
/// 红灯1020
/// 绿灯1000
/// </summary>
/// <param name="value"></param>
6 months ago
/// <returns></returns>
public static bool WriteEntranceLamp(ushort value)
6 months ago
{
if (PlcClient != null)
6 months ago
{
HostToPlcData.LightIn.Value = value;
return PlcClient.WriteValue(HostToPlcData.LightIn);
6 months ago
}
6 months ago
return false;
}
6 months ago
public static bool AirBlowerControl(ushort value)
{
if (PlcClient != null)
{
HostToPlcData.ExhaustFanControl.Value = value;
return PlcClient.WriteValue(HostToPlcData.ExhaustFanControl);
}
return false;
}
6 months ago
public static ushort BlowerStatus()
{
if (PlcClient != null)
{
return PlcToHostData.ExhaustFanStatus.Value;
}
return 0;
}
6 months ago
6 months ago
/// <summary>
/// 是否远程模式
/// </summary>
/// <returns></returns>
public static bool IsRemote()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.RemoteLocalControlState.Value == 1010;
}
else
{
return false;
}
}
6 months ago
public static bool IsAuto()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.ModeControl.Value == 1010;
6 months ago
}
else
{
return false;
}
}
/// <summary>
/// 入口雷达检测
/// </summary>
/// <returns></returns>
public static bool EntranceRadar()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.RadarStatesIn.Value == 1000 ? true : false;
}
else
{
return false;
}
}
/// <summary>
/// 出口雷达检测
/// </summary>
/// <returns></returns>
public static bool ExitRadar()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.RadarStatesOut.Value == 1000 ? true : false;
}
else
{
return false;
}
}
/// <summary>
/// 写出口灯
/// 红灯1020
/// 绿灯1000
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static bool WriteExistLamp(int data)
{
if (PlcClient != null)
6 months ago
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.LightOut.Value = (ushort)data;
return PlcClient.WriteValue(writeHostToPlc.LightOut);
6 months ago
}
6 months ago
return false;
}
/// <summary>
/// 下发选包
/// </summary>
/// <param name="inBinNo">入仓位,仓位号</param>
/// <param name="outBinNo">出仓位,仓位号</param>
/// <returns></returns>
public static bool DistributeBinNo(string inBinNo, string outBinNo)
6 months ago
{
if (PlcClient != null)
6 months ago
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.EntrySelection.Value = Convert.ToUInt16(inBinNo);
writeHostToPlc.ExitSelection.Value = Convert.ToUInt16(outBinNo);
bool write1 = PlcClient.WriteValue(writeHostToPlc.EntrySelection);
bool write2 = PlcClient.WriteValue(writeHostToPlc.ExitSelection);
6 months ago
return write1 && write2;
}
6 months ago
return false;
}
public static bool ReadTaskStatus(ushort taskNo)
{
if (PlcClient != null)
{
ResetPlc();
return PlcToHostData.TaskType.Value == taskNo;
}
return false;
}
/// <summary>
/// plc上使能
/// </summary>
/// <returns></returns>
public static bool HoldOn()
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.TaskEnablement.Value = 1000;
return PlcClient.WriteValue(writeHostToPlc.TaskEnablement);
}
/// <summary>
/// 下发任务 plc 需要一起下发
/// </summary>
/// <returns></returns>
public static bool DistributeTask(ushort inBinNo, ushort outBinNo, ushort taskNo)
{
DistributeTask distributeTask = new()
{
TaskNo = taskNo,
InBinNo = inBinNo,
OutBinNo = outBinNo,
BatteryPackType = 0,
};
byte[] encode = ModelConvert.Encode(distributeTask);
//TODO::現在手動處理encode
for (int i = 0; i < encode.Length; i++)
{
if (i % 2 == 0)
{
var temp = encode[i + 1];
encode[i + 1] = encode[i];
encode[i] = temp;
}
}
//需要将数据转换成byte数组
6 months ago
OperateResult operateResult = PlcClient.Write("x=16;111", encode);
return operateResult.IsSuccess;
}
6 months ago
/// <summary>
/// 下发换电任务以外的任务 6:调库 7消防
6 months ago
/// </summary>
/// <param name="inBinNo"> 入仓位</param>
/// <param name="outBinNo">出仓位</param>
/// <param name="taskNo">任务类型</param>
6 months ago
/// <returns></returns>
public static bool StartSwapping(ushort inBinNo, ushort outBinNo, ushort taskNo)
6 months ago
{
if (PlcClient != null)
6 months ago
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.TaskType.Value = taskNo;
writeHostToPlc.EntrySelection2.Value = inBinNo;
writeHostToPlc.ExitSelection2.Value = outBinNo;
//writeHostToPlc.TaskEnablement.Value = (ushort)1000;
bool write1 = PlcClient.WriteValue(writeHostToPlc.TaskType);
//bool write2 = PlcClient.WriteValue(writeHostToPlc.TaskEnablement);
return write1;
6 months ago
}
6 months ago
return false;
}
6 months ago
static bool heart = false;
private static BinInfoRepository BinInfoRepository = AppInfo.Container.Resolve<BinInfoRepository>();
6 months ago
/// <summary>
/// 查看拍照状态
/// </summary>
/// <param name="location">位置 1左侧 2右侧 </param>
6 months ago
/// <returns></returns>
public static ushort ChannelStatus(int location)
6 months ago
{
if (PlcClient != null)
{
if (location==1)
{
return PlcToHostData.ChannelLocationState2.Value;
}
else
{
return PlcToHostData.ChannelLocationState.Value;
}
}
6 months ago
return 0;
}
/// <summary>
/// 重新读
/// </summary>
public static void ResetPlc()
{
PlcClient.Reset();
}
6 months ago
/// <summary>
/// 读plc任务状态
/// </summary>
/// <returns>6未连接</returns>
public static int ReadPlcTaskStatus()
{
if (PlcClient != null)
6 months ago
{
return PlcToHostData.TaskStates.Value;
6 months ago
}
6 months ago
return (-1);
6 months ago
}
/// <summary>
/// 灯光控制:全部打开
/// </summary>
/// <returns></returns>
public static bool AllLightsOn()
{
bool bResult = false;
if (PlcClient != null)
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.LightingControl.Value = 1000;
bResult = PlcClient.WriteValue(writeHostToPlc.LightingControl);
}
6 months ago
return bResult;
}
6 months ago
/// <summary>
/// 获取当前灯光状态
/// </summary>
/// <returns></returns>
public static ushort GetNowLightsOn()
{
if (PlcClient != null)
{
return PlcToHostData.LightStatus.Value;
}
6 months ago
return default;
}
/// <summary>
/// 灯光控制:全部关闭
/// </summary>
/// <returns></returns>
public static bool AllLightsOff()
{
bool bResult = false;
if (PlcClient != null)
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.LightingControl.Value = 1010;
bResult = PlcClient.WriteValue(writeHostToPlc.LightingControl);
}
6 months ago
return bResult;
}
/// <summary>
/// 写电池包锁止状态
/// </summary>
/// <returns></returns>
public static bool WriteStopCommand(ushort lockStatus)
{
bool bResult = false;
if (PlcClient != null)
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.StopCommand.Value = lockStatus;
bResult = PlcClient.WriteValue(writeHostToPlc.StopCommand);
}
return bResult;
}
/// <summary>
/// 下发车辆驻车状态
/// </summary>
/// <param name="vehicleParkingStatus"></param>
/// <returns></returns>
public static bool WriteVehicleParkingStatus(ushort vehicleParkingStatus)
{
bool bResult = false;
if (PlcClient != null)
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.VehicleParkingStatus.Value = vehicleParkingStatus;
bResult = PlcClient.WriteValue(writeHostToPlc.VehicleParkingStatus);
}
return bResult;
}
/// <summary>
/// 控制卷帘门
/// 0:无操作
///1000请求开启
///1010请求关闭
/// </summary>
/// <param name="pollerShutter"></param>
/// <returns></returns>
public static bool WriteRollerShutter(ushort pollerShutter)
{
bool bResult = false;
if (PlcClient != null)
{
HostToPlc writeHostToPlc = new HostToPlc();
writeHostToPlc.RollerShutter.Value = pollerShutter;
bResult = PlcClient.WriteValue(writeHostToPlc.RollerShutter);
}
return bResult;
}
/// <summary>
/// 卷帘门是否开启
/// </summary>
/// <returns></returns>
public static bool RollerShutterRadar()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.RollerShutter.Value == 1000 ? true : false;
}
else
{
return false;
}
}
/// <summary>
/// 实体按钮是否拍下
/// </summary>
/// <returns></returns>
public static bool PhysicalButtonStateRadar()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcToHostData.PhysicalButtonState.Value == 1000 ? true : false;
}
else
{
return false;
}
}
}