海康AGV控制系统

 

using WCS.Framework.DataTypes;
using WCS.Framework.DataTypes.ExtensionMethods;
using WCS.Framework.Log;
using WCS.HikRobot.SDK;
using WCS.HikRobot.SDK.ApiName;
using WCS.HikRobot.SDK.Model;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;

namespace Git.HikAgv.App.Server
{
    public partial class AgvCallbackServiceController : ApiController
    {
        private Log log = Log.Instance(typeof(AgvCallbackServiceController));

        /// <summary>
        /// 测试连接
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public HikDataResult TestAgv()
        {
            HikDataResult HikDataResult = new HikDataResult();
            HikDataResult.code = (int)EHikResponseCode.Success;
            HikDataResult.message = "测试连接成功";
            return HikDataResult;
        }

        /// <summary>
        /// AGV 执行回调的方法,包含任务开始,走出储位,任务完成及任务取消。取消通知为任务单,其他通知为单个任务组或子任务。
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [HttpPost]
        public HikDataResult<string> AgvCallback([FromBody] TaskCallbackDTO entity)
        {
            HikDataResult<string> HikDataResult = new HikDataResult<string>();
            log.Info("AGV 执行回调的方法: " + HikJsonHelper.SerializeObject(entity));

            string reqCode = entity.reqCode;                            //请求唯一编号
            string currentPositionCode = entity.currentPositionCode;    //当前所在的地图坐标
            string podCode = entity.podCode;                            //AGV搬运的货架编号
            string method = entity.method;                              //参数方法,用于各个模板回传的参数判断
            string robotCode = entity.robotCode;                        //AGV编号
            string taskCode=entity.taskCode;

            log.Info(string.Format("reqCode:{0} ; taskCode:{1} ; method:{2} ;podCode:{3} ;currentPositionCode:{4} ;", reqCode,taskCode, method,podCode, currentPositionCode));
            //坐标转换
            List<PositionEntity> ListMap = DomainContext.ListMap;
            ListMap = ListMap.IsNull() ? new List<PositionEntity>() : ListMap;

            if (currentPositionCode.IsNotEmpty())
            {
                PositionEntity Position = ListMap.FirstOrDefault(item => item.PositionCode == currentPositionCode);
                if (Position == null)
                {
                    HikDataResult.code = (int)EHikResponseCode.Exception;
                    HikDataResult.message = string.Format("{0}:对应的坐标点数据配置不正确, 请核对", currentPositionCode);
                    log.Info("坐标异常:->" + HikDataResult.message);
                    return HikDataResult;
                }
            }

            log.Info("判断回传的参数:-->" + method);

            /**路线一:开始任务和结束任务监控**/
            if (method == "btnStartOne")
            {
                AgvTaskEntity TaskModel = new AgvTaskEntity();
                TaskModel.reqCode = reqCode;
                TaskModel.currentPositionCode = currentPositionCode;
                TaskModel.podCode = podCode;
                TaskModel.method = method;
                TaskModel.robotCode = robotCode;
                TaskModel.TaskType = "T01";
                TaskModel.taskCode = taskCode;
                log.Info("[btnStartOne]请求号1:{"+taskCode+"}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
                TaskModel.EndPositionName = "Apply_A-1";
                PositionEntity PositionModel = ListMap.FirstOrDefault(item => item.PositionName == TaskModel.EndPositionName);
                if (PositionModel != null)
                {
                    TaskModel.EndPositionCode = PositionModel.PositionCode;
                }
                log.Info("[btnStartOne]请求号2:{" + taskCode + "}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
                DomainContext.AgvTask = TaskModel;
            }
            else if (method == "btnEndOne")
            {
                AgvTaskEntity TaskModel = DomainContext.AgvTask;
                if (TaskModel == null)
                {
                    HikDataResult.code = (int)EHikResponseCode.Exception;
                    HikDataResult.message = string.Format("[btnEndOne]请求号:{0}的搬运任务,在P1暂停点任务与系统记录不一致", taskCode);
                    log.Info("坐标异常:->" + HikDataResult.message);
                    return HikDataResult;
                }
                if (podCode.IsEmpty())
                {
                    HikDataResult.code = (int)EHikResponseCode.Exception;
                    HikDataResult.message = string.Format("[btnEndOne]请求号:{0}的搬运任务,在P1暂停点没有货架,不能继续搬运", taskCode);
                    log.Info("坐标异常:->" + HikDataResult.message);
                    return HikDataResult;
                }

                TaskModel.currentPositionCode = currentPositionCode;
                TaskModel.podCode = podCode;
                TaskModel.method = method;
                TaskModel.robotCode = robotCode;
                TaskModel.TaskType = "T01";
                TaskModel.taskCode = taskCode;

                if (TaskModel.currentPositionCode.IsNotEmpty())
                {
                    GenTaskRequestDTO StartModel = new GenTaskRequestDTO();
                    StartModel.reqCode = ConvertHelper.NewGuid().SubString(25);
                    StartModel.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    StartModel.clientCode = "WMS";
                    StartModel.agvCode = TaskModel.robotCode;
                    StartModel.podCode = TaskModel.podCode;
                    StartModel.taskCode = ConvertHelper.NewGuid().SubString(25);
                    StartModel.positionCodePath = new List<PositionDTO>();

                    //目标点坐标
                    PositionEntity EndBin = ListMap.Where(item => item.PositionName == "A-1" || item.PositionName == "A-2")
                        .Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
                        .FirstOrDefault();
                    //PositionEntity EndBin = ListMap.Where(item => item.PositionName == "A-2")
                    //    .Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
                    //    .FirstOrDefault();
                    if (EndBin == null)
                    {
                        HikDataResult.code = (int)EHikResponseCode.Exception;
                        HikDataResult.message = string.Format("[btnEndOne]请求号:{0}的搬运任务,在A-1,A-2中无可搬运的目标点", reqCode);
                        log.Info("坐标异常:->" + HikDataResult.message);
                        return HikDataResult;
                    }

                    //起始点坐标
                    PositionEntity BeginBin = ListMap.FirstOrDefault(item => item.PositionCode == currentPositionCode);
                    //StartModel.positionCodePath.Add(new PositionDTO() { positionCode = BeginBin.PositionCode, type = "00" });

                    PositionEntity HalfwayBin = null;
                    //确定目标坐标点以及中途停顿点
                    if (EndBin.PositionName == "A-2")
                    {
                        StartModel.taskTyp = "T03";

                        HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-2").FirstOrDefault();
                        if (HalfwayBin != null)
                        {
                            StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
                        }
                    }
                    else if (EndBin.PositionName == "A-1")
                    {
                        StartModel.taskTyp = "T04";
                        HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-3").FirstOrDefault();
                        if (HalfwayBin != null)
                        {
                            StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
                        }
                    }

                    StartModel.positionCodePath.Add(new PositionDTO() { positionCode = EndBin.PositionCode, type = "00" });

                    if (HalfwayBin != null)
                    {
                        StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
                    }

                    //搬运任务状态的变更
                    TaskModel = new AgvTaskEntity();
                    TaskModel.reqCode = StartModel.reqCode;
                    TaskModel.currentPositionCode = currentPositionCode;
                    TaskModel.podCode = podCode;
                    TaskModel.method = "";
                    TaskModel.robotCode = robotCode;
                    TaskModel.TaskType = StartModel.taskTyp;
                    TaskModel.taskCode = StartModel.taskCode;
                    if (BeginBin != null)
                    {
                        TaskModel.StartPositionCode = BeginBin.PositionCode;
                        TaskModel.StartPositionName = BeginBin.PositionName;
                    }
                    if (HalfwayBin != null)
                    {
                        TaskModel.HalfwayPositionCode = HalfwayBin.PositionCode;
                        TaskModel.HalfwayPositionName = HalfwayBin.PositionName;
                    }
                    if (EndBin != null)
                    {
                        TaskModel.EndPositionCode = EndBin.PositionCode;
                        TaskModel.EndPositionName = EndBin.PositionName;
                    }
                    DomainContext.AgvTask = TaskModel;

                    log.Info("[btnEndOne]第一条生产线搬运控制权转移: " + HikJsonHelper.SerializeObject(StartModel));
                    IHikTopClient client = new HikTopClientDefault();
                    JObject param = JObject.Parse(HikJsonHelper.SerializeObject(StartModel));
                    string Content = client.Execute(TaskApiName.TaskApiName_genAgvSchedulingTask, param);
                    log.Info("[btnEndOne]第一条生产线搬运控制权转移下发任务结果:" + Content);
                }
            }


            /**路线二:开始任务和结束任务监控**/
            else if (method == "btnStartTwo")
            {
                AgvTaskEntity TaskModel = new AgvTaskEntity();
                TaskModel.reqCode = reqCode;
                TaskModel.currentPositionCode = currentPositionCode;
                TaskModel.podCode = podCode;
                TaskModel.method = method;
                TaskModel.robotCode = robotCode;
                TaskModel.taskCode = taskCode;
                TaskModel.TaskType = "T02";

                TaskModel.EndPositionName = "Apply_A-1";
                log.Info("[btnStartTwo]请求号1:{"+taskCode+"}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
                PositionEntity PositionModel = ListMap.FirstOrDefault(item => item.PositionName == TaskModel.EndPositionName);
                if (PositionModel != null)
                {
                    TaskModel.EndPositionCode = PositionModel.PositionCode;
                }
                log.Info("[btnStartTwo]请求号2:{" + taskCode + "}的搬运任务" + HikJsonHelper.SerializeObject(TaskModel));
                DomainContext.AgvTask = TaskModel;
            }
            else if (method == "btnEndTwo")
            {
                AgvTaskEntity TaskModel = DomainContext.AgvTask;
                if (TaskModel == null)
                {
                    HikDataResult.code = (int)EHikResponseCode.Exception;
                    HikDataResult.message = string.Format("[btnEndTwo]请求号:{0}的搬运任务,在P1暂停点任务与系统记录不一致", taskCode);
                    log.Info("坐标异常:->" + HikDataResult.message);
                    return HikDataResult;
                }
                if (podCode.IsEmpty())
                {
                    HikDataResult.code = (int)EHikResponseCode.Exception;
                    HikDataResult.message = string.Format("[btnEndTwo]请求号:{0}的搬运任务,在P1暂停点没有货架,不能继续搬运", taskCode);
                    log.Info("坐标异常:->" + HikDataResult.message);
                    return HikDataResult;
                }
                TaskModel.currentPositionCode = currentPositionCode;
                TaskModel.podCode = podCode;
                TaskModel.method = method;
                TaskModel.robotCode = robotCode;
                TaskModel.taskCode = taskCode;
                TaskModel.TaskType = "T02";

                if (TaskModel.currentPositionCode.IsNotEmpty())
                {
                    GenTaskRequestDTO StartModel = new GenTaskRequestDTO();
                    StartModel.reqCode = ConvertHelper.NewGuid().SubString(25);
                    StartModel.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    StartModel.clientCode = "WMS";
                    StartModel.agvCode = TaskModel.robotCode;
                    StartModel.podCode = TaskModel.podCode;
                    StartModel.taskCode = ConvertHelper.NewGuid().SubString(25);
                    StartModel.positionCodePath = new List<PositionDTO>();

                    //目标点坐标
                    PositionEntity EndBin = ListMap.Where(item => item.PositionName == "C-1" || item.PositionName == "C-2")
                        .Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
                        .FirstOrDefault();
                    //PositionEntity EndBin = ListMap.Where(item => item.PositionName == "C-2")
                    //    .Where(item => item.HasCon == (int)EHikBool.No && item.PodCode.IsEmpty())
                    //    .FirstOrDefault();
                    if (EndBin == null)
                    {
                        HikDataResult.code = (int)EHikResponseCode.Exception;
                        HikDataResult.message = string.Format("[btnEndTwo]请求号:{0}的搬运任务,在C-1,C-2中无可搬运的目标点", reqCode);
                        log.Info("坐标异常:->" + HikDataResult.message);
                        return HikDataResult;
                    }

                    //起始点坐标
                    PositionEntity BeginBin = ListMap.FirstOrDefault(item => item.PositionCode == currentPositionCode);
                    //StartModel.positionCodePath.Add(new PositionDTO() { positionCode = BeginBin.PositionCode, type = "00" });

                    PositionEntity HalfwayBin = null;
                    //确定目标坐标点以及中途停顿点
                    if (EndBin.PositionName == "C-2")
                    {
                        StartModel.taskTyp = "T05";

                        HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-2").FirstOrDefault();
                        if (HalfwayBin != null)
                        {
                            StartModel.positionCodePath.Add(new PositionDTO() { positionCode = HalfwayBin.PositionCode, type = "00" });
                        }
                    }
                    else if (EndBin.PositionName == "C-1")
                    {
                        StartModel.taskTyp = "T06";
                        HalfwayBin = ListMap.Where(item => item.PositionName == "Apply_A-3&

### 海康威视AGV模拟器下载与使用 对于希望从事智能仓储物流技术研究或者实际应用开发的技术人员来说,获取并掌握海康威视AGV(自动导引车)模拟器是非常有帮助的。然而,官方文档中并未直接提及专门针对AGV产品的独立模拟器软件。 通常情况下,海康威视提供的一系列开发工具和服务可以间接满足这一需求。例如,isc海康平台测试工具提供了全面的API支持,允许开发者高效对接海康平台,这其中包括了可能涉及到AGV控制的相关功能[^2]。这意味着虽然没有特定标记为“AGV”的模拟环境,但是可以通过这些通用接口来构建虚拟场景下的AGV行为仿真。 如果确实需要更加贴近真实的AGV操作体验,则建议关注以下几个方向: - **联系厂商**:直接向海康威视申请技术支持或咨询是否有内部使用的培训/演示版本可供外部访问。 - **社区资源**:加入专业的论坛和技术交流群组,如智能仓储物流技术研习社这样的社群,成员间可能会分享更多未公开的信息和经验[^1]。 - **第三方解决方案**:市场上存在一些由其他公司提供的基于海康设备协议实现的模拟程序,尽管不是原厂出品,但在某些应用场景下也能起到很好的辅助作用。 ```python import requests def check_hikvision_api_status(api_url): try: response = requests.get(api_url) if response.status_code == 200: print("API is accessible.") else: print(f"Failed to access API, status code: {response.status_code}") except Exception as e: print(f"Error occurred while checking API: {e}") # Example usage of the function with a hypothetical Hikvision API endpoint check_hikvision_api_status('https://example.hikvision.com/api/v1/status') ``` 此代码片段展示了如何利用Python脚本检查一个假设性的海康威视API端点的状态,这对于初步了解所选API是否正常工作非常有用,在尝试连接任何类型的模拟器之前都是必要的准备工作之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

softshow1026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值