C# IO管理数据访问

using CommonLib.Components;
using CommonLib.Modules.ParamsFileReader;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WCSPro.Model;

namespace WCSPro.IDAL
{
    /// <summary>
    /// IO项管理数据访问接口
    /// </summary>
    public interface ILibIODAL : IParamsFileRW<List<IOItem>>
    {
        /// <summary>
        /// 获取IO列表
        /// </summary>
        /// <param name="queryKey">查询关键字,可选参数</param>
        /// <returns></returns>
        List<IOItem> QueryIOList(string queryKey);

        /// <summary>
        /// 获取IO列表
        /// </summary>
        /// <param name="queryKey">查询关键字,可选参数</param>
        /// <param name="ioType">io类型("DI"、"DO"、"AI"、"AO")</param>
        /// <returns></returns>
        List<IOItem> QueryIOList(string queryKey, string ioType);

        /// <summary>
        /// 获取指定部件的IO集合
        /// </summary>
        /// <param name="components">部件可选参数</param>
        /// <returns></returns>
        Dictionary<string, IOItem> GetComponentIOItems(params ComponentName[] components);

        /// <summary>
        /// 根据名称获取IO
        /// </summary>
        /// <param name="ioName">IO名称</param>
        /// <returns></returns>
        IOItem GetIOItemByName(string ioName);

        /// <summary>
        /// 添加IO项
        /// </summary>
        /// <param name="item">IO项</param>
        /// <returns></returns>
        bool AddIOItem(IOItem item);

        /// <summary>
        /// 修改IO项
        /// </summary>
        /// <param name="item">IO项</param>
        /// <returns></returns>
        bool ModifyIO(IOItem item);

        /// <summary>
        /// 修改IO项
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        bool RemoveIO(IOItem item);
    }
}

using CommonLib.Components;
using CommonLib.SerializerUtils;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WCSPro.IDAL;
using WCSPro.Model;

namespace WCSPro.DAL
{
    /// <summary>
    /// IO管理数据访问实现类
    /// </summary>
    public class LibIODAL : ILibIODAL
    {
        /// <summary>
        /// IO列表文件存放路径
        /// </summary>
        private string IOListFilePath { get; } = Path.Combine(AppContext.BaseDirectory, "Config", "IOList.JFANA");

        public LibIODAL()
        {
            IOList = ReadParamsObjFromFile(this.IOListFilePath);
        }

        /// <summary>
        /// IO列表。
        /// </summary>
        private List<IOItem> IOList { get; set; }

        /// <summary>
        /// 从文件读取IO列表
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <returns></returns>
        public List<IOItem> ReadParamsObjFromFile(string path)
        {
            if (!File.Exists(path)) return new List<IOItem>();
            var paramJson = File.ReadAllText(path);
            return JsonHelper.Deserialize<List<IOItem>>(paramJson);

        }

        /// <summary>
        /// 将IO列表写入文件
        /// </summary>
        /// <param name="obj">IO列表</param>
        /// <param name="path">文件路径</param>
        /// <returns></returns>
        public bool WriteParamsObjToFile(List<IOItem> obj, string path)
        {
            var paramJson = JsonHelper.Serialize(obj);
            File.WriteAllText(path, paramJson);
            return true;
        }

        public List<IOItem> QueryIOList(string queryKey)
        {
            List<IOItem> lRet = IOList;
            if (!string.IsNullOrWhiteSpace(queryKey))
            {
                lRet = IOList.Where(t =>
                    t.IOCode.ToLower().Contains(queryKey.ToLower()) ||
                    t.IOName.ToLower().Contains(queryKey.ToLower()) ||
                    t.PointName.ToLower().Contains(queryKey.ToLower())
                    ).ToList();
            }
            return JsonHelper.ObjCopy(lRet).OrderBy(t => t.IOCode).ThenBy(t => t.IOName).ToList();
        }

        public List<IOItem> QueryIOList(string queryKey, string ioType)
        {
            List<IOItem> lRet = IOList;

            if (!string.IsNullOrWhiteSpace(ioType))
            {
                lRet = lRet.Where(t => t.IOType.ToString().ToUpper() == ioType.ToUpper()).ToList();
            }
            if (!string.IsNullOrWhiteSpace(queryKey))
            {
                lRet = lRet
                    .WhereIF(!string.IsNullOrWhiteSpace(ioType), t => t.IOType.ToString().ToUpper() == ioType.ToUpper())
                    .Where(t =>
                    t.IOCode.ToLower().Contains(queryKey.ToLower()) ||
                    t.IOName.ToLower().Contains(queryKey.ToLower()) ||
                    t.PointName.ToLower().Contains(queryKey.ToLower())
                    )
                    .ToList();
            }
            return JsonHelper.ObjCopy(lRet).OrderBy(t => t.IOCode).ThenBy(t => t.IOName).ToList();
        }

        public Dictionary<string, IOItem> GetComponentIOItems(params ComponentName[] components)
        {
            List<IOItem> ls = new List<IOItem>();
            if (components == null || components.Length == 0) return new Dictionary<string, IOItem>();
            foreach (var component in components)
            {
                var temp = IOList.Where(t => t.CmpName == component);
                if (temp != null && temp.Count() > 0) ls.AddRange(temp);
            }
            return JsonHelper.ObjCopy(ls.ToDictionary(t => t.IOName));
        }

        public IOItem GetIOItemByName(string ioName)
        {
            if (this.IOList == null || this.IOList.Count == 0) return null;
            var item = this.IOList.FirstOrDefault(t => t.IOName == ioName);
            if (item == null) return null;
            return JsonHelper.ObjCopy(item);
        }

        public bool AddIOItem(IOItem item)
        {
            if (IOList.Exists(t => t.IOCode == item.IOCode))
            {
                throw new Exception("IO already exists");
            }
            IOList.Add(item);
            return WriteParamsObjToFile(IOList, this.IOListFilePath);
        }

        public bool ModifyIO(IOItem item)
        {
            var obj = IOList.Single(t => t.IOCode == item.IOCode);
            obj.IOAddr = item.IOAddr;
            obj.CanRead = item.CanRead;
            obj.CanWrite = item.CanWrite;
            obj.CmpName = item.CmpName;
            obj.IONote = item.IONote;
            obj.IOType = item.IOType;
            obj.IOName = item.IOName;
            obj.PointName = item.PointName;
            obj.DataLen = item.DataLen;
            obj.ValueType = item.ValueType;
            return WriteParamsObjToFile(IOList, this.IOListFilePath);
        }


        public bool RemoveIO(IOItem item)
        {
            IOList.RemoveAll(t => t.IOCode == item.IOCode);
            return WriteParamsObjToFile(IOList, this.IOListFilePath);
        }


    }
}

using Newtonsoft.Json;
using PropertyChanged;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using CommonLib.IO;
using CommonLib.Components;

namespace WCSPro.Model
{
    /// <summary>
    ///IO点本身属性
    /// </summary>
    [AddINotifyPropertyChangedInterface]
    public class IOItem
    {
        /// <summary>
        /// 主键
        /// </summary>
        //public string GID { get; set; } = Guid.NewGuid().ToString();
        /// <summary>
        /// IO号
        /// </summary>
        public string IOCode { get; set; } = string.Empty;
        /// <summary>
        /// I/O类型 DI/DO/AI/AO/SI/SO
        /// </summary>
        public IO_Type IOType { get; set; }
        /// <summary>
        /// IO名称
        /// </summary>
        public string IOName { get; set; } = string.Empty;
        /// <summary>
        /// IO连接点名称
        /// </summary>
        public string PointName { get; set; } = string.Empty;
        /// <summary>
        /// IO访问地址
        /// </summary>
        public string IOAddr { get; set; } = string.Empty;
        /// <summary>
        /// 说明
        /// </summary>
        public string IONote { get; set; } = string.Empty;
        /// <summary>
        /// 所属零部件,不全有
        /// </summary>
        public ComponentName CmpName { get; set; } //若无所属零部件,选择None        
        /// <summary>
        /// 是否可读
        /// </summary>
        public bool CanRead { get; set; } = true;
        /// <summary>
        /// 是否可写
        /// </summary>
        public bool CanWrite { get; set; } = false;
        /// <summary>
        /// 数据长度,单位字节
        /// </summary>
        public int DataLen { get; set; }
        /// <summary>
        /// 数据
        /// </summary>
        [JsonIgnore]
        public byte[] Data { get; set; }

        /// <summary>
        /// 显示值类型。"bool","unit","int","ushort","short","float","double"
        /// </summary>
        public string ValueType { get; set; } = "bool";


        private string sValue;
        /// <summary>
        /// 显示值
        /// </summary>
        [JsonIgnore]
        public string Value
        {
            get { return sValue; }
            set
            {
                if (ValueType == "bool" && DataLen == 1)
                {
                    switch (value)
                    {
                        default:
                            sValue = value;
                            break;
                        case "1":
                            sValue = "true";
                            break;
                        case "0":
                            sValue = "false";
                            break;
                    }
                }
                else
                {
                    sValue = value;
                }
            }
        }


        /// <summary>
        /// 消息
        /// </summary>
        [JsonIgnore]
        public string Message { get; set; } = string.Empty;

        public IOItem Clone()
        {
            IOItem item = new IOItem();
            //
            item.IOCode = this.IOCode;
            item.IOType = this.IOType;
            item.IOName = this.IOName;
            item.PointName = this.PointName;
            item.IOAddr = this.IOAddr;
            item.IONote = this.IONote;
            item.CmpName = this.CmpName;
            item.CanRead = this.CanRead;
            item.CanWrite = this.CanWrite;
            item.DataLen = this.DataLen;
            item.Data = new byte[this.Data.Length];
            Array.Copy(this.Data, item.Data, this.Data.Length);
            item.ValueType = this.ValueType;
            item.Value = this.Value;
            item.Message = this.Message;
            //
            return item;
        }

    }
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值