diff --git a/Admin.Core.Api/Admin.Core.Model.xml b/Admin.Core.Api/Admin.Core.Model.xml new file mode 100644 index 0000000..aa1539d --- /dev/null +++ b/Admin.Core.Api/Admin.Core.Model.xml @@ -0,0 +1,4455 @@ + + + + Admin.Core.Model + + + + + ApiResponse + + + + + Status + + + + + Value + + + + + MessageModel + + + + + ApiResponse + + + + + + + StatusCode + + + + + CODE200 + + + + + CODE401 + + + + + CODE403 + + + + + CODE404 + + + + + CODE500 + + + + + 通用分页信息类 + + + + + 当前页标 + + + + + 每页大小 + + + + + 时间范围 + + + + + 排序字段 + + + + + 排序方式 + + + + + 查询条件 + + + + + 通用分页信息类 + + + + + 当前页标 + + + + + 总页数 + + + + + 数据总数 + + + + + 每页大小 + + + + + 返回数据 + + + + + ResponseEnum + + + + + 无权限 + + + + + 找不到指定资源 + + + + + 找不到指定资源 + + + + + 表格数据,支持分页 + + + + + 返回编码 + + + + + 返回信息 + + + + + 记录总数 + + + + + 返回数据集 + + + + + TokenInfoViewModel + + + + + success + + + + + token + + + + + expires_in + + + + + token_type + + + + + 拆分的SAP BOM 信息 + + + + + 主键标识 + + + + + BOM编号 + + + + + 物料编号 + + + + + 物料名称 + + + + + 物料类别 + + + + + 标准数量 + + + + + 父级编号 + + + + + 工厂编号 + + + + + 产线/工位 + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 祖级列表 + + + + + 打印名称 + + + + + 设备参数 + + + + + 主键标识 + + + + + 参数编号 + + + + + 参数名称 + + + + + 网络地址 + + + + + 参数地址 + + + + + 参数类型:int、float + + + + + 设备编号 + + + + + 读取频率(毫秒) + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + SAP订单信息 + + + + + 主键标识 + + + + + 物料名称 + + + + + 销售订单编号 + + + + + 销售订单行号 + + + + + 物料编号 + + + + + 物料名称 + + + + + 物料组 + + + + + 订单计划数量 + + + + + 完成数量 + + + + + ORDER_TYPE + + + + + 工单状态 + + + + + 开始日期 + + + + + 结束日期 + + + + + 工厂编码 + + + + + 是否标识 + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 完成日期 + + + + + 是否已下达计划(0-是,1-否) + + + + + 接收从条码系统获取的校验字符串 + + + + + 物料完成记录 + + + + + 主键 + + + + + 订单编号 + + + + + 物料条码 + + + + + 物料编码 + + + + + 物料名称 + + + + + 所属工位 + + + + + 所属产线 + + + + + 完成时间 + + + + + 工单编号 + + + + + 是否下线 + + + + + 老发泡线泡前库 + + + + + 主键 + + + + + 位置;东线泡前库;西线泡前库 + + + + + 货道类型 + + + + + 库存数量 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新时间 + + + + + 产品型号 + + + + + 产品名称 + + + + + SAP BOM 信息 + + + + + 主键标识 + + + + + BOM编号 + + + + + 物料编号 + + + + + 物料名称 + + + + + 物料类别 + + + + + 标准数量 + + + + + 父级编号 + + + + + 是否标识 + + + + + 灌注设备状态表 + + + + + 主键 + + + + + 设备名称;Perfusion:灌注 + + + + + 设备状态1运行、2停机、3故障 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 打印信息表 + + + + + 主键 + + + + + SAP计划编号 + + + + + 物料编号 + + + + + 物料名称 + + + + + 内胆已打印数量 + + + + + 箱壳已打印数量 + + + + + 创建时间 + + + + + 箱体发泡夹具完工数据 + + + + + 主键标识 + + + + + 产线编号 + + + + + 工位编号 + + + + + 夹具编号 + + + + + 夹具箱型 + + + + + 夹具状态 + + + + + 夹具产量 + + + + + 实际产量 + + + + + 固化实际设定值 + + + + + 固化时间实际值 + + + + + 记录时间 + + + + + 设备编号 + + + + + 设备类型:1-生产设备;2-计量设备 + + + + + 参数编号 + + + + + 参数值 + + + + + 报警信息 + + + + + 报警时间 + + + + + 创建时间 + + + + + 电实时数据 + + + + + 主键标识 + + + + + 计量设备编号 + + + + + 采集时间 + + + + + A项电压 + + + + + B项电压 + + + + + C项电压 + + + + + A项电流 + + + + + B项电流 + + + + + C项电流 + + + + + 记录时间 + + + + + 功率因数 + + + + + 正向有功 + + + + + 有功功率 + + + + + 无功功率 + + + + + 采集类型(0-自动,1-手动) + + + + + 启用标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 修改人 + + + + + 修改时间 + + + + + 工厂编号 + + + + + 钣金任务完成表 + + + + + 主键 + + + + + 计划编号 + + + + + 工单编号 + + + + + 物料编号 + + + + + 钣金任务计划表 + + + + + 主键 + + + + + 工单编号 + + + + + 计划编号 + + + + + 物料编号 + + + + + 物料名称 + + + + + 任务执行数量 + + + + + 完成数量 + + + + + 前板数量 + + + + + 后板数量 + + + + + 开始时间 + + + + + 执行顺序 + + + + + 创建时间 + + + + + 是否执行中:1-执行,2-完成 + + + + + 任务类型 + + + + + 计划任务执行编号 + + + + + 成品信息 + + + + + 主键标识 + + + + + 物料编号 + + + + + 物料名称 + + + + + 物料大类(100-冷柜) + + + + + 物料小类 + + + + + SAP物料类型 + + + + + SAP物料类型 + + + + + 物料组 + + + + + 物料型号 + + + + + 所属工厂 + + + + + 产线工位 + + + + + 是否标识 + + + + + 是否标识 + + + + + 创建时间 + + + + + 修改人 + + + + + 修改时间 + + + + + 增量日期 + + + + + 入库方向-A/B + + + + + SAP计划员(100=成品;200=箱体;300=门体) + + + + + 质检项信息 + + + + + 主键标识 + + + + + 质检项/质量缺陷编号 + + + + + 质检项/质量缺陷名字 + + + + + 父级编号 + + + + + 启用标识 + + + + + 成品下线是否校验(0-不校验;1-校验) + + + + + 货道明细 + + + + + 主键标识 + + + + + 所属仓库 + + + + + 货道编号 + + + + + 物料编码 + + + + + 物料名称 + + + + + 物料类型 + + + + + 物料数量 + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 货道信息 + + + + + 主键标识 + + + + + 货道编号 + + + + + 货道名称 + + + + + 货道容量 + + + + + 货道库存 + + + + + 货道状态 + + + + + 货道类型 + + + + + 所属仓库 + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 物料类型A + + + + + 夹具箱型 + + + + + 在途数量 + + + + + 出库数量 + + + + + 入库标识:1-允许入库;2-禁止入库 + + + + + 出库标识:1-允许出库;2-禁止出库 + + + + + 异常标识:1-正常货道;2-异常货道 + + + + + 物料类型B + + + + + 物料类型C + + + + + 物料类型(名称)A + + + + + 物料类型(名称)B + + + + + 物料类型(名称)C + + + + + 分垛使用字段,箱体入库旋转角度(90,180,270) + + + + + 分垛使用字段,是否大产品占两个货道,1-是;0-否 + + + + + 分垛使用字段,记录同型号上次入的货道,如FD01_002 == >记录上次货道ObjId + + + + + SAP BOM + + + + + 主键标识 + + + + + 仓库编号 + + + + + 仓库名称 + + + + + 仓库类型:1-集存库、2-线边库、3-立体库 + + + + + 仓库区域 + + + + + 仓库状态:1-空余;2-已满;3-异常 + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 所属工厂 + + + + + 设备 + + + + + 主键 + + + + + 产品线 1、2 + + + + + 设备编码 + + + + + 排序 + + + + + 每班发泡信息 + + + + + 主键 + + + + + 设备表主键,夹具编号 + + + + + SAP订单 + + + + + 产品线 1、2 + + + + + 夹具箱型 + + + + + 夹具状态:0:停止;1生产 + + + + + 产量 + + + + + 固化时间设定值 + + + + + 固化时间实际值 + + + + + 1小时 + + + + + 2小时 + + + + + 3小时 + + + + + 4小时 + + + + + 5小时 + + + + + 6小时 + + + + + 7小时 + + + + + 8小时 + + + + + 9小时 + + + + + 10小时 + + + + + 11小时 + + + + + 12小时 + + + + + 侧板温度 + + + + + 内模温度 + + + + + 节拍 + + + + + 更新时间 + + + + + 工位编号 + + + + + 夹具实时数据 + + + + + 主键 + + + + + 夹具序号 + + + + + 公司 + + + + + 产线编码 + + + + + 工序 + + + + + 工位 + + + + + 夹具箱型 + + + + + 夹具状态 + + + + + 夹具产量 + + + + + 夹具固化时间设定值 + + + + + 夹具固化时间显示值 + + + + + 模具内温度 + + + + + 模具外温度 + + + + + 节拍 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 每日发泡信息数据记录表 + + + + + 主键SEQ_BOX_FOAMDATARECORD + + + + + 产线 1、2 + + + + + 订单编码 + + + + + 夹具箱型 + + + + + 夹具状态:0:停止;1生产 + + + + + 产量 + + + + + 固化时间设定值 + + + + + 固化时间实际值 + + + + + 1小时 + + + + + 2小时 + + + + + 3小时 + + + + + 4小时 + + + + + 5小时 + + + + + 6小时 + + + + + 7小时 + + + + + 8小时 + + + + + 9小时 + + + + + 10小时 + + + + + 11小时 + + + + + 12小时 + + + + + 侧板温度 + + + + + 内模温度 + + + + + 节拍 + + + + + 更新时间 + + + + + 夹具历史数据 + + + + + 主键 + + + + + 公司 + + + + + 产线编码 + + + + + 工序 + + + + + 工位 + + + + + 夹具箱型 + + + + + 夹具状态 + + + + + 夹具产量 + + + + + 夹具固化时间设定值 + + + + + 夹具固化时间显示值 + + + + + 模具内温度 + + + + + 模具外温度 + + + + + 节拍 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 发泡计划 + + + + + 主键标识 + + + + + 物料编号 + + + + + 物料名称 + + + + + SAP订单编码 + + + + + MES计划编号 + + + + + 计划数量 + + + + + 当班计划 + + + + + 产线 + + + + + 更新时间 + + + + + 创建时间 + + + + + 计划完成数量 + + + + + 工位编号 + + + + + 获取发泡机最后一枪记录 + + + + + 主键 + + + + + 所属系统;1系统 2系统 + + + + + 系统状态 + + + + + 枪编号;A1枪,B1枪,A2枪,B2枪 + + + + + 产线编号 + + + + + 枪POL注料温度 + + + + + 枪POL注料压力 + + + + + 枪POL注料流量 + + + + + 枪POL原料用量 + + + + + 枪ISO注料温度 + + + + + 枪ISO注料压力 + + + + + 枪ISO注料流量 + + + + + 枪ISO原料用量 + + + + + 枪注料工位号 + + + + + 枪设定注料时间 + + + + + 枪设定注料重量 + + + + + 枪设定注料比例 + + + + + 枪实际注料重量 + + + + + 枪实际注料比例 + + + + + 枪中压循环时间 + + + + + 枪高压循环时间 + + + + + 枪液压压力 + + + + + 枪液压温度 + + + + + 枪开枪时间 + + + + + 枪关枪时间 + + + + + 枪总产量 + + + + + 枪注料结束信号 + + + + + 创建时间 + + + + + 测温历史记录 + + + + + 主键 + + + + + 线号 + + + + + 工位号 + + + + + 产品条码 + + + + + 产品型号 + + + + + 基准型号 + + + + + 工作电压 + + + + + 测试通道 + + + + + 计划测试时间 + + + + + 实际测试时间 + + + + + 环温 + + + + + 开始测试时间 + + + + + 测试结果 + + + + + 测试结束时间 + + + + + 系统用户 + + + + + 备注 + + + + + 第几次测试 + + + + + 温度数据 + + + + + 功率数据 + + + + + 部件测试数据 + + + + + 故障代码 + + + + + 内部传感器 1 名称 + + + + + 内部传感器 2 名称 + + + + + 内部传感器 3 名称 + + + + + 内部传感器 4 名称 + + + + + 内部传感器 5 名称 + + + + + 内部传感器 6 名称 + + + + + 是否测试部件(”Y”测试) + + + + + 低压启动测试时间 + + + + + 低压启动标准下限 + + + + + 低压启动标准上限 + + + + + 低压启动实际采集值 + + + + + 低压启动测试电压 + + + + + 创建时间 + + + + + 条码绑定记录 + + + + + 主键 + + + + + 箱体条码 + + + + + 箱体名称 + + + + + 成品码 + + + + + 绑定结果 + + + + + 条码1记录时间 + + + + + 条码2记录时间 + + + + + plc放行标志,2为放行通过,1为pda提示需要放行记录 + + + + + 存储当班班组 + + + + + 主键 + + + + + 班组名称 + + + + + 开始时间 + + + + + 结束时间 + + + + + 电检数据明细 + + + + + 标识 + + + + + 序号 + + + + + 项目名称 + + + + + 测试条件 + + + + + 测试值 + + + + + 测试结果 + + + + + 记录时间 + + + + + 门体发泡记录 + + + + + 主键 + + + + + 台车编号 + + + + + 枪号 + + + + + 模位状态;0=>不工作,1=>A门工作;2=>B门工作;3=>AB门工作 + + + + + 模位类型 + + + + + 模具产量A + + + + + 模具产量B + + + + + 创建时间 + + + + + 门体发泡记录 + + + + + 主键 + + + + + 计划编码 + + + + + 订单编码 + + + + + 物料编码 + + + + + 物料名称 + + + + + 门体计划数 + + + + + 完成数 + + + + + 开始时间 + + + + + 结束时间 + + + + + 创建时间 + + + + + 更新时间 + + + + + 门体匹配记录 + + + + + 主键标识 + + + + + 计划编号 + + + + + 订单编号 + + + + + 工厂编号 + + + + + 产线 + + + + + 工位编码 + + + + + 物料编号 + + + + + 物料名称 + + + + + 匹配时间 + + + + + 计划执行表 + + + + + 主键标识 + + + + + 执行计划编号 + + + + + 生产计划编号 + + + + + 工单编号 + + + + + 物料编码 + + + + + 物料名称 + + + + + 产线/工位 + + + + + 计划数量 + + + + + 完成数量 + + + + + 开始时间 + + + + + 结束时间 + + + + + 是否标识 + + + + + 执行顺序 + + + + + 执行方式:1-手动;2-自动 + + + + + 执行状态:1-待执行;2-执行中;3-完成 + + + + + 创建时间 + + + + + 任务类型 + + + + + 计划任务执行编号——钣金任务 + + + + + 产品简码 + + + + + 夹具型号 + + + + + y + + + + + 条码下线信息记录 + + + + + 主键标识 + + + + + 所属产线 + + + + + 灌注告警 + + + + + 灌注 + + + + + 箱体码 + + + + + 报警状态码 + + + + + 报警信息 + + + + + 灌注是否完成 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 灌注记录表 + + + + + 主键 + + + + + 实际灌注量 + + + + + 灌注压力_R + + + + + 灌注压力_L + + + + + 灌注时长 + + + + + 产量 + + + + + 箱体码 + + + + + 冷媒类型;左侧冷媒型号 + + + + + 冷媒类型;右侧侧冷媒型号 + + + + + 设置灌注量 + + + + + 系统;0,右系统 1,左系统 + + + + + 灌注结果 + + + + + 灌注完成状态字 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 打印条码信息 + + + + + 主键 + + + + + SAP计划编号 + + + + + 物料编码 + + + + + 物料名称 + + + + + 条码 + + + + + 打印时间 + + + + + 补打个数 + + + + + 打印类型:箱壳、内胆 + + + + + 订单执行表 + + + + + 主键 + + + + + 工单编号 + + + + + 工单编号 + + + + + 物料编码 + + + + + 物料名称 + + + + + 物料名称 + + + + + 订单计划数量 + + + + + 完成数量 + + + + + 工单类型 + + + + + 工单状态 + + + + + 开始时间 + + + + + 完成时间 + + + + + 创建时间 + + + + + 从SAP中拆分出来的工位信息 + + + + + 主键标识 + + + + + 计划编号 + + + + + 工单编号 + + + + + 销售订单编号 + + + + + 销售订单行号 + + + + + 物料编码 + + + + + 物料名称 + + + + + 产线/工位 + + + + + 计划数量 + + + + + 完成数量 + + + + + 开始时间 + + + + + 结束时间 + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 库存任务实时处理 + + + + + 主键标识 + + + + + 任务编号 + + + + + 任务形式:0-自动;1-手动 + + + + + 任务类型:1-入库;2-出库 + + + + + 任务状态:1-待执行;2-执行中;3-完成 + + + + + 计划编号 + + + + + 物料编号 + + + + + 物料类型 + + + + + 货道编号 + + + + + 货道名称 + + + + + 计划数量 + + + + + 完成数量 + + + + + 开始时间 + + + + + 结束时间 + + + + + 是否标识 + + + + + 仓库编号 + + + + + 创建时间 + + + + + 完成记录 + + + + + 主键标识 + + + + + 计划编号 + + + + + 物料编号 + + + + + 计划工位 + + + + + 完成数量 + + + + + 下线数量 + + + + + 实际产量 + + + + + 记录时间 + + + + + 是否标识 + + + + + 电检数据记录 + + + + + 唯一标识 + + + + + 测试总结果 + + + + + 产品条码 + + + + + 测试时间 + + + + + 测试数据 + + + + + 记录时间 + + + + + 入库记录 + + + + + 主键标识 + + + + + 仓库编号 + + + + + 仓库区域 + + + + + 货道编号 + + + + + 物料类型 + + + + + 物料编号 + + + + + 入库数量 + + + + + 入库时间 + + + + + 物料条码编号 + + + + + 物料名称 + + + + + 入库方式(0-正常,1-异常) + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 出库记录 + + + + + 主键标识 + + + + + 仓库编号 + + + + + 仓库区域 + + + + + 货道编号 + + + + + 物料编号 + + + + + 物料名称 + + + + + 出库数量 + + + + + 出库时间 + + + + + 物料条码编号 + + + + + 物料类型 + + + + + 出库方式(0-正常,1-异常) + + + + + 是否标识 + + + + + 创建人 + + + + + 创建时间 + + + + + 更新人 + + + + + 更新时间 + + + + + 完成记录 + + + + + 主键标识 + + + + + 计划编号 + + + + + 物料编号 + + + + + 计划工位 + + + + + 完成数量 + + + + + 记录时间 + + + + + 是否标识 + + + + + 完成记录 + + + + + 主键标识 + + + + + 计划编号 + + + + + 物料编号 + + + + + 计划工位 + + + + + 完成数量 + + + + + 下线数量 + + + + + 实际产量 + + + + + 记录时间 + + + + + 是否标识 + + + + + 质检记录 + + + + + 主键 + + + + + 箱体条码 + + + + + 物料名称 + + + + + 工序编号 + + + + + 检测项(工位)编号 + + + + + 质量缺陷编码 + + + + + 质量缺陷名称 + + + + + 质检处理措施(3=合格,1=返修) + + + + + 返修处理结果 + + + + + 是否下静态线(1-是;2-否) + + + + + 班组编号 + + + + + 检测人员 + + + + + 检测时间 + + + + + 返修次数 + + + + + 返修完成时间 + + + + + 返修结果(1=正常,2=异常) + + + + + 更新人 + + + + + 更新时间 + + + + + 检测人工位编号 + + + + + 钣金每日生产记录表 + + + + + 主键-guid + + + + + 计划编码 + + + + + 产品编码 + + + + + 产品名称 + + + + + 生产类型;0--前板,1--后板 + + + + + 生产新时间 + + + + + 上位机同步钣金设备设置的物料型号 + + + + + 主键 + + + + + 产品ID + + + + + 同步型号 + + + + + 设置型号 + + + + + 同步时间 + + + + + 类别 1=>前板,2=》后板 + + + + + 创建时间 + + + + + bom设置 + + + + + 产品型号编码——主键产品型号 + + + + + 产品型号编码——主键产品型号 + + + + + 产品型号编码——主键产品型号 + + + + + 物料编码 + + + + + 物料名称 + + + + + 对应型号 + + + + + 创建时间 + + + + + 用户信息 + + + + + 用户Id,自增主键 + + + + + 用户名称 + + + + + 用户密码 + + + + + 测温历史记录 + + + + + 主键 + + + + + 线号 + + + + + 工位号 + + + + + 产品条码 + + + + + 产品型号 + + + + + 基准型号 + + + + + 工作电压 + + + + + 测试通道 + + + + + 计划测试时间 + + + + + 实际测试时间 + + + + + 环温 + + + + + 开始测试时间 + + + + + 测试结果 + + + + + 测试结束时间 + + + + + 系统用户 + + + + + 备注 + + + + + 第几次测试 + + + + + 温度数据 + + + + + 功率数据 + + + + + 部件测试数据 + + + + + 故障代码 + + + + + 内部传感器 1 名称 + + + + + 内部传感器 2 名称 + + + + + 内部传感器 3 名称 + + + + + 内部传感器 4 名称 + + + + + 内部传感器 5 名称 + + + + + 内部传感器 6 名称 + + + + + 是否测试部件(”Y”测试) + + + + + 低压启动测试时间 + + + + + 低压启动标准下限 + + + + + 低压启动标准上限 + + + + + 低压启动实际采集值 + + + + + 低压启动测试电压 + + + + + 同步标识 + + + + + 条码绑定扫描类型统计 + + + + + 箱体名称 + + + + + 数量 + + + + + 获取每日班组时间 + + + + + 开始时间 + + + + + 开始时间 + + + + + 结束时间 + + + + + 小时 + + + + + 班组 + + + + + 泡前库入库相信展示 + + + + + 序号 + + + + + 货道号 + + + + + 产品条码 + + + + + 产品型号 + + + + + 入库时间 + + + + + Dto + + + + + 获取订单物料型号 + + + + + 物料编码 + + + + + 物料名称 + + + + + 部件型号 + + + + + 条码打印物料信息 + + + + + 订单编号 + + + + + 产品编号 + + + + + 订单数量 + + + + + 产品型号 + + + + + 内胆数量 + + + + + 箱体数量 + + + + + 完成量 + + + + + 物料编码 + + + + + 物料名称 + + + + + 物料数量 + + + + + 异常量 + + + + + 内胆码已打量 + + + + + 箱壳码已打量 + + + + + 剩余数量 + + + + + 打印名称 + + + + + 创建时间 + + + + + 工位信息 + + + + + 公司编码 + + + + + 产品线 + + + + + 工序 + + + + + 工位 + + + + + 公司 + + + + + 产线编码 + + + + + 工序 + + + + + 工位 + + + + + 小时 + + + + + 物料名称 + + + + + 前板数量 + + + + + 后板数量 + + + + + 计划编码 + + + + + 订单查询 + + + + + 物料编码 + + + + + 物料名称 + + + + + 计划数量 + + + + + 完成数量 + + + + + 开始时间 + + + + + 结束时间 + + + + + 前板数量 + + + + + 后板数量 + + + + + 物料名称 + + + + + 前板数量 + + + + + 后板数量 + + + + + 钣金计划 + + + + + 下发计划的ID + + + + + 计划编码 + + + + + 订单编码 + + + + + 物料编码 + + + + + 物料名称 + + + + + 产线工位 + + + + + 计划数量 + + + + + 完成数量 + + + + + 开始时间 + + + + + 结束时间 + + + + + 产品型号 + + + + + 主键 + + + + + 计划Code + + + + + 订单Code + + + + + 物料编码 + + + + + 物料名称 + + + + + 物料编码 + + + + + 物料名称 + + + + + 物料名称 + + + + + 计划编码 + + + + + 开始时间 + + + + + 开始时间 + + + + + 执行状态 + + + + + 计划类型(1=联合下发;2=前板下发;3=后板下发) + + + + + 计划数量 + + + + + 计划数量 + + + + + 任务编码 + + + + + 前板数量 + + + + + 后板数量 + + + + + 执行顺序 + + + + + 产线编码 + + + + + 产线编码 + + + + + 时间 + + + + + 小时 + + + + + 背板数量 + + + + + 前板数量 + + + + + 条码绑定扫描类型统计 + + + + + 开始时间 + + + + + 结束时间 + + + + + 工位信息 + + + + + 序号 + + + + + 计划信息 + + + + + 订单号 + + + + + 物料名称 + + + + + 物料名称 + + + + + 产品编码 + + + + + 产品名称 + + + + + 工艺编码 + + + + + 工艺编号 + + + + + 分类 + + + + + 物料大类 + + + + + 物料小类 + + + + + 订单数量 + + + + + 剩余数量 + + + + + 开始日期 + + + + diff --git a/Admin.Core.IRepository/IRepository_New/IBaseDeviceParamRepository.cs b/Admin.Core.IRepository/IRepository_New/IBaseDeviceParamRepository.cs new file mode 100644 index 0000000..32700ee --- /dev/null +++ b/Admin.Core.IRepository/IRepository_New/IBaseDeviceParamRepository.cs @@ -0,0 +1,14 @@ +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.IRepository.IRepository_New +{ + public interface IBaseDeviceParamRepository : IBaseRepository + { + } +} diff --git a/Admin.Core.IRepository/IRepository_New/IRecordDeviceAlarmInfoRepository.cs b/Admin.Core.IRepository/IRepository_New/IRecordDeviceAlarmInfoRepository.cs new file mode 100644 index 0000000..273a52f --- /dev/null +++ b/Admin.Core.IRepository/IRepository_New/IRecordDeviceAlarmInfoRepository.cs @@ -0,0 +1,13 @@ +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.IRepository.IRepository_New +{ + public interface IRecordDeviceAlarmInfoRepository : IBaseRepository + { + } +} diff --git a/Admin.Core.IRepository/IRepository_New/IRecordDeviceElectricityRepository.cs b/Admin.Core.IRepository/IRepository_New/IRecordDeviceElectricityRepository.cs new file mode 100644 index 0000000..87ad0a6 --- /dev/null +++ b/Admin.Core.IRepository/IRepository_New/IRecordDeviceElectricityRepository.cs @@ -0,0 +1,13 @@ +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.IRepository.IRepository_New +{ + public interface IRecordDeviceElectricityRepository : IBaseRepository + { + } +} diff --git a/Admin.Core.IService/IService_New/IBaseDeviceParamServices.cs b/Admin.Core.IService/IService_New/IBaseDeviceParamServices.cs new file mode 100644 index 0000000..b13c690 --- /dev/null +++ b/Admin.Core.IService/IService_New/IBaseDeviceParamServices.cs @@ -0,0 +1,14 @@ +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.IService.IService_New +{ + public interface IBaseDeviceParamServices : IBaseServices + { + } +} diff --git a/Admin.Core.IService/IService_New/IRecordDeviceAlarmInfoServices.cs b/Admin.Core.IService/IService_New/IRecordDeviceAlarmInfoServices.cs new file mode 100644 index 0000000..8136c01 --- /dev/null +++ b/Admin.Core.IService/IService_New/IRecordDeviceAlarmInfoServices.cs @@ -0,0 +1,14 @@ +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.IService.IService_New +{ + public interface IRecordDeviceAlarmInfoServices : IBaseServices + { + } +} diff --git a/Admin.Core.IService/IService_New/IRecordDeviceElectricityServices.cs b/Admin.Core.IService/IService_New/IRecordDeviceElectricityServices.cs new file mode 100644 index 0000000..1f5ff16 --- /dev/null +++ b/Admin.Core.IService/IService_New/IRecordDeviceElectricityServices.cs @@ -0,0 +1,14 @@ +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.IService.IService_New +{ + public interface IRecordDeviceElectricityServices : IBaseServices + { + } +} diff --git a/Admin.Core.Model/Model_New/BaseDeviceParam.cs b/Admin.Core.Model/Model_New/BaseDeviceParam.cs new file mode 100644 index 0000000..8c40f88 --- /dev/null +++ b/Admin.Core.Model/Model_New/BaseDeviceParam.cs @@ -0,0 +1,82 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Model.Model_New +{ + /// + /// 设备参数 + /// + [SugarTable("BASE_DEVICEPARAM", "AUCMA_MES")] + public class BaseDeviceParam + { + /// + /// 主键标识 + /// + [SugarColumn(ColumnName = "OBJ_ID", IsPrimaryKey = true)] + public decimal ObjId { get; set; } + /// + /// 参数编号 + /// + [SugarColumn(ColumnName = "PARAM_CODE")] + public string ParamCode { get; set; } + /// + /// 参数名称 + /// + [SugarColumn(ColumnName = "PARAM_NAME")] + public string ParamName { get; set; } + /// + /// 网络地址 + /// + [SugarColumn(ColumnName = "PARAM_NETWORK")] + public string ParamNetwork { get; set; } + /// + /// 参数地址 + /// + [SugarColumn(ColumnName = "PARAM_ADDRESS")] + public string ParamAddress { get; set; } + /// + /// 参数类型:int、float + /// + [SugarColumn(ColumnName = "PARAM_TYPE")] + public string ParamType { get; set; } + /// + /// 设备编号 + /// + [SugarColumn(ColumnName = "DEVICE_CODE")] + public string DeviceCode { get; set; } + /// + /// 读取频率(毫秒) + /// + [SugarColumn(ColumnName = "READ_FREQUENCY")] + public decimal? ReadFrequency { get; set; } + /// + /// 是否标识 + /// + [SugarColumn(ColumnName = "IS_FLAG")] + public short? IsFlag { get; set; } + /// + /// 创建人 + /// + [SugarColumn(ColumnName = "CREATED_BY")] + public string CreatedBy { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "CREATED_TIME")] + public DateTime? CreatedTime { get; set; } + /// + /// 更新人 + /// + [SugarColumn(ColumnName = "UPDATED_BY")] + public string UpdatedBy { get; set; } + /// + /// 更新时间 + /// + [SugarColumn(ColumnName = "UPDATED_TIME")] + public DateTime? UpdatedTime { get; set; } + } +} diff --git a/Admin.Core.Model/Model_New/Record_DeviceAlarmInfo.cs b/Admin.Core.Model/Model_New/Record_DeviceAlarmInfo.cs new file mode 100644 index 0000000..923c944 --- /dev/null +++ b/Admin.Core.Model/Model_New/Record_DeviceAlarmInfo.cs @@ -0,0 +1,61 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Model.Model_New +{ + [SugarTable("RECORD_ALARM_DEVICE", "AUCMA_MES")] + public class Record_DeviceAlarmInfo + { + [SugarColumn(ColumnName = "OBJ_ID", IsPrimaryKey = true, OracleSequenceName = "SQE_DEVICE_ALARM_RECORD")] + public decimal ObjId { get; set; } + + [SugarColumn(ColumnName = "BATCH_ID")] + public string BatchId { get; set; } + + /// + /// 设备编号 + /// + [SugarColumn(ColumnName = "DEVICE_CODE")] + public string DeviceCode { get; set; } + + /// + /// 设备类型:1-生产设备;2-计量设备 + /// + [SugarColumn(ColumnName = "DEVICE_TYPE")] + public string DeviceType { get; set; } + + /// + /// 参数编号 + /// + [SugarColumn(ColumnName ="PARAM_CODE")] + public string ParamCode { get; set; } + + /// + /// 参数值 + /// + [SugarColumn(ColumnName = "PARAM_VALUE")] + public string ParamValue { get; set; } + + /// + /// 报警信息 + /// + [SugarColumn(ColumnName = "ALARM_INFO")] + public string AlarmInfo { get; set; } + + /// + /// 报警时间 + /// + [SugarColumn(ColumnName = "ALARM_TIME")] + public DateTime AlarmTime { get; set; } + + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "CREATED_TIME")] + public DateTime CreadtedTime { get; set; } + } +} diff --git a/Admin.Core.Model/Model_New/Record_DeviceElectricity.cs b/Admin.Core.Model/Model_New/Record_DeviceElectricity.cs new file mode 100644 index 0000000..3140eca --- /dev/null +++ b/Admin.Core.Model/Model_New/Record_DeviceElectricity.cs @@ -0,0 +1,122 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Model.Model_New +{ + /// + /// 电实时数据 + /// + [SugarTable("RECORD_DNB_INSTANT", "AUCMA_MES")] + public class Record_DeviceElectricity + { + /// + /// 主键标识 + /// + [SugarColumn(ColumnName = "OBJ_ID", IsPrimaryKey = true, OracleSequenceName = "SEQ_RECORD_DNB_INSTANT")] + public decimal ObjId { get; set; } + /// + /// 计量设备编号 + /// + [SugarColumn(ColumnName = "MONITOR_ID")] + public string MonitorId { get; set; } + /// + /// 采集时间 + /// + [SugarColumn(ColumnName = "COLLECT_TIME")] + public DateTime? CollectTime { get; set; } + /// + /// A项电压 + /// + [SugarColumn(ColumnName = "VA")] + public decimal? Va { get; set; } + /// + /// B项电压 + /// + [SugarColumn(ColumnName = "VB")] + public decimal? Vb { get; set; } + /// + /// C项电压 + /// + [SugarColumn(ColumnName = "VC")] + public decimal? Vc { get; set; } + /// + /// A项电流 + /// + [SugarColumn(ColumnName = "IA")] + public decimal? Ia { get; set; } + /// + /// B项电流 + /// + [SugarColumn(ColumnName = "IB")] + public decimal? Ib { get; set; } + /// + /// C项电流 + /// + [SugarColumn(ColumnName = "IC")] + public decimal? Ic { get; set; } + /// + /// 记录时间 + /// + [SugarColumn(ColumnName = "RECORD_TIME")] + public DateTime? RecordTime { get; set; } + /// + /// 功率因数 + /// + [SugarColumn(ColumnName = "GLYS")] + public decimal? Glys { get; set; } + /// + /// 正向有功 + /// + [SugarColumn(ColumnName = "ZXYG")] + public decimal? Zxyg { get; set; } + /// + /// 有功功率 + /// + [SugarColumn(ColumnName = "ACTIVE_POWER")] + public decimal? ActivePower { get; set; } + /// + /// 无功功率 + /// + [SugarColumn(ColumnName = "REACTIVE_POWER")] + public decimal? ReactivePower { get; set; } + /// + /// 采集类型(0-自动,1-手动) + /// + [SugarColumn(ColumnName = "COLLECT_TYPE")] + public decimal? CollectType { get; set; } + /// + /// 启用标识 + /// + [SugarColumn(ColumnName = "IS_FLAG")] + public decimal? IsFlag { get; set; } + /// + /// 创建人 + /// + [SugarColumn(ColumnName = "CREATED_BY")] + public string CreatedBy { get; set; } + /// + /// 创建时间 + /// + [SugarColumn(ColumnName = "CREATED_TIME")] + public DateTime? CreatedTime { get; set; } + /// + /// 修改人 + /// + [SugarColumn(ColumnName = "UPDATED_BY")] + public string UpdatedBy { get; set; } + /// + /// 修改时间 + /// + [SugarColumn(ColumnName = "UPDATED_TIME")] + public DateTime? UpdatedTime { get; set; } + /// + /// 工厂编号 + /// + [SugarColumn(ColumnName = "FACTORY_CODE")] + public string FactoryCode { get; set; } + } +} \ No newline at end of file diff --git a/Admin.Core.Repository/Repository_New/BaseDeviceParamRepository.cs b/Admin.Core.Repository/Repository_New/BaseDeviceParamRepository.cs new file mode 100644 index 0000000..0041a06 --- /dev/null +++ b/Admin.Core.Repository/Repository_New/BaseDeviceParamRepository.cs @@ -0,0 +1,19 @@ +using Admin.Core.IRepository; +using Admin.Core.IRepository.IRepository_New; +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Repository.Repository_New +{ + public class BaseDeviceParamRepository : BaseRepository, IBaseDeviceParamRepository + { + public BaseDeviceParamRepository(IUnitOfWork unitOfWork) : base(unitOfWork) + { + } + } +} diff --git a/Admin.Core.Repository/Repository_New/RecordDeviceAlarmInfoRepository.cs b/Admin.Core.Repository/Repository_New/RecordDeviceAlarmInfoRepository.cs new file mode 100644 index 0000000..1d6489c --- /dev/null +++ b/Admin.Core.Repository/Repository_New/RecordDeviceAlarmInfoRepository.cs @@ -0,0 +1,19 @@ +using Admin.Core.IRepository; +using Admin.Core.IRepository.IRepository_New; +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Repository.Repository_New +{ + public class RecordDeviceAlarmInfoRepository : BaseRepository, IRecordDeviceAlarmInfoRepository + { + public RecordDeviceAlarmInfoRepository(IUnitOfWork unitOfWork) : base(unitOfWork) + { + } + } +} diff --git a/Admin.Core.Repository/Repository_New/RecordDeviceElectricityRepository.cs b/Admin.Core.Repository/Repository_New/RecordDeviceElectricityRepository.cs new file mode 100644 index 0000000..1fd1a7a --- /dev/null +++ b/Admin.Core.Repository/Repository_New/RecordDeviceElectricityRepository.cs @@ -0,0 +1,17 @@ +using Admin.Core.IRepository.IRepository_New; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Repository.Repository_New +{ + internal class RecordDeviceElectricityRepository : BaseRepository, IRecordDeviceElectricityRepository + { + public RecordDeviceElectricityRepository(IUnitOfWork unitOfWork) : base(unitOfWork) + { + } + } +} diff --git a/Admin.Core.Service/Service_New/BaseDeviceParamServicesImpl.cs b/Admin.Core.Service/Service_New/BaseDeviceParamServicesImpl.cs new file mode 100644 index 0000000..497388c --- /dev/null +++ b/Admin.Core.Service/Service_New/BaseDeviceParamServicesImpl.cs @@ -0,0 +1,22 @@ +using Admin.Core.IRepository; +using Admin.Core.IService.IService_New; +using Admin.Core.Model; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Service.Service_New +{ + public class BaseDeviceParamServicesImpl : BaseServices, IBaseDeviceParamServices + { + private readonly IBaseRepository _dal; + public BaseDeviceParamServicesImpl(IBaseRepository dal) + { + this._dal = dal; + base.BaseDal = dal; + } + } +} diff --git a/Admin.Core.Service/Service_New/RecordDeviceAlarmInfoServicesImpl.cs b/Admin.Core.Service/Service_New/RecordDeviceAlarmInfoServicesImpl.cs new file mode 100644 index 0000000..b843a67 --- /dev/null +++ b/Admin.Core.Service/Service_New/RecordDeviceAlarmInfoServicesImpl.cs @@ -0,0 +1,21 @@ +using Admin.Core.IRepository; +using Admin.Core.IService.IService_New; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Service.Service_New +{ + public class RecordDeviceAlarmInfoServicesImpl : BaseServices, IRecordDeviceAlarmInfoServices + { + private readonly IBaseRepository _dal; + public RecordDeviceAlarmInfoServicesImpl(IBaseRepository dal) + { + this._dal = dal; + base.BaseDal = dal; + } + } +} diff --git a/Admin.Core.Service/Service_New/RecordDeviceElectricityServicesImpl.cs b/Admin.Core.Service/Service_New/RecordDeviceElectricityServicesImpl.cs new file mode 100644 index 0000000..ebd2ede --- /dev/null +++ b/Admin.Core.Service/Service_New/RecordDeviceElectricityServicesImpl.cs @@ -0,0 +1,21 @@ +using Admin.Core.IRepository; +using Admin.Core.IService.IService_New; +using Admin.Core.Model.Model_New; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Admin.Core.Service.Service_New +{ + public class RecordDeviceElectricityServicesImpl : BaseServices, IRecordDeviceElectricityServices + { + private readonly IBaseRepository _dal; + public RecordDeviceElectricityServicesImpl(IBaseRepository dal) + { + this._dal = dal; + base.BaseDal = dal; + } + } +} diff --git a/Aucma.Core.DataCollector/DataCollectorFactory.cs b/Aucma.Core.DataCollector/DataCollectorFactory.cs index a6e120f..a06aa24 100644 --- a/Aucma.Core.DataCollector/DataCollectorFactory.cs +++ b/Aucma.Core.DataCollector/DataCollectorFactory.cs @@ -1,15 +1,7 @@ using Admin.Core.IService.IService_New; using Admin.Core.Model.Model_New; -using Aucma.Core.DataCollector.Factory; using Aucma.Core.HwPLc; using log4net; -using NPOI.SS.Formula.Functions; -using SqlSugar; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Aucma.Core.DataCollector { diff --git a/Aucma.Core.DataCollector/DataCollectorSetup.cs b/Aucma.Core.DataCollector/DataCollectorSetup.cs index 263dce6..e7b58df 100644 --- a/Aucma.Core.DataCollector/DataCollectorSetup.cs +++ b/Aucma.Core.DataCollector/DataCollectorSetup.cs @@ -31,74 +31,24 @@ namespace Aucma.Core.DataCollector { try { - if (stationCode == "1002") //箱壳、内胆,包含预装线、集存库 + if (stationCode == "1001") //箱壳 { + //前板 Task.Run(() => { - DataCollectorFactory collector = new ShellStoreFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); + DataCollectorFactory collector = new SidePanelFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); }); - - Task.Run(() => - { - DataCollectorFactory collector = new LinerStoreFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); - - Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); - }); - } - else if (stationCode == "1005")//泡前库、发泡线、发泡机、泡后库 - { - Task.Run(() => - { - DataCollectorFactory collector = new BoxFoamFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); - - Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); - }); - } - else if (stationCode == "1010")//成品分垛 - { - //Task.Run(() => - //{ - // DataCollectorFactory collector = new PalletizFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); - - // Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); - //}); - Task.Run(() => - { - DataCollectorFactory collector = new ShellStoreFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); - - Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); - }); - - Task.Run(() => - { - DataCollectorFactory collector = new LinerStoreFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); - - Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); - }); - - Task.Run(() => - { - DataCollectorFactory collector = new ShellPreassembleFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); - - Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); - }); - - Task.Run(() => - { - DataCollectorFactory collector = new LinerPreassembleFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); - - Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); - }); - + //后板 Task.Run(() => { - DataCollectorFactory collector = new FoamBackFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); + DataCollectorFactory collector = new BackPanelFactory(_deviceParamServices, _deviceAlarmInfoServices, _deviceElectricityServices); Parallel.Invoke(() => collector.CollectDeviceAlarmInfo(out var alarmInfos), () => collector.CollectDeviceElectricity(out var electricity)); }); } + }catch(Exception ex) { _logger.Error($"UseDataCollectorExtensions逻辑执行异常:{ex.Message}"); diff --git a/Aucma.Core.DataCollector/Factory/BoxFoamFactory.cs b/Aucma.Core.DataCollector/Factory/BackPanelFactory.cs similarity index 77% rename from Aucma.Core.DataCollector/Factory/BoxFoamFactory.cs rename to Aucma.Core.DataCollector/Factory/BackPanelFactory.cs index 302ce3b..d9e5d4d 100644 --- a/Aucma.Core.DataCollector/Factory/BoxFoamFactory.cs +++ b/Aucma.Core.DataCollector/Factory/BackPanelFactory.cs @@ -1,7 +1,6 @@ using Admin.Core.IService.IService_New; using Admin.Core.Model.Model_New; using Aucma.Core.HwPLc; -using log4net; using System; using System.Collections.Generic; using System.Linq; @@ -10,19 +9,15 @@ using System.Threading.Tasks; namespace Aucma.Core.DataCollector.Factory { - /// - /// 箱体发泡数据采集 - /// - public class BoxFoamFactory : DataCollectorFactory + public class BackPanelFactory : DataCollectorFactory { - private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("Test")); - - public BoxFoamFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) + private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC")); + public BackPanelFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) { } /// - /// 采集泡前库、发泡线、发泡机、泡后库设备报警信息 + /// 后板数据采集 /// /// public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) @@ -31,13 +26,12 @@ namespace Aucma.Core.DataCollector.Factory { try { - if (_plc != null) { Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集设备报警信息"); var plc = _plc.plc; - - var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00009"); + if (plc.IsConnected == false) continue; + var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00029"); if (deviceParams != null) { @@ -73,19 +67,19 @@ namespace Aucma.Core.DataCollector.Factory else { Task.Delay(base.AlarmReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("Test")); } } catch (Exception ex) { - base._logger.Error($"采集泡前库、发泡线、发泡机、泡后库设备报警信息:{ex.Message}"); + base._logger.Error($"采集泡前库、发泡线、发泡机、泡后库设备报警信息:{ex.Message}"); } } } public override void CollectDeviceElectricity(out List deviceElectricitys) { - throw new NotImplementedException(); + deviceElectricitys = null; + return; } } } diff --git a/Aucma.Core.DataCollector/Factory/BeforeFoamFactory.cs b/Aucma.Core.DataCollector/Factory/BeforeFoamFactory.cs deleted file mode 100644 index 2ed3682..0000000 --- a/Aucma.Core.DataCollector/Factory/BeforeFoamFactory.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -#region << 版 本 注 释 >> -/*-------------------------------------------------------------------- -* 版权所有 (c) 2024 WenJY 保留所有权利。 -* CLR版本:4.0.30319.42000 -* 机器名称:LAPTOP-E0N2L34V -* 命名空间:Aucma.Core.DataCollector.Factory -* 唯一标识:a4c93b2e-0cca-4fc8-be63-7f560c451cd9 -* -* 创建者:WenJY -* 电子邮箱:wenjy@mesnac.com -* 创建时间:2024-03-28 11:16:52 -* 版本:V1.0.0 -* 描述: -* -*-------------------------------------------------------------------- -* 修改人: -* 时间: -* 修改说明: -* -* 版本:V1.0.0 -*--------------------------------------------------------------------*/ -#endregion << 版 本 注 释 >> -namespace Aucma.Core.DataCollector.Factory -{ - /// - /// 泡前数据采集 - /// - public class BeforeFoamFactory - { - - } -} diff --git a/Aucma.Core.DataCollector/Factory/FoamBackFactory.cs b/Aucma.Core.DataCollector/Factory/FoamBackFactory.cs deleted file mode 100644 index 1249735..0000000 --- a/Aucma.Core.DataCollector/Factory/FoamBackFactory.cs +++ /dev/null @@ -1,186 +0,0 @@ -using Admin.Core.IService.IService_New; -using Admin.Core.Model.Model_New; -using Aucma.Core.HwPLc; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -#region << 版 本 注 释 >> -/*-------------------------------------------------------------------- -* 版权所有 (c) 2024 WenJY 保留所有权利。 -* CLR版本:4.0.30319.42000 -* 机器名称:LAPTOP-E0N2L34V -* 命名空间:Aucma.Core.DataCollector.Factory -* 唯一标识:d14bf35f-5d0b-4d74-a9a8-f7781f5c12cd -* -* 创建者:WenJY -* 电子邮箱:wenjy@mesnac.com -* 创建时间:2024-03-28 11:15:55 -* 版本:V1.0.0 -* 描述: -* -*-------------------------------------------------------------------- -* 修改人: -* 时间: -* 修改说明: -* -* 版本:V1.0.0 -*--------------------------------------------------------------------*/ -#endregion << 版 本 注 释 >> -namespace Aucma.Core.DataCollector.Factory -{ - /// - /// 泡后数据采集 - /// - public class FoamBackFactory : DataCollectorFactory - { - private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("FoamBack")); - - public FoamBackFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) - { - } - - public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) - { - while (true) - { - try - { - - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集泡后库设备报警信息"); - var plc = _plc.plc; - - var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00009"); - - if (deviceParams != null) - { - deviceAlarmInfos = new List(); - string batchId = System.Guid.NewGuid().ToString("N"); - foreach (var item in deviceParams) - { - base.ReadParamValueByPlc(plc, item.ParamAddress, item.ParamType, out int paramValue); - - if (paramValue != 0) - { - deviceAlarmInfos.Add(new Record_DeviceAlarmInfo() - { - BatchId = batchId, - DeviceCode = item.DeviceCode, - DeviceType = "1", - ParamCode = item.ParamCode, - ParamValue = paramValue.ToString(), - AlarmInfo = item.ParamName, - AlarmTime = DateTime.Now, - CreadtedTime = DateTime.Now, - }); - } - - } - if (deviceAlarmInfos.Count > 0) - { - base._deviceAlarmInfoServices.AddAsync(deviceAlarmInfos); - } - } - Task.Delay(base.AlarmReadTimer).Wait(); - } - else - { - Task.Delay(base.AlarmReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("FoamBack")); - } - } - catch (Exception ex) - { - base._logger.Error($"采集泡后库设备报警信息异常:{ex.Message}"); - } - } - } - - public override void CollectDeviceElectricity(out List deviceElectricitys) - { - while (true) - { - try - { - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集泡后库设备用电数据"); - var plc = _plc.plc; - - deviceElectricitys = new List(); - - //泡后集存库(10柜-主柜) - string[] address_10 = new string[] { "D7602", "D7604", "D7606", "D7608", "D7610", "D7612", "D7630", "D7634", "D7638", "D7642" }; - - Record_DeviceElectricity _deviceElectricity_10 = new Record_DeviceElectricity() - { - MonitorId = "E00009_0001" - }; - - base.ReadDeviceElectricity(address_10, plc, ref _deviceElectricity_10); - - if(_deviceElectricity_10 != null) - { - deviceElectricitys.Add(_deviceElectricity_10); - } - - //泡后集存库(09柜-分柜)IP10.10.92.40 - string[] address_09 = new string[] { "D7652", "D7664", "D7666", "D7668", "D7660", "D7662", "D7680", "D7684", "D7688", "D7692" }; - - Record_DeviceElectricity _deviceElectricity_09 = new Record_DeviceElectricity() - { - MonitorId = "E00009_0002" - }; - - base.ReadDeviceElectricity(address_09, plc, ref _deviceElectricity_09); - - if (_deviceElectricity_09 != null) - { - deviceElectricitys.Add(_deviceElectricity_09); - } - - //泡后集存库(12柜-分柜) - string[] address_12 = new string[] { "D7752", "D7764", "D7766", "D7768", "D7760", "D7762", "D7780", "D7784", "D7788", "D7792" }; - - Record_DeviceElectricity _deviceElectricity_12 = new Record_DeviceElectricity() - { - MonitorId = "E00009_0003" - }; - - base.ReadDeviceElectricity(address_12, plc, ref _deviceElectricity_12); - - if (_deviceElectricity_12 != null) - { - deviceElectricitys.Add(_deviceElectricity_12); - } - - if(deviceElectricitys.Count > 0) - { - var result = base._deviceElectricityServices.AddAsync(deviceElectricitys); - } - else - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集泡后库设备用电数据失败,数据为空"); - } - - Task.Delay(base.EleReadTimer).Wait(); - } - else - { - Task.Delay(base.EleReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("FoamBack")); - } - - } - catch (Exception ex) - { - base._logger.Error($"采集泡后库设备用电数据采集异常:{ex.Message}"); - } - } - } - } -} diff --git a/Aucma.Core.DataCollector/Factory/LinerPreassembleFactory.cs b/Aucma.Core.DataCollector/Factory/LinerPreassembleFactory.cs deleted file mode 100644 index 2823b67..0000000 --- a/Aucma.Core.DataCollector/Factory/LinerPreassembleFactory.cs +++ /dev/null @@ -1,167 +0,0 @@ -using Admin.Core.IService.IService_New; -using Admin.Core.Model.Model_New; -using Aucma.Core.HwPLc; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -#region << 版 本 注 释 >> -/*-------------------------------------------------------------------- -* 版权所有 (c) 2024 WenJY 保留所有权利。 -* CLR版本:4.0.30319.42000 -* 机器名称:LAPTOP-E0N2L34V -* 命名空间:Aucma.Core.DataCollector.Factory -* 唯一标识:81c294d4-c4ab-4504-b193-9a5d013383d3 -* -* 创建者:WenJY -* 电子邮箱:wenjy@mesnac.com -* 创建时间:2024-03-28 11:57:37 -* 版本:V1.0.0 -* 描述: -* -*-------------------------------------------------------------------- -* 修改人: -* 时间: -* 修改说明: -* -* 版本:V1.0.0 -*--------------------------------------------------------------------*/ -#endregion << 版 本 注 释 >> -namespace Aucma.Core.DataCollector.Factory -{ - public class LinerPreassembleFactory : DataCollectorFactory - { - private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("LinerPreassemble")); - public LinerPreassembleFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) - { - } - - public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) - { - while (true) - { - try - { - - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集内胆预装设备报警信息"); - var plc = _plc.plc; - - var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00024"); - - if (deviceParams != null) - { - deviceAlarmInfos = new List(); - string batchId = System.Guid.NewGuid().ToString("N"); - foreach (var item in deviceParams) - { - base.ReadParamValueByPlc(plc, item.ParamAddress, item.ParamType, out int paramValue); - - if (paramValue != 0) - { - deviceAlarmInfos.Add(new Record_DeviceAlarmInfo() - { - BatchId = batchId, - DeviceCode = item.DeviceCode, - DeviceType = "1", - ParamCode = item.ParamCode, - ParamValue = paramValue.ToString(), - AlarmInfo = item.ParamName, - AlarmTime = DateTime.Now, - CreadtedTime = DateTime.Now, - }); - } - - } - if (deviceAlarmInfos.Count > 0) - { - base._deviceAlarmInfoServices.AddAsync(deviceAlarmInfos); - } - } - Task.Delay(base.AlarmReadTimer).Wait(); - } - else - { - Task.Delay(base.AlarmReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("LinerPreassemble")); - } - } - catch (Exception ex) - { - base._logger.Error($"采集内胆预装设备报警信息异常:{ex.Message}"); - } - } - } - - public override void CollectDeviceElectricity(out List deviceElectricitys) - { - while (true) - { - try - { - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集内胆预装设备用电数据"); - var plc = _plc.plc; - - deviceElectricitys = new List(); - - // 地面内胆预装主柜 - string[] ground = new string[] { "D7602", "D7604", "D7606", "D7608", "D7610", "D7612", "D7630", "D7634", "D7638", "D7642" }; - - Record_DeviceElectricity _deviceElectricity_ground = new Record_DeviceElectricity() - { - MonitorId = "E00024_0001" - }; - - base.ReadDeviceElectricity(ground, plc, ref _deviceElectricity_ground); - - if(_deviceElectricity_ground != null) - { - deviceElectricitys.Add(_deviceElectricity_ground); - } - - //平台内胆预装远程 - string[] platform = new string[] { "D7652", "D7664", "D7666", "D7668", "D7660", "D7662", "D7680", "D7684", "D7688", "D7692" }; - - Record_DeviceElectricity _deviceElectricity_platform = new Record_DeviceElectricity() - { - MonitorId = "E00024_0002" - }; - - base.ReadDeviceElectricity(platform, plc, ref _deviceElectricity_platform); - - if (_deviceElectricity_platform != null) - { - deviceElectricitys.Add(_deviceElectricity_platform); - } - - if(deviceElectricitys.Count > 0) - { - var result = base._deviceElectricityServices.AddAsync(deviceElectricitys); - } - else - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集内胆预装设备用电数据失败,数据为空"); - } - - Task.Delay(base.EleReadTimer).Wait(); - } - else - { - Task.Delay(base.EleReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("LinerPreassemble")); - } - - } - catch (Exception ex) - { - base._logger.Error($"采集内胆预装用电数据采集异常:{ex.Message}"); - } - } - } - } -} diff --git a/Aucma.Core.DataCollector/Factory/LinerStoreFactory.cs b/Aucma.Core.DataCollector/Factory/LinerStoreFactory.cs deleted file mode 100644 index eda4bc3..0000000 --- a/Aucma.Core.DataCollector/Factory/LinerStoreFactory.cs +++ /dev/null @@ -1,138 +0,0 @@ -using Admin.Core.IService.IService_New; -using Admin.Core.Model.Model_New; -using Aucma.Core.HwPLc; -using log4net; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Aucma.Core.DataCollector.Factory -{ - /// - /// 内胆预装、内胆库数据采集 - /// - public class LinerStoreFactory : DataCollectorFactory - { - private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("LinerStore")); - - public LinerStoreFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) - { - } - - /// - /// 采集内胆库设备报警信息 - /// - /// - public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) - { - while (true) - { - try - { - - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集内胆库设备报警信息"); - var plc = _plc.plc; - - var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00032"); - - if (deviceParams != null) - { - deviceAlarmInfos = new List(); - string batchId = System.Guid.NewGuid().ToString("N"); - foreach (var item in deviceParams) - { - base.ReadParamValueByPlc(plc, item.ParamAddress, item.ParamType, out int paramValue); - - if (paramValue != 0) - { - deviceAlarmInfos.Add(new Record_DeviceAlarmInfo() - { - BatchId = batchId, - DeviceCode = item.DeviceCode, - DeviceType = "1", - ParamCode = item.ParamCode, - ParamValue = paramValue.ToString(), - AlarmInfo = item.ParamName, - AlarmTime = DateTime.Now, - CreadtedTime = DateTime.Now, - }); - } - - } - if (deviceAlarmInfos.Count > 0) - { - base._deviceAlarmInfoServices.AddAsync(deviceAlarmInfos); - } - } - Task.Delay(base.AlarmReadTimer).Wait(); - } - else - { - Task.Delay(base.AlarmReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("LinerStore")); - } - } - catch (Exception ex) - { - base._logger.Error($"采集内胆库设备报警信息异常:{ex.Message}"); - } - } - } - - public override void CollectDeviceElectricity(out List deviceElectricitys) - { - while (true) - { - try - { - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集内胆库设备用电数据"); - var plc = _plc.plc; - - deviceElectricitys = new List(); - - string[] address = new string[] { "D7602", "D7604", "D7606", "D7608", "D7610", "D7612", "D7630", "D7634", "D7638", "D7642" }; - - Record_DeviceElectricity _deviceElectricity_address = new Record_DeviceElectricity() - { - MonitorId = "E00032_0001" - }; - - base.ReadDeviceElectricity(address, plc, ref _deviceElectricity_address); - - if( _deviceElectricity_address != null) - { - deviceElectricitys.Add(_deviceElectricity_address); - } - - if(deviceElectricitys.Count > 0 ) - { - var result = base._deviceElectricityServices.AddAsync(deviceElectricitys); - } - else - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集内胆库设备用电数据失败,数据为空"); - } - - Task.Delay(base.EleReadTimer).Wait(); - } - else - { - Task.Delay(base.EleReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("LinerStore")); - } - - } - catch (Exception ex) - { - base._logger.Error($"采集内胆库设备用电数据采集异常:{ex.Message}"); - } - } - } - } -} diff --git a/Aucma.Core.DataCollector/Factory/PalletizFactory.cs b/Aucma.Core.DataCollector/Factory/PalletizFactory.cs deleted file mode 100644 index b74c159..0000000 --- a/Aucma.Core.DataCollector/Factory/PalletizFactory.cs +++ /dev/null @@ -1,184 +0,0 @@ -using Admin.Core.Common.Helper; -using Admin.Core.IService.IService_New; -using Admin.Core.Model.Model_New; -using Aucma.Core.HwPLc; -using log4net; -using System.Globalization; - -namespace Aucma.Core.DataCollector.Factory -{ - /// - /// 分垛入库数据采集 - /// - public class PalletizFactory : DataCollectorFactory - { - private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("Palletiz")); - - public PalletizFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) - { - } - - /// - /// 采集成品分垛设备报警信息 - /// - /// - /// - public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) - { - while(true) - { - try - { - - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集成品分垛设备报警信息"); - var plc = _plc.plc; - - var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00002"); - - if (deviceParams != null) - { - deviceAlarmInfos = new List(); - string batchId = System.Guid.NewGuid().ToString("N"); - foreach (var item in deviceParams) - { - base.ReadParamValueByPlc(plc, item.ParamAddress, item.ParamType, out int paramValue); - - if (paramValue != 0) - { - deviceAlarmInfos.Add(new Record_DeviceAlarmInfo() - { - BatchId = batchId, - DeviceCode = item.DeviceCode, - DeviceType = "1", - ParamCode = item.ParamCode, - ParamValue = paramValue.ToString(), - AlarmInfo = item.ParamName, - AlarmTime = DateTime.Now, - CreadtedTime = DateTime.Now, - }); - } - - } - if (deviceAlarmInfos.Count > 0) - { - base._deviceAlarmInfoServices.AddAsync(deviceAlarmInfos); - } - } - Task.Delay(base.AlarmReadTimer).Wait(); - } - else - { - Task.Delay(base.AlarmReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("Palletiz")); - } - } - catch(Exception ex) - { - base._logger.Error($"采集成品分垛设备报警信息异常:{ex.Message}"); - } - } - } - - /// - /// 采集设备用电信息 - /// - /// - /// - public override void CollectDeviceElectricity(out List deviceElectricitys) - { - while (true) - { - try - { - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集设备用电数据"); - var plc = _plc.plc; - - deviceElectricitys = new List(); - - - string[] ground = new string[] { "D7602", "D7604", "D7606", "D7608", "D7610", "D7612", "D7630", "D7634", "D7638", "D7642" }; - - Record_DeviceElectricity _deviceElectricity_ground = new Record_DeviceElectricity() - { - MonitorId = "E0003" - }; - - base.ReadDeviceElectricity(ground, plc, ref _deviceElectricity_ground); - - deviceElectricitys.Add(_deviceElectricity_ground); - - string[] platform = new string[] { "D7652", "D7664", "D7666", "D7668", "D7660", "D7662", "D7680", "D7684", "D7688", "D7692" }; - - Record_DeviceElectricity _deviceElectricity_platform = new Record_DeviceElectricity() - { - MonitorId = "E0004" - }; - - base.ReadDeviceElectricity(platform, plc, ref _deviceElectricity_platform); - - deviceElectricitys.Add(_deviceElectricity_platform); - - var result = base._deviceElectricityServices.AddAsync(deviceElectricitys); - - Task.Delay(base.EleReadTimer).Wait(); - } - else - { - Task.Delay(base.EleReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("Palletiz")); - } - - } - catch (Exception ex) - { - base._logger.Error($"采集成品分垛设备用电数据采集异常:{ex.Message}"); - } - } - } - - public byte[] array(byte[] data) - { - if (data == null) return null; - for (int i = 0; i < data.Length; i += 2) - { - byte temp = data[i]; - data[i] = data[i + 1]; - data[i + 1] = temp; - } - - return data; - } - - /// - /// 用电数据解析 - /// - /// - /// - /// - /// - /// - private int[] ParseAndReverseByteArray(byte[] data, int startIndex, int length) - { - if (data == null || data.Length < startIndex + length) - { - throw new ArgumentException("Invalid data or startIndex/length parameter."); - } - - int[] resultArray = new int[length / 2]; - for (int i = 0; i < resultArray.Length; i++) - { - byte[] subset = new byte[2]; - Array.Copy(data, startIndex + (i * 2), subset, 0, 2); - Array.Reverse(subset); - string hexString = BitConverter.ToString(subset).Replace("-", ""); - resultArray[i] = Convert.ToInt32(hexString, 16); - } - - return resultArray; - } - } -} diff --git a/Aucma.Core.DataCollector/Factory/ShellPreassembleFactory.cs b/Aucma.Core.DataCollector/Factory/ShellPreassembleFactory.cs deleted file mode 100644 index 5f672ea..0000000 --- a/Aucma.Core.DataCollector/Factory/ShellPreassembleFactory.cs +++ /dev/null @@ -1,166 +0,0 @@ -using Admin.Core.IService.IService_New; -using Admin.Core.Model.Model_New; -using Aucma.Core.HwPLc; - -#region << 版 本 注 释 >> -/*-------------------------------------------------------------------- -* 版权所有 (c) 2024 WenJY 保留所有权利。 -* CLR版本:4.0.30319.42000 -* 机器名称:LAPTOP-E0N2L34V -* 命名空间:Aucma.Core.DataCollector.Factory -* 唯一标识:f88ccab0-cc8a-4d6f-8be8-1a0dbc687b9e -* -* 创建者:WenJY -* 电子邮箱:wenjy@mesnac.com -* 创建时间:2024-03-28 11:53:14 -* 版本:V1.0.0 -* 描述: -* -*-------------------------------------------------------------------- -* 修改人: -* 时间: -* 修改说明: -* -* 版本:V1.0.0 -*--------------------------------------------------------------------*/ -#endregion << 版 本 注 释 >> -namespace Aucma.Core.DataCollector.Factory -{ - /// - /// 箱壳预装数据采集 - /// - public class ShellPreassembleFactory : DataCollectorFactory - { - private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("ShellPreassemble")); - - public ShellPreassembleFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) - { - } - - public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) - { - while (true) - { - try - { - - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集箱壳预装设备报警信息"); - var plc = _plc.plc; - - var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00019"); - - if (deviceParams != null) - { - deviceAlarmInfos = new List(); - string batchId = System.Guid.NewGuid().ToString("N"); - foreach (var item in deviceParams) - { - base.ReadParamValueByPlc(plc, item.ParamAddress, item.ParamType, out int paramValue); - - if (paramValue != 0) - { - deviceAlarmInfos.Add(new Record_DeviceAlarmInfo() - { - BatchId = batchId, - DeviceCode = item.DeviceCode, - DeviceType = "1", - ParamCode = item.ParamCode, - ParamValue = paramValue.ToString(), - AlarmInfo = item.ParamName, - AlarmTime = DateTime.Now, - CreadtedTime = DateTime.Now, - }); - } - - } - if (deviceAlarmInfos.Count > 0) - { - base._deviceAlarmInfoServices.AddAsync(deviceAlarmInfos); - } - } - Task.Delay(base.AlarmReadTimer).Wait(); - } - else - { - Task.Delay(base.AlarmReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("ShellPreassemble")); - } - } - catch (Exception ex) - { - base._logger.Error($"采集箱壳预装设备报警信息异常:{ex.Message}"); - } - } - } - - public override void CollectDeviceElectricity(out List deviceElectricitys) - { - while (true) - { - try - { - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集箱壳预装设备用电数据"); - var plc = _plc.plc; - - deviceElectricitys = new List(); - - // 地面箱壳预装远程 - string[] ground = new string[] { "D7602", "D7604", "D7606", "D7608", "D7610", "D7612", "D7630", "D7634", "D7638", "D7642" }; - - Record_DeviceElectricity _deviceElectricity_ground = new Record_DeviceElectricity() - { - MonitorId = "E00019_0001" - }; - - base.ReadDeviceElectricity(ground, plc, ref _deviceElectricity_ground); - - if(_deviceElectricity_ground != null) - { - deviceElectricitys.Add(_deviceElectricity_ground); - } - - //平台箱壳预装主柜 - string[] platform = new string[] { "D7652", "D7664", "D7666", "D7668", "D7660", "D7662", "D7680", "D7684", "D7688", "D7692" }; - - Record_DeviceElectricity _deviceElectricity_platform = new Record_DeviceElectricity() - { - MonitorId = "E00019_0002" - }; - - base.ReadDeviceElectricity(platform, plc, ref _deviceElectricity_platform); - - if(_deviceElectricity_platform != null) - { - deviceElectricitys.Add(_deviceElectricity_platform); - } - - if(deviceElectricitys.Count > 0) - { - var result = base._deviceElectricityServices.AddAsync(deviceElectricitys); - } - else - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集箱壳预装设备用电数据失败,数据为空"); - } - - Task.Delay(base.EleReadTimer).Wait(); - } - else - { - Task.Delay(base.EleReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("ShellPreassemble")); - } - - } - catch (Exception ex) - { - base._logger.Error($"采集箱壳库设备用电数据采集异常:{ex.Message}"); - } - } - } - } -} diff --git a/Aucma.Core.DataCollector/Factory/ShellStoreFactory.cs b/Aucma.Core.DataCollector/Factory/ShellStoreFactory.cs deleted file mode 100644 index 2bf9978..0000000 --- a/Aucma.Core.DataCollector/Factory/ShellStoreFactory.cs +++ /dev/null @@ -1,158 +0,0 @@ -using Admin.Core.IService.IService_New; -using Admin.Core.Model.Model_New; -using Aucma.Core.HwPLc; -using log4net; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Aucma.Core.DataCollector.Factory -{ - /// - /// 箱壳库数据采集 - /// - public class ShellStoreFactory : DataCollectorFactory - { - private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("ShellStore")); - - public ShellStoreFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) - { - } - - /// - /// 采集箱壳库设备报警信息 - /// - /// - public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) - { - while (true) - { - try - { - - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集箱壳库设备报警信息"); - var plc = _plc.plc; - - var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00031"); - - if (deviceParams != null) - { - deviceAlarmInfos = new List(); - string batchId = System.Guid.NewGuid().ToString("N"); - foreach (var item in deviceParams) - { - base.ReadParamValueByPlc(plc, item.ParamAddress, item.ParamType, out int paramValue); - - if (paramValue != 0) - { - deviceAlarmInfos.Add(new Record_DeviceAlarmInfo() - { - BatchId = batchId, - DeviceCode = item.DeviceCode, - DeviceType = "1", - ParamCode = item.ParamCode, - ParamValue = paramValue.ToString(), - AlarmInfo = item.ParamName, - AlarmTime = DateTime.Now, - CreadtedTime = DateTime.Now, - }); - } - - } - if (deviceAlarmInfos.Count > 0) - { - base._deviceAlarmInfoServices.AddAsync(deviceAlarmInfos); - } - } - Task.Delay(base.AlarmReadTimer).Wait(); - } - else - { - Task.Delay(base.AlarmReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("ShellStore")); - } - } - catch (Exception ex) - { - base._logger.Error($"采集箱壳库设备报警信息异常:{ex.Message}"); - } - } - } - - /// - /// 采集箱壳库设备用电 - /// - /// - public override void CollectDeviceElectricity(out List deviceElectricitys) - { - while (true) - { - try - { - if (_plc != null) - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集箱壳库设备用电数据"); - var plc = _plc.plc; - - deviceElectricitys = new List(); - - //箱壳主柜 - string[] mainCabinet = new string[] { "D7602", "D7604", "D7606", "D7608", "D7610", "D7612", "D7630", "D7634", "D7638", "D7642" }; - - Record_DeviceElectricity _deviceElectricity_mainCabinet = new Record_DeviceElectricity() - { - MonitorId = "E00031_0001" - }; - - base.ReadDeviceElectricity(mainCabinet, plc, ref _deviceElectricity_mainCabinet); - - if(_deviceElectricity_mainCabinet != null) - { - deviceElectricitys.Add(_deviceElectricity_mainCabinet); - } - - //箱壳远程柜 - string[] rangeCabinet = new string[] { "D7652", "D7664", "D7666", "D7668", "D7660", "D7662", "D7680", "D7684", "D7688", "D7692" }; - - Record_DeviceElectricity _deviceElectricity_rangeCabinet = new Record_DeviceElectricity() - { - MonitorId = "E00031_0002" - }; - - base.ReadDeviceElectricity(rangeCabinet, plc, ref _deviceElectricity_rangeCabinet); - - if(_deviceElectricity_rangeCabinet != null) - { - deviceElectricitys.Add(_deviceElectricity_rangeCabinet); - } - - if(deviceElectricitys.Count > 0) - { - var result = base._deviceElectricityServices.AddAsync(deviceElectricitys); - } - else - { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集箱壳库设备用电数据失败,数据为空"); - } - - Task.Delay(base.EleReadTimer).Wait(); - } - else - { - Task.Delay(base.EleReadTimer).Wait(); - _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("ShellStore")); - } - - } - catch (Exception ex) - { - base._logger.Error($"采集箱壳库设备用电数据采集异常:{ex.Message}"); - } - } - } - } -} diff --git a/Aucma.Core.DataCollector/Factory/SidePanelFactory.cs b/Aucma.Core.DataCollector/Factory/SidePanelFactory.cs new file mode 100644 index 0000000..14e128c --- /dev/null +++ b/Aucma.Core.DataCollector/Factory/SidePanelFactory.cs @@ -0,0 +1,88 @@ +using Admin.Core.IService.IService_New; +using Admin.Core.Model.Model_New; +using Aucma.Core.HwPLc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Aucma.Core.DataCollector.Factory +{ + public class SidePanelFactory : DataCollectorFactory + { + private PlcModel _plc = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc")); + + public SidePanelFactory(IBaseDeviceParamServices deviceParamServices, IRecordDeviceAlarmInfoServices deviceAlarmInfoServices, IRecordDeviceElectricityServices deviceElectricityServices) : base(deviceParamServices, deviceAlarmInfoServices, deviceElectricityServices) + { + + } + + /// + /// 设备报警采集 + /// + /// + /// + public override void CollectDeviceAlarmInfo(out List deviceAlarmInfos) + { + while (true) + { + try + { + if (_plc != null) + { + Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}采集设备报警信息"); + var plc = _plc.plc; + if (plc.IsConnected == false) continue; + var deviceParams = base._deviceParamServices.Query(x => x.DeviceCode == "E00029"); + + if (deviceParams != null) + { + deviceAlarmInfos = new List(); + string batchId = System.Guid.NewGuid().ToString("N"); + foreach (var item in deviceParams) + { + base.ReadParamValueByPlc(plc, item.ParamAddress, item.ParamType, out int paramValue); + + if (paramValue != 0) + { + deviceAlarmInfos.Add(new Record_DeviceAlarmInfo() + { + BatchId = batchId, + DeviceCode = item.DeviceCode, + DeviceType = "1", + ParamCode = item.ParamCode, + ParamValue = paramValue.ToString(), + AlarmInfo = item.ParamName, + AlarmTime = DateTime.Now, + CreadtedTime = DateTime.Now, + }); + } + + } + if (deviceAlarmInfos.Count > 0) + { + base._deviceAlarmInfoServices.AddAsync(deviceAlarmInfos); + } + } + Task.Delay(base.AlarmReadTimer).Wait(); + } + else + { + Task.Delay(base.AlarmReadTimer).Wait(); + } + } + catch (Exception ex) + { + base._logger.Error($"采集泡前库、发泡线、发泡机、泡后库设备报警信息:{ex.Message}"); + } + } + } + + public override void CollectDeviceElectricity(out List deviceElectricitys) + { + deviceElectricitys = null; + return; + } + } +} diff --git a/Aucma.Core.HwPLc/IPlc.cs b/Aucma.Core.HwPLc/IPlc.cs index 261e0c1..cbfadad 100644 --- a/Aucma.Core.HwPLc/IPlc.cs +++ b/Aucma.Core.HwPLc/IPlc.cs @@ -38,6 +38,10 @@ namespace Aucma.Core.HwPLc /// /// byte[] Read(string address, ushort len); + + public short[] ReadRandomInt16(string[] address); + + public byte[] ReadRandomInt32(string[] address); /// /// 读取bool /// diff --git a/Aucma.Core.HwPLc/Impl/MelsecPlc.cs b/Aucma.Core.HwPLc/Impl/MelsecPlc.cs index bc2b695..15457dd 100644 --- a/Aucma.Core.HwPLc/Impl/MelsecPlc.cs +++ b/Aucma.Core.HwPLc/Impl/MelsecPlc.cs @@ -592,5 +592,58 @@ namespace Aucma.Core.HwPLc b = temp; } + + /// + /// 根据数组读取 + /// + /// + /// + public short[] ReadRandomInt16(string[] address) + { + try + { + var info = melsecMcNet.ReadRandomInt16(address); + if (info.IsSuccess) + { + IsConnected = true; + + return info.Content; + } + else + { + Console.WriteLine($"读取失败信息:{info.Message}"); + } + } + catch (Exception ex) + { + + Console.WriteLine($"读取失败信息:{ex.Message}"); + } + return null; + } + + public byte[] ReadRandomInt32(string[] address) + { + try + { + var info = melsecMcNet.ReadRandom(address); + if (info.IsSuccess) + { + IsConnected = true; + + return info.Content; + } + else + { + Console.WriteLine($"读取失败信息:{info.Message}"); + } + } + catch (Exception ex) + { + + Console.WriteLine($"读取失败信息:{ex.Message}"); + } + return null; + } } } diff --git a/Aucma.Core.HwPLc/Impl/SiemensPlc.cs b/Aucma.Core.HwPLc/Impl/SiemensPlc.cs index eed0238..33f1465 100644 --- a/Aucma.Core.HwPLc/Impl/SiemensPlc.cs +++ b/Aucma.Core.HwPLc/Impl/SiemensPlc.cs @@ -528,5 +528,20 @@ namespace Aucma.Core.HwPLc { throw new NotImplementedException(); } + + /// + /// 根据数组读取 + /// + /// + /// + public short[] ReadRandomInt16(string[] address) + { + throw new NotImplementedException(); + } + + public byte[] ReadRandomInt32(string[] address) + { + throw new NotImplementedException(); + } } } diff --git a/Aucma.Core.SheetMetal/Aucma.Core.SheetMetal.csproj b/Aucma.Core.SheetMetal/Aucma.Core.SheetMetal.csproj index 7803cc7..9e15834 100644 --- a/Aucma.Core.SheetMetal/Aucma.Core.SheetMetal.csproj +++ b/Aucma.Core.SheetMetal/Aucma.Core.SheetMetal.csproj @@ -71,6 +71,8 @@ + + diff --git a/Aucma.Core.SheetMetal/Startup.cs b/Aucma.Core.SheetMetal/Startup.cs index d387599..1881835 100644 --- a/Aucma.Core.SheetMetal/Startup.cs +++ b/Aucma.Core.SheetMetal/Startup.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Text; +using Aucma.Core.DataCollector; namespace Aucma.Core.SheetMetal { @@ -88,6 +89,9 @@ namespace Aucma.Core.SheetMetal app.UsePlcMildd(runPlcService); //Ŀм app.UseAucamSheetMetalTaskMildds(aucamSheetMetalTaskService); + // ǰɼ + app.UseDataCollectorExtensions(); + } #region ע diff --git a/Aucma.Core.SheetMetalTasks/AucamSheetMetalTaskService.cs b/Aucma.Core.SheetMetalTasks/AucamSheetMetalTaskService.cs new file mode 100644 index 0000000..624ed7e --- /dev/null +++ b/Aucma.Core.SheetMetalTasks/AucamSheetMetalTaskService.cs @@ -0,0 +1,2036 @@ +using Admin.Core.Common; +using Admin.Core.IService; +using Admin.Core.Model; +using Admin.Core.Model.ViewModels; +using System.Text; +using Aucma.Core.HwPLc; +using log4net; +using Aucma.Core.SheetMetalTasks.Models; +using StackExchange.Profiling.Internal; + +namespace Aucma.Core.SheetMetalTasks +{ + /// + /// 任务列表 + /// + public class AucamSheetMetalTaskService : IAucamSheetMetalTaskService + { + private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(AucamSheetMetalTaskService)); + + #region 刷新创建计划 + /// + /// 刷新创建计划 + /// + public delegate Task RefreshCretaePlanInfo(); + public static event RefreshCretaePlanInfo RefreshCreatePlanInfoEvent; + #endregion + + #region 刷新图表 + /// + /// 刷新创建计划 + /// + public delegate Task RefreshChat(); + public static event RefreshChat RefreshChatEvent; + #endregion + + #region 刷新创建计划 + /// + /// 刷新创建计划 + /// + public delegate void RefreshPlanInfo(SheetMetaSendPlanInfoView planInfo); + public static event RefreshPlanInfo RefreshPlanInfoEvent; + #endregion + + #region 刷新当前正在执行的计划 + /// + /// 刷新当前正在执行的计划 + /// + public delegate void RefreshCurrentPlanInfo(); + public static event RefreshCurrentPlanInfo RefreshCurrentPlanInfoEvent; + + #endregion + + #region 给设备监控模块显示 + /// + /// 刷新当前正在执行的计划 + /// + public delegate void RefreshExecInfo(string message, string color); + public static event RefreshExecInfo RefreshExecInfoEvent; + + #endregion + + protected readonly IExecutePlanInfoServices? _executePlanInfoServices; + protected readonly IRecordSidePanelComplateServices _sidePanelComplateServices; + protected readonly IRecordBackPanelComplateServices _backPanelComplateServices; + protected readonly IProductPlanInfoServices _productPlanInfoServices; + protected readonly ISysUserInfoServices? _sysUserInfoServices; + protected readonly IMaterialCompletionServices? _materialCompletionServices; + protected readonly ISmSyncModelServices? _smSyncModelServices; + public HwPLc.PlcModel obj_backPanel = null; + public HwPLc.PlcModel obj_sidePanel = null; + bool backFlag = true;//后板标识 + bool sideFlag = true;//前板标识 + bool statusFlag = true;//计划任务状态标识 + bool complatePlanFlag = true;//计划完成 + + #region 构造函数 + /// + /// 构造函数 + /// + /// + /// + /// + /// + /// + /// + public AucamSheetMetalTaskService(IExecutePlanInfoServices executePlanInfoServices, IRecordSidePanelComplateServices recordSidePanelComplateServices, + IRecordBackPanelComplateServices recordBackPanelComplateServices, IProductPlanInfoServices productPlanInfoServices, + ISysUserInfoServices sysUserInfoServices, IMaterialCompletionServices materialCompletionServices, ISmSyncModelServices smSyncModelServices) + { + _executePlanInfoServices = executePlanInfoServices; + _sidePanelComplateServices = recordSidePanelComplateServices; + _backPanelComplateServices = recordBackPanelComplateServices; + _productPlanInfoServices = productPlanInfoServices; + _sysUserInfoServices = sysUserInfoServices; + _materialCompletionServices = materialCompletionServices; + _smSyncModelServices = smSyncModelServices; + } + #endregion + + #region 启动任务下发 + + #region 前板任务下发 + /// + /// 前板任务下发 + /// + /// + public async Task SendSidePanelPlan() + { + // await InitSendSidePanelPlan();//前板任务 + // 设备状态刷新定时器 + System.Timers.Timer timer = new System.Timers.Timer(1000); + timer.Elapsed += new System.Timers.ElapsedEventHandler(InitSendSidePanelPlan); + timer.AutoReset = true; + timer.Enabled = true; + timer.Start(); + + await Task.CompletedTask; + } + #endregion + + #region 后板任务 + public async Task SendBackPanelPlan() + { + System.Timers.Timer timer = new System.Timers.Timer(1000); + timer.Elapsed += new System.Timers.ElapsedEventHandler(InitSendBackPanelPlan); + timer.AutoReset = true; + timer.Enabled = true; + timer.Start(); + + await Task.CompletedTask; + } + #endregion + + #region 完成任务执行 + public async Task ExecUpdateComplatePlan() + { + System.Timers.Timer timer = new System.Timers.Timer(1000); + timer.Elapsed += new System.Timers.ElapsedEventHandler(UpdateComplatePlan); + timer.AutoReset = true; + timer.Enabled = true; + timer.Start(); + + await Task.CompletedTask; + } + #endregion + + #region 完结任务 + public async Task ExecProcessTheEndTask() + { + // 设备状态刷新定时器 + System.Timers.Timer timer = new System.Timers.Timer(1000); + timer.Elapsed += new System.Timers.ElapsedEventHandler(ProcessTheEndTask); + timer.AutoReset = true; + timer.Enabled = true; + timer.Start(); + + await Task.CompletedTask; + } + #endregion + + public Task SheetMetalTasks() + { + + return Task.CompletedTask; + } + + #endregion + + #region 计划下达 + + #region 下发多个计划同步执行 + + #region 前板任务 + /// + /// 初始化下发生产计划,获取已拆分的计划进行下发——前板任务 + /// + public void InitSendSidePanelPlan(object sender, System.Timers.ElapsedEventArgs e) + { + var obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc")); + if (obj_sidePanel == null) return; + var obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC")); + if (obj_backPanel == null) return; + if (sideFlag) + { + sideFlag = false; + try + { + List planInfoList = _executePlanInfoServices.QuerySheetMetalSendPlanData("1001").Result; + if (planInfoList == null || planInfoList.Count == 0) + { + Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>未获取到需要下发的前板任务"); + return; + } + planInfoList = planInfoList.Where(d => d.PlanAmount > d.SidePanelAmount && (d.ExecuteStatus == 1 || d.ExecuteStatus == 2) && d.PlanType == 2).ToList(); + if (planInfoList == null || planInfoList.Count == 0) return; + planInfoList = planInfoList.Where(d => d.ExecuteStatus == 1 || d.ExecuteStatus == 2).ToList(); + if (planInfoList == null || planInfoList.Count == 0) return; + var planInfos = planInfoList.Where(d => d.PlanType == 2).ToList(); + if (planInfos != null) + { + if (planInfos.Count > 0) + { + SheetMetaSendPlanInfoView planInfo = planInfos.FirstOrDefault(d => d.SidePanelAmount != d.PlanAmount); + if (planInfo == null) return; + if (planInfo.PlanType == 2)//如果类型为2,前板计划单独下发 + { + List binList = GetSideBinStatus(obj_sidePanel); + + SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "0").Result; + if (smSyncModel == null) return; + Bin bin = binList.SingleOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId)); + if (bin == null) return; + + SendPlanTaskToSidPanel(planInfo, obj_sidePanel, smSyncModel.SmProductId.ObjToInt()); + + //UpdateSidPanelPlanTaskByComplate(planInfo); + // sideFlag = false; + } + if (planInfo.PlanType == 1) + { + //联合下发,检测前后板是否都设置了此型号,如果没有执行下一条任务 + List backBinList = GetBackBinStatus(obj_backPanel); + List sideBinList = GetSideBinStatus(obj_sidePanel); + if (backBinList != null && sideBinList != null) + { + SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "2").Result; + Bin backBin = backBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId)); + Bin sideBin = sideBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId)); + if (backBin == null || sideBin == null) + { + planInfos.Remove(planInfo);//移除list中当前的对象,执行下一个计划 + + Console.WriteLine($"移除数据:{planInfo.ToJson()}"); + //sideFlag = true; + } + else + { + SendPlanTaskToSidPanel(planInfo, obj_sidePanel, smSyncModel.SmProductId.ObjToInt()); + //UpdateSidPanelPlanTaskByComplate(planInfo); + // sideFlag = false; + } + } + } + } + else + { + Console.WriteLine("未获取到需要下发的前板任务"); + } + } + else + { + Console.WriteLine("未获取到需要下发的前板任务"); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + + } + finally + { + sideFlag = true; + } + Thread.Sleep(5000); + } + } + + #endregion + + #region 下发前板生产计划 + /// + /// 下发前板生产计划 + /// + /// + /// + public void SendPlanTaskToSidPanel(SheetMetaSendPlanInfoView planInfo, PlcModel obj_sidePanel, int SmProductId) + { + try + { + //Task.Run(() => + //{ + + if (obj_sidePanel != null) + { + //计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021 + obj_sidePanel.plc.WriteString("D6000", planInfo.TaskCode); + obj_sidePanel.plc.WriteInt16("D6022", SmProductId.ToString());//产品号 + string processNumber = GetProcessNumberBy(planInfo.MaterialCode); + obj_sidePanel.plc.WriteString("D6010", planInfo.MaterialSpecificatons); + int surplus = planInfo.PlanAmount - planInfo.SidePanelAmount; + obj_sidePanel.plc.WriteInt16("D6020", surplus.ToString()); + Thread.Sleep(500); + obj_sidePanel.plc.WriteInt16("D6021", "1"); + + Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>下发机头号为:{planInfo.MaterialSpecificatons}"); + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>计划【{planInfo.TaskCode}】已下发,等待前板设备应答......."); + RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】已下发,等待前板设备应答.......", "White"); + #region PLC反馈信号逻辑处理 + //循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中 + bool isFlag = true; + bool isTaskFlag = true; + DateTime startTime = DateTime.Now; + do + { + //判断当前是否有手动下发的任务,有退出当前方法 + isTaskFlag = GetNewTask(planInfo.ObjId); + if (isTaskFlag) + { + break; + } + + int answer = obj_sidePanel.plc.ReadInt16("D6021"); + if (answer == 2) + { + obj_sidePanel.plc.WriteInt16("D6021", "0"); + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>计划【{planInfo.TaskCode}】,收到前板设备应答信号,复位应答地址"); + RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】,收到前板板设备应答信号,复位应答地址", "White"); + startTime = DateTime.Now; + isFlag = false; + break; + } + + + Thread.Sleep(3000); + } while (isFlag); + + if (isTaskFlag) return ; + + //更新计划状态为2执行中 + planInfo.ExecuteStatus = 2; + bool result = _executePlanInfoServices.UpdateSheetMetalExecutePlanInfo(planInfo.ObjId, planInfo.ExecuteStatus, startTime).Result; + if (result) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + RefreshPlanInfoEvent?.Invoke(planInfo);//刷新计划执行 + } + + #endregion + + //读取设备进度,完成后再次下发新任务 + ReadDeviceComplate_SidePanel(obj_sidePanel); + } + // }); + } + catch (Exception ex) + { + RefreshExecInfoEvent?.Invoke($"前板⽣产计划下发异常:{ex.Message}", "Red"); + } + } + + #endregion + + #region 根据前板完成记录更新生产计划 + /// + /// 根据前板完成记录更新生产计划 + /// + /// + private void UpdateSidPanelPlanTaskByComplate(SheetMetaSendPlanInfoView planInfo) + { + lock (string.Empty) + { + bool isComplate = true; + + do + { + try + { + //等待计划执行完成 + List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode); + int sumSidePanelAmount = sidePanelComplates.Sum(x => x.OutPutAmount); + + List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode); + int sumBackPanelAmount = backPanelComplates.Sum(x => x.OutPutAmount); + + Console.WriteLine($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}"); + RefreshExecInfoEvent?.Invoke($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}", "White"); + int sumAmount = 0; + + if (planInfo.PlanType == 1) + { + if (planInfo.PlanAmount == sumSidePanelAmount) + { + if (sumSidePanelAmount == sumBackPanelAmount && sumSidePanelAmount != 0 && sumBackPanelAmount != 0) + { + sumAmount = sumSidePanelAmount; + planInfo.ExecuteStatus = 3; + } + + if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount) + { + sumAmount = sumSidePanelAmount; + } + if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount) + { + sumAmount = sumBackPanelAmount; + } + if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0; + + isComplate = false; + } + else + { + if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount) + { + sumAmount = sumSidePanelAmount; + } + if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount) + { + sumAmount = sumBackPanelAmount; + } + if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0; + } + } + + if (planInfo.PlanType == 2) + { + sumAmount = sumSidePanelAmount; + if (planInfo.PlanAmount - sumAmount == 0) + { + planInfo.ExecuteStatus = 3; + isComplate = false; + } + planInfo.CompleteAmount = sumAmount; + } + + planInfo.CompleteAmount = sumAmount; + + var obj = _executePlanInfoServices.FirstAsync(d => d.ObjId == planInfo.ObjId).Result; + obj.CompleteAmount = planInfo.CompleteAmount; + obj.ExecuteStatus = planInfo.ExecuteStatus; + bool result = _executePlanInfoServices.UpdateExecutePlanInfo(obj).Result; + if (result) + { + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + RefreshCreatePlanInfoEvent?.Invoke(); + } + Thread.Sleep(5000); + } + catch (Exception ex) + { + Console.WriteLine($"计划任务信息更新异常:{ex.Message}"); + RefreshExecInfoEvent?.Invoke($"计划任务信息更新异常:{ex.Message}", "Red"); + } + } while (isComplate); + + if (!isComplate) + { + //更新前端展示图表 + //RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + //SheetMetaSendPlanInfoView planInfo = planInfoList.FirstOrDefault(d => d.TaskCode == planCode); + RefreshPlanInfoEvent?.Invoke(planInfo);//刷新计划执行 + } + } + + } + + #endregion + + #region 后板任务 + /// + /// 初始化下发生产计划,获取已拆分的计划进行下发——后板任务 + /// + public void InitSendBackPanelPlan(object sender, System.Timers.ElapsedEventArgs e) + { + + var obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC")); + if (obj_backPanel == null) return; + var obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc")); + if (obj_sidePanel == null) return; + if (backFlag) + { + backFlag = false; + try + { + var planInfoList = _executePlanInfoServices.QuerySheetMetalSendPlanData("1001").Result; + if (planInfoList == null || planInfoList.Count == 0) + { + Console.WriteLine("未获取到需要下发的后板任务"); + Thread.Sleep(3000); + return; + } + planInfoList = planInfoList.Where(d => d.PlanAmount > d.SidePanelAmount).ToList(); + if (planInfoList == null || planInfoList.Count == 0) return; + planInfoList = planInfoList.Where(d => d.ExecuteStatus == 1 || d.ExecuteStatus == 2).ToList(); + if (planInfoList == null || planInfoList.Count == 0) return; + var planInfos = planInfoList.Where(d => d.PlanType == 3 || d.PlanType == 1).ToList(); + if (planInfos != null) + { + if (planInfos.Count > 0) + { + SheetMetaSendPlanInfoView planInfo = planInfos.FirstOrDefault(d => d.BackPanelAmount != d.PlanAmount); + if (planInfo == null) return; + if (planInfo.PlanType == 3)//如果为3或者为1 后板计划单独下发 + { + //获取设置的型号查询对应的型号,下发计划 + List binList = GetBackBinStatus(obj_backPanel); + SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "1").Result; + if (smSyncModel == null) return; + Bin bin = binList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId)); + if (bin == null) + { + Console.WriteLine($"未查询到钣金设备对计划!当前计划【{planInfo.TaskCode}】"); + // backFlag = true; + Thread.Sleep(1000); + return; + }; + + SendPlanTaskToBackPanel(planInfo, obj_backPanel, smSyncModel.SmProductId.ObjToInt()); + //UpdateBackPanelPlanTaskByComplate(planInfo); + //backFlag = false; + } + if (planInfo.PlanType == 1) + { + //联合下发,检测前后板是否都有此型号,没有执行下一条任务 + List backBinList = GetBackBinStatus(obj_backPanel); + List sideBinList = GetSideBinStatus(obj_sidePanel); + if (backBinList != null && sideBinList != null) + { + SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "2").Result; + if (smSyncModel == null) + { + planInfos.Remove(planInfo);//连接计划如果没有查询到,移除当前计划执行下一个计划 + Console.WriteLine($"移除数据:{planInfo.ToJson()}"); + //backFlag = true; + return; + } + Bin backBin = backBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId)); + Bin sideBin = sideBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId)); + if (backBin == null || sideBin == null) + { + planInfos.Remove(planInfo); + Console.WriteLine($"移除数据:{planInfo.ToJson()}"); + // backFlag = true; + } + else + { + SendPlanTaskToBackPanel(planInfo, obj_backPanel, smSyncModel.SmProductId.ObjToInt()); + UpdateBackPanelPlanTaskByComplate(planInfo); + // backFlag = false; + } + } + else + { + // backFlag = false; + } + } + + } + else + { + Console.WriteLine("未获取到需要下发的后板任务"); + } + } + else + { + Console.WriteLine("未获取到需要下发的后板任务"); + } + Thread.Sleep(3000); + } + catch (Exception ex) + { + logHelper.Error(ex.Message); + Console.WriteLine(ex.Message); + } + finally + { + backFlag = true; + } + } + + + } + + #endregion + + #region 下发背板生产计划 + /// + /// 下发背板生产计划 + /// + /// + /// + public void SendPlanTaskToBackPanel(SheetMetaSendPlanInfoView planInfo, PlcModel obj_backPanel, int productId) + { + try + { + //Task.Run(() => + //{ + if (obj_backPanel != null) + { + //计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021 + obj_backPanel.plc.WriteString("D4000", planInfo.TaskCode); + obj_backPanel.plc.WriteInt16("D4022", productId.ToString()); + string processNumber = GetProcessNumberBy(planInfo.MaterialCode); + obj_backPanel.plc.WriteString("D4010", planInfo.MaterialSpecificatons); + int surplus = planInfo.PlanAmount - planInfo.CompleteAmount;//剩余计划数量 + obj_backPanel.plc.WriteInt16("D4020", surplus.ToString()); + Thread.Sleep(500); + obj_backPanel.plc.WriteInt16("D4021", "1"); + + Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>下发机头号为:{planInfo.MaterialSpecificatons}"); + Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>计划【{planInfo.TaskCode}】已下发,等待背板设备应答......."); + RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】已下发,等待背板设备应答......", "White"); + #region PLC反馈信号逻辑处理 + //循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中 + bool isFlag = true; + bool isTaskFlag = true; + DateTime startTime = DateTime.Now; + do + { + //判断当前是否有手动下发的任务,有退出当前方法 + isTaskFlag = GetNewTask(planInfo.ObjId); + if (isTaskFlag) + { + break; + } + + int backPalnelAnswer = obj_backPanel.plc.ReadInt16("D4021"); + Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>应答信号:{backPalnelAnswer}"); + if (backPalnelAnswer == 2) + { + obj_backPanel.plc.WriteInt16("D4021", "0"); + Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>收到背板板设备应答信号,复位应答地址"); + RefreshExecInfoEvent?.Invoke($"收到背板板设备应答信号,复位应答地址", "White"); + startTime = DateTime.Now; + isFlag = false; + } + Thread.Sleep(2000); + } while (isFlag); + + if (isTaskFlag) return; + + //更新计划状态为2执行中 + planInfo.ExecuteStatus = 2; + bool result = _executePlanInfoServices.UpdateSheetMetalExecutePlanInfo(planInfo.ObjId, planInfo.ExecuteStatus, startTime).Result; + if (result) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshPlanInfoEvent?.Invoke(planInfo); + RefreshChatEvent?.Invoke();//刷新图表 + } + + #endregion + + //读取设备进度,完成后再次下发新任务 + ReadDeviceComplate_BackPanel(obj_backPanel); + } + //}); + } + catch (Exception ex) + { + RefreshExecInfoEvent?.Invoke($"背板⽣产计划下发异常:{ex.Message}", "Red"); + } + } + + #endregion + + #region 根据后板完成记录更新生产计划 + /// + /// 根据后板完成记录更新生产计划 + /// + private void UpdateBackPanelPlanTaskByComplate(SheetMetaSendPlanInfoView planInfo) + { + try + { + lock (string.Empty) + { + bool isComplate = true; + + do + { + //等待计划执行完成 + List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode); + int sumSidePanelAmount = sidePanelComplates.Sum(x => x.OutPutAmount); + + List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode); + int sumBackPanelAmount = backPanelComplates.Sum(x => x.OutPutAmount); + + Console.WriteLine($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}"); + RefreshExecInfoEvent?.Invoke($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}", "White"); + int sumAmount = 0; + + if (planInfo.PlanType == 1) + { + if (planInfo.PlanAmount == sumBackPanelAmount) + { + if (sumSidePanelAmount == sumBackPanelAmount && sumSidePanelAmount != 0 && sumBackPanelAmount != 0) + { + sumAmount = sumSidePanelAmount; + planInfo.ExecuteStatus = 3; + } + if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount) + { + sumAmount = sumSidePanelAmount; + } + if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount) + { + sumAmount = sumBackPanelAmount; + } + if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0; + isComplate = false; + + } + else + { + if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount) + { + sumAmount = sumSidePanelAmount; + } + if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount) + { + sumAmount = sumBackPanelAmount; + } + if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0; + } + } + + if (planInfo.PlanType == 3) + { + sumAmount = sumBackPanelAmount; + if (planInfo.PlanAmount - sumAmount == 0) + { + planInfo.ExecuteStatus = 3; + isComplate = false; + } + + planInfo.CompleteAmount = sumAmount; + } + + var obj = _executePlanInfoServices.FirstAsync(d => d.ObjId == planInfo.ObjId).Result; + + if (obj.PlanType == 1 && planInfo.ExecuteStatus == 3) + { + obj.CompleteAmount = sumAmount; + obj.EndTime = DateTime.Now; + } + + if (obj.PlanType == 3 && planInfo.ExecuteStatus == 3) + { + obj.ExecuteStatus = 3; + obj.EndTime = DateTime.Now; + } + + bool result = _executePlanInfoServices.UpdateExecutePlanInfo(obj).Result; + if (result) + { + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshPlanInfoEvent?.Invoke(planInfo); + RefreshChatEvent?.Invoke();//刷新图表 + } + + Thread.Sleep(5000); + + } while (isComplate); + + if (!isComplate) + { + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshPlanInfoEvent?.Invoke(planInfo); + RefreshChatEvent?.Invoke();//刷新图表 + } + } + } + catch (Exception ex) + { + Console.WriteLine($"计划任务信息更新异常:{ex.Message}"); + RefreshExecInfoEvent?.Invoke($"计划任务信息更新异常:{ex.Message}", "Red"); + } + } + + #endregion + #endregion + + #region 下发单个计划逻辑 + + + #region 初始化下发生产计划,获取已拆分的计划进行下发 + + + /// + /// 初始化下发生产计划,获取已拆分的计划进行下发 + /// + public void InitSendPlan() + { + Thread.Sleep(5000); + var obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc")); + var obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC")); + + while (true) + { + var planInfos = _executePlanInfoServices.Query(d => d.ProductLineCode.Equals("1001") && d.ExecuteStatus == 1 || d.ExecuteStatus == 2); + + if (planInfos != null) + { + if (planInfos.Count > 0) + { + ExecutePlanInfo planInfo = planInfos.First(); + if (planInfo.PlanType == 1) //联合下发 + { + SendPlanTask(planInfo, obj_sidePanel, obj_backPanel); + + UpdatePlanTaskByComplate(planInfo); + + } + else if (planInfo.PlanType == 2) + { + SendPlanTask_SidePanel(planInfo, obj_sidePanel); + + UpdatePlanTaskByComplate(planInfo); + + } + else if (planInfo.PlanType == 3) + { + SendPlanTaskTo_BackPanel(planInfo, obj_backPanel); + + UpdatePlanTaskByComplate(planInfo); + } + } + else + { + Console.WriteLine("未获取到需要下发的任务"); + } + } + + Thread.Sleep(3000); + } + } + + #endregion + + #region 根据完成记录更新生产计划 + /// + /// 根据完成记录更新生产计划 + /// + /// + private void UpdatePlanTaskByComplate(ExecutePlanInfo planInfo) + { + try + { + lock (string.Empty) + { + bool isComplate = true; + + do + { + //等待计划执行完成 + List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode); + if (sidePanelComplates == null || sidePanelComplates.Count == 0) continue; + int sumSidePanelAmount = sidePanelComplates.Sum(x => x.OutPutAmount); + + List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode); + int sumBackPanelAmount = backPanelComplates.Sum(x => x.OutPutAmount); + + Console.WriteLine($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}"); + RefreshExecInfoEvent?.Invoke($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}", "White"); + int sumAmount = 0; + + if (planInfo.PlanType == 1) + { + if (sumSidePanelAmount >= sumBackPanelAmount) + { + sumAmount = sumBackPanelAmount; + } + else + { + sumAmount = sumSidePanelAmount; + } + } + else if (planInfo.PlanType == 2) + { + sumAmount = sumSidePanelAmount; + } + else + { + sumAmount = sumBackPanelAmount; + } + + if (planInfo.PlanAmount - sumAmount == 0) + { + planInfo.ExecuteStatus = 3; + isComplate = false; + } + + planInfo.CompleteAmount = sumAmount; + + bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result; + if (result) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + Thread.Sleep(5000); + + } while (isComplate); + } + } + catch (Exception ex) + { + Console.WriteLine($"计划任务信息更新异常:{ex.Message}"); + RefreshExecInfoEvent?.Invoke($"计划任务信息更新异常:{ex.Message}", "Red"); + } + } + + #endregion + + #region 联合下发 + /// + /// 联合下发 + /// + /// + /// + /// + private void SendPlanTask(ExecutePlanInfo planInfo, PlcModel obj_sidePanel, PlcModel obj_backPanel) + { + try + { + //前板 + Task.Run(() => + { + if (obj_sidePanel != null) + { + //计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021 + obj_sidePanel.plc.WriteString("D6000", planInfo.TaskCode); + string processNumber = GetProcessNumberBy(planInfo.MaterialCode); + obj_sidePanel.plc.WriteString("D6010", planInfo.MaterialSpecificatons); + obj_sidePanel.plc.WriteInt32("D6020", planInfo.PlanAmount); + obj_sidePanel.plc.WriteInt32("D6021", 1); + + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待前板设备应答。。。。。。"); + RefreshExecInfoEvent?.Invoke("等待前板设备应答......", "Red"); + //下发完成后读取PLC应答,应答后复位应答信号 + + #region PLC反馈信号逻辑处理 + //循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中 + bool isFlag = true; + do + { + //开始做计划的时候给我 + if (obj_sidePanel.plc.ReadInt32("D6021") == 2) + { + obj_sidePanel.plc.WriteInt32("D6021", 0); + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到前板设备应答信号,复位应答地址"); + RefreshExecInfoEvent?.Invoke("收到前板设备应答信号,复位应答地址", "White"); + isFlag = false; + } + Thread.Sleep(2000); + } while (isFlag); + + //更新计划状态为2执行中 + planInfo.ExecuteStatus = 2; + bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result; + if (result) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + #endregion + //读取设备进度,完成后再次下发新任务 + ReadDeviceComplate_SidePanel(obj_sidePanel); + if (!isFlag) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + } + }); + //背板 + Task.Run(() => + { + if (obj_backPanel != null) + { + //计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021 + obj_backPanel.plc.WriteString("D4000", planInfo.TaskCode); + string processNumber = GetProcessNumberBy(planInfo.MaterialCode); + obj_backPanel.plc.WriteString("D4010", "BCD/310NF"); + obj_backPanel.plc.WriteInt32("D4020", planInfo.PlanAmount); + obj_backPanel.plc.WriteInt32("D4021", 1); + + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待背板设备应答。。。。。。"); + RefreshExecInfoEvent?.Invoke($"等待背板设备应答。。。。。。", "White"); + #region PLC反馈信号逻辑处理 + //循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中 + bool isFlag = true; + do + { + if (obj_backPanel.plc.ReadInt32("D4021") == 2) + { + obj_backPanel.plc.WriteInt32("D4021", 0); + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到背板板设备应答信号,复位应答地址"); + RefreshExecInfoEvent?.Invoke("收到背板板设备应答信号,复位应答地址", "White"); + isFlag = false; + } + Thread.Sleep(2000); + } while (isFlag); + + //更新计划状态为2执行中 + planInfo.ExecuteStatus = 2; + bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result; + if (result) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + #endregion + + //读取设备进度,完成后再次下发新任务 + ReadDeviceComplate_BackPanel(obj_backPanel); + if (!isFlag) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + } + }); + } + catch (Exception ex) + { + Console.WriteLine($"前板⽣产计划下发异常:{ex.Message}"); + RefreshExecInfoEvent?.Invoke($"前板⽣产计划下发异常:{ex.Message}", "Red"); + } + } + + #endregion + + #region 下发前板生产计划 + /// + /// 下发前板生产计划 + /// + /// + /// + public void SendPlanTask_SidePanel(ExecutePlanInfo planInfo, PlcModel obj_sidePanel) + { + try + { + Task.Run(() => + { + if (obj_sidePanel != null) + { + //计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021 + obj_sidePanel.plc.WriteString("D6000", planInfo.TaskCode); + string processNumber = GetProcessNumberBy(planInfo.MaterialCode); + obj_sidePanel.plc.WriteString("D6010", planInfo.MaterialSpecificatons); + obj_sidePanel.plc.WriteInt32("D6020", planInfo.PlanAmount); + obj_sidePanel.plc.WriteInt32("D6021", 1); + + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待前板设备应答。。。。。。"); + RefreshExecInfoEvent?.Invoke("等待前板设备应答......", "White"); + //下发完成后读取PLC应答,应答后复位应答信号 + + #region PLC反馈信号逻辑处理 + //循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中 + bool isFlag = true; + do + { + if (obj_sidePanel.plc.ReadInt32("D6021") == 2) + { + obj_sidePanel.plc.WriteInt32("D6021", 0); + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到前板设备应答信号,复位应答地址"); + RefreshExecInfoEvent?.Invoke("收到前板设备应答信号......", "White"); + isFlag = false; + } + Thread.Sleep(2000); + } while (isFlag); + + //更新计划状态为2执行中 + planInfo.ExecuteStatus = 2; + bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result; + if (result) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + RefreshCurrentPlanInfoEvent?.Invoke(); + } + + #endregion + //读取设备进度,完成后再次下发新任务 + ReadDeviceComplate_SidePanel(obj_sidePanel); + if (!isFlag) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + } + }); + } + catch (Exception ex) + { + Console.WriteLine($"前板⽣产计划下发异常:{ex.Message}"); + RefreshExecInfoEvent?.Invoke($"前板⽣产计划下发异常:{ex.Message}", "Red"); + } + } + + #endregion + + #region 读取前板生产数据 + /// + /// 读取前板生产数据 + /// + /// + public async void ReadDeviceComplate_SidePanel(PlcModel obj) + { + bool isFlag = true; + + do + { + try + { + + //D6030 + //计划编号:D6030-D6039,物料编号:D6040-D6049,计划完成数:D6050,计划下线数:D6051,设备状态:D6052-D6056,生产节拍:D6057-D6058 + byte[] info = obj.plc.Read("D6030", 59); + + if (info == null) + { + Thread.Sleep(1000); + continue; + } + + //计划编号 + string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray()).Replace("\0", "").Trim(); + //物料编号 + string materialCode = Encoding.ASCII.GetString(info.Skip(20).Take(20).ToArray()); + //完成数量 + int complateAmount = short.Parse(bytesToHexStr(info.Skip(40).Take(1).ToArray(), 1), System.Globalization.NumberStyles.HexNumber); + //下线数量 + int offLineAmount = short.Parse(bytesToHexStr(info.Skip(41).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber); + //设备状态 + int deviceStatus = short.Parse(bytesToHexStr(info.Skip(43).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber); + //生产节拍 + int productionBeat = short.Parse(bytesToHexStr(info.Skip(51).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber); + + if (string.IsNullOrEmpty(planCode)) + { + Thread.Sleep(5000); + continue; + } + + Console.WriteLine($"前板设备数据读取====>>>>当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}"); + RefreshExecInfoEvent?.Invoke($"前板设备数据读取====>>>>当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}", "White"); + + var planInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode).Result; + if (planInfo == null) + { + Thread.Sleep(3000); + continue; + } + if (planInfo.ExecuteStatus !=2) + { + isFlag = false; + break; + } + //添加完工记录 + RecordSidePanelComplate sidePanelComplate = new RecordSidePanelComplate() + { + ProductlineCode = "1001", + PlanCode = planCode.Substring(0, 16), + //MaterialCode = string.IsNullOrEmpty(materialCode) ? "" : materialCode, + MaterialCode = materialCode.Replace("\0", "").Trim(),//"BCD/310NF", + CompleteAmount = complateAmount, + OffLineAmount = offLineAmount, + DeviceStatus = deviceStatus, + ProductionBeat = productionBeat, + RecordTime = DateTime.Now, + IsFlag = 1 + }; + + //先查询该计划编号下的前一条完工记录,如果不存在本条记录产量为0 + List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planCode.Substring(0, 16)); + int lastComplateAmount = 0; //前一条完成记录的计划完成数量 + int sumComplateAmount = 0; //当前计划总产量 + if (sidePanelComplates != null && sidePanelComplates.Count != 0) + { + if (sidePanelComplates.Count > 0) + { + sidePanelComplates = sidePanelComplates.OrderByDescending(x => x.RecordTime).ToList(); + + lastComplateAmount = sidePanelComplates.First().CompleteAmount; + sidePanelComplate.OutPutAmount = complateAmount - lastComplateAmount; + sumComplateAmount = sidePanelComplates.Sum(x => x.OutPutAmount) + sidePanelComplate.OutPutAmount; + + if (sidePanelComplate.OutPutAmount == 0) + { + Thread.Sleep(5000); + continue; + } + else + { + List planInfos = _executePlanInfoServices.Query(x => x.TaskCode.Equals(planCode.Substring(0, 16)) && x.ExecuteStatus == 2); + if (planInfos != null) + { + if (planInfo.PlanAmount - sumComplateAmount == 0) + { + isFlag = false; + Console.WriteLine($"前板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}"); + RefreshExecInfoEvent?.Invoke($"前板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}", "White"); + + planInfo.CompleteAmount = planInfo.PlanAmount; + _ = _sidePanelComplateServices.InsertSidePanelCimplate(sidePanelComplate).Result; + _ = _executePlanInfoServices.UpdateAsync(planInfo).Result; + + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + } + else + { + planInfo.CompleteAmount = sumComplateAmount; + var r =await _executePlanInfoServices.UpdateAsync(planInfo); + _ = _sidePanelComplateServices.InsertSidePanelCimplate(sidePanelComplate).Result; + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + RefreshCreatePlanInfoEvent?.Invoke(); + //任务没有完成但是已经暂停、退出系统 + if (planInfo.ExecuteStatus==0) + { + isFlag = false; + } + } + } + } + } + } + else + { + //如果没有完成记录插入一条默认完成数量为0 + _ = _sidePanelComplateServices.InsertSidePanelCimplate(sidePanelComplate).Result; + } + Thread.Sleep(5000); + } + catch (Exception e) + { + Console.WriteLine($"读取前板设备完成数据异常:{e.Message}"); + RefreshExecInfoEvent?.Invoke($"读取前板设备完成数据异常:{e.Message}", "Red"); + } + } while (isFlag); + } + + #endregion + + #region 下发背板生产计划 + /// + /// 下发背板生产计划 + /// + /// + /// + public void SendPlanTaskTo_BackPanel(ExecutePlanInfo planInfo, PlcModel obj_backPanel) + { + try + { + Task.Run(() => + { + if (obj_backPanel != null) + { + //计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021 + obj_backPanel.plc.WriteString("D4000", planInfo.TaskCode); + string processNumber = GetProcessNumberBy(planInfo.MaterialCode); + obj_backPanel.plc.WriteString("D4010", planInfo.MaterialSpecificatons); + obj_backPanel.plc.WriteInt32("D4020", planInfo.PlanAmount); + obj_backPanel.plc.WriteInt32("D4021", 1); + + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待背板设备应答。。。。。。"); + RefreshExecInfoEvent?.Invoke($"等待背板设备应答。。。。。。", "White"); + #region PLC反馈信号逻辑处理 + //循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中 + bool isFlag = true; + do + { + + if (obj_backPanel.plc.ReadInt32("D4021") == 2) + { + obj_backPanel.plc.WriteInt32("D4021", 0); + Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到背板板设备应答信号,复位应答地址"); + RefreshExecInfoEvent?.Invoke($"收到背板板设备应答信号,复位应答地址", "White"); + isFlag = false; + } + Thread.Sleep(2000); + } while (isFlag); + + //更新计划状态为2执行中 + planInfo.ExecuteStatus = 2; + bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result; + if (result) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + + #endregion + + //读取设备进度,完成后再次下发新任务 + ReadDeviceComplate_BackPanel(obj_backPanel); + + if (!isFlag) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + } + }); + } + catch (Exception ex) + { + Console.WriteLine($"读取前板设备完成数据异常:{ex.Message}"); + RefreshExecInfoEvent?.Invoke($"背板⽣产计划下发异常:{ex.Message}", "Red"); + } + } + + #endregion + + #region 读取背板生产数据 + /// + /// 读取背板生产数据 + /// + /// + public void ReadDeviceComplate_BackPanel(PlcModel obj) + { + bool isFlag = true; + try + { + do + { + //计划编号:D4030-D4039,物料编号:D4040-D4049,计划完成数:D4050,计划下线数:D4051,设备状态:D4052-D4056,生产节拍:D4057-D4058 + byte[] info = obj.plc.Read("D4030", 59); + + if (info == null) + { + Thread.Sleep(1000); + continue; + } + + //计划编号 + string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray()).Replace("\0", "").Trim(); + //物料编号 + string materialCode = Encoding.ASCII.GetString(info.Skip(20).Take(20).ToArray()).Replace("\0", "").Trim(); + //完成数量 + int complateAmount = short.Parse(bytesToHexStr(info.Skip(40).Take(1).ToArray(), 1), System.Globalization.NumberStyles.HexNumber); + //下线数量 + int offLineAmount = short.Parse(bytesToHexStr(info.Skip(41).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber); + //设备状态 + int deviceStatus = short.Parse(bytesToHexStr(info.Skip(43).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber); + //生产节拍 + int productionBeat = short.Parse(bytesToHexStr(info.Skip(51).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber); + + Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】背板设备数据读取====>>>>当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}"); + RefreshExecInfoEvent?.Invoke($"当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}", "White"); + + if (string.IsNullOrEmpty(planCode)) + { + Thread.Sleep(5000); + continue; + } + var planInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode && x.ExecuteStatus == 2).Result; + if (planInfo == null) + { + Console.WriteLine($"未查询到【{planCode}】运行任务!"); + RefreshExecInfoEvent?.Invoke($"未查询到【{planCode}】计划信息!", "White"); + Thread.Sleep(5000); + continue; + } + //var planInfoStatus = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode && x.ExecuteStatus == 3).Result; + //if (planInfoStatus != null) + //{ + // break; + //} + //添加完工记录 + RecordBackPanelComplate backPanelComplate = new RecordBackPanelComplate() + { + ProductlineCode = "1001", + PlanCode = planCode.Replace("\0", "").Trim(), + MaterialCode = string.IsNullOrEmpty(materialCode) ? "" : materialCode.Replace("\0", "").Trim(), + //MaterialCode = materialCode.Replace("\0", "").Trim(),//"BCD/310NF", + CompleteAmount = complateAmount,//完成数量(计划完成) + OffLineAmount = offLineAmount,//下线 + DeviceStatus = deviceStatus, + ProductionBeat = productionBeat, + RecordTime = DateTime.Now, + IsFlag = 1 + }; + + //先查询该计划编号下的前一条完工记录,如果不存在任务,默认创建,记录产量为0 + List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planCode.Substring(0, 16)); + int lastComplateAmount = 0; //前一条完成记录的计划完成数量 + int sumComplateAmount = 0; //当前计划总产量 + if (backPanelComplates != null && backPanelComplates.Count != 0) + { + if (backPanelComplates.Count > 0) + { + backPanelComplates = backPanelComplates.OrderByDescending(x => x.RecordTime).ToList(); + + lastComplateAmount = backPanelComplates.First().CompleteAmount;//最新的完工数量 + backPanelComplate.OutPutAmount = complateAmount - lastComplateAmount;//实际产量 + sumComplateAmount = backPanelComplates.Sum(x => x.OutPutAmount) + backPanelComplate.OutPutAmount; //计划总产量 + if (backPanelComplate.OutPutAmount == 0) + { + Thread.Sleep(5000); + continue; + } + else + { + if (planInfo != null) + { + if (planInfo.PlanAmount - sumComplateAmount == 0) + { + isFlag = false; + Console.WriteLine($"背板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}"); + RefreshExecInfoEvent?.Invoke($"背板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}", "White"); + + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + + planInfo.CompleteAmount = planInfo.PlanAmount; + _backPanelComplateServices.InsertBackPanelCimplate(backPanelComplate); + + _executePlanInfoServices.UpdateAsync(planInfo); + } + else + { + planInfo.CompleteAmount = sumComplateAmount; + _executePlanInfoServices.UpdateAsync(planInfo); + _backPanelComplateServices.InsertBackPanelCimplate(backPanelComplate); + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + RefreshCreatePlanInfoEvent?.Invoke(); + + //任务没有完成但是已经暂停、退出系统 + if (planInfo.ExecuteStatus == 1) break; + + } + } + } + if (complateAmount != lastComplateAmount) + { + //更新前端展示图表 + RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + RefreshChatEvent?.Invoke();//刷新图表 + } + } + } + else + { + //如果没有完成记录插入一条默认完成数量为0 + _backPanelComplateServices.InsertBackPanelCimplate(backPanelComplate); + } + Thread.Sleep(5000); + } while (isFlag); + + //if (!isFlag) + //{ + // //更新前端展示图表 + // RefreshCreatePlanInfoEvent?.Invoke();//更新界面 + // RefreshChatEvent?.Invoke();//刷新图表 + //} + } + catch (Exception e) + { + Console.WriteLine($"读取背板设备完成数据异常:{e.Message}"); + RefreshExecInfoEvent?.Invoke($"背板⽣产计划下发异常:{e.Message}", "Red"); + } + } + + #endregion + + #region 通过物料编号获取工艺编号 + /// + /// 通过物料编号获取工艺编号 + /// + /// + /// + private string GetProcessNumberBy(string materialCode) + { + return System.Guid.NewGuid().ToString("N").Substring(0, 20); + } + + #endregion + + public static string bytesToHexStr(byte[] bytes, int iLen)//e.g. { 0x01, 0x01} ---> " 01 01" + { + string returnStr = ""; + if (bytes != null) + { + for (int i = 0; i < iLen; i++) + { + returnStr += bytes[i].ToString("X2"); + } + } + return returnStr; + } + #endregion + + #region 更新计划列表数量 + /// + /// 更新计划列表数量 + /// + public void UpdateComplatePlan(object sender, System.Timers.ElapsedEventArgs e) + { + string stationCode = Appsettings.app("StationInfo", "StationCode"); + string productLineCode = Appsettings.app("StationInfo", "ProductLineCode"); + + if (complatePlanFlag) + { + List pPlanInfoList = new List(); + complatePlanFlag = false; + try + { + var planInfoList = _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Contains(stationCode) && d.PlanAmount > d.CompleteAmount).Result; + if (planInfoList == null || planInfoList.Count == 0) return; + + var list = from d in planInfoList + select new + { + d.OrderCode, + d.CompleteAmount + }; + + var grouplist = (from d in list + group d by d.OrderCode into g + select new + { + OrderCode = g.Key, + CompleteAmount = g.Sum(d => d.CompleteAmount) + }).OrderBy(t => t.OrderCode).ToList(); + + var productPlanInfoList = _productPlanInfoServices.QueryAsync(d => d.ProductLineCode.Contains(stationCode) && d.CompleteAmount <= d.PlanAmount).Result; + + productPlanInfoList.ForEach(t => + { + // var materialCompletionList = _materialCompletionServices.QueryAsync(d => d.ProductLineCode.Contains(productLineCode) && d.StationName.Equals(stationCode)).Result; + var obj = grouplist.FirstOrDefault(d => d.OrderCode.Equals(t.OrderCode)); + + if (obj != null) + { + if (obj.CompleteAmount == 1 && t.CompleteAmount == 0) + { + t.EndTime = DateTime.Now; + _sysUserInfoServices.UpdateSapPlan(obj.OrderCode);//第一次执行更新日历表 + } + + if (t.PlanAmount == obj.CompleteAmount) + { + t.CompleteAmount = obj.CompleteAmount; + t.EndTime = DateTime.Now; + } + if (t.PlanAmount > obj.CompleteAmount) + { + t.CompleteAmount = obj.CompleteAmount; + } + else + { + t.CompleteAmount = t.PlanAmount; + } + } + + if (pPlanInfoList.Count != 0 && pPlanInfoList != null) + { + _ = _productPlanInfoServices.UpdateAsync(t).Result; + } + + }); + + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + finally + { + complatePlanFlag = true; + } + } + } + + #endregion + + #endregion + + #region 同步钣金设置型号 + + /// + /// 获取所有设置的钣金前板型号 + /// + /// + public async Task QuerySidePanelMode() + { + while (true) + { + Thread.Sleep(50000); + obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc")); + if (obj_sidePanel == null) { continue; } + if (obj_sidePanel.plc.IsConnected) + { + Console.WriteLine("===============采集前板开始==============="); + RefreshExecInfoEvent?.Invoke($"===============采集前板开始配置开始===============", "White"); + byte[] info = obj_sidePanel.plc.Read("D7000", 3000); + if (info == null) + { + Thread.Sleep(1000); + continue; + } + int j = 1; + string mode = string.Empty; + List addList = new List(); + List updateList = new List(); + var smSyncModelList = _smSyncModelServices.QueryAsync(d=>d.Category=="0").Result; + + for (int i = 1; i <= 600; i++) + { + if (i % 2 == 0) + { + //设置型号 + mode = Encoding.ASCII.GetString(info.Skip(i * 10).Take(10).ToArray()).Replace("\0", "").Trim(); + + if (smSyncModelList.Count == 0 || smSyncModelList == null) + { + SmSyncModel sm = new SmSyncModel(); + sm.SmProductId = j.ToString(); + sm.SmModel = mode.Trim(); + sm.SyncTime = DateTime.Now; + sm.CreateTime = DateTime.Now; + sm.Category = "0"; + addList.Add(sm); + } + else + { + var obj = smSyncModelList.First(d => d.SmProductId == j.ToString()); + if (obj == null) + { + SmSyncModel sm = new SmSyncModel(); + sm.SmProductId = j.ToString(); + sm.SmModel = mode.Trim(); + sm.SyncTime = DateTime.Now; + sm.Category = "0"; + addList.Add(sm); + } + else + { + if (string.IsNullOrEmpty(obj.SmModel) && string.IsNullOrEmpty(mode)) continue; + if (string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode)) + { + obj.SmProductId = j.ToString(); + obj.SmModel = mode.Trim(); + obj.SyncTime = DateTime.Now; + obj.Category = "0"; + updateList.Add(obj); + } + if (!string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode) && obj.SmModel!= mode) + { + obj.SmProductId = j.ToString(); + obj.SmModel = mode.Trim(); + obj.SyncTime = DateTime.Now; + obj.Category = "0"; + updateList.Add(obj); + } + } + } + j++; + } + } + if (addList != null && addList.Count > 0) await _smSyncModelServices.AddAsync(addList); + if (updateList != null&&updateList.Count > 0) await _smSyncModelServices.UpdateAsync(updateList); + RefreshExecInfoEvent?.Invoke($"===============采集前板配置结束===============", "White"); + Console.WriteLine("===============采集结束==============="); + } + } + } + + /// + /// 获取所有设置的钣金前板型号 + /// + /// + public async Task QueryBackPanelMode() + { + while (true) + { + Thread.Sleep(5000); + obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC")); + if (obj_backPanel == null) { continue; } + if (obj_backPanel.plc.IsConnected) + { + RefreshExecInfoEvent?.Invoke($"===============采集后板开始配置===============", "White"); + Console.WriteLine("===============采集后板开始==============="); + byte[] info = obj_backPanel.plc.Read("D7000", 3000); + if (info == null) + { + Thread.Sleep(1000); + continue; + } + int j = 1; + string mode = string.Empty; + List addList = new List(); + List updateList = new List(); + var smSyncModelList = _smSyncModelServices.QueryAsync(d=>d.Category=="1").Result; + + for (int i = 1; i <= 600; i++) + { + if (i % 2 == 0) + { + //设置型号 + mode = Encoding.ASCII.GetString(info.Skip(i * 10).Take(10).ToArray()).Replace("\0", "").Trim(); + + if (smSyncModelList.Count == 0 || smSyncModelList == null) + { + SmSyncModel sm = new SmSyncModel(); + sm.SmProductId = j.ToString(); + sm.SmModel = mode.Trim(); + sm.SyncTime = DateTime.Now; + sm.CreateTime = DateTime.Now; + sm.Category = "1"; + addList.Add(sm); + } + else + { + var obj = smSyncModelList.First(d => d.SmProductId == j.ToString()); + if (obj == null) + { + SmSyncModel sm = new SmSyncModel(); + sm.SmProductId = j.ToString(); + sm.SmModel = mode.Trim(); + sm.SyncTime = DateTime.Now; + sm.Category = "1"; + addList.Add(sm); + } + else + { + if (string.IsNullOrEmpty(obj.SmModel) && string.IsNullOrEmpty(mode)) continue; + if (string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode)) + { + obj.SmProductId = j.ToString(); + obj.SmModel = mode.Trim(); + obj.SyncTime = DateTime.Now; + obj.Category = "1"; + updateList.Add(obj); + } + if (!string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode) && obj.SmModel != mode) + { + obj.SmProductId = j.ToString(); + obj.SmModel = mode.Trim(); + obj.SyncTime = DateTime.Now; + obj.Category = "1"; + updateList.Add(obj); + } + } + } + j++; + } + } + if (addList != null && addList.Count > 0) await _smSyncModelServices.AddAsync(addList); + if (updateList != null && updateList.Count > 0) await _smSyncModelServices.UpdateAsync(updateList); + RefreshExecInfoEvent?.Invoke($"===============采集后板配置结束===============", "White"); + Console.WriteLine("===============采集结束==============="); + } + } + } + #endregion + + #region 获取后板设置的型号 + /// + /// 获取后板设置的型号 + /// + /// + /// + public List GetBackBinStatus(PlcModel obj_SidePanel) + { + List list = new List(); + + if (!obj_SidePanel.plc.IsConnected) + { + Console.WriteLine("plc为 false"); + + return null; + } + var startb0 = obj_SidePanel.plc.ReadBool("M60"); + if (startb0) + { + string productId = obj_SidePanel.plc.ReadInt16("D2002").ToString();//读取产品编码 + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb0; + list.Add(bin); + } + var startb2 = obj_SidePanel.plc.ReadBool("M61"); + if (startb2) + { + string productId = obj_SidePanel.plc.ReadInt16("D2026").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb2; + list.Add(bin); + } + var startb4 = obj_SidePanel.plc.ReadBool("M62"); + if (startb4) + { + string productId = obj_SidePanel.plc.ReadInt16("D2050").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb4; + list.Add(bin); + } + var startb6 = obj_SidePanel.plc.ReadBool("M63"); + if (startb6) + { + string productId = obj_SidePanel.plc.ReadInt16("D2075").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb6; + list.Add(bin); + } + var startb7 = obj_SidePanel.plc.ReadBool("M64"); + if (startb7) + { + string productId = obj_SidePanel.plc.ReadInt16("D2098").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb7; + list.Add(bin); + } + var startb8 = obj_SidePanel.plc.ReadBool("M65"); + if (startb8) + { + string productId = obj_SidePanel.plc.ReadInt16("D2122").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb8; + list.Add(bin); + } + return list; + + } + + #endregion + + #region 获取前板设置的型号 + /// + /// 获取前板设置的型号 + /// + /// + /// + public List GetSideBinStatus(PlcModel obj_SidePanel) + { + List list = new List(); + var startb0 = obj_SidePanel.plc.ReadBool("M140"); + if (startb0) + { + string productId = obj_SidePanel.plc.ReadInt16("D1402").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb0; + list.Add(bin); + } + var startb2 = obj_SidePanel.plc.ReadBool("M141"); + if (startb2) + { + string productId = obj_SidePanel.plc.ReadInt16("D1426").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb0; + list.Add(bin); + } + var startb4 = obj_SidePanel.plc.ReadBool("M142"); + if (startb4) + { + string productId = obj_SidePanel.plc.ReadInt16("D1450").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb4; + list.Add(bin); + } + var startb6 = obj_SidePanel.plc.ReadBool("M143"); + if (startb6) + { + string productId = obj_SidePanel.plc.ReadInt16("D1474").ToString(); + Bin bin = new Bin(); + bin.ProductId = productId; + bin.Status = startb6; + list.Add(bin); + } + return list; + + } + + #endregion + + #region 前板下线数量 + /// + /// 前板下线数量 + /// + public async Task ReadSideBlanking() + { + while (true) + { + string stationCode = Appsettings.app("StationInfo", "StationCode"); + string productLineCode = Appsettings.app("StationInfo", "ProductLineCode"); + Thread.Sleep(5000); + obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc")); + if (obj_sidePanel.plc.IsConnected) + { + byte[] info = obj_sidePanel.plc.Read("D2100", 20); + + if (info == null) + { + Thread.Sleep(1000); + continue; + } + //计划编号 + string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray()).Replace("\n", "").Trim(); + var offLineAmount = obj_sidePanel.plc.ReadInt16("D6051"); + RefreshExecInfoEvent?.Invoke($"下线计划号:{planCode}》》》》下线数量:{offLineAmount}", "White"); + Console.WriteLine($"计划号:{planCode}》》》》下线数量:{offLineAmount}"); + List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == stationCode && x.PlanCode == planCode); + sidePanelComplates = sidePanelComplates.OrderByDescending(d => d.RecordTime).ToList(); + RecordSidePanelComplate recordSidePanelComplate = sidePanelComplates.First(); + int sumSidePanelAmount = recordSidePanelComplate.OffLineAmount; + if (recordSidePanelComplate.OffLineAmount < offLineAmount) + { + //更新计划数量 + ExecutePlanInfo executePlanInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode).Result; + var productPlanInfoList = _productPlanInfoServices.FirstAsync(d => d.ProductLineCode.Contains(stationCode) && d.PlanCode.Contains(executePlanInfo.ProductPlanCode)).Result; + productPlanInfoList.CompleteAmount = productPlanInfoList.CompleteAmount + (offLineAmount - recordSidePanelComplate.OffLineAmount); + await _productPlanInfoServices.UpdateAsync(productPlanInfoList);//更新计划 + } + } + } + } + + #endregion + + #region 后板下线数量 + + /// + /// 后板下线数量 + /// + public void ReadBackBlanking() + { + while (true) + { + string stationCode = Appsettings.app("StationInfo", "StationCode"); + string productLineCode = Appsettings.app("StationInfo", "ProductLineCode"); + Thread.Sleep(5000); + obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc")); + if (obj_sidePanel.plc.IsConnected) + { + byte[] info = obj_sidePanel.plc.Read("D2100", 20); + + if (info == null) + { + Thread.Sleep(1000); + continue; + } + //计划编号 + string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray()).Replace("\n", "").Trim(); + var offLineAmount = obj_sidePanel.plc.ReadInt16("D6051"); + RefreshExecInfoEvent?.Invoke($"下线计划号:{planCode}》》》》下线数量:{offLineAmount}", "White"); + Console.WriteLine($"计划号:{planCode}》》》》下线数量:{offLineAmount}"); + List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == stationCode && x.PlanCode == planCode); + sidePanelComplates = sidePanelComplates.OrderByDescending(d => d.RecordTime).ToList(); + RecordSidePanelComplate recordSidePanelComplate = sidePanelComplates.First(); + int sumSidePanelAmount = recordSidePanelComplate.OffLineAmount; + if (recordSidePanelComplate.OffLineAmount < offLineAmount) + { + //更新计划数量 + ExecutePlanInfo executePlanInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode).Result; + var productPlanInfoList = _productPlanInfoServices.FirstAsync(d => d.ProductLineCode.Contains(stationCode) && d.PlanCode.Contains(executePlanInfo.ProductPlanCode)).Result; + productPlanInfoList.CompleteAmount = productPlanInfoList.CompleteAmount + (offLineAmount - recordSidePanelComplate.OffLineAmount); + _ = _productPlanInfoServices.UpdateAsync(productPlanInfoList).Result;//更新计划 + } + } + } + } + + #endregion + + #region 处理任务未结束情况 + /// + /// 处理任务未结束情况 public void RefreshStatus(object sender, System.Timers.ElapsedEventArgs e) + /// + /// + public void ProcessTheEndTask(object sender, System.Timers.ElapsedEventArgs e) + { + if (statusFlag) + { + statusFlag=false; + try + { + var result = _executePlanInfoServices.QueryAsync(d => d.ExecuteStatus == 2 && d.PlanAmount == d.CompleteAmount).Result; + if (result == null || result.Count == 0) return; + List list = new List(); + foreach (var item in result) + { + item.ExecuteStatus = 3; + list.Add(item); + } + var back = _executePlanInfoServices.UpdateAsync(list).Result; + if (back) + { + RefreshCurrentPlanInfoEvent?.Invoke();//刷新计划执行 + } + } + catch (Exception ex) + { + Console.WriteLine( ); + logHelper.Error($"更新钣金计划任务状态异常:{ex.Message}"); + } + finally + { + statusFlag = true; + } + } + } + #endregion + + + public bool GetNewTask(int Id) + { + List planInfoList = _executePlanInfoServices.QuerySheetMetalSendPlanData("1001").Result; + if (planInfoList == null || planInfoList.Count == 0) return false; + var task= planInfoList.FirstOrDefault(d=>d.ExecuteStatus==2&& d.ObjId!= Id); + if (task == null) return false; + else return true; + + } + } +} diff --git a/Aucma.Core.SheetMetalTasks/Aucma.Core.SheetMetalTasks.csproj b/Aucma.Core.SheetMetalTasks/Aucma.Core.SheetMetalTasks.csproj new file mode 100644 index 0000000..f492bc0 --- /dev/null +++ b/Aucma.Core.SheetMetalTasks/Aucma.Core.SheetMetalTasks.csproj @@ -0,0 +1,14 @@ + + + + net6.0 + enable + enable + + + + + + + + diff --git a/Aucma.Core.SheetMetalTasks/IAucamSheetMetalTaskService.cs b/Aucma.Core.SheetMetalTasks/IAucamSheetMetalTaskService.cs new file mode 100644 index 0000000..4862435 --- /dev/null +++ b/Aucma.Core.SheetMetalTasks/IAucamSheetMetalTaskService.cs @@ -0,0 +1,19 @@ + +namespace Aucma.Core.SheetMetalTasks +{ + public interface IAucamSheetMetalTaskService + { + /// + /// 钣金计划任务 + /// + Task SheetMetalTasks(); + + Task SendSidePanelPlan(); + + Task SendBackPanelPlan(); + + Task ExecUpdateComplatePlan(); + + Task ExecProcessTheEndTask(); + } +} diff --git a/Aucma.Core.SheetMetalTasks/Models/Bin.cs b/Aucma.Core.SheetMetalTasks/Models/Bin.cs new file mode 100644 index 0000000..8306fc6 --- /dev/null +++ b/Aucma.Core.SheetMetalTasks/Models/Bin.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Aucma.Core.SheetMetalTasks.Models +{ + /// + /// 前后板料仓型号 + /// + public class Bin + { + /// + /// 料仓Id + /// + public string? ProductId { get; set; } + /// + /// 是否启用 + /// + public bool Status { get; set; } + } +} diff --git a/Aucma.sln b/Aucma.sln index 79a528d..b5a4b31 100644 --- a/Aucma.sln +++ b/Aucma.sln @@ -45,10 +45,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aucma.Core.RunPlc", "Aucma. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aucma.Core.HwPLc", "Aucma.Core.HwPLc\Aucma.Core.HwPLc.csproj", "{A1473270-1D54-40D5-9E68-5C917347CFE8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aucma.Core.SheetMetalTasks", "Aucma.Core.SheetMetalTasks\Aucma.Core.SheetMetalTasks.csproj", "{F78F41F3-8B38-4CA1-A254-C18CCDCA8291}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aucma.Core.DataCollector", "Aucma.Core.DataCollector\Aucma.Core.DataCollector.csproj", "{495F20DC-9159-4FC5-A8F8-3A61D1E9B6B8}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aucma.Core.SheetMetalTasks", "Aucma.Core.SheetMetalTasks\Aucma.Core.SheetMetalTasks.csproj", "{2CFD13EF-06C8-4AA0-A1EE-0B93784F3DA9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -103,14 +103,14 @@ Global {A1473270-1D54-40D5-9E68-5C917347CFE8}.Debug|Any CPU.Build.0 = Debug|Any CPU {A1473270-1D54-40D5-9E68-5C917347CFE8}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1473270-1D54-40D5-9E68-5C917347CFE8}.Release|Any CPU.Build.0 = Release|Any CPU - {F78F41F3-8B38-4CA1-A254-C18CCDCA8291}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F78F41F3-8B38-4CA1-A254-C18CCDCA8291}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F78F41F3-8B38-4CA1-A254-C18CCDCA8291}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F78F41F3-8B38-4CA1-A254-C18CCDCA8291}.Release|Any CPU.Build.0 = Release|Any CPU {495F20DC-9159-4FC5-A8F8-3A61D1E9B6B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {495F20DC-9159-4FC5-A8F8-3A61D1E9B6B8}.Debug|Any CPU.Build.0 = Debug|Any CPU {495F20DC-9159-4FC5-A8F8-3A61D1E9B6B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {495F20DC-9159-4FC5-A8F8-3A61D1E9B6B8}.Release|Any CPU.Build.0 = Release|Any CPU + {2CFD13EF-06C8-4AA0-A1EE-0B93784F3DA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CFD13EF-06C8-4AA0-A1EE-0B93784F3DA9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CFD13EF-06C8-4AA0-A1EE-0B93784F3DA9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CFD13EF-06C8-4AA0-A1EE-0B93784F3DA9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -131,8 +131,8 @@ Global {AD2C008F-7D9F-43EB-9B44-F15A46F05583} = {BD987F3A-4E6C-4C47-B28F-1671F875EAE3} {680718C5-E39C-442F-AC9E-4A56E15AF261} = {F8FB57F6-5465-4E60-B052-D3A63C3C56AE} {A1473270-1D54-40D5-9E68-5C917347CFE8} = {F8FB57F6-5465-4E60-B052-D3A63C3C56AE} - {F78F41F3-8B38-4CA1-A254-C18CCDCA8291} = {F8FB57F6-5465-4E60-B052-D3A63C3C56AE} {495F20DC-9159-4FC5-A8F8-3A61D1E9B6B8} = {F8FB57F6-5465-4E60-B052-D3A63C3C56AE} + {2CFD13EF-06C8-4AA0-A1EE-0B93784F3DA9} = {F8FB57F6-5465-4E60-B052-D3A63C3C56AE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8047AB56-042B-4AE4-B06A-34137067A86A}