Пример #1
0
        private int CalCachDatablockSize(Cdy.Tag.TagType tagType, Cdy.Tag.RecordType recordType, int headSize, out int dataOffset, out int qulityOffset)
        {
            //单个数据块内容包括:时间戳(2)+数值+质量戳(1)

            qulityOffset = headSize;
            int count = CachMemoryTime;

            //对于值改变的记录方式,提高内存分配量,以提高值改变记录的数据个数
            if (recordType == RecordType.ValueChanged)
            {
                count = CachMemoryTime * 1000 / MemoryTimeTick;
            }

            //数据区偏移,时间戳占2个字节,质量戳占1个字节
            dataOffset = headSize + count * 2;
            switch (tagType)
            {
            case Cdy.Tag.TagType.Byte:
            case Cdy.Tag.TagType.Bool:
                qulityOffset = dataOffset + count;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.Short:
            case Cdy.Tag.TagType.UShort:
                qulityOffset = dataOffset + count * 2;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.Int:
            case Cdy.Tag.TagType.UInt:
            case Cdy.Tag.TagType.Float:
                qulityOffset = dataOffset + count * 4;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.Long:
            case Cdy.Tag.TagType.ULong:
            case Cdy.Tag.TagType.Double:
            case Cdy.Tag.TagType.DateTime:
                qulityOffset = dataOffset + count * 8;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.String:
                qulityOffset = dataOffset + count * Const.StringSize;
                return(qulityOffset + count);

            default:
                return(0);
            }
        }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="tagType"></param>
        /// <returns></returns>
        public static Cdy.Tag.Tagbase GetTag(this Cdy.Tag.TagType tagType)
        {
            switch (tagType)
            {
            case Cdy.Tag.TagType.Bool:
                return(new Cdy.Tag.BoolTag());

            case Cdy.Tag.TagType.Byte:
                return(new Cdy.Tag.ByteTag());

            case Cdy.Tag.TagType.DateTime:
                return(new Cdy.Tag.DateTimeTag());

            case Cdy.Tag.TagType.Double:
                return(new Cdy.Tag.DoubleTag());

            case Cdy.Tag.TagType.Float:
                return(new Cdy.Tag.FloatTag());

            case Cdy.Tag.TagType.Int:
                return(new Cdy.Tag.IntTag());

            case Cdy.Tag.TagType.Long:
                return(new Cdy.Tag.LongTag());

            case Cdy.Tag.TagType.Short:
                return(new Cdy.Tag.ShortTag());

            case Cdy.Tag.TagType.String:
                return(new Cdy.Tag.StringTag());

            case Cdy.Tag.TagType.UInt:
                return(new Cdy.Tag.UIntTag());

            case Cdy.Tag.TagType.ULong:
                return(new Cdy.Tag.ULongTag());

            case Cdy.Tag.TagType.UShort:
                return(new Cdy.Tag.UShortTag());
            }
            return(null);
        }
Пример #3
0
        /// <summary>
        /// 计算每个变量数据块的大小
        /// </summary>
        /// <param name="tagType"></param>
        /// <returns></returns>
        private int CalMergeBlockSize(Cdy.Tag.TagType tagType, Cdy.Tag.RecordType recordType, int blockHeadSize, out int dataOffset, out int qulityOffset)
        {
            //单个数据块内容包括:时间戳(2)+数值+质量戳(1)

            qulityOffset = 0;
            int regionHeadSize = blockHeadSize;
            // int count = MemoryCachTime * 1000 / MemoryTimeTick;
            int count = MergeMemoryTime;

            //对于值改变的记录方式,提高内存分配量,以提高值改变记录的数据个数
            if (recordType == RecordType.ValueChanged)
            {
                count = MergeMemoryTime * 1000 / MemoryTimeTick;
            }

            //用于解码时在头尾分别记录前一个区域的值和后一个区域的值
            count += 2;

            //数据区偏移,时间戳占2个字节
            dataOffset = regionHeadSize + count * 2;
            switch (tagType)
            {
            case Cdy.Tag.TagType.Byte:
            case Cdy.Tag.TagType.Bool:
                qulityOffset = dataOffset + count;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.Short:
            case Cdy.Tag.TagType.UShort:
                qulityOffset = dataOffset + count * 2;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.Int:
            case Cdy.Tag.TagType.UInt:
            case Cdy.Tag.TagType.Float:
                qulityOffset = dataOffset + count * 4;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.Long:
            case Cdy.Tag.TagType.ULong:
            case Cdy.Tag.TagType.Double:
            case Cdy.Tag.TagType.DateTime:
            case Cdy.Tag.TagType.IntPoint:
            case Cdy.Tag.TagType.UIntPoint:
                qulityOffset = dataOffset + count * 8;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.IntPoint3:
            case Cdy.Tag.TagType.UIntPoint3:
                qulityOffset = dataOffset + count * 12;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.LongPoint:
            case Cdy.Tag.TagType.ULongPoint:
                qulityOffset = dataOffset + count * 16;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.LongPoint3:
            case Cdy.Tag.TagType.ULongPoint3:
                qulityOffset = dataOffset + count * 24;
                return(qulityOffset + count);

            case Cdy.Tag.TagType.String:
                qulityOffset = dataOffset + count * Const.StringSize;
                return(qulityOffset + count);

            default:
                return(0);
            }
        }