using Microsoft.Extensions.Logging;
using SlnMesnac.Repository.service;
using SlnMesnac.TouchSocket;
using SlnMesnac.TouchSocket.Entity;
using System;
using System.Collections.Generic;
using System.Text;
namespace SlnMesnac.Business.@base
{
///
/// 视觉系统业务类
///
public class VisionBusiness
{
private ILogger _logger;
private static VisionBusiness instance;
private TcpServer _tcpServer;
public VisionBusiness(ILogger logger, TcpServer tcpServer)
{
_logger = logger;
_tcpServer = tcpServer;
//视觉系统回复状态
_tcpServer.ReceiveVisionSysStateEvent += VisionStateRequest;
//视觉系统回复开始码垛
_tcpServer.ReceiveVisionStartWorkEvent += GetVisionWorkState;
//视觉系统通知一次码垛完成结果
_tcpServer.ReceiveStackWorkDoneEvent += StackResultSend;
//视觉系统通知人工异常处理完成
_tcpServer.ReceiveManualExceptionDealDoneEvent += GetManualExceptionDealDone;
//视觉系统回复复位结果
_tcpServer.ReceiveStackRobotResetEvent += GetResetResult;
}
public static VisionBusiness GetInstance(ILogger logger, TcpServer tcpServer)
{
if (instance == null)
{
instance = new VisionBusiness(logger, tcpServer);
}
return instance;
}
///
/// AMR就绪,请求视觉开始工作
///
public void RequestVisionStartWork(StackState state, string id)
{
_tcpServer.SendAMRRequestVisionStartWork(new byte[1] { (byte)state }, id);
}
///
/// 码垛结束,请求视觉系统复位
///
public void RequestVisionReplace(string port)
{
_tcpServer.SendStackOverRequestVisionSysReplace(port);
VDCount = 1;
VACount = 0;
TotalJudge = false;
}
///
/// 上位机调度系统每隔固定时间,请求视觉系统状态
///
public void VisionStateRequest(TcpVisionEntity entity, string id)
{
if (entity.DataLength == 2)
{
}
//Thread.Sleep(1000);
//SendRequestVisionSysState(id);
}
///
/// 接受开始工作状态
///
///
///
private void GetVisionWorkState(TcpVisionEntity entity, string id)
{
if (entity.DataLength == 1)
{
if (entity.DataBytes[0] == 0x00)
{
_logger.LogInformation($"视觉系统收到开始工作状态:正常开始工作");
}
else if (entity.DataBytes[0] == 0x01)
{
_logger.LogError($"视觉系统收到开始工作状态:异常不能开始工作");
}
else
{
_logger.LogError($"视觉系统收到开始工作状态:返回未知代码");
}
}
else
{
_logger.LogError($"视觉系统收到开始工作状态:数据返回格式错误");
}
}
int VDCount = 1;
int VACount = 0;
int VDTotal = 8;
int VATotal = 6;
bool Vjudge = true;
bool VNow = true;
public bool TotalJudge = false;
///
/// 接受码垛结果
///
public void StackResultSend(TcpVisionEntity entity, string id)
{
if (entity.DataLength == 1)
{
if (entity.DataBytes[0] == 0x00)
{
_logger.LogInformation($"视觉系统一次码垛结束,码垛完成 Deliver:{VDCount} AMR:{VACount}");
//上位机回复收到码垛结果
_tcpServer.SendReplayStackResult(id);
//这里写是否继续下一次码垛的判断条件
if ((VDCount < VDTotal && Vjudge == true && TotalJudge == true) || (VACount < VATotal && Vjudge == false && TotalJudge == true))
{
//如果码垛没结束继续发下一次的码垛信号
if (Vjudge) //这里写向哪个机器人码垛的判断条件
{
//发送向搬运机器人(AGVDeliver)码垛的信号
RequestVisionStartWork(StackState.AGVNoPositioning, id);
_logger.LogInformation("下一次码垛开始,方向:搬运机器人");
VDCount++;
VNow = true;
if (VDCount >= VDTotal)
{
Vjudge = false;
}
}
else
{
//发送向复合机器人(AMR)码垛的信号
RequestVisionStartWork(StackState.AMRNoPositioning, id);
_logger.LogInformation("下一次码垛开始,方向:复合机器人");
VACount++;
VNow = false;
if (VACount >= VATotal)
{
Vjudge = true;
}
}
}
else
{
//如果码垛结束就请求复位
RequestVisionReplace(id);
_logger.LogInformation("本次码垛结束,请求复位");
}
}
else if (entity.DataBytes[0] == 0x01)
{
_logger.LogError($"视觉系统一次码垛结束,码垛过程失败 Deliver:{VDCount} AMR:{VACount}");
//如果码垛没结束继续发下一次的码垛信号
if (VNow) //这里写向哪个机器人码垛的判断条件
{
//发送向搬运机器人(AGVDeliver)码垛的信号
RequestVisionStartWork(StackState.AGVNoPositioning, id);
_logger.LogInformation("下一次码垛开始,方向:搬运机器人");
}
else
{
//发送向复合机器人(AMR)码垛的信号
RequestVisionStartWork(StackState.AMRNoPositioning, id);
_logger.LogInformation("下一次码垛开始,方向:复合机器人");
}
}
else if (entity.DataBytes[0] == 0x02)
{
_logger.LogError($"视觉系统一次码垛结束,码垛检查失败");
}
else
{
_logger.LogError($"视觉系统一次码垛结束,未知返回代码");
}
}
else
{
_logger.LogError($"视觉系统一次码垛结束,返回数据格式错误");
}
}
///
/// 收到视觉系统复位结果
///
public void GetResetResult(TcpVisionEntity entity, string id)
{
if(entity.DataLength == 0x01)
{
if (entity.DataBytes[0] == 0x00)
{
_logger.LogInformation($"视觉系统码垛结束,复位正常");
}
else if (entity.DataBytes[0] == 0x01)
{
_logger.LogError($"视觉系统码垛结束,复位异常");
}
else
{
_logger.LogError($"视觉系统码垛结束,未知返回代码");
}
}
else
{
_logger.LogError($"视觉系统码垛结束,返回数据格式错误");
}
}
///
/// 人工异常处理完成并更新计数
///
public void GetManualExceptionDealDone(TcpVisionEntity entity, string id)
{
_tcpServer.SendReplyGetManualException(id);
}
}
}