分支自 SuZhouGuanHong/TaiYuanTaiZhong

dengjunjie
2024-06-07 227cf5ae845198eb25552d3db7509c0ed517f69a
获取VK4和VK5的所有显示工位车轮数据
已修改5个文件
已添加3个文件
491 ■■■■■ 文件已修改
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_Comm/PLCDBItem/StackerReadDBItem.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_Comm/PLCDBItem/WheelDBItem.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Common/equipment/GetWheelDate.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/One_two_unitJob.cs 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK4Job.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK5Job.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/PCS/WCS_Server/WIDESEA_WCS/WCSClient/Siemens/SiemensPLCClient.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -23,3 +23,4 @@
/代码管理/WMS/WMS_Client/dist.zip
/代码管理/WMS/WMS_Client/dist.zip
/代码管理/WMS/WMS_Client/dist.zip
/代码管理/PCS/WCS_Server.zip
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_Comm/PLCDBItem/StackerReadDBItem.cs
@@ -4,15 +4,17 @@
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_Comm.PLCDBItem
namespace WIDESEA_Comm
{
    /// <summary>
    /// è¾Šé“信息
    /// </summary>
    public class StackerReadDBItem
    {
        public event Action<string, StackerReadDBItem> OnReadStackerSignal;
        /// <summary>
        /// å¯¹è±¡é›†åˆ
        /// </summary>
        public static List<StackerReadDBItem> StackerReadDBItems = new List<StackerReadDBItem>();
        /// <summary>
        /// è¾Šé“编号
        /// </summary>
@@ -47,13 +49,5 @@
        /// è¯»å–辊道direction
        /// </summary>
        public byte R_direction { get; set; }
        public void ReadSignal(string signalType, StackerReadDBItem dBItem)
        {
            Task.Run(() =>
            {
                OnReadStackerSignal?.Invoke(signalType, dBItem);
            });
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_Comm/PLCDBItem/WheelDBItem.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_Comm
{
    public class WheelDBItem
    {
        /// <summary>
        /// å¯¹è±¡é›†åˆ
        /// </summary>
        public static List<WheelDBItem> VK4WheelDBItem = new List<WheelDBItem>();
        /// <summary>
        /// å¯¹è±¡é›†åˆ
        /// </summary>
        public static List<WheelDBItem> VK5WheelDBItem = new List<WheelDBItem>();
        /// <summary>
        /// ç¼–号
        /// </summary>
        public string StackerNo { get; set; }
        /// <summary>
        /// è½¦è½®SN号
        /// </summary>
        public string R_wheel_SN { get; set; }
        /// <summary>
        /// è½¦è½®ç±»åž‹
        /// </summary>
        public Int16 R_wheel_type { get; set; }
        /// <summary>
        /// è½¦è½®çŠ¶æ€
        /// </summary>
        public byte R_part_status { get; set; }
        /// <summary>
        /// è½¦è½®å·¥è‰º
        /// </summary>
        public byte R_part_process { get; set; }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Common/equipment/GetWheelDate.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Comm;
using WIDESEA_WCS.WCSClient;
namespace WIDESEA_WCS
{
    public class GetDate
    {
        /// <summary>
        /// èŽ·å–è½¦è½®æ•°æ®
        /// </summary>
        public static void GetWheelDate(PLCClient client)
        {
            PropertyInfo[] propertyInfos = typeof(WheelDBItem).GetProperties();
            var groups = client.itemGroups.OrderBy(x => x.Methods).ThenBy(x => x.name).GroupBy(x => x.Methods).ToList();
            foreach (var key in groups)
            {
                WheelDBItem StackerDBItem = new WheelDBItem();
                foreach (var propertyInfo in propertyInfos)
                {
                    if (propertyInfo.Name == "StackerNo")
                    {
                        StackerDBItem.StackerNo = 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 "R_wheel_SN":
                                    StackerDBItem.R_wheel_SN = readData.ToString();
                                    break;
                                case "R_wheel_type":
                                    StackerDBItem.R_wheel_type = Convert.ToInt16(readData);
                                    break;
                                case "R_part_status":
                                    StackerDBItem.R_part_status = Convert.ToByte(readData);
                                    break;
                                case "R_part_process":
                                    StackerDBItem.R_part_process = Convert.ToByte(readData);
                                    break;
                            }
                        }
                    }
                }
                switch (client.PLCName)
                {
                    case "VK4":
                        WheelDBItem.VK4WheelDBItem.Add(StackerDBItem);
                        break;
                    case "VK5":
                        WheelDBItem.VK5WheelDBItem.Add(StackerDBItem);
                        break;
                }
            }
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/One_two_unitJob.cs
@@ -1,4 +1,5 @@
using FreeSql;
using OfficeOpenXml.Drawing.Chart;
using Quartz;
using System;
using System.Collections.Generic;
@@ -6,12 +7,15 @@
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Comm;
using WIDESEA_Comm.ItemDB;
using WIDESEA_Comm.LogInfo;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Core.Extensions;
using WIDESEA_Entity.DomainModels;
using WIDESEA_WCS.IRepositories;
using WIDESEA_WCS.IServices;
using WIDESEA_WCS.Jobs;
using WIDESEA_WCS.Repositories;
using WIDESEA_WCS.Services;
using WIDESEA_WCS.WCSClient;
@@ -23,186 +27,141 @@
    /// ä¸€äºŒå•元调度
    /// </summary>
    [DisallowConcurrentExecution]
    public class One_two_unitJob : IJob
    public class One_two_unitJob : JobBase, IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                var client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient;
                if (client == null)
                AddDB();
                //ExecuteJob(context, DoAction);
            }
            catch (Exception ex)
                {
            }
                    return Task.CompletedTask;
                }
        private void DoAction(IJobExecutionContext context)
        {
            var client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient;
                //自动重连
                if (!client.IsConnected)
                {
                    client.Connect();
                    return Task.CompletedTask;
                return;
                }
                DoAction(client);
            }
            catch { }
            return Task.CompletedTask;
        }
        static List<GDXDB> gDXDBs = new List<GDXDB>();
        private void DoAction(PLCClient client)
            StackerReadDBItem.StackerReadDBItems = new List<StackerReadDBItem>();
            PropertyInfo[] propertyInfos = typeof(StackerReadDBItem).GetProperties();
            var groups = client.itemGroups.OrderBy(x => x.Methods).ThenBy(x => x.name).GroupBy(x => x.Methods).ToList();
            foreach (var key in groups)
        {
            try
                StackerReadDBItem StackerDBItem = new StackerReadDBItem();
                foreach (var propertyInfo in propertyInfos)
            {
                #region è¯»å†™æ–¹æ³•、日志、执行时间
                //client.Write("DB400.DBX0", "123456");
                //client.WriteByOrder("R_wheel_SN", "123456", "4.1");
                //client.WriteByOrder("R_wheel_SN", "666666", "4.2");
                //var res = client.Read<string>("DB400.DBX0", 20);
                //var res1 = client.ReadByOrder<string>("R_wheel_SN", "4.1");
                //var res2 = client.ReadByOrder<string>("R_wheel_SN", "4.2");
                //日志写入
                //WriteDBLog.Info("一二单元调度", "4.1:" + res1 + ";4.2:" + res2, "PCS");
                //执行完成时间
                //Console.WriteLine(DateTime.Now);
                #endregion
                #region     æ·»åŠ PLC地址信息
                //VOLContext Context = new VOLContext();
                //Idt_plcinfodetailRepository dt_PlcinfodetailService = new dt_plcinfodetailRepository(Context);
                //List<dt_plcinfodetail> plcinfodetails = new List<dt_plcinfodetail>();
                //for (int i = 106; i <= 110; i++)
                //{
                //    dt_plcinfodetail dt_Plcinfodetail = new dt_plcinfodetail()
                //    {
                //        plcdetail_id = Guid.NewGuid(),
                //        plcdetail_iotype = "One_two_unit",
                //        plcdetail_db = "DB400",
                //        plcdetail_value = "DBX" + ((i - 1) * 30),
                //        plcdetail_valtype = "string",
                //        plcdetail_len = 20,
                //        plcdetail_name = "R_wheel_SN",
                //        plcdetail_number = "7." + (i - 80),
                //        plcdetail_remark = "读取车轮SN号"
                //    };
                //    plcinfodetails.Add(dt_Plcinfodetail);
                //    dt_plcinfodetail dt_Plcinfodetail1 = new dt_plcinfodetail()
                //    {
                //        plcdetail_id = Guid.NewGuid(),
                //        plcdetail_iotype = "One_two_unit",
                //        plcdetail_db = "DB400",
                //        plcdetail_value = "DBX" + ((i - 1) * 30 + 20),
                //        plcdetail_valtype = "int",
                //        plcdetail_name = "R_wheel_type",
                //        plcdetail_number = "7." + (i - 80),
                //        plcdetail_remark = "读取车轮类型"
                //    };
                //    plcinfodetails.Add(dt_Plcinfodetail1);
                //    dt_plcinfodetail dt_Plcinfodetail2 = new dt_plcinfodetail()
                //    {
                //        plcdetail_id = Guid.NewGuid(),
                //        plcdetail_iotype = "One_two_unit",
                //        plcdetail_db = "DB400",
                //        plcdetail_value = "DBX" + ((i - 1) * 30 + 22),
                //        plcdetail_valtype = "byte",
                //        plcdetail_name = "R_part_status",
                //        plcdetail_number = "7." + (i - 80),
                //        plcdetail_remark = "读取车轮零件状态"
                //    };
                //    plcinfodetails.Add(dt_Plcinfodetail2);
                //    dt_plcinfodetail dt_Plcinfodetail3 = new dt_plcinfodetail()
                //    {
                //        plcdetail_id = Guid.NewGuid(),
                //        plcdetail_iotype = "One_two_unit",
                //        plcdetail_db = "DB400",
                //        plcdetail_value = "DBX" + ((i - 1) * 30 + 23),
                //        plcdetail_valtype = "byte",
                //        plcdetail_name = "R_part_process",
                //        plcdetail_number = "7." + (i - 80),
                //        plcdetail_remark = "读取车轮零件工艺"
                //    };
                //    plcinfodetails.Add(dt_Plcinfodetail3);
                //    dt_plcinfodetail dt_Plcinfodetail4 = new dt_plcinfodetail()
                //    {
                //        plcdetail_id = Guid.NewGuid(),
                //        plcdetail_iotype = "One_two_unit",
                //        plcdetail_db = "DB400",
                //        plcdetail_value = "DBX" + ((i - 1) * 30 + 24),
                //        plcdetail_valtype = "byte",
                //        plcdetail_name = "R_machine_nr",
                //        plcdetail_number = "7." + (i - 80),
                //        plcdetail_remark = "读取辊道machine_nr"
                //    };
                //    plcinfodetails.Add(dt_Plcinfodetail4);
                //    dt_plcinfodetail dt_Plcinfodetail5 = new dt_plcinfodetail()
                //    {
                //        plcdetail_id = Guid.NewGuid(),
                //        plcdetail_iotype = "One_two_unit",
                //        plcdetail_db = "DB400",
                //        plcdetail_value = "DBX" + ((i - 1) * 30 + 25),
                //        plcdetail_valtype = "byte",
                //        plcdetail_name = "R_direction",
                //        plcdetail_number = "7." + (i - 80),
                //        plcdetail_remark = "读取辊道direction"
                //    };
                //    plcinfodetails.Add(dt_Plcinfodetail5);
                //}
                //dt_PlcinfodetailService.AddRange(plcinfodetails, true);
                #endregion
                VOLContext Context = new VOLContext();
                Idt_plcinfoheadRepository repository = new dt_plcinfoheadRepository(Context);
                Idt_plcinfodetailRepository plcRepository = new dt_plcinfodetailRepository(Context);
                PropertyInfo[] propertyInfos = typeof(GDXDB).GetProperties();//获取所有属性
                var plc = repository.FindFirst(x => x.plcinfo_name == client.PLCName);
                var numbers = plcRepository.Find(x => x.plcdetail_iotype == plc.plcinfo_iotyep).GroupBy(x => x.plcdetail_number).ToList();
                foreach (var number in numbers)
                    if (propertyInfo.Name == "StackerNo")
                {
                    GDXDB dBItem = gDXDBs.Where(x => x.R_Name == number.Key).FirstOrDefault();
                    if (dBItem == null)
                    {
                        dBItem = new();
                        dBItem.OnReadSignal += HandleReadSignal;
                        gDXDBs.Add(dBItem);
                        //object obj = dBItem.R_part_status;
                        //dBItem.R_part_status = client.Read<byte>(number.Key);
                    }
                    List<dt_plcinfodetail> details = plcRepository.Find(x => x.plcdetail_iotype == plc.plcinfo_iotyep && x.plcdetail_number == number.Key).ToList();
                    for (int i = 0; i < propertyInfos.Length; i++)
                    {
                        if (i == 0)
                        {
                            dBItem.R_Name = number.Key;
                        StackerDBItem.StackerNo = key.Key;
                        }
                        else
                        {
                            object readData = DBExtension.Read(details.Where(x => x.plcdetail_name == propertyInfos[i].Name).FirstOrDefault(), client);
                            if (readData != null) { }
                            object obj = propertyInfos[i].GetValue(dBItem);
                            if (obj != readData)
                                propertyInfos[i].SetValue(dBItem, readData);
                        }
                    }
                }
            }
            catch (Exception ex)
                        DBItemGroup group = key.FirstOrDefault(x => x.name == propertyInfo.Name);
                        if (group != null)
            {
                Console.WriteLine(ex.Message);
            }
        }
        public void HandleReadSignal(GDXDB DBItem)
                            var readData = DBExtension.Read(group, client);
                            switch (propertyInfo.Name)
        {
            VOLContext Context = new VOLContext();
            Idt_ActualProductionRepository repository = new dt_ActualProductionRepository(Context);
            var info = repository.FindFirst(x => x.SN == DBItem.R_wheel_SN);//查询车轮的详细信息
            if (info != null)
            {
                //告诉桁架
                                case "R_wheel_SN":
                                    StackerDBItem.R_wheel_SN = readData.ToString();
                                    break;
                                case "R_wheel_type":
                                    StackerDBItem.R_wheel_type = Convert.ToInt16(readData);
                                    break;
                                case "R_part_status":
                                    StackerDBItem.R_part_status = Convert.ToByte(readData);
                                    break;
                                case "R_part_process":
                                    StackerDBItem.R_part_process = Convert.ToByte(readData);
                                    break;
                                case "R_machine_nr":
                                    StackerDBItem.R_machine_nr = Convert.ToBoolean(readData);
                                    break;
                                case "R_direction":
                                    StackerDBItem.R_direction = Convert.ToByte(readData);
                                    break;
            }
        }
    }
}
                StackerReadDBItem.StackerReadDBItems.Add(StackerDBItem);
            }
        }
        /// <summary>
        /// æ·»åŠ DB地址信息
        /// </summary>
        public void AddDB()
        {
            VOLContext context = new VOLContext();
            Idt_plcinfodetailRepository repository = new dt_plcinfodetailRepository(context);
            List<dt_plcinfodetail> plcinfodetail = new List<dt_plcinfodetail>();
            for (int i = 1; i <= 1; i++)
            {
                dt_plcinfodetail dt_Plcinfodetail1 = new dt_plcinfodetail()
                {
                    plcdetail_id = Guid.NewGuid(),
                    plcdetail_iotype = "VK5",
                    plcdetail_db = "DB630",
                    plcdetail_value = ((i - 1 + 28 + 10 + 10) * 24).ToString(),
                    plcdetail_valtype = "string",
                    plcdetail_len = 20,
                    plcdetail_name = "R_wheel_SN",
                    plcdetail_opratortype = "wheel",
                    plcdetail_remark = "读取车轮SN号",
                    plcdetail_number = "机械手3",
                };
                plcinfodetail.Add(dt_Plcinfodetail1);
                dt_plcinfodetail dt_Plcinfodetail2 = new dt_plcinfodetail()
                {
                    plcdetail_id = Guid.NewGuid(),
                    plcdetail_iotype = "VK5",
                    plcdetail_db = "DB630",
                    plcdetail_value = (20 + (i - 1 + 28 + 10 + 10) * 24).ToString(),
                    plcdetail_valtype = "int16",
                    plcdetail_name = "R_wheel_type",
                    plcdetail_opratortype = "wheel",
                    plcdetail_remark = "读取车轮类型",
                    plcdetail_number = "机械手3",
                };
                plcinfodetail.Add(dt_Plcinfodetail2);
                dt_plcinfodetail dt_Plcinfodetail3 = new dt_plcinfodetail()
                {
                    plcdetail_id = Guid.NewGuid(),
                    plcdetail_iotype = "VK5",
                    plcdetail_db = "DB630",
                    plcdetail_value = (22 + (i - 1 + 28 + 10 + 10) * 24).ToString(),
                    plcdetail_valtype = "byte",
                    plcdetail_name = "R_part_status",
                    plcdetail_opratortype = "wheel",
                    plcdetail_remark = "读取车轮状态",
                    plcdetail_number = "机械手3",
                };
                plcinfodetail.Add(dt_Plcinfodetail3);
                dt_plcinfodetail dt_Plcinfodetail4 = new dt_plcinfodetail()
                {
                    plcdetail_id = Guid.NewGuid(),
                    plcdetail_iotype = "VK5",
                    plcdetail_db = "DB630",
                    plcdetail_value = (23 + (i - 1 + 28 + 10 + 10) * 24).ToString(),
                    plcdetail_valtype = "byte",
                    plcdetail_name = "R_part_process",
                    plcdetail_opratortype = "wheel",
                    plcdetail_remark = "读取车轮工艺",
                    plcdetail_number = "机械手3",
                };
                plcinfodetail.Add(dt_Plcinfodetail4);
            }
            repository.AddRange(plcinfodetail, true);
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK4Job.cs
@@ -6,7 +6,7 @@
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Comm.PLCDBItem;
using WIDESEA_Comm;
using WIDESEA_Core.Extensions;
using WIDESEA_WCS.Jobs;
using WIDESEA_WCS.WCSClient;
@@ -30,7 +30,6 @@
            return Task.CompletedTask;
        }
        public static StackerReadDBItem StackerDBItem;
        private void DoAction(IJobExecutionContext context)
        {
            var client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient;
@@ -40,40 +39,9 @@
                client.Connect();
                return;
            }
            PropertyInfo[] propertyInfos = typeof(StackerReadDBItem).GetProperties();
            if (StackerDBItem == null)
            {
                StackerDBItem = new();
                //StackerDBItem.OnReadStackerSignal += HandleReadStackerSignal;
            }
            List<StackerReadDBItem> StackerReadDBItems = new List<StackerReadDBItem>();
            var groups = client.itemGroups.OrderBy(x => x.Methods).ThenBy(x=>x.name).GroupBy(x => x.Methods);
            foreach (var key in groups)
            {
                //foreach (var item in key)
                //{
                    for (int i = 0; i < propertyInfos.Length; i++)
                    {
                        if (i == 0)
                        {
                            StackerDBItem.StackerNo = key.First(x=>true).Methods;
                        }
                        else
                        {
                            DBItemGroup group = key.FirstOrDefault(x => x.name == propertyInfos[i].Name);
                            if (group != null)
                            {
                                object readData = DBExtension.Read(group, client);
                                object obj = propertyInfos[i].GetValue(StackerDBItem);
                                if (obj != readData)
                                    propertyInfos[i].SetValue(StackerDBItem, readData);
                            }
                        }
                    }
                    StackerReadDBItems.Add(StackerDBItem);
                //}
            }
            
            WheelDBItem.VK4WheelDBItem = new List<WheelDBItem>();
            GetDate.GetWheelDate(client);
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/Jobs/equipment/VK5Job.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Comm;
using WIDESEA_WCS.Jobs;
using WIDESEA_WCS.WCSClient;
namespace WIDESEA_WCS
{
    [DisallowConcurrentExecution]
    public class VK5Job : JobBase, IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                ExecuteJob(context, DoAction);
            }
            catch (Exception ex)
            {
            }
            return Task.CompletedTask;
        }
        private void DoAction(IJobExecutionContext context)
        {
            var client = context.JobDetail.JobDataMap.Get("JobParams") as PLCClient;
            //自动重连
            if (!client.IsConnected)
            {
                client.Connect();
                return;
            }
            WheelDBItem.VK5WheelDBItem = new List<WheelDBItem>();
            GetDate.GetWheelDate(client);
        }
    }
}
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/WCSClient/Siemens/SiemensPLCClient.cs
@@ -3,6 +3,7 @@
using System.Net.NetworkInformation;
using WIDESEA_Comm.DataHandle;
using WIDESEA_Comm.LogInfo;
using static FreeSql.Internal.GlobalFilter;
namespace WIDESEA_WCS.WCSClient
{
@@ -134,8 +135,11 @@
            }
            else if (typeof(DataType) == typeof(string))//字符串
            {
                var bytes = (byte[])GetContent(siemensPLCClient.Read(dbAddress, (ushort)len), dbAddress);
                string str = DataParse.GetStr(bytes, 0);
                //var bytes = (byte[])GetContent(siemensPLCClient.Read(dbAddress, (ushort)len), dbAddress);
                //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();
                return (DataType)(str as object);
            }
            else