public static float ScaleToValue(this ITag tag) { return(ScaleToValue(tag, tag.Value)); }
public bool AddItems(IList <TagMetaData> items) { int count = items.Count; if (_items == null) { _items = new List <ITag>(count); } lock (_server.SyncRoot) { for (int i = 0; i < count; i++) { ITag dataItem = null; TagMetaData meta = items[i]; if (meta.GroupID == this._id) { DeviceAddress addr = _plcReader.GetDeviceAddress(meta.Address); if (addr.DataSize == 0) { addr.DataSize = meta.Size; } if (addr.VarType == DataType.NONE) { addr.VarType = meta.DataType; } if (addr.VarType != DataType.BOOL) { addr.Bit = 0; } switch (meta.DataType) { case DataType.BOOL: dataItem = new BoolTag(meta.ID, addr, this); break; case DataType.BYTE: dataItem = new ByteTag(meta.ID, addr, this); break; case DataType.WORD: case DataType.SHORT: dataItem = new ShortTag(meta.ID, addr, this); break; case DataType.TIME: case DataType.INT: dataItem = new IntTag(meta.ID, addr, this); break; case DataType.FLOAT: dataItem = new FloatTag(meta.ID, addr, this); break; case DataType.STR: dataItem = new StringTag(meta.ID, addr, this); break; } if (dataItem != null) { //dataItem.Active = meta.Active; _items.Add(dataItem); _server.AddItemIndex(meta.Name, dataItem); } } } } _items.TrimExcess(); _items.Sort(); UpdatePDUArea(); return(true); }
public static float ScaleToValue(this ITag tag, Storage value) { DataType type = tag.Address.VarType; if (type == DataType.BOOL) { return(value.Boolean ? 1f : 0f); } IDataServer srv = tag.Parent.Server; int ind = srv.GetScaleByID(tag.ID); Scaling meta = ind < 0 ? Scaling.Empty : srv.ScalingList[ind]; if (meta.ScaleType == ScaleType.None) { switch (type) { case DataType.BYTE: return((float)value.Byte); case DataType.WORD: case DataType.SHORT: return((float)value.Int16); case DataType.INT: return((float)value.Int32); case DataType.FLOAT: return(value.Single); case DataType.STR: return(float.Parse(tag.ToString())); default: return(0f); } } else { double temp; switch (type) { case DataType.BYTE: temp = (value.Byte - meta.RawLo) / (meta.RawHi - meta.RawLo); break; case DataType.WORD: case DataType.SHORT: temp = (value.Int16 - meta.RawLo) / (meta.RawHi - meta.RawLo); break; case DataType.INT: temp = (value.Int32 - meta.RawLo) / (meta.RawHi - meta.RawLo); break; case DataType.FLOAT: temp = (value.Single - meta.RawLo) / (meta.RawHi - meta.RawLo); break; default: return(0f); } if (meta.ScaleType == ScaleType.SquareRoot) { temp = Math.Sqrt(temp); } return((meta.EUHi - meta.EULo) * (float)temp + meta.EULo); } }