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); } } }