コード例 #1
0
        void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
        {
            switch (e.Index)
            {
            case 1:
                LogicalName = GXCommon.ToLogicalName(e.Value);
                break;

            case 2:
                DataType dt = GetDataType(2);
                if (!e.User && e.Value != null && (dt == DataType.None || dt == DataType.DateTime || dt == DataType.String))
                {
                    DataType dt2 = GXCommon.GetDLMSDataType(e.Value.GetType());
                    if (dt != dt2)
                    {
                        SetDataType(2, dt2);
                    }
                }
                dt = GetUIDataType(2);
                if (dt == DataType.DateTime && (e.Value is UInt32 || e.Value is UInt64 || e.Value is Int32 || e.Value is Int64))
                {
                    Value = GXDateTime.FromUnixTime(Convert.ToUInt32(e.Value));
                }
                else
                {
                    Value = e.Value;
                }
                break;

            default:
                e.Error = ErrorCode.ReadWriteDenied;
                break;
            }
        }
コード例 #2
0
 /// <inheritdoc cref="IGXDLMSBase.GetDataType"/>
 public override DataType GetDataType(int index)
 {
     if (index == 1)
     {
         return(DataType.OctetString);
     }
     if (index == 2)
     {
         DataType dt = base.GetDataType(index);
         if (dt == DataType.None && Value != null)
         {
             dt = GXCommon.GetDLMSDataType(Value.GetType());
         }
         return(dt);
     }
     if (index == 3)
     {
         return(DataType.Array);
     }
     if (index == 4 && this is GXDLMSExtendedRegister)
     {
         return(base.GetDataType(index));
     }
     throw new ArgumentException("GetDataType failed. Invalid attribute index.");
 }
コード例 #3
0
        /// <inheritdoc cref="IGXDLMSBase.GetDataType"/>
        public override DataType GetDataType(int index)
        {
            switch (index)
            {
            case 1:
                return(DataType.OctetString);

            case 2:
            {
                DataType dt = base.GetDataType(index);
                if (dt == DataType.None && Value != null)
                {
                    dt = GXCommon.GetDLMSDataType(Value.GetType());
                    //If user has set initial value.
                    if (dt == DataType.String)
                    {
                        dt = DataType.None;
                    }
                }
                return(dt);
            }

            default:
                throw new ArgumentException("GetDataType failed. Invalid attribute index.");
            }
        }
コード例 #4
0
        /// <inheritdoc cref="IGXDLMSBase.GetDataType"/>
        public override DataType GetDataType(int index)
        {
            DataType dt;

            switch (index)
            {
            case 1:
                dt = DataType.OctetString;
                break;

            case 2:
                dt = base.GetDataType(index);
                if (dt == DataType.None && CurrentAverageValue != null)
                {
                    dt = GXCommon.GetDLMSDataType(CurrentAverageValue.GetType());
                }
                break;

            case 3:
                dt = base.GetDataType(index);
                if (dt == DataType.None && LastAverageValue != null)
                {
                    dt = GXCommon.GetDLMSDataType(LastAverageValue.GetType());
                }
                break;

            case 4:
                dt = DataType.Array;
                break;

            case 5:
                dt = base.GetDataType(index);
                if (dt == DataType.None && Status != null)
                {
                    dt = GXCommon.GetDLMSDataType(Status.GetType());
                }
                break;

            case 6:
                dt = DataType.OctetString;
                break;

            case 7:
                dt = DataType.OctetString;
                break;

            case 8:
                dt = DataType.UInt32;
                break;

            case 9:
                dt = DataType.UInt16;
                break;

            default:
                throw new ArgumentException("GetDataType failed. Invalid attribute index.");
            }
            return(dt);
        }
コード例 #5
0
 /// <summary>
 /// Get DLMS data type.
 /// </summary>
 /// <param name="value">Object</param>
 /// <returns>DLMS data type.</returns>
 static public DataType GetDLMSDataType(object value)
 {
     if (value == null)
     {
         return(DataType.None);
     }
     return(GXCommon.GetDLMSDataType(value.GetType()));
 }
コード例 #6
0
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (Scaler != 1 && e.Value != null && !e.User)
         {
             SetDataType(2, GXCommon.GetDLMSDataType(e.Value.GetType()));
             try
             {
                 if (settings != null && settings.IsServer)
                 {
                     Value = e.Value;
                 }
                 else
                 {
                     Value = Convert.ToDouble(e.Value) * Scaler;
                 }
             }
             catch (Exception)
             {
                 //Sometimes scaler is set for wrong Object type.
                 Value = e.Value;
             }
         }
         else
         {
             Value = e.Value;
         }
     }
     else if (e.Index == 3)
     {
         if (e.Value == null)
         {
             Scaler = 1;
             Unit   = Unit.None;
         }
         else
         {
             object[] arr = (object[])e.Value;
             if (arr.Length != 2)
             {
                 throw new Exception("setValue failed. Invalid scaler unit value.");
             }
             scaler = Convert.ToInt32(arr[0]);
             Unit   = (Unit)(Convert.ToInt32(arr[1]) & 0xFF);
         }
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
コード例 #7
0
 object IGXDLMSBase.GetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         return(GXCommon.LogicalNameToBytes(LogicalName));
     }
     if (e.Index == 2)
     {
         //If client set new value.
         if (!settings.IsServer && Scaler != 1 && Value != null)
         {
             DataType dt = base.GetDataType(2);
             if (dt == DataType.None && Value != null)
             {
                 dt = GXCommon.GetDLMSDataType(Value.GetType());
                 //If user has set initial value.
                 if (dt == DataType.String)
                 {
                     dt = DataType.None;
                 }
             }
             object tmp;
             tmp = Convert.ToDouble(Value) / Scaler;
             if (dt != DataType.None)
             {
                 tmp = Convert.ChangeType(tmp, GXCommon.GetDataType(dt));
             }
             return(tmp);
         }
         return(Value);
     }
     if (e.Index == 3)
     {
         GXByteBuffer data = new GXByteBuffer();
         data.SetUInt8((byte)DataType.Structure);
         data.SetUInt8(2);
         GXCommon.SetData(settings, data, DataType.Int8, scaler);
         GXCommon.SetData(settings, data, DataType.Enum, Unit);
         return(data.Array());
     }
     if (e.Index == 4)
     {
         return(Status);
     }
     if (e.Index == 5)
     {
         return(CaptureTime);
     }
     e.Error = ErrorCode.ReadWriteDenied;
     return(null);
 }
コード例 #8
0
        void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
        {
            switch (e.Index)
            {
            case 1:
                LogicalName = GXCommon.ToLogicalName(e.Value);
                break;

            case 2:
                if (!e.User && e.Value != null && GetDataType(2) == DataType.None)
                {
                    SetDataType(2, GXCommon.GetDLMSDataType(e.Value.GetType()));
                }
                Value = e.Value;
                break;

            default:
                e.Error = ErrorCode.ReadWriteDenied;
                break;
            }
        }
コード例 #9
0
 /// <summary>
 /// Get DLMS data type.
 /// </summary>
 /// <param name="type">Data type.</param>
 /// <returns>DLMS data type.</returns>
 static public DataType GetDLMSDataType(Type type)
 {
     return(GXCommon.GetDLMSDataType(type));
 }
コード例 #10
0
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (Scaler != 1 && e.Value != null && !e.User)
         {
             SetDataType(2, GXCommon.GetDLMSDataType(e.Value.GetType()));
             try
             {
                 if (settings.IsServer)
                 {
                     Value = e.Value;
                 }
                 else
                 {
                     Value = Convert.ToDouble(e.Value) * Scaler;
                 }
             }
             catch (Exception)
             {
                 //Sometimes scaler is set for wrong Object type.
                 Value = e.Value;
             }
         }
         else
         {
             Value = e.Value;
         }
     }
     else if (e.Index == 3)
     {
         if (e.Value == null)
         {
             Scaler = 1;
             Unit   = Unit.None;
         }
         else
         {
             List <object> arr;
             if (e.Value is List <object> )
             {
                 arr = (List <object>)e.Value;
             }
             else
             {
                 arr = new List <object>((object[])e.Value);
             }
             if (arr.Count != 2)
             {
                 throw new Exception("setValue failed. Invalid scaler unit value.");
             }
             scaler = Convert.ToInt32(arr[0]);
             Unit   = (Unit)Convert.ToInt32(arr[1]);
         }
     }
     else if (e.Index == 4)
     {
         Status = e.Value;
     }
     else if (e.Index == 5)
     {
         if (e.Value is byte[])
         {
             e.Value = GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings == null ? false : settings.UseUtc2NormalTime);
         }
         else if (e.Value is string)
         {
             e.Value = new GXDateTime((string)e.Value);
         }
         //Actaris meters might return null.
         if (e.Value == null)
         {
             CaptureTime = new GXDateTime();
         }
         else
         {
             CaptureTime = ((GXDateTime)e.Value).Value.LocalDateTime;
         }
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
コード例 #11
0
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (Scaler != 1 && e.Value != null && !e.User)
         {
             try
             {
                 if (settings.IsServer)
                 {
                     CurrentAverageValue = e.Value;
                 }
                 else
                 {
                     CurrentAverageValue = Convert.ToDouble(e.Value) * Scaler;
                 }
             }
             catch (Exception)
             {
                 //Sometimes scaler is set for wrong Object type.
                 CurrentAverageValue = e.Value;
             }
         }
         else
         {
             CurrentAverageValue = e.Value;
         }
     }
     else if (e.Index == 3)
     {
         if (Scaler != 1 && e.Value != null && !e.User)
         {
             try
             {
                 SetDataType(e.Index, GXCommon.GetDLMSDataType(e.Value.GetType()));
                 if (settings.IsServer)
                 {
                     LastAverageValue = e.Value;
                 }
                 else
                 {
                     LastAverageValue = Convert.ToDouble(e.Value) * Scaler;
                 }
             }
             catch (Exception)
             {
                 //Sometimes scaler is set for wrong Object type.
                 LastAverageValue = e.Value;
             }
         }
         else
         {
             LastAverageValue = e.Value;
         }
     }
     else if (e.Index == 4)
     {
         if (e.Value == null)
         {
             Scaler = 1;
             Unit   = Unit.None;
         }
         else
         {
             object[] arr = (object[])e.Value;
             if (arr.Length != 2)
             {
                 throw new Exception("setValue failed. Invalid scaler unit value.");
             }
             scaler = Convert.ToInt32(arr[0]);
             Unit   = (Unit)Convert.ToInt32(arr[1]);
         }
     }
     else if (e.Index == 5)
     {
         Status = Convert.ToInt32(e.Value);
     }
     else if (e.Index == 6)
     {
         if (e.Value == null)
         {
             CaptureTime = new GXDateTime(DateTime.MinValue);
         }
         else
         {
             if (e.Value is byte[])
             {
                 e.Value = GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings.UseUtc2NormalTime);
             }
             else if (e.Value is string)
             {
                 e.Value = new GXDateTime((string)e.Value);
             }
             CaptureTime = (GXDateTime)e.Value;
         }
     }
     else if (e.Index == 7)
     {
         if (e.Value == null)
         {
             StartTimeCurrent = new GXDateTime(DateTime.MinValue);
         }
         else
         {
             if (e.Value is byte[])
             {
                 e.Value = GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings.UseUtc2NormalTime);
             }
             else if (e.Value is string)
             {
                 e.Value = new GXDateTime((string)e.Value);
             }
             StartTimeCurrent = (GXDateTime)e.Value;
         }
     }
     else if (e.Index == 8)
     {
         Period = Convert.ToUInt32(e.Value);
     }
     else if (e.Index == 9)
     {
         NumberOfPeriods = Convert.ToUInt16(e.Value);
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
コード例 #12
0
 object IGXDLMSBase.GetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         return(GXCommon.LogicalNameToBytes(LogicalName));
     }
     if (e.Index == 2)
     {
         //If client set new value.
         if (!settings.IsServer && Scaler != 1 && CurrentAverageValue != null)
         {
             Type type = null;
             if (CurrentAverageValue != null)
             {
                 type = CurrentAverageValue.GetType();
             }
             object tmp;
             tmp = Convert.ToDouble(CurrentAverageValue) / Scaler;
             if (type != null)
             {
                 tmp = Convert.ChangeType(tmp, type);
             }
             return(tmp);
         }
         return(CurrentAverageValue);
     }
     if (e.Index == 3)
     {
         //If client set new value.
         if (!settings.IsServer && Scaler != 1 && LastAverageValue != null)
         {
             DataType dt = base.GetDataType(3);
             if (dt == DataType.None && LastAverageValue != null)
             {
                 dt = GXCommon.GetDLMSDataType(LastAverageValue.GetType());
             }
             object tmp;
             tmp = Convert.ToDouble(LastAverageValue) / Scaler;
             if (dt != DataType.None)
             {
                 tmp = Convert.ChangeType(tmp, GXCommon.GetDataType(dt));
             }
             return(tmp);
         }
         return(LastAverageValue);
     }
     if (e.Index == 4)
     {
         GXByteBuffer data = new GXByteBuffer();
         data.SetUInt8((byte)DataType.Structure);
         data.SetUInt8(2);
         GXCommon.SetData(settings, data, DataType.Int8, scaler);
         GXCommon.SetData(settings, data, DataType.Enum, Unit);
         return(data.Array());
     }
     if (e.Index == 5)
     {
         return(Status);
     }
     if (e.Index == 6)
     {
         return(CaptureTime);
     }
     if (e.Index == 7)
     {
         return(StartTimeCurrent);
     }
     if (e.Index == 8)
     {
         return(Period);
     }
     if (e.Index == 9)
     {
         return(NumberOfPeriods);
     }
     e.Error = ErrorCode.ReadWriteDenied;
     return(null);
 }