分支自 SuZhouGuanHong/TaiYuanTaiZhong

dengjunjie
2024-06-20 00ad010a45f2f58807eb0f4f70e2dcf66ef35085
车轮信息追溯
已修改5个文件
已添加4个文件
544 ■■■■■ 文件已修改
代码管理/PCS/WCS_Client/src/api/http.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Client/src/extension/widesea_wcs/wcs/dt_info_trace.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Client/src/router/viewGird.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Client/src/views/widesea_wcs/wcs/dt_info_trace.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_Comm/PLCDBItem/Wheel_trace.cs 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Common/equipment/Wheel_info_trace.cs 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK4Job.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK5Job.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/WCSClient/Siemens/SiemensPLCClient.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/PCS/WCS_Client/src/api/http.js
@@ -12,7 +12,7 @@
let loadingInstance;
let loadingStatus = false;
if (process.env.NODE_ENV == 'development') {
    axios.defaults.baseURL = 'http://192.168.12.101:8099/';
    axios.defaults.baseURL = 'http://192.168.12.118:8099/';
}
else if (process.env.NODE_ENV == 'debug') {
    axios.defaults.baseURL = 'http://192.168.12.101:8099/';
´úÂë¹ÜÀí/PCS/WCS_Client/src/extension/widesea_wcs/wcs/dt_info_trace.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
/*****************************************************************************************
**  Author:jxx 2022
**  QQ:283591387
**完整文档见:http://v2.volcore.xyz/document/api ã€ä»£ç ç”Ÿæˆé¡µé¢ViewGrid】
**常用示例见:http://v2.volcore.xyz/document/vueDev
**后台操作见:http://v2.volcore.xyz/document/netCoreDev
*****************************************************************************************/
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
let extension = {
  components: {
    //查询界面扩展组件
    gridHeader: '',
    gridBody: '',
    gridFooter: '',
    //新建、编辑弹出框扩展组件
    modelHeader: '',
    modelBody: '',
    modelFooter: ''
  },
  tableAction: '', //指定某张表的权限(这里填写表名,默认不用填写)
  buttons: { view: [], box: [], detail: [] }, //扩展的按钮
  methods: {
     //下面这些方法可以保留也可以删除
    onInit() {  //框架初始化配置前,
        //示例:在按钮的最前面添加一个按钮
        //   this.buttons.unshift({  //也可以用push或者splice方法来修改buttons数组
        //     name: '按钮', //按钮名称
        //     icon: 'el-icon-document', //按钮图标vue2版本见iview文档icon,vue3版本见element ui文档icon(注意不是element puls文档)
        //     type: 'primary', //按钮样式vue2版本见iview文档button,vue3版本见element ui文档button
        //     onClick: function () {
        //       this.$Message.success('点击了按钮');
        //     }
        //   });
        //示例:设置修改新建、编辑弹出框字段标签的长度
        // this.boxOptions.labelWidth = 150;
    },
    onInited() {
      //框架初始化配置后
      //如果要配置明细表,在此方法操作
      //this.detailOptions.columns.forEach(column=>{ });
    },
    searchBefore(param) {
      //界面查询前,可以给param.wheres添加查询参数
      //返回false,则不会执行查询
      return true;
    },
    searchAfter(result) {
      //查询后,result返回的查询数据,可以在显示到表格前处理表格的值
      return true;
    },
    addBefore(formData) {
      //新建保存前formData为对象,包括明细表,可以给给表单设置值,自己输出看formData的值
      return true;
    },
    updateBefore(formData) {
      //编辑保存前formData为对象,包括明细表、删除行的Id
      return true;
    },
    rowClick({ row, column, event }) {
      //查询界面点击行事件
      // this.$refs.table.$refs.table.toggleRowSelection(row); //单击行时选中当前行;
    },
    modelOpenAfter(row) {
      //点击编辑、新建按钮弹出框后,可以在此处写逻辑,如,从后台获取数据
      //(1)判断是编辑还是新建操作: this.currentAction=='Add';
      //(2)给弹出框设置默认值
      //(3)this.editFormFields.字段='xxx';
      //如果需要给下拉框设置默认值,请遍历this.editFormOptions找到字段配置对应data属性的key值
      //看不懂就把输出看:console.log(this.editFormOptions)
    }
  }
};
export default extension;
´úÂë¹ÜÀí/PCS/WCS_Client/src/router/viewGird.js
@@ -225,6 +225,10 @@
        path: '/VV_Workinfo_hty',
        name: 'VV_Workinfo_hty',
        component: () => import('@/views/widesea_wcs/tomes/VV_Workinfo_hty.vue')
    }    ,{
      path: '/dt_info_trace',
      name: 'dt_info_trace',
      component: () => import('@/views/widesea_wcs/wcs/dt_info_trace.vue')
    }]
export default viewgird
´úÂë¹ÜÀí/PCS/WCS_Client/src/views/widesea_wcs/wcs/dt_info_trace.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
<!--
*Author:jxx
 *Contact:283591387@qq.com
 *代码由框架生成,任何更改都可能导致被代码生成器覆盖
 *业务请在@/extension/widesea_wcs/wcs/dt_info_trace.js此处编写
 -->
<template>
    <view-grid ref="grid"
               :columns="columns"
               :detail="detail"
               :editFormFields="editFormFields"
               :editFormOptions="editFormOptions"
               :searchFormFields="searchFormFields"
               :searchFormOptions="searchFormOptions"
               :table="table"
               :extend="extend">
    </view-grid>
</template>
<script>
    import extend from "@/extension/widesea_wcs/wcs/dt_info_trace.js";
    import { ref, defineComponent } from "vue";
    export default defineComponent({
        setup() {
            const table = ref({
                key: 'trace_id',
                footer: "Foots",
                cnName: '车轮信息追溯',
                name: 'wcs/dt_info_trace',
                url: "/dt_info_trace/",
                sortName: "trace_online_time"
            });
            const editFormFields = ref({});
            const editFormOptions = ref([]);
            const searchFormFields = ref({"trace_SN":"","trace_status":"","trace_workOrder":"","trace_drawingNo":"","trace_heatID":"","trace_billetID":"","trace_line_number":"","trace_mach_number":"","trace_mach_statu":"","trace_process":"","trace_operator":"","trace_tcvm_number":""});
            const searchFormOptions = ref([[{"title":"车轮SN号","field":"trace_SN","type":"like"},{"title":"工作令号","field":"trace_workOrder","type":"like"},{"title":"产品图号","field":"trace_drawingNo","type":"like"}],[{"dataKey":"trace_status","data":[],"title":"状态","field":"trace_status","type":"select"},{"title":"炉代号","field":"trace_heatID","type":"like"},{"title":"钢坯号","field":"trace_billetID","type":"like"}],[{"title":"生产线编号","field":"trace_line_number","type":"like"},{"title":"机床编号","field":"trace_mach_number","type":"like"},{"title":"视觉检测编号","field":"trace_tcvm_number","type":"like"}],[{"title":"加工质量状态","field":"trace_mach_statu","type":"like"},{"title":"完成情况","field":"trace_process","type":"like"},{"title":"操作人员","field":"trace_operator","type":"like"}]]);
            const columns = ref([{field:'ID',title:'ID',type:'int',width:80,hidden:true,readonly:true,require:true,align:'left'},
                       {field:'trace_id',title:'主键',type:'guid',width:110,hidden:true,readonly:true,require:true,align:'left'},
                       {field:'trace_SN',title:'车轮SN号',type:'string',width:110,require:true,align:'left',sort:true},
                       {field:'trace_status',title:'状态',type:'string',bind:{ key:'trace_status',data:[]},width:80,align:'left'},
                       {field:'trace_workOrder',title:'工作令号',type:'string',width:120,align:'left'},
                       {field:'trace_productName',title:'产品名称',type:'string',width:80,align:'left'},
                       {field:'trace_drawingNo',title:'产品图号',type:'string',width:80,align:'left'},
                       {field:'trace_heatBatchID',title:'熔炼炉号',type:'string',width:100,align:'left'},
                       {field:'trace_heatID',title:'炉代号',type:'string',width:60,align:'left'},
                       {field:'trace_billetID',title:'钢坯号',type:'string',width:60,align:'left'},
                       {field:'trace_line_number',title:'生产线编号',type:'string',width:100,align:'left'},
                       {field:'trace_online_time',title:'上线时间',type:'datetime',width:150,align:'left',sort:true},
                       {field:'trace_mach_number',title:'机床编号',type:'string',sort:true,width:110,align:'left'},
                       {field:'trace_mach_start_time',title:'加工开始时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_mach_finish_time',title:'加工完成时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_mach_statu',title:'加工质量状态',type:'int',width:80,align:'left'},
                       {field:'trace_process',title:'完成情况',type:'int',width:80,align:'left'},
                       {field:'trace_operator',title:'操作人员',type:'string',width:110,align:'left'},
                       {field:'trace_shift',title:'班组',type:'string',width:110,align:'left'},
                       {field:'trace_manufacturer',title:'钢锭厂家',type:'string',width:120,align:'left'},
                       {field:'trace_offline_time',title:'下线时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_tcvm_number',title:'视觉检测编号',type:'string',width:110,align:'left'},
                       {field:'trace_tcvm_start_time',title:'视觉检测开始时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_tcvm_finish_time',title:'视觉检测完成时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_tcvm_statu',title:'检测质量状态',type:'int',width:80,align:'left'},
                       {field:'trace_liquoring_time',title:'喷防锈液时间',type:'datetime',width:150,align:'left',sort:true},
                       {field:'trace_bait_number',title:'下料位编号',type:'string',width:110,align:'left'},
                       {field:'trace_baiting_time',title:'下料时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_direction',title:'去向(待检库,外协库)',type:'string',width:110,align:'left'},
                       {field:'trace_in_time',title:'入库时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_load_number',title:'上料位编号',type:'string',width:110,align:'left'},
                       {field:'trace_loading_time',title:'上料时间',type:'datetime',sort:true,width:150,align:'left',sort:true},
                       {field:'trace_defect',title:'缺陷描述',type:'string',width:110,align:'left'},
                       {field:'trace_remark',title:'备注:注意事项',type:'string',width:110,align:'left'}]);
            const detail = ref({
                cnName: "#detailCnName",
                table: "#detailTable",
                columns: [],
                sortName: "",
                key: ""
            });
            return {
                table,
                extend,
                editFormFields,
                editFormOptions,
                searchFormFields,
                searchFormOptions,
                columns,
                detail,
            };
        },
    });
</script>
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_Comm/PLCDBItem/Wheel_trace.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_Comm
{
    public class Wheel_trace
    {
        /// <summary>
        /// è½¦è½®ä¸Šçº¿ï¼ˆDB610)
        /// </summary>
        public class Wheel_online
        {
            /// <summary>
            /// åç§°
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// è½¦è½®SN号
            /// </summary>
            public string o_wp_id { get; set; }
            /// <summary>
            /// ä¸Šçº¿æ—¶é—´
            /// </summary>
            public string o_online_time { get; set; }
            /// <summary>
            /// ç”³è¯·
            /// </summary>
            public byte oi_on { get; set; }
        }
        /// <summary>
        /// è½¦è½®åŠ å·¥ï¼ˆDB611)
        /// </summary>
        public class Wheel_Machine
        {
            /// <summary>
            /// åç§°
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// è½¦è½®SN号
            /// </summary>
            public string o_wp_id { get; set; }
            /// <summary>
            /// åŠ å·¥å¼€å§‹æ—¶é—´
            /// </summary>
            public string o_mach_start_time { get; set; }
            /// <summary>
            /// åŠ å·¥å®Œæˆæ—¶é—´
            /// </summary>
            public string o_mach_finish_time { get; set; }
            /// <summary>
            /// æ“ä½œäºº
            /// </summary>
            public string o_operator { get; set; }
            /// <summary>
            /// ç­ç»„
            /// </summary>
            public string o_shift { get; set; }
            /// <summary>
            /// åŠ å·¥è´¨é‡çŠ¶æ€
            /// </summary>
            public Int16 o_wp_status { get; set; }
            /// <summary>
            /// å®Œæˆæƒ…况
            /// </summary>
            public Int16 o_wp_process { get; set; }
            /// <summary>
            /// ç”³è¯·
            /// </summary>
            public byte oi_on { get; set; }
        }
        /// <summary>
        /// è½¦è½®ä¸‹çº¿ï¼ˆDB612)
        /// </summary>
        public class Wheel_offline
        {
            /// <summary>
            /// åç§°
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// è½¦è½®SN号
            /// </summary>
            public string o_wp_id { get; set; }
            /// <summary>
            /// ä¸‹çº¿æ—¶é—´
            /// </summary>
            public string o_offline_time { get; set; }
            /// <summary>
            /// å޻向
            /// </summary>
            public byte o_direction { get; set; }
            /// <summary>
            /// ç”³è¯·
            /// </summary>
            public byte oi_on { get; set; }
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Common/equipment/Wheel_info_trace.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,256 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Comm;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Entity.DomainModels;
using WIDESEA_WCS.IRepositories;
using WIDESEA_WCS.Repositories;
using WIDESEA_WCS.WCSClient;
using WIDESEA_WMS.IRepositories;
using WIDESEA_WMS.Repositories;
using static WIDESEA_Comm.Wheel_trace;
namespace WIDESEA_WCS
{
    public class Wheel_info_trace
    {
        /// <summary>
        /// æŸ¥è¯¢è½¦è½®ä¸Šçº¿
        /// </summary>
        /// <param name="client"></param>
        public static void Wheel_online(PLCClient client)
        {
            VOLContext context = new VOLContext();
            Idt_info_traceRepository traceRepository = new dt_info_traceRepository(context);
            IVV_Mes_WorkinfoRepository workinfoRepository = new VV_Mes_WorkinfoRepository(context);
            PropertyInfo[] propertyInfos = typeof(Wheel_online).GetProperties();
            var groups = client.itemGroups.Where(x => x.opratortype == "trace_online").OrderBy(x => x.Methods).ThenBy(x => x.name).GroupBy(x => x.Methods).ToList();
            foreach (var key in groups)
            {
                try
                {
                    Wheel_online StackerDBItem = new Wheel_online();
                    foreach (var propertyInfo in propertyInfos)
                    {
                        if (propertyInfo.Name == "Name")
                        {
                            StackerDBItem.Name = key.Key;
                        }
                        else
                        {
                            DBItemGroup group = key.FirstOrDefault(x => x.name == propertyInfo.Name);
                            if (group != null)
                            {
                                var readData = DBExtension.Read(group, client);
                                switch (propertyInfo.Name)
                                {
                                    case "oi_on":
                                        StackerDBItem.oi_on = Convert.ToByte(readData);
                                        break;
                                    case "o_wp_id":
                                        StackerDBItem.o_wp_id = Convert.ToString(readData);
                                        break;
                                    case "o_online_time":
                                        StackerDBItem.o_online_time = readData.ToString();
                                        break;
                                }
                            }
                        }
                    }
                    #region æ›¿æ¢è€PCS时使用
                    if (/*StackerDBItem.oi_on == 1*/true)
                    {
                        if (string.IsNullOrEmpty(StackerDBItem.o_wp_id)) throw new Exception($"{StackerDBItem.Name}:SN号为空");
                        if (string.IsNullOrEmpty(StackerDBItem.o_online_time)) throw new Exception($"{StackerDBItem.Name}:上线时间为空");
                        var info = traceRepository.Find(x => x.trace_SN == StackerDBItem.o_wp_id).FirstOrDefault();
                        if (info != null) throw new Exception();
                        info = new dt_info_trace();
                        info.trace_SN = StackerDBItem.o_wp_id;
                        var time = DateTime.ParseExact(StackerDBItem.o_online_time, "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
                        //var time1 = DateTime.ParseExact(StackerDBItem.o_online_time, "yyyyMMddHHmmss", new CultureInfo("zh-CN", true));
                        info.trace_status = "待加工";
                        info.trace_online_time = time;
                        info.trace_line_number = StackerDBItem.Name;
                        var Work = workinfoRepository.Find(x => x.SN == info.trace_SN && x.processCode == "17").FirstOrDefault();
                        if (Work != null)
                        {
                            info.trace_workOrder = Work.workOrder;
                            info.trace_productName = Work.productName;
                            info.trace_drawingNo = Work.drawingNo;
                            info.trace_heatBatchID = Work.heatBatchID;
                            info.trace_heatID = Work.heatID;
                            info.trace_billetID = Work.billetID.ToString();
                        }
                        traceRepository.Add(info, true);
                        //client.Write(key.FirstOrDefault(x => x.name == "oi_on").dbAddress, (byte)0);//信号复位
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    //client.Write(key.FirstOrDefault(x => x.name == "oi_on").dbAddress, (byte)0);//信号复位
                }
            }
        }
        /// <summary>
        /// æŸ¥è¯¢è½¦è½®åŠ å·¥
        /// </summary>
        /// <param name="client"></param>
        public static void Wheel_machine(PLCClient client)
        {
            VOLContext context = new VOLContext();
            Idt_info_traceRepository traceRepository = new dt_info_traceRepository(context);
            PropertyInfo[] propertyInfos = typeof(Wheel_Machine).GetProperties();
            var groups = client.itemGroups.Where(x => x.opratortype == "trace_Machine").OrderBy(x => x.Methods).ThenBy(x => x.name).GroupBy(x => x.Methods).ToList();
            foreach (var key in groups)
            {
                try
                {
                    Wheel_Machine StackerDBItem = new Wheel_Machine();
                    foreach (var propertyInfo in propertyInfos)
                    {
                        if (propertyInfo.Name == "Name")
                        {
                            StackerDBItem.Name = key.Key;
                        }
                        else
                        {
                            DBItemGroup group = key.FirstOrDefault(x => x.name == propertyInfo.Name);
                            if (group != null)
                            {
                                var readData = DBExtension.Read(group, client);
                                switch (propertyInfo.Name)
                                {
                                    case "oi_on":
                                        StackerDBItem.oi_on = Convert.ToByte(readData);
                                        break;
                                    case "o_wp_id":
                                        StackerDBItem.o_wp_id = Convert.ToString(readData);
                                        break;
                                    case "o_mach_start_time":
                                        StackerDBItem.o_mach_start_time = readData.ToString();
                                        break;
                                    case "o_mach_finish_time":
                                        StackerDBItem.o_mach_finish_time = readData.ToString();
                                        break;
                                    case "o_operator":
                                        StackerDBItem.o_operator = readData.ToString();
                                        break;
                                    case "o_shift":
                                        StackerDBItem.o_shift = readData.ToString();
                                        break;
                                    case "o_wp_status":
                                        StackerDBItem.o_wp_status = Convert.ToInt16(readData);
                                        break;
                                    case "o_wp_process":
                                        StackerDBItem.o_wp_process = Convert.ToInt16(readData);
                                        break;
                                }
                            }
                        }
                    }
                    #region æ›¿æ¢è€PCS时使用
                    if (/*StackerDBItem.oi_on == 1*/true)
                    {
                        if (string.IsNullOrEmpty(StackerDBItem.o_wp_id)) throw new Exception($"{StackerDBItem.Name}:SN号为空");
                        var info = traceRepository.Find(x => x.trace_SN == StackerDBItem.o_wp_id).FirstOrDefault();
                        if (info != null)
                        {
                            if (!string.IsNullOrEmpty(StackerDBItem.o_mach_start_time))
                                info.trace_mach_start_time = DateTime.ParseExact(StackerDBItem.o_mach_start_time, "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
                            if (!string.IsNullOrEmpty(StackerDBItem.o_mach_finish_time))
                                info.trace_mach_finish_time = DateTime.ParseExact(StackerDBItem.o_mach_finish_time, "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
                            if (!string.IsNullOrEmpty(StackerDBItem.o_operator)) info.trace_operator = StackerDBItem.o_operator;
                            if (!string.IsNullOrEmpty(StackerDBItem.o_shift)) info.trace_shift = info.trace_shift;
                            info.trace_mach_statu = StackerDBItem.o_wp_status;
                            info.trace_process = StackerDBItem.o_wp_process;
                            info.trace_mach_number = StackerDBItem.Name;
                            traceRepository.Update(info, x => new { x.trace_mach_start_time, x.trace_mach_finish_time, x.trace_operator, x.trace_shift, x.trace_mach_statu, x.trace_process, x.trace_mach_number }, true);
                        }
                        //client.Write(key.FirstOrDefault(x => x.name == "oi_on").dbAddress, (byte)0);//信号复位
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    //client.Write(key.FirstOrDefault(x => x.name == "oi_on").dbAddress, (byte)0);//信号复位
                }
            }
        }
        /// <summary>
        /// æŸ¥è¯¢è½¦è½®ä¸‹çº¿
        /// </summary>
        /// <param name="client"></param>
        public static void Wheel_offline(PLCClient client)
        {
            VOLContext context = new VOLContext();
            Idt_info_traceRepository traceRepository = new dt_info_traceRepository(context);
            PropertyInfo[] propertyInfos = typeof(Wheel_offline).GetProperties();
            var groups = client.itemGroups.Where(x => x.opratortype == "trace_offline").OrderBy(x => x.Methods).ThenBy(x => x.name).GroupBy(x => x.Methods).ToList();
            foreach (var key in groups)
            {
                try
                {
                    Wheel_offline StackerDBItem = new Wheel_offline();
                    foreach (var propertyInfo in propertyInfos)
                    {
                        if (propertyInfo.Name == "Name")
                        {
                            StackerDBItem.Name = key.Key;
                        }
                        else
                        {
                            DBItemGroup group = key.FirstOrDefault(x => x.name == propertyInfo.Name);
                            if (group != null)
                            {
                                var readData = DBExtension.Read(group, client);
                                switch (propertyInfo.Name)
                                {
                                    case "oi_on":
                                        StackerDBItem.oi_on = Convert.ToByte(readData);
                                        break;
                                    case "o_wp_id":
                                        StackerDBItem.o_wp_id = Convert.ToString(readData);
                                        break;
                                    case "o_offline_time":
                                        StackerDBItem.o_offline_time = readData.ToString();
                                        break;
                                    case "o_direction":
                                        StackerDBItem.o_direction = Convert.ToByte(readData);
                                        break;
                                }
                            }
                        }
                    }
                    #region æ›¿æ¢è€PCS时使用
                    if (/*StackerDBItem.oi_on == 1*/true)
                    {
                        if (string.IsNullOrEmpty(StackerDBItem.o_wp_id)) throw new Exception($"{StackerDBItem.Name}:SN号为空");
                        var info = traceRepository.Find(x => x.trace_SN == StackerDBItem.o_wp_id).FirstOrDefault();
                        if (info != null)
                        {
                            if (!string.IsNullOrEmpty(StackerDBItem.o_offline_time))
                                info.trace_offline_time = DateTime.ParseExact(StackerDBItem.o_offline_time, "yyyyMMddHHmmss", CultureInfo.CurrentCulture);
                            info.trace_direction = StackerDBItem.o_direction.ToString();
                            //info.trace_line_number = info.trace_line_number + StackerDBItem.Name;
                            traceRepository.Update(info, x => new { x.trace_offline_time, x.trace_direction }, true);
                        }
                        //client.Write(key.FirstOrDefault(x => x.name == "oi_on").dbAddress, (byte)0);//信号复位
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    //client.Write(key.FirstOrDefault(x => x.name == "oi_on").dbAddress, (byte)0);//信号复位
                }
            }
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK4Job.cs
@@ -39,10 +39,17 @@
                client.Connect();
                return;
            }
            #region MyRegion
            Wheel_info_trace.Wheel_online(client);
            Wheel_info_trace.Wheel_machine(client);
            Wheel_info_trace.Wheel_offline(client);
            #endregion
            #region ä¿¡æ¯é‡‡é›†
            WheelDBItem.VK4WheelDBItem = GetDate.GetWheelDate(client);
            VKDBItem.VK4DBItem = GetDate.GetVKDate(client);
            GantryDBItem.VK4GantryDBItem = GetDate.GetGantryDate(client);
            MachineDBItem.VK4MachineDBItem = GetDate.GetMachineDate(client);
            #endregion
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK5Job.cs
@@ -35,10 +35,17 @@
                client.Connect();
                return;
            }
            #region MyRegion
            Wheel_info_trace.Wheel_online(client);
            Wheel_info_trace.Wheel_machine(client);
            Wheel_info_trace.Wheel_offline(client);
            #endregion
            #region ä¿¡æ¯é‡‡é›†
            WheelDBItem.VK5WheelDBItem = GetDate.GetWheelDate(client);
            VKDBItem.VK5DBItem = GetDate.GetVKDate(client);
            GantryDBItem.VK5GantryDBItem = GetDate.GetGantryDate(client);
            MachineDBItem.VK5MachineDBItem = GetDate.GetMachineDate(client);
            #endregion
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/WCSClient/Siemens/SiemensPLCClient.cs
@@ -139,7 +139,7 @@
                //string str = DataParse.GetStr(bytes, 0);
                //return (DataType)(str as object);
                var str = GetContent(siemensPLCClient.ReadString(dbAddress, (ushort)len), dbAddress).ToString();
                str = str.Replace("\0", "")?.Replace("\\", "")?.Replace("\u0014", "")?.Replace("?\u0006", "")?.Replace("\n", "")?.Replace("?", "")?.Trim();
                str = str.Replace("\0", "")?.Replace("\\", "")?.Replace("\u0014", "")?.Replace("?\u0006", "")?.Replace("\u000e\u000e", "")?.Replace("\n", "")?.Replace("?", "")?.Trim();
                return (DataType)(str as object);
            }
            else