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