| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 | using FreeRedis;using System.Collections.Generic;namespace Virtual_PLC{    /// <summary>    /// plc数据    /// </summary>    public class PlcData    {        private static RedisClient Redis { get; set; }        /// <summary>        /// 数据结构缓存        /// </summary>        private static List<PLCData> PLCDatas { get; set; } = new List<PLCData>();        /// <summary>        /// redis 链接字符串        /// </summary>        /// <param name="redisClient">Redis链接字符串</param>        public PlcData(string redisClient)        {            Redis = new RedisClient(redisClient);        }        /// <summary>        /// redis 链接字符串        /// </summary>        /// <param name="redisClient"></param>        /// <returns></returns>        public static PlcData Init(string redisClient)        {            return new PlcData(redisClient);        }        /// <summary>        /// 初始化PLC数据        /// </summary>        /// <param name="pLCData">一个PLC</param>        public void InitPlcData(PLCData pLCData)        {            if (!PLCDatas.Contains(pLCData))            {                PLCDatas.Add(pLCData);            }            //用总长度除以数据长度,再以每断数据的起始位置、IP、DB组成Key            var mun = pLCData.Length / pLCData.DataLength;            int addstart = 0;            for (int i = 0; i < mun; i++)            {                var key = $"{pLCData.IP}:{pLCData.DB}:{addstart}";                if (Redis.Exists(key)) continue;                Redis.Set(key, new byte[pLCData.DataLength]);                addstart = addstart + pLCData.DataLength;            }        }        /// <summary>        /// 初始化PLC数据        /// </summary>        /// <param name="pLCDatas">多个PLC</param>        public void InitPlcData(List<PLCData> pLCDatas)        {            pLCDatas.ForEach(v =>            {                InitPlcData(v);            });        }        /// <summary>        /// 按照DB读取        /// </summary>        /// <param name="pLCData"></param>        /// <returns></returns>        public static byte[] Read(PLCData pLCData)        {            byte[] data = new byte[pLCData.Length];            //用总长度除以数据长度,再以每断数据的起始位置、IP、DB组成Key            var mun = pLCData.Length / pLCData.DataLength;            int addstart = 0;            for (int i = 0; i < mun; i++)            {                var a = Redis.Get<byte[]>($"{pLCData.IP}:{pLCData.DB}:{addstart}");                a.CopyTo(data, addstart);                addstart = addstart + pLCData.DataLength;            }            return data;        }        /// <summary>        /// 按照长度读取        /// </summary>        /// <param name="pLCData"></param>        /// <param name="startLength">起始长度</param>        /// <returns></returns>        public static byte[] Read(PLCData pLCData, int startLength)        {            return System.Text.Encoding.Default.GetBytes(Redis.Get($"{pLCData.IP}:{pLCData.DB}:{startLength}"));        }        /// <summary>        ///        /// </summary>        public static void Write(PLCData pLCData, int startLength, byte[] value)        {            var data = PLCDatas.Find(v => v.IP == pLCData.IP && v.DB == pLCData.DB);            var start = startLength < data.DataLength ? 0 : (data.DataLength - startLength) + startLength;            //获取原有数据            var bytes = System.Text.Encoding.Default.GetBytes(Redis.Get($"{pLCData.IP}:{pLCData.DB}:{start}"));            value.CopyTo(bytes, startLength - 1);            Redis.Set($"{pLCData.IP}:{pLCData.DB}:{start}", bytes);        }    }    /// <summary>    /// PLC数据结构    /// </summary>    public class PLCData    {        /// <summary>        /// IP        /// </summary>        public string IP { get; set; }        /// <summary>        /// DB        /// </summary>        public int DB { get; set; }        /// <summary>        /// 总长度        /// </summary>        public int Length { get; set; }        /// <summary>        /// 数据长度        /// </summary>        public int DataLength { get; set; }    }}
 |