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); } }
/// <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); } }