示例#1
0
        public static bool HasScaling(this IDataServer server, string tagName)
        {
            ITag tag = server[tagName];

            if (tag == null)
            {
                return(false);
            }
            int scaleid = server.GetScaleByID(tag.ID);

            return(scaleid >= 0);
        }
示例#2
0
        public static float ValueToScale(this ITag tag, float value)
        {
            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)
            {
                return(value);
            }
            else
            {
                double temp = (value - meta.EULo) / (meta.EUHi - meta.EULo);
                if (meta.ScaleType == ScaleType.SquareRoot)
                {
                    temp = temp * temp;
                }
                return((meta.RawHi - meta.RawLo) * (float)temp + meta.RawLo);
            }
        }
示例#3
0
        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);
            }
        }