using Autofac;
using HybirdFrameworkCore.Autofac;
using Service.PlcAfrica.Msg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HslCommunication;
using HybirdFrameworkCore.Utils;
using Service.Charger.Server;
using Service.Execute.Model;
namespace Service.PlcAfrica.Client
{
public class PlcAfricaMgr
{
public static PlcAfricaClient? PlcAfricaClient;
public static PlcAfricaMsg PlcAfricaMsg = new PlcAfricaMsg();
///
/// 数据有效时间。单位秒
///
static int DataTimeSeconds = 20;
///
/// 数据刷新时间
///
public static DateTime DataValidityTime = DateTime.Now;
public static void PlcInit()
{
if (PlcAfricaClient == null)
{
PlcAfricaClient = AppInfo.Container.Resolve();
}
Task.Run(() => PlcAfricaClient.Connect());
}
public static void Reset()
{
if (PlcAfricaClient == null)
{
PlcAfricaClient.Reset();
}
}
///
/// 0 无动作
/// 1 急停指令
/// 2 自动换电启动指令
/// 3 自动调仓启动指令
/// 4 暂停指令
/// 5 继续指令
/// 6 停止指令
/// 7 结束指令
/// 11 测量轴启动
/// 12 回原点
/// 101 此行及以下未实装,维持《上位机PLC通讯内容V1.5》内容
///
///
public static bool StartSwap()
{
if (PlcAfricaClient != null)
{
PlcAfricaMsg.OperationInstruction.Value = 2;
PlcAfricaClient!.WriteValue(PlcAfricaMsg.OperationInstruction);
Reset();
return PlcAfricaMsg.StationCommandFeedback.Value == 2;
}
return false;
}
public static bool StationCommandFeedback()
{
return PlcAfricaMsg.StationCommandFeedback.Value == 2;
}
///
/// 操作指令
///
///
///
public static bool OperationInstruction(ushort cmd)
{
if (PlcAfricaClient == null)
{
PlcAfricaMsg.OperationInstruction.Value = cmd;
PlcAfricaClient!.WriteValue(PlcAfricaMsg.OperationInstruction);
Reset();
return PlcAfricaMsg.StationCommandFeedback.Value == cmd;
}
return false;
}
///
/// 读8000 自动任务状态
///
///
///
public static ushort AutoActionStatus()
{
return PlcAfricaMsg.ActionCode.Value ;
}
///
/// 机器人状态 7001
///
///
///
public static bool RobotStatus(ushort cmd)
{
return PlcAfricaMsg.PowerChangeModeRobot.Value == cmd;
}
///
/// 机器人状态 就绪
///
///
///
public static bool RobotReady()
{
return PlcAfricaMsg.PowerChangeModeRobot.Value == 1;
}
///
/// 机器人状态 工作完成
///
///
///
public static bool RobotWorkFinish()
{
return PlcAfricaMsg.PowerChangeModeRobot.Value == 3;
}
///
/// 下发车辆信息 0无车辆,1车辆解锁,2车辆上锁
///
///
///
public static bool CarStatus(ushort cmd)
{
if (PlcAfricaClient == null)
{
PlcAfricaMsg.TboxUnlock.Value = cmd;
return PlcAfricaClient.WriteValue(PlcAfricaMsg.TboxUnlock);
}
return false;
}
///
///下发取放仓位
///
///
/// 下发换电
///
///
public static bool DistributeTask(ushort inBinNo, ushort outBinNo)
{
//下发任务前,增加待机状态判断
if (!RobotReady())
{
return false;
}
DistributeTask distributeTask = new()
{
InBinNo = inBinNo,
OutBinNo = inBinNo,//outBinNo,
};
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数组
OperateResult operateResult = PlcAfricaClient.Write("x=16;7008", encode);
return operateResult.IsSuccess;
}
public static bool IsAutoAndRemote()
{
if ((DateTime.Now - DataValidityTime).Seconds <= DataTimeSeconds)
{
return PlcAfricaMsg.PowerChangeMode.Value == 2;
}
else
{
return false;
}
}
///
/// 红绿灯 0-不亮,1-亮红灯,2-绿灯,3-绿灯闪
///
///
public static bool LightControl(ushort cmd)
{
if (PlcAfricaClient == null)
{
PlcAfricaMsg.TrafficLightFunction.Value = cmd;
return PlcAfricaClient!.WriteValue(PlcAfricaMsg.TrafficLightFunction);
}
return false;
}
}
}