Exemplo n.º 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);
            }
        }
Exemplo n.º 2
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);
            }
        }