工站下拉

This commit is contained in:
quowingwang 2026-01-31 10:00:18 +08:00
parent e52a9fbf47
commit 9cd4ce6672
4 changed files with 293 additions and 179 deletions

View File

@ -144,7 +144,13 @@ namespace MDM.Controllers.Plant
return SUCCESS(response);
}
//获取工站下拉
[HttpGet("getWorkstationPulldown")]
public ApiResult GetWorkstationPulldown()
{
var response = _PlantWorkstationService.GetWorkstationPulldown();
return response;
}
}
}

View File

@ -1,5 +1,6 @@
using Infrastructure.Model;
using MDM.Model;
using MDM.Model.Plant;
using MDM.Model.Plant.Dto;
@ -25,6 +26,6 @@ namespace MDM.Services.IPlantService
List<PlantWorkshop> GetWorkShop(string? site_code, string? workshop_code);
List<PlantProductlinebody> GetPlantProductlinebodies(string? site_code, string? workshop_code, string? linecode);
object GetWorkstation();
ApiResult GetWorkstationPulldown();
}
}

View File

@ -1,14 +1,13 @@
using System;
using SqlSugar;
using Infrastructure.Attribute;
using MDM.Services.IPlantService;
using MDM.Service;
using Infrastructure.Model;
using MDM.Model;
using MDM.Model.Plant;
using MDM.Model.Plant.Dto;
using MDM.Repository;
using MDM.Service;
using MDM.Services.IPlantService;
using SqlSugar;
using System;
namespace MDM.Services.Plant
{
@ -121,5 +120,23 @@ namespace MDM.Services.Plant
.ToList();
}
public ApiResult GetWorkstationPulldown()
{
try
{
return ApiResult.Success(data: Context.Queryable<PlantWorkstation>()
.Select(it => new
{
it.WorkstationCode,
it.WorkstationName
})
.ToList());
}
catch
{
return null;
}
}
}
}

View File

@ -46,15 +46,28 @@ namespace RIZO.Admin.WebApi.PLC.Service
//MES返回PLC请求映射
private readonly Dictionary<string, string> _mesIntReturnMap = new()
{
{ "设备使能", "DB1317.DBW0" }, // Int
{ "工位开始查询结果", "DB1317.DBW2000" }, // Int
{ "保存结果", "DB1317.DBW2002" }, // Int
{ "设备使能", "DB1000.DBW0" }, // Int
{ "工位开始查询结果", "DB1000.DBW2000" }, // Int
{ "保存结果", "DB1000.DBW2002" }, // Int
};
private readonly Dictionary<string, (string Addr, int Len)> _mesStringReturnMap = new()
{
{ "产品型号", ("DB1317.DBB1016", 14) }, // String[14]
{ "订单下发", ("DB1317.DBB1032", 50) }, // String[50]
{ "产品型号", ("DB1000.DBB1016", 14) }, // String[14]
{ "订单下发", ("DB1000.DBB1032", 50) }, // String[50]
};
private readonly Dictionary<string, string> _mesop058IntReturnMap = new()
{
{ "设备使能", "DB300.DBW0" }, // Int
{ "工位开始查询结果", "DB300.DBW2000" }, // Int
{ "保存结果", "DB300.DBW2002" }, // Int
};
private readonly Dictionary<string, (string Addr, int Len)> _mesop058StringReturnMap = new()
{
{ "产品型号", ("DB300.DBB1016", 14) }, // String[14]
{ "订单下发", ("DB300.DBB1032", 50) }, // String[50]
};
// OP020-2 专属地址映射合盖工位DB1001
@ -85,12 +98,36 @@ namespace RIZO.Admin.WebApi.PLC.Service
};
// OP020-3 专属地址映射热铆工位DB1001
private readonly Dictionary<string, (string Addr, int Len)> _op020_3StringMap = new()
{
{ "报警信息", ("DB1001.DBB88", 48) }, // Array[1..48] of Byte
{ "产品型号", ("DB1001.DBB4060", 48) }, // String[48]
{ "产品1SN", ("DB1001.DBB2300", 48) }, // String[48]
{ "产品2SN", ("DB1001.DBB2350", 48) }, // String[48]
{ "产品3SN", ("DB1001.DBB2400", 48) }, // String[48]
{ "产品4SN", ("DB1001.DBB2450", 48) } // String[48]
};
private readonly Dictionary<string, string> _op020_3IntMap = new()
{
// 基础状态
{ "运行状态", "DB1001.DBW0" }, // Int - 1=空闲2=运行中3=故障
{ "设备模式", "DB1001.DBW2" }, // Int - 1=空模式2=手动4=初始化8=自动16=CycleStop
{ "设备在线状态", "DB1001.DBW4" }, // Int - 1=离线,0=在线
{ "ByPass", "DB1001.DBW6" }, // Int - 1=ByPass,0=正常模式
{ "生产模式", "DB1001.DBW8" }, // Int - 1=正常模式;2=清线模式;4=返工模式;8=换型模式;16=预热模式
// 上传请求
{ "查询请求", "DB1001.DBW2000" }, // Int - 1:请求开始0:无请求
{ "上传请求", "DB1001.DBW2002" }, // Int - 1:请求开始0:无请求
// 节拍时间
{ "节拍时间", "DB1001.DBD2988" }, // Real
// 产品结果与产量
{ "合格数量", "DB1001.DBD4110" }, // DInt
{ "失败数量", "DB1001.DBD4114" }, // DInt
{ "实际数量", "DB1001.DBD4118" } // DInt
};
// OP020-4 专属地址映射pin压合&视觉检查工位DB1001
@ -345,130 +382,130 @@ namespace RIZO.Admin.WebApi.PLC.Service
// OP070-1 专属地址映射 点散热胶GF1500工位 OP070-2 点散热胶TC4060 OP070-3 点散热胶GF3500
private readonly Dictionary<string, (string Addr, int Len)> _op070_1StringMap = new()
{
//{ "报警信息", ("DB1011.DBB58", 48) }, // Array[1..48] of Byte
{ "订单名称", ("DB1011.DBB1000", 48) }, // String[48]
{ "产品名称", ("DB1011.DBB1054", 48) }, // String[48]
{ "产品型号", ("DB1011.DBB2006", 28) }, // String[28]
{ "SN_1", ("DB1011.DBB2100", 28) }, // String[28]
{ "SN_2", ("DB1011.DBB2134", 28) } // String[28]
//{ "报警信息", ("DB1001.DBB58", 48) }, // Array[1..48] of Byte
{ "订单名称", ("DB1001.DBB1000", 48) }, // String[48]
{ "产品名称", ("DB1001.DBB1054", 48) }, // String[48]
{ "产品型号", ("DB1001.DBB2006", 28) }, // String[28]
{ "SN_1", ("DB1001.DBB2100", 28) }, // String[28]
{ "SN_2", ("DB1001.DBB2134", 28) } // String[28]
};
private readonly Dictionary<string, string> _op070_1IntMap = new()
{
{ "运行状态", "DB1011.DBW0" }, // Int
{ "设备模式", "DB1011.DBW2" }, // Int
{ "设备在线状态", "DB1011.DBW4" }, // Int
{ "ByPass", "DB1011.DBW6" }, // Int
{ "生产模式", "DB1011.DBW8" }, // Int
{ "实际产量", "DB1011.DBD1104" }, // DInt
//{ "合格数量", "DB1011.DBD1108" }, // DInt
//{ "失败数量", "DB1011.DBD1112" }, // DInt
{ "查询请求", "DB1011.DBW2000" }, // Int
{ "保存请求", "DB1011.DBW2002" }, // Int
{ "托盘号", "DB1011.DBW2004" }, // Int
{ "相机结果", "DB1011.DBW2164" }, // Int
{ "站位结果", "DB1011.DBW2166" }, // Int
{ "节拍时间", "DB1011.DBD2168" }, // Real
{ "运行状态", "DB1001.DBW0" }, // Int
{ "设备模式", "DB1001.DBW2" }, // Int
{ "设备在线状态", "DB1001.DBW4" }, // Int
{ "ByPass", "DB1001.DBW6" }, // Int
{ "生产模式", "DB1001.DBW8" }, // Int
{ "实际产量", "DB1001.DBD1104" }, // DInt
//{ "合格数量", "DB1001.DBD1108" }, // DInt
//{ "失败数量", "DB1001.DBD1112" }, // DInt
{ "查询请求", "DB1001.DBW2000" }, // Int
{ "保存请求", "DB1001.DBW2002" }, // Int
{ "托盘号", "DB1001.DBW2004" }, // Int
{ "相机结果", "DB1001.DBW2164" }, // Int
{ "站位结果", "DB1001.DBW2166" }, // Int
{ "节拍时间", "DB1001.DBD2168" }, // Real
};
// OP075 专属地址映射 PWM折弯&装配
private readonly Dictionary<string, (string Addr, int Len)> _op075StringMap = new()
{
//{ "报警信息", ("DB1011.DBB58", 48) }, // Array[1..48] of Byte
{ "订单名称", ("DB1011.DBB1000", 48) }, // String[48]
{ "产品名称", ("DB1011.DBB1054", 48) }, // String[48]
{ "产品型号", ("DB1011.DBB2006", 28) }, // String[28]
{ "SN_1", ("DB1011.DBB2100", 28) }, // String[28]
{ "SN_2", ("DB1011.DBB2192", 28) }, // String[28]
{ "芯片SN", ("DB1011.DBB2222", 28) } // String[28]
//{ "报警信息", ("DB1001.DBB58", 48) }, // Array[1..48] of Byte
{ "订单名称", ("DB1001.DBB1000", 48) }, // String[48]
{ "产品名称", ("DB1001.DBB1054", 48) }, // String[48]
{ "产品型号", ("DB1001.DBB2006", 28) }, // String[28]
{ "SN_1", ("DB1001.DBB2100", 28) }, // String[28]
{ "SN_2", ("DB1001.DBB2192", 28) }, // String[28]
{ "芯片SN", ("DB1001.DBB2222", 28) } // String[28]
};
private readonly Dictionary<string, string> _op075IntMap = new()
{
{ "运行状态", "DB1011.DBW0" }, // Int
{ "设备模式", "DB1011.DBW2" }, // Int
{ "设备在线状态", "DB1011.DBW4" }, // Int
{ "ByPass", "DB1011.DBW6" }, // Int
{ "生产模式", "DB1011.DBW8" }, // Int
{ "实际产量", "DB1011.DBD1104" }, // DInt
//{ "合格数量", "DB1011.DBD1108" }, // DInt
//{ "失败数量", "DB1011.DBD1112" }, // DInt
{ "查询请求", "DB1011.DBW2000" }, // Int
{ "保存请求", "DB1011.DBW2002" }, // Int
{ "托盘号", "DB1011.DBW2004" }, // Int
{ "站位结果", "DB1011.DBW2252" }, // Int
{ "节拍时间", "DB1011.DBD2284" } // Real
{ "运行状态", "DB1001.DBW0" }, // Int
{ "设备模式", "DB1001.DBW2" }, // Int
{ "设备在线状态", "DB1001.DBW4" }, // Int
{ "ByPass", "DB1001.DBW6" }, // Int
{ "生产模式", "DB1001.DBW8" }, // Int
{ "实际产量", "DB1001.DBD1104" }, // DInt
//{ "合格数量", "DB1001.DBD1108" }, // DInt
//{ "失败数量", "DB1001.DBD1112" }, // DInt
{ "查询请求", "DB1001.DBW2000" }, // Int
{ "保存请求", "DB1001.DBW2002" }, // Int
{ "托盘号", "DB1001.DBW2004" }, // Int
{ "站位结果", "DB1001.DBW2252" }, // Int
{ "节拍时间", "DB1001.DBD2284" } // Real
};
// OP080-1 专属地址映射 PCBA组装&拧紧
private readonly Dictionary<string, (string Addr, int Len)> _op080_1StringMap = new()
{
//{ "报警信息", ("DB1017.DBB58", 48) }, // Array[1..48] of Byte
{ "订单名称", ("DB1017.DBB1000", 48) }, // String[48]
{ "产品名称", ("DB1017.DBB1054", 48) }, // String[48]
{ "合装位机壳_SN", ("DB1017.DBB2100", 28) }, // String[28]
{ "合装位PCB_SN", ("DB1017.DBB2130", 28) }, // String[28]
{ "拧紧位机壳_SN", ("DB1017.DBB2904", 28) }, // String[28]
{ "拧紧位PCB_SN", ("DB1017.DBB3092", 28) }, // String[28]
//{ "报警信息", ("DB1001.DBB58", 48) }, // Array[1..48] of Byte
{ "订单名称", ("DB1001.DBB1000", 48) }, // String[48]
{ "产品名称", ("DB1001.DBB1054", 48) }, // String[48]
{ "合装位机壳_SN", ("DB1001.DBB2100", 28) }, // String[28]
{ "合装位PCB_SN", ("DB1001.DBB2130", 28) }, // String[28]
{ "拧紧位机壳_SN", ("DB1001.DBB2904", 28) }, // String[28]
{ "拧紧位PCB_SN", ("DB1001.DBB3092", 28) }, // String[28]
};
private readonly Dictionary<string, string> _op080_1IntMap = new()
{
{ "运行状态", "DB1017.DBW0" }, // Int
{ "设备模式", "DB1017.DBW2" }, // Int
{ "设备在线状态", "DB1017.DBW4" }, // Int
{ "ByPass", "DB1017.DBW6" }, // Int
{ "生产模式", "DB1017.DBW8" }, // Int
{ "实际产量", "DB1017.DBD1104" }, // DInt
{ "合格数量", "DB1017.DBD1108" }, // DInt
{ "失败数量", "DB1017.DBD1112" }, // DInt
{ "合装工位查询请求", "DB1017.DBW2000" }, // Int
{ "合装结果保存请求", "DB1017.DBW2004" }, // Int
{ "拧紧结果保存请求", "DB1017.DBW2006" }, // Int
{ "合装位托盘号", "DB1017.DBW2100" }, // Int
{ "拧紧位托盘号", "DB1017.DBW3152" }, // Int
{ "运行状态", "DB1001.DBW0" }, // Int
{ "设备模式", "DB1001.DBW2" }, // Int
{ "设备在线状态", "DB1001.DBW4" }, // Int
{ "ByPass", "DB1001.DBW6" }, // Int
{ "生产模式", "DB1001.DBW8" }, // Int
{ "实际产量", "DB1001.DBD1104" }, // DInt
{ "合格数量", "DB1001.DBD1108" }, // DInt
{ "失败数量", "DB1001.DBD1112" }, // DInt
{ "合装工位查询请求", "DB1001.DBW2000" }, // Int
{ "合装结果保存请求", "DB1001.DBW2004" }, // Int
{ "拧紧结果保存请求", "DB1001.DBW2006" }, // Int
{ "合装位托盘号", "DB1001.DBW2100" }, // Int
{ "拧紧位托盘号", "DB1001.DBW3152" }, // Int
// 2号螺钉
{ "2号螺钉_结果", "DB1017.DBW3164" }, // Int
{ "2号螺钉_扭矩", "DB1017.DBD3166" }, // Real
{ "2号螺钉_深度", "DB1017.DBD3170" }, // Real
{ "2号螺钉_角度", "DB1017.DBD3174" }, // Real
{ "2号螺钉_拧紧时间", "DB1017.DBD3178" }, // Real
{ "2号螺钉_结果", "DB1001.DBW3164" }, // Int
{ "2号螺钉_扭矩", "DB1001.DBD3166" }, // Real
{ "2号螺钉_深度", "DB1001.DBD3170" }, // Real
{ "2号螺钉_角度", "DB1001.DBD3174" }, // Real
{ "2号螺钉_拧紧时间", "DB1001.DBD3178" }, // Real
// 3号螺钉
{ "3号螺钉_结果", "DB1017.DBW3182" }, // Int
{ "3号螺钉_扭矩", "DB1017.DBD3184" }, // Real
{ "3号螺钉_深度", "DB1017.DBD3188" }, // Real
{ "3号螺钉_角度", "DB1017.DBD3192" }, // Real
{ "3号螺钉_拧紧时间", "DB1017.DBD3196" }, // Real
{ "3号螺钉_结果", "DB1001.DBW3182" }, // Int
{ "3号螺钉_扭矩", "DB1001.DBD3184" }, // Real
{ "3号螺钉_深度", "DB1001.DBD3188" }, // Real
{ "3号螺钉_角度", "DB1001.DBD3192" }, // Real
{ "3号螺钉_拧紧时间", "DB1001.DBD3196" }, // Real
// 4号螺钉
{ "4号螺钉_结果", "DB1017.DBW3200" }, // Int
{ "4号螺钉_扭矩", "DB1017.DBD3202" }, // Real
{ "4号螺钉_深度", "DB1017.DBD3206" }, // Real
{ "4号螺钉_角度", "DB1017.DBD3210" }, // Real
{ "4号螺钉_拧紧时间", "DB1017.DBD3214" }, // Real
{ "4号螺钉_结果", "DB1001.DBW3200" }, // Int
{ "4号螺钉_扭矩", "DB1001.DBD3202" }, // Real
{ "4号螺钉_深度", "DB1001.DBD3206" }, // Real
{ "4号螺钉_角度", "DB1001.DBD3210" }, // Real
{ "4号螺钉_拧紧时间", "DB1001.DBD3214" }, // Real
// 1号螺钉
{ "1号螺钉_结果", "DB1017.DBW3218" }, // Int
{ "1号螺钉_扭矩", "DB1017.DBD3220" }, // Real
{ "1号螺钉_深度", "DB1017.DBD3224" }, // Real
{ "1号螺钉_角度", "DB1017.DBD3228" }, // Real
{ "1号螺钉_拧紧时间", "DB1017.DBD3232" }, // Real
{ "1号螺钉_结果", "DB1001.DBW3218" }, // Int
{ "1号螺钉_扭矩", "DB1001.DBD3220" }, // Real
{ "1号螺钉_深度", "DB1001.DBD3224" }, // Real
{ "1号螺钉_角度", "DB1001.DBD3228" }, // Real
{ "1号螺钉_拧紧时间", "DB1001.DBD3232" }, // Real
// 5号螺钉
{ "5号螺钉_结果", "DB1017.DBW3236" }, // Int
{ "5号螺钉_扭矩", "DB1017.DBD3238" }, // Real
{ "5号螺钉_深度", "DB1017.DBD3242" }, // Real
{ "5号螺钉_角度", "DB1017.DBD3246" }, // Real
{ "5号螺钉_拧紧时间", "DB1017.DBD3250" }, // Real
{ "5号螺钉_结果", "DB1001.DBW3236" }, // Int
{ "5号螺钉_扭矩", "DB1001.DBD3238" }, // Real
{ "5号螺钉_深度", "DB1001.DBD3242" }, // Real
{ "5号螺钉_角度", "DB1001.DBD3246" }, // Real
{ "5号螺钉_拧紧时间", "DB1001.DBD3250" }, // Real
// 6号螺钉
{ "6号螺钉_结果", "DB1017.DBW3254" }, // Int
{ "6号螺钉_扭矩", "DB1017.DBD3256" }, // Real
{ "6号螺钉_深度", "DB1017.DBD3260" }, // Real
{ "6号螺钉_角度", "DB1017.DBD3264" }, // Real
{ "6号螺钉_拧紧时间", "DB1017.DBD3268" }, // Real
{ "6号螺钉_结果", "DB1001.DBW3254" }, // Int
{ "6号螺钉_扭矩", "DB1001.DBD3256" }, // Real
{ "6号螺钉_深度", "DB1001.DBD3260" }, // Real
{ "6号螺钉_角度", "DB1001.DBD3264" }, // Real
{ "6号螺钉_拧紧时间", "DB1001.DBD3268" }, // Real
// 7号螺钉
{ "7号螺钉_结果", "DB1017.DBW3272" }, // Int
{ "7号螺钉_扭矩", "DB1017.DBD3274" }, // Real
{ "7号螺钉_深度", "DB1017.DBD3278" }, // Real
{ "7号螺钉_角度", "DB1017.DBD3282" }, // Real
{ "7号螺钉_拧紧时间", "DB1017.DBD3286" }, // Real
{ "7号螺钉_结果", "DB1001.DBW3272" }, // Int
{ "7号螺钉_扭矩", "DB1001.DBD3274" }, // Real
{ "7号螺钉_深度", "DB1001.DBD3278" }, // Real
{ "7号螺钉_角度", "DB1001.DBD3282" }, // Real
{ "7号螺钉_拧紧时间", "DB1001.DBD3286" }, // Real
};
// OP080-2 专属地址映射PCBA拧紧工位DB1001
@ -624,23 +661,23 @@ namespace RIZO.Admin.WebApi.PLC.Service
private readonly Dictionary<string, string> _op085IntMap = new()
{
// 基础状态
{ "运行状态", "DB1030.DBW0" }, // Int - 1=空闲2=运行中3=故障
{ "设备模式", "DB1030.DBW2" }, // Int - 1=空模式2=手动4=初始化8=自动16=CycleStop
{ "设备在线状态", "DB1030.DBW4" }, // Int - 1=离线,0=在线
{ "ByPass", "DB1030.DBW6" }, // Int - 1=ByPass,0=正常模式
{ "生产模式", "DB1030.DBW8" }, // Int - 1=点检2=返工4=样件5=正常
{ "运行状态", "DB1001.DBW0" }, // Int - 1=空闲2=运行中3=故障
{ "设备模式", "DB1001.DBW2" }, // Int - 1=空模式2=手动4=初始化8=自动16=CycleStop
{ "设备在线状态", "DB1001.DBW4" }, // Int - 1=离线,0=在线
{ "ByPass", "DB1001.DBW6" }, // Int - 1=ByPass,0=正常模式
{ "生产模式", "DB1001.DBW8" }, // Int - 1=点检2=返工4=样件5=正常
// 产量数据
{ "实际产量", "DB1030.DBD1104" }, // DInt
{ "合格数量", "DB1030.DBD1108" }, // DInt
{ "失败数量", "DB1030.DBD1112" }, // DInt
{ "实际产量", "DB1001.DBD1104" }, // DInt
{ "合格数量", "DB1001.DBD1108" }, // DInt
{ "失败数量", "DB1001.DBD1112" }, // DInt
// 操作请求
{ "保存请求", "DB1030.DBW2002" }, // Int - 1=请求开始0=无请求
{ "线体托盘号", "DB1030.DBW2070" }, // Int
{ "保存请求", "DB1001.DBW2002" }, // Int - 1=请求开始0=无请求
{ "线体托盘号", "DB1001.DBW2070" }, // Int
// 工艺参数
{ "节拍时间", "DB1030.DBD2242" } // Real
{ "节拍时间", "DB1001.DBD2242" } // Real
};
// OP100 专属地址映射(手动上料壳体&盖板工位DB1001
@ -1509,50 +1546,83 @@ namespace RIZO.Admin.WebApi.PLC.Service
return null;
}
}
/// <summary>
/// 读取OP020-3数据热铆工位
/// OP020-3 数据读取(热铆工位DB1001- 按OP020-4风格优化
/// </summary>
private async Task<PlcProductionData?> ReadOP020_3DataAsync(Plc plc, string ip, string workstationCode)
private async Task<PlcProductionData> ReadOP020_3DataAsync(Plc plc, string ip, string workstationCode)
{
// 前置核心校验避免无效PLC操作
// 前置校验PLC连接无效直接返回与OP020-4风格保持一致
if (plc == null || !plc.IsConnected)
{
Console.WriteLine($"OP020-3({ip})PLC连接无效跳过数据读取");
return null;
}
try
{
// 1. 真正的并行读取所有Int字段核心效率优化
// 步骤1创建所有异步读取任务仅发起请求不等待
var taskRunStatus = ReadPlcIntAsync(plc, _op020_3IntMap["运行状态"]);
var taskMachineModel = ReadPlcIntAsync(plc, _op020_3IntMap["设备模式"]);
var taskOnlineStatus = ReadPlcIntAsync(plc, _op020_3IntMap["设备在线状态"]);
var taskProduceModel = ReadPlcIntAsync(plc, _op020_3IntMap["生产模式"]);
// 1. 批量创建并行读取任务(字典存储,最大化并行效率,减少临时变量开销)
// 字符串读取任务匹配_op020_3StringMap所有字段
var stringReadTasks = new Dictionary<string, Task<string>>
{
{ "产品型号", ReadPlcStringAsync(plc, _op020_3StringMap["产品型号"].Addr, _op020_3StringMap["产品型号"].Len) },
{ "产品1SN", ReadPlcStringAsync(plc, _op020_3StringMap["产品1SN"].Addr, _op020_3StringMap["产品1SN"].Len) },
{ "产品2SN", ReadPlcStringAsync(plc, _op020_3StringMap["产品2SN"].Addr, _op020_3StringMap["产品2SN"].Len) },
{ "产品3SN", ReadPlcStringAsync(plc, _op020_3StringMap["产品3SN"].Addr, _op020_3StringMap["产品3SN"].Len) },
{ "产品4SN", ReadPlcStringAsync(plc, _op020_3StringMap["产品4SN"].Addr, _op020_3StringMap["产品4SN"].Len) }
};
// DInt任务单独提取避免字典开销
var taskActualOutput = ReadPlcIntAsync(plc, _op050IntMap["实际产量"]);
var taskQualifiedQty = ReadPlcIntAsync(plc, _op050IntMap["合格数量"]);
var taskFailedQty = ReadPlcIntAsync(plc, _op050IntMap["失败数量"]);
// Int读取任务匹配_op020_3IntMap基础状态/请求/托盘号字段)
var intReadTasks = new Dictionary<string, Task<int>>
{
{ "运行状态", ReadPlcIntAsync(plc, _op020_3IntMap["运行状态"]) },
{ "设备模式", ReadPlcIntAsync(plc, _op020_3IntMap["设备模式"]) },
{ "设备在线状态", ReadPlcIntAsync(plc, _op020_3IntMap["设备在线状态"]) },
{ "ByPass", ReadPlcIntAsync(plc, _op020_3IntMap["ByPass"]) },
{ "生产模式", ReadPlcIntAsync(plc, _op020_3IntMap["生产模式"]) },
{ "查询请求", ReadPlcIntAsync(plc, _op020_3IntMap["查询请求"]) },
{ "上传请求", ReadPlcIntAsync(plc, _op020_3IntMap["上传请求"]) },
{ "托盘号", ReadPlcIntAsync(plc, _op020_3IntMap["托盘号"]) }
};
// 步骤2等待所有任务并行完成耗时=最慢的单个读取任务,而非总和)
await Task.WhenAll(taskRunStatus, taskMachineModel, taskOnlineStatus, taskProduceModel, taskActualOutput, taskQualifiedQty, taskFailedQty);
// DInt/Real读取任务产量+节拍时间复用ReadPlcIntAsync兼容转换与OP020-4风格一致
var dIntRealReadTasks = new Dictionary<string, Task<int>>
{
{ "节拍时间", ReadPlcIntAsync(plc, _op020_3IntMap["节拍时间"]) },
{ "合格数量", ReadPlcIntAsync(plc, _op020_3IntMap["合格数量"]) },
{ "失败数量", ReadPlcIntAsync(plc, _op020_3IntMap["失败数量"]) },
{ "实际数量", ReadPlcIntAsync(plc, _op020_3IntMap["实际数量"]) }
};
// 步骤3获取结果带await确保值已返回无需额外判空
int runStatus = await taskRunStatus;
int machineModel = await taskMachineModel;
int onlineStatus = await taskOnlineStatus;
int produceModel = await taskProduceModel;
// 2. 并行等待所有读取任务完成合并任务列表单次WaitAll提升效率添加ConfigureAwait(false)优化异步)
var allTasks = new List<Task>();
allTasks.AddRange(stringReadTasks.Values);
allTasks.AddRange(intReadTasks.Values);
allTasks.AddRange(dIntRealReadTasks.Values);
await Task.WhenAll(allTasks).ConfigureAwait(false);
int actualOutput = await taskActualOutput;
int qualifiedQty = await taskQualifiedQty;
int failedQty = await taskFailedQty;
// 3. 提取读取结果(直接取值+空值兜底减少await重复调用与OP020-4风格一致
// 字符串字段
string productModel = stringReadTasks["产品型号"].Result ?? string.Empty;
string product1SN = stringReadTasks["产品1SN"].Result ?? string.Empty;
string product2SN = stringReadTasks["产品2SN"].Result ?? string.Empty;
string product3SN = stringReadTasks["产品3SN"].Result ?? string.Empty;
string product4SN = stringReadTasks["产品4SN"].Result ?? string.Empty;
// 2. 业务逻辑计算(优化:常量复用+减少冗余计算)
var reworkFlag = produceModel == 4 ? "1" : "0";
// 整数字段
int runStatus = intReadTasks["运行状态"].Result;
int machineModel = intReadTasks["设备模式"].Result;
int onlineStatus = intReadTasks["设备在线状态"].Result;
int byPass = intReadTasks["ByPass"].Result;
int produceModel = intReadTasks["生产模式"].Result;
int trayNo = intReadTasks["托盘号"].Result;
// 预定义常量减少字符串创建(高频场景累计收益)
// DInt/Real转换结果
int cycleTime = dIntRealReadTasks["节拍时间"].Result;
int qualifiedQty = dIntRealReadTasks["合格数量"].Result;
int failedQty = dIntRealReadTasks["失败数量"].Result;
int actualOutput = dIntRealReadTasks["实际数量"].Result;
// 4. 业务逻辑转换极简逻辑仅保留必要转换与OP020-4风格对齐
string reworkFlag = produceModel == 4 ? "1" : "0";
string produceModelDesc = produceModel switch
{
1 => "正常模式",
@ -1560,53 +1630,55 @@ namespace RIZO.Admin.WebApi.PLC.Service
4 => "返工模式",
8 => "换型模式",
16 => "预热模式",
_ => $"未知({produceModel})"
_ => produceModel.ToString()
};
string runStatusDesc = runStatus switch
{
1 => "空闲",
2 => "运行中",
3 => "故障",
_ => $"未知({runStatus})"
};
string onlineStatusDesc = onlineStatus == 1 ? "离线" : "在线";
// OP020-3无产品结果字段默认合格与原有逻辑保持一致
string qualificationFlag = "1";
// 调试日志(优化:减少字符串拼接开销,保留核心信息)
Console.WriteLine($"OP020-3({ip})读取结果:运行状态={runStatusDesc},生产模式={produceModelDesc}");
// 3. 构建数据实体(优化:减少冗余操作,提前兜底)
// 5. 构建实体精准匹配PlcProductionData字段无冗余补充OP020-3独有信息
return new PlcProductionData
{
// 基础字段ip外层已校验非空无需Trim减少字符串操作
PlcIp = ip,
OccurTime = DateTime.Now,
LineCode = "line2",
WorkstationCode = workstationCode,
WorkstationName = "热铆", // 补充工站名称
ActualOutQty = actualOutput.ToString(),
QualifiedQty = qualifiedQty.ToString(),
FailedQty = failedQty.ToString(),
WorkstationName = "热铆工位", // 补充工站名称与OP020-4对齐
ProductModel = productModel,
ProductName = string.Empty, // OP020-3无产品名字段置空
ProductCode = product1SN, // 主产品编码取产品1SN与OP020-4对齐
ReworkFlag = reworkFlag,
Automanual = machineModel,
Runstatus = runStatus,
OnlineStatus = onlineStatusDesc,
ProduceModel = produceModelDesc,
// 系统字段:固定值直接赋值
TrayNo = trayNo.ToString(),
CreatedBy = "PLC",
CreatedTime = DateTime.Now
CreatedTime = DateTime.Now,
Product1SN = product1SN,
Product2SN = product2SN,
Product3SN = product3SN,
Product4SN = product4SN,
SN1 = product1SN,
SN2 = product2SN,
ActualOutQty = actualOutput.ToString(),
QualifiedQty = qualifiedQty.ToString(),
FailedQty = failedQty.ToString(),
// 补充节拍时间和报警信息
ProductionCycle = cycleTime,
// 合格标识
QualificationFlag = qualificationFlag
};
}
catch (Exception ex)
catch
{
// 增强异常日志:包含堆栈,便于定位问题(不影响效率,提升可维护性)
Console.WriteLine($"OP020-3({ip})数据读取异常:{ex.Message}\n{ex.StackTrace}");
// 异常直接返回null与OP020-4风格保持一致
return null;
}
}
/// <summary>
/// 读取OP020-4数据pin压合&视觉检查工位)
/// </summary>
@ -5523,6 +5595,23 @@ namespace RIZO.Admin.WebApi.PLC.Service
private void WritePlcSaveRequestResult(Plc plc, string ip, string plcName, PlcProductionData prodData, string saveResult)
{
try
{
if (plcName == "OP058")
{
WritePlcValue(plc, _mesop058IntReturnMap["设备使能"], "1");
//WritePlcValue(plc, _mesIntReturnMap["工位开始查询结果"], "1");
WritePlcValue(plc, _mesop058IntReturnMap["保存结果"], saveResult);
if (prodData.ProductModel != null && prodData.ProductModel.Length > 0)
{
WritePlcString(plc, _mesop058StringReturnMap["产品型号"].Addr, _mesop058StringReturnMap["产品型号"].Len, prodData.ProductModel);
}
else
{
WritePlcString(plc, _mesop058StringReturnMap["产品型号"].Addr, _mesop058StringReturnMap["产品型号"].Len, prodData.ProductModel);
}
WritePlcString(plc, _mesop058StringReturnMap["订单下发"].Addr, _mesop058StringReturnMap["订单下发"].Len, "cpxhtest");
}
else
{
WritePlcValue(plc, _mesIntReturnMap["设备使能"], "1");
//WritePlcValue(plc, _mesIntReturnMap["工位开始查询结果"], "1");
@ -5537,6 +5626,7 @@ namespace RIZO.Admin.WebApi.PLC.Service
}
WritePlcString(plc, _mesStringReturnMap["订单下发"].Addr, _mesStringReturnMap["订单下发"].Len, "cpxhtest");
}
}
catch (Exception ex)
{
}