chengsc
2025-04-16 42bb5b84ff935e0a3efb46f56d4ff5ca5ed9e592
修改问题,添加备注
4个文件已修改
58 ■■■■■ 已修改文件
Admin.NET/WCS.Application/Configuration/Database.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/OpenApi.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCUtil.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Configuration/Database.json
@@ -11,7 +11,7 @@
        //"ConnectionString": "PORT=5432;DATABASE=xxx;HOST=localhost;PASSWORD=xxx;USER ID=xxx", // PostgreSQL 库连接字符串
        //"ConnectionString": "Server=localhost;Database=xxx;Uid=xxx;Pwd=xxx;SslMode=None;", // MySql 库连接字符串",
        //"ConnectionString": "User Id=xxx; Password=xxx; Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))", // Oracle 库连接字符串
        "ConnectionString": "Server=localhost;Database=WCS_JC30;User Id=sa;Password=sql2022;", // SqlServer 库连接字符串
        "ConnectionString": "Server=172.18.3.206;Database=WCS_JC30;User Id=sa;Password=sql2024!@#;", // SqlServer 库连接字符串
        //"SlaveConnectionConfigs": [ // 读写分离/主从
Admin.NET/WCS.Application/OpenApi/OpenApi.cs
@@ -568,6 +568,7 @@
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                //写入光幕0
                                Task.Run(() =>
                                {
                                    var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB);
@@ -586,6 +587,7 @@
                                    HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                });
                                //向码垛机器人写取托完成信号
                                modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.Station);
                                res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0");
                                modTaskMonitor = new WcsTaskMonitor()
@@ -600,7 +602,8 @@
                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                modConn.Close();
                            }
                            if (modTask.StartLocate == AGVStaionEnum.A1.ToString())
                            //起始工位是提升机取货工位
                            if (modTask.StartLocate == AGVStaionEnum.A2.ToString())
                            {
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.ConveyorLine);
                                var modConn = new PLCUtil(modPlc);
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -675,9 +675,11 @@
            //如果拉托盘去成品工位,先检查有没有缺托
            if (modTask.StartLocate.Substring(0, 1) == "D" && modTask.EndLocate.Substring(0, 1) == "B")
            {
                //判断目标位置是拆托机的任务有没有,有就跳过拆托机到成品工位的任务
                if (listTask.Any(s => s.EndLocate.Substring(0, 1) == "D"))
                    continue;
            }
            //如果目的工位是原料仓,先检查原料仓储位状态
            if (modTask.EndLocate == AGVStaionEnum.F1.ToString())
            {
                if (_sysConfigService.GetConfigValue<bool>("cache_Materal").Result)
@@ -688,12 +690,17 @@
            //    if (!_sysConfigService.GetConfigValue<bool>("cache_Materal").Result)
            //        continue;
            //}
            //如果起始工位是拆托机
            if (modTask.StartLocate == AGVStaionEnum.D1.ToString())
            {
                //获取叠拆托机IP
                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine);
                //获取叠拆托机工位
                var modDevice2 = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Text == "拆托机");
                //打开连接
                var modConn = new PLCUtil(modPlc);
                //是否缺托信号
                //是否允许取托信号
                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice2.Id && s.Text == "允许取托");
                var (result, value) = modConn.GetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos);
                if (result.IsSucceed)
@@ -724,6 +731,7 @@
                    }
                    else
                    {
                        //不允许取托,判断是否拆托机准备完成
                        modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice2.Id && s.Text == "准备完成");
                        (result, value) = modConn.GetPlcDBValue(modPos.PosType, modDevice2.DbNumber, modPos.PlcPos);
                        if (!value)
@@ -738,6 +746,7 @@
                    continue;
                }
            }
            //如果目的工位是提升机放货工位,先检查有没有托盘线的任务
            if (modTask.EndLocate == AGVStaionEnum.A1.ToString())
            {
                if (_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.ConveyorLine && s.Status == TaskStatusEnum.Doing).Any())
Admin.NET/WCS.Application/PLC/PLCUtil.cs
@@ -1,6 +1,7 @@
using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Drawing;
using Elastic.Clients.Elasticsearch;
using Furion.Logging;
using IoTClient;
using IoTClient.Clients.Modbus;
using IoTClient.Clients.PLC;
@@ -332,4 +333,43 @@
        }
        return _client.BatchWrite(addresses);
    }
    /// <summary>
    /// 循环写入PLC值(并读取值判断和写入的值是否一致,写入控制字不能用此方法)
    /// </summary>
    public IoTClient.Result SetPlcDBValueRepeat(PLCDataTypeEnum PosType, string DbNumber, string Pos, string Value)
    {
        IoTClient.Result _result = new IoTClient.Result();
        int setCount = 0;//写入次数
        while (setCount < 5)
        {
            string address;
            if (DbNumber.StartsWith("DB"))
                address = DbNumber + "." + Pos;
            else
                address = DbNumber + Pos;
            _result = this.SetPlcDBValue(PosType, address, Value);//写入值
            //累计写入次数
            setCount++;
            if (_result.IsSucceed)
            {
                //读取写入的值
                var (res, val) = GetPlcDBValue(PosType, DbNumber, Pos);
                if (val.ToString() == Value)
                {
                    //读取的值和写入的值一致,直接跳出循环
                    break;
                }
            }
        }
        //写入日志
        Log.Information($"66666666写入PLC,DbNumber:{DbNumber},Pos:{Pos},Value:{Value},setCount:{setCount}");
        return _result;
    }
}