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

228 lines
8.6 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// 视觉系统业务类
/// </summary>
public class VisionBusiness
{
private ILogger<VisionBusiness> _logger;
private static VisionBusiness instance;
private TcpServer _tcpServer;
public VisionBusiness(ILogger<VisionBusiness> 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<VisionBusiness> logger, TcpServer tcpServer)
{
if (instance == null)
{
instance = new VisionBusiness(logger, tcpServer);
}
return instance;
}
/// <summary>
/// AMR就绪请求视觉开始工作
/// </summary>
public void RequestVisionStartWork(StackState state, string id)
{
_tcpServer.SendAMRRequestVisionStartWork(new byte[1] { (byte)state }, id);
}
/// <summary>
/// 码垛结束,请求视觉系统复位
/// </summary>
public void RequestVisionReplace(string port)
{
_tcpServer.SendStackOverRequestVisionSysReplace(port);
VDCount = 1;
VACount = 0;
TotalJudge = false;
}
/// <summary>
/// 上位机调度系统每隔固定时间,请求视觉系统状态
/// </summary>
public void VisionStateRequest(TcpVisionEntity entity, string id)
{
if (entity.DataLength == 2)
{
}
//Thread.Sleep(1000);
//SendRequestVisionSysState(id);
}
/// <summary>
/// 接受开始工作状态
/// </summary>
/// <param name="entity"></param>
/// <param name="id"></param>
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;
/// <summary>
/// 接受码垛结果
/// </summary>
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($"视觉系统一次码垛结束,返回数据格式错误");
}
}
/// <summary>
/// 收到视觉系统复位结果
/// </summary>
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($"视觉系统码垛结束,返回数据格式错误");
}
}
/// <summary>
/// 人工异常处理完成并更新计数
/// </summary>
public void GetManualExceptionDealDone(TcpVisionEntity entity, string id)
{
_tcpServer.SendReplyGetManualException(id);
}
}
}