kazelee
2025-06-30 3512011e94f013955b7b1e2de8558b8861db86b7
优化配置文件读取和AGV调度细节
4个文件已添加
9个文件已修改
4个文件已删除
130 ■■■■ 已修改文件
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/0dac82e9-3813-4381-97c5-6d5e9aea9264.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/45cd14e7-f5f2-43ad-8265-90a4e2beef30.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/aba42493-3f71-43ce-88ef-e0cd43be7a13.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/b46d38b7-1876-42b3-81c8-ac8f930ac5f8.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/cebd90f0-0f2c-46b9-a251-1039546e19c0.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/f899d85d-f665-4743-b2a9-9b2ea8fc7674.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.AnGang/v17/HierarchyCache.v1.txt 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3.AnGang.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Program.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/config.comment.json 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/config.json 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_Loc_Container.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
process/TaskProcess.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util/Settings.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/WCSHelper.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/0dac82e9-3813-4381-97c5-6d5e9aea9264.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/45cd14e7-f5f2-43ad-8265-90a4e2beef30.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/aba42493-3f71-43ce-88ef-e0cd43be7a13.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/b46d38b7-1876-42b3-81c8-ac8f930ac5f8.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/cebd90f0-0f2c-46b9-a251-1039546e19c0.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/f899d85d-f665-4743-b2a9-9b2ea8fc7674.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.AnGang/v17/HierarchyCache.v1.txt
Binary files differ
HH.WCS.Mobox3.AnGang.csproj
@@ -310,7 +310,6 @@
  <ItemGroup>
    <None Include=".editorconfig" />
    <None Include="App.config" />
    <None Include="config\config.comment.json" />
    <None Include="config\config.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
Program.cs
@@ -23,7 +23,7 @@
            //1.0 开启api
            Startup();
            //2.0 开启tcp
            StartTcp();
            //StartTcp();
            //3.0 开启S7
            //StartS7();
            //4.0 开启Modbus
@@ -76,9 +76,9 @@
        /// </summary>
        private static void StartTcp()
        {
            var tcpServerIP = Settings.TCPServerIP;
            var tcpServerPort = Settings.TCPServerPort;
            new TcpServer(tcpServerIP, tcpServerPort);
            //var tcpServerIP = Settings.TCPServerIP;
            //var tcpServerPort = Settings.TCPServerPort;
            //new TcpServer(tcpServerIP, tcpServerPort);
        }
api/ApiHelper.cs
@@ -23,13 +23,15 @@
            var taskName = TaskName.产品入库;
            var db = new SqlHelper<object>().GetInstance();
            var startAreas = Settings.Areas[AreaIndex.Q取货区];
            try {
                // 起点位置必须:为空、无锁、启用、属于收发区域
                var startLoc = db.Queryable<TN_Location>()
                    .Where(a => a.S_CODE == model.StartLoc)
                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y")
                    //.Where(a => a.N_CURRENT_NUM == 0)
                    .Where(a => Settings.Areas[0].Contains(a.S_AREA_CODE)) // 收发区
                    .Where(a => startAreas.Contains(a.S_AREA_CODE))
                    .First();
                if (startLoc == null) {
@@ -150,13 +152,15 @@
            var taskName = TaskName.产品入库;
            var db = new SqlHelper<object>().GetInstance();
            var startAreas = Settings.Areas[AreaIndex.Q取货区];
            try {
                // 起点位置必须:为空、无锁、启用、属于收发区域
                var startLoc = db.Queryable<TN_Location>()
                    .Where(a => a.S_CODE == model.StartLoc)
                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y")
                    //.Where(a => a.N_CURRENT_NUM == 0)
                    .Where(a => Settings.Areas[0].Contains(a.S_AREA_CODE)) // 收发区
                    .Where(a => startAreas.Contains(a.S_AREA_CODE))
                    .First();
                if (startLoc == null) {
@@ -261,6 +265,8 @@
            var db = new SqlHelper<object>().GetInstance();
            var endAreas = Settings.Areas[AreaIndex.H货架区];
            try {
                // 任务号存在:终点货架和终点位置为空,且任务为产品入库(PDA)
                var task = db.Queryable<TN_Task>()
@@ -305,7 +311,7 @@
                        .Where(a => a.S_CODE == model.EndLoc)
                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y")
                        .Where(a => a.N_CURRENT_NUM == 0)
                        .Where(a => Settings.Areas[1].Contains(a.S_AREA_CODE))
                        .Where(a => endAreas.Contains(a.S_AREA_CODE))
                        .Where(a => a.N_LAYER <= 2)
                        .First();
                }
@@ -314,7 +320,7 @@
                        .Where(a => a.S_CODE == model.EndLoc)
                        .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y")
                        .Where(a => a.N_CURRENT_NUM == 0)
                        .Where(a => Settings.Areas[1].Contains(a.S_AREA_CODE))
                        .Where(a => endAreas.Contains(a.S_AREA_CODE))
                        .OrderBy(a => a.N_LAYER > 2 ? 0 : 1) // 优先取大于2的
                        //.Where(a => a.N_LAYER <= 3)
                        .First();
@@ -375,11 +381,15 @@
            var taskName = TaskName.产品部分出库;
            var db = new SqlHelper<object>().GetInstance();
            var startAreas = Settings.Areas[AreaIndex.H货架区];
            var endAreas = Settings.Areas[AreaIndex.X卸货区];
            try {
                // 起点位置:货架(有货、没有锁、已启用)
                var startLoc = db.Queryable<TN_Location>()
                    .Where(a => a.S_CODE == model.startLoc)
                    .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y")
                    .Where(a => startAreas.Contains(a.S_AREA_CODE))
                    .Where(a => a.N_CURRENT_NUM == 1)
                    .First();
@@ -393,7 +403,7 @@
                    return BuildSimpleResult(3, $"起点位置 {model.startLoc} 没有绑定容器,无可出库的物料");
                }
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && Settings.Areas[0].Contains(a.S_AREA_CODE));
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && endAreas.Contains(a.S_AREA_CODE));
                if (endLoc == null) {
                    return BuildSimpleResult(4, $"终点位置 {model.endLoc} 不具备放货条件");
@@ -446,9 +456,12 @@
            var taskName = TaskName.产品部分回库;
            var db = new SqlHelper<object>().GetInstance();
            var startAreas = Settings.Areas[AreaIndex.X卸货区];
            var endAreas = Settings.Areas[AreaIndex.H货架区];
            try {
                // 起点位置:取放货区(有货物、没有锁、已启用)
                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && Settings.Areas[0].Contains(a.S_AREA_CODE));
                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && startAreas.Contains(a.S_AREA_CODE));
                if (startLoc == null) {
                    return BuildSimpleResult(2, $"起点位置 {model.startLoc} 不符合回库条件");
                }
@@ -459,7 +472,7 @@
                }
                // 终点位置:货架(没有货物,没有锁)
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y");
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && endAreas.Contains(a.S_AREA_CODE));
                if (endLoc == null) {
                    return BuildSimpleResult(4, $"终点位置 {model.endLoc} 不具备放货条件");
                }
config/config.comment.json
File was deleted
config/config.json
@@ -1,14 +1,15 @@
{
    "WebApiUrl": "http://127.0.0.1:8901",
    "RCSApiUrl": "http://127.0.0.1:6001/",
    "NDCApiUrl": "http://127.0.0.1:5201/api/order/",
    "SqlServer": "Data Source=192.168.1.144;Initial Catalog=YinKouAnGan;User ID=hhuser;Password=Hh123321&&",
    "TCPServerIP": "127.0.0.1",
    "TCPServerPort": 8085,
    "Areas": [
        {
            "Name": "取放货区",
            "Codes": [ "QFHQ" ]
            "Name": "取货区",
            "Codes": [ "AGVQH" ]
        },
        {
            "Name": "卸货区",
            "Codes": [ "AGVXH" ]
        },
        {   
            "Name": "货架区",
core/WCSCore.cs
@@ -126,13 +126,13 @@
                    return;
                }
                if (db.Updateable<TN_Loc_Container>()
                    .SetColumns(d => d.S_IMG_URL == filepath)
                    .Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0) {
                //if (db.Updateable<TN_Loc_Container>()
                //    .SetColumns(d => d.S_IMG_URL == filepath)
                //    .Where(d => d.S_CNTR_CODE == model.S_CNTR_CODE).ExecuteCommand() <= 0) {
                    LogHelper.Info($"图片URL '{filepath}' 写入数据库失败");
                    return;
                }
                //    LogHelper.Info($"图片URL '{filepath}' 写入数据库失败");
                //    return;
                //}
            }
            catch (Exception ex) {
                LogHelper.Info($"发生了错误:{ex.Message}");
@@ -245,7 +245,7 @@
                // 如果没有符合条件的货位,置空,等待PDA重新确定
                if (endLoc == null) {
                    tn_task.S_END_AREA = Settings.Areas[1][0]; // HJQ
                    tn_task.S_END_AREA = Settings.Areas[AreaIndex.H货架区][0]; // HJQ
                    tn_task.S_END_LOC = "0";
                    // 不需要再给GZ AGV传空值,一开始就没给具体货位,只给了Area
models/TN_Loc_Container.cs
@@ -20,6 +20,6 @@
        /// <summary>
        /// 图片链接
        /// </summary>
        public string S_IMG_URL { get; set; } = "";
        //public string S_IMG_URL { get; set; } = "";
    }
}
process/TaskProcess.cs
@@ -29,7 +29,6 @@
                LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
                LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList());
            }
        }
        /// <summary>
@@ -45,13 +44,10 @@
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
            else {
                //起点终点解锁
                LocationHelper.UnLockLoc(mst.S_START_LOC);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
        }
        /// <summary>
@@ -118,8 +114,19 @@
                var startSite = LocationHelper.GetAgvSite(mst.S_START_LOC);
                var endSite = LocationHelper.GetAgvSite(mst.S_END_LOC); // 如果找不到会返回0,就是假终点
                var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, dst = endSite }), "p2pdst", "pgapi");
                var code = -1;
                if (taskType == TaskName.产品入库) {
                    code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, order_name = $"{mst.S_CODE}" }), "p2pdst", "pgapi");
                }
                else {
                    code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, JsonConvert.SerializeObject(new { src = startSite, dst = endSite }), "p2p", "pgapi");
                }
                // car_type 默认为1
                // src_ort 货架排号
                // dst_orc 货架层数(后两个信息应该为国自AGV内部维护,以后面更改的结果为准)
                //var code = GZRobot.CreateOrder(mst.S_CODE, mst.N_PRIORITY, $"{{\"src\" = \"{startSite}\", \"dst\" = \"{endSite}\", \"car-type\": 1 }}", "p2pdst", "pgapi");
                if (code > 0) {
                    //更新任务状态
                    mst.N_B_STATE = 1;
util/Settings.cs
@@ -49,10 +49,10 @@
                WebApiUrl = root.WebApiUrl;
                RCSApiUrl = root.RCSApiUrl;
                NDCApiUrl = root.NDCApiUrl;
                //NDCApiUrl = root.NDCApiUrl;
                SqlServer = root.SqlServer;
                TCPServerIP = root.TCPServerIP;
                TCPServerPort = root.TCPServerPort;
                //TCPServerIP = root.TCPServerIP;
                //TCPServerPort = root.TCPServerPort;
                //Areas = root.Areas;
                foreach (var item in root.Areas) {
                    Areas.Add(item.Codes);
@@ -90,10 +90,7 @@
        public class Root {
            public string WebApiUrl { get; set; }
            public string RCSApiUrl { get; set; }
            public string NDCApiUrl { get; set; }
            public string SqlServer { get; set; }
            public string TCPServerIP { get; set; }
            public int TCPServerPort { get; set; }
            public List<Area> Areas { get; set; }
            public List<Snap> Snaps { get; set; }
            public string CaptureUrl { get; set; }
@@ -105,13 +102,19 @@
            public string Name { get; set; }
            public string Pwd { get; set; }
        }
    }
    public class TaskName {
        public const string 产品入库 = "产品入库";
        public const string 产品部分出库 = "产品部分出库";
        public const string 产品部分回库 = "产品部分回库";
        public const string 盘点理货出库 = "盘点理货出库";
        public const string 盘点理货回库 = "盘点理货回库";
    }
    public class AreaIndex {
        public const int Q取货区 = 0;
        public const int X卸货区 = 1;
        public const int H货架区 = 2;
    }
}
wms/WCSHelper.cs
@@ -64,7 +64,7 @@
        public static TN_Task BuildInboundTask(TN_Location startLoc, string endLocCode, string cntId) {
            var type = TaskName.产品入库;
            var endArea = Settings.Areas[1][0]; // HJQ
            var endArea = Settings.Areas[AreaIndex.H货架区][0]; // HJQ
            TN_Task TN_Task = new TN_Task() {
                S_CODE = GenerateTaskNo(),
@@ -100,7 +100,7 @@
            var endArea = "";
            if (endLoc == null) {
                if (taskType == TaskName.产品入库) {
                    endArea = Settings.Areas[1][0]; // HJQ
                    endArea = Settings.Areas[AreaIndex.H货架区][0]; // HJQ
                }
                else {
                    LogHelper.Info("终点货位不存在,且任务类型不是PDA货品入库");