Esempio n. 1
0
        public static string GrowattModelFromBytes(DeviceAlgorithm device, RegisterSettings.RegisterValueType valueType, ref byte[] input, int size, int start, bool cStringNull)
        {
            if (size < 2)
                return "Unknown";

            String hex = SystemServices.BytesToHex(ref input, 1, "", "", start, size);

            string result = String.Format("P{0} U{1} M{2} S{3}", hex[0], hex[1], hex[2], hex[3]);

            return result;
        }
Esempio n. 2
0
 public static UInt16 SizeInBytes(RegisterSettings.RegisterValueType valueType, int size, bool cStringNull)
 {
     if (valueType == RegisterSettings.RegisterValueType.rv_uint16)
         return 2;
     else if (valueType == RegisterSettings.RegisterValueType.rv_uint16_exp)
         return 3;
     else if (valueType == RegisterSettings.RegisterValueType.rv_uint32)
         return 4;
     else if (valueType == RegisterSettings.RegisterValueType.rv_byte)
         return 1;
     else if (valueType == RegisterSettings.RegisterValueType.rv_sint16)
         return 2;
     else if (valueType == RegisterSettings.RegisterValueType.rv_sint16_exp)
         return 3;
     else if (valueType == RegisterSettings.RegisterValueType.rv_sint32)
         return 4;
     else if (valueType == RegisterSettings.RegisterValueType.rv_bcd)
     {
         return (UInt16)((size + 1) / 2);
     }
     else if (valueType == RegisterSettings.RegisterValueType.rv_string)
         return (UInt16)size;
     else
         return 0;
 }
Esempio n. 3
0
        public static void DecimalToBytes(DeviceAlgorithm device, decimal value, RegisterSettings.RegisterValueType valueType, ref byte[] registerData, int size, int registerIndex, bool cStringNull)
        {
            byte[] bytes = null;

            // rv_uint16_exp and rv_sint16_exp not supported for data writes
            // ordered to minimise tests
            if (valueType == RegisterSettings.RegisterValueType.rv_uint16)
                bytes = device.Params.EndianConverter16Bit.GetExternalBytes((UInt16)value);
            else if (valueType == RegisterSettings.RegisterValueType.rv_uint32)
                bytes = device.Params.EndianConverter32Bit.GetExternalBytes((UInt32)value);
            else if (valueType == RegisterSettings.RegisterValueType.rv_byte)
            {
                bytes = new byte[1];
                bytes[0] = (byte)value;
            }
            else if (valueType == RegisterSettings.RegisterValueType.rv_sint16)
                bytes = device.Params.EndianConverter16Bit.GetExternalBytes((Int16)value);
            else if (valueType == RegisterSettings.RegisterValueType.rv_sint32)
                bytes = device.Params.EndianConverter32Bit.GetExternalBytes((Int32)value);
            else if (valueType == RegisterSettings.RegisterValueType.rv_bcd)
                bytes = EndianConverter32Bit.GetBCDFromDecimal(value, size, 0, false);
            else if (valueType == RegisterSettings.RegisterValueType.rv_string)
                bytes = StringToBytes(value.ToString(), size, cStringNull ? (byte)0 : (byte)' ');

            int j = registerIndex;
            for (int i = 0; i < bytes.Length; )
                registerData[j++] = bytes[i++];
        }
Esempio n. 4
0
        public static string FroniusModelFromBytes(DeviceAlgorithm device, RegisterSettings.RegisterValueType valueType, ref byte[] input, int size, int start, bool cStringNull)
        {
            if (size != 1)
                return "Unknown";

            byte id = input[start];

            foreach (FroniusModel model in FroniusModels)
                if (id == model.Id)
                    return model.Name;

            return "Fronius - Unknown";
        }
Esempio n. 5
0
        public static decimal BytesToDecimal(DeviceAlgorithm device, RegisterSettings.RegisterValueType valueType, ref byte[] registerData, int size, int registerIndex, bool cStringNull)
        {
            Decimal val = 0;

            // ordered to minimise tests
            if (valueType == RegisterSettings.RegisterValueType.rv_uint16)
                val = device.Params.EndianConverter16Bit.GetUInt16FromBytes(ref registerData, registerIndex);
            else if (valueType == RegisterSettings.RegisterValueType.rv_uint16_exp)
            {
                UInt16 raw = device.Params.EndianConverter16Bit.GetUInt16FromBytes(ref registerData, registerIndex);
                byte exp = registerData[registerIndex + 2];
                val = ApplyExponent(raw, exp);
            }
            else if (valueType == RegisterSettings.RegisterValueType.rv_uint32)
                val = device.Params.EndianConverter32Bit.GetUInt32FromBytes(ref registerData, registerIndex);
            else if (valueType == RegisterSettings.RegisterValueType.rv_byte)
                val = registerData[registerIndex];
            else if (valueType == RegisterSettings.RegisterValueType.rv_sint16)
                val = device.Params.EndianConverter16Bit.GetInt16FromBytes(ref registerData, registerIndex);
            else if (valueType == RegisterSettings.RegisterValueType.rv_sint16_exp)
            {
                Int16 raw = device.Params.EndianConverter16Bit.GetInt16FromBytes(ref registerData, registerIndex);
                byte exp = registerData[registerIndex + 2];
                val = ApplyExponent(raw, exp);
            }
            else if (valueType == RegisterSettings.RegisterValueType.rv_sint32)
                val = device.Params.EndianConverter32Bit.GetInt32FromBytes(ref registerData, registerIndex);
            else if (valueType == RegisterSettings.RegisterValueType.rv_bcd)
                val = EndianConverter32Bit.GetDecimalFromBCD(ref registerData, size, registerIndex);
            else if (valueType == RegisterSettings.RegisterValueType.rv_string)
                val = Decimal.Parse(RegisterString.BytesToString(device, valueType, ref registerData, size, registerIndex, cStringNull));

            return val;
        }
Esempio n. 6
0
        public static String BytesToString(DeviceAlgorithm device, RegisterSettings.RegisterValueType valueType, ref byte[] input, int size, int start, bool cStringNull)
        {
            if (valueType == RegisterSettings.RegisterValueType.rv_string)
            {
                int outSize = size;
                if (start + outSize > input.Length)
                    outSize = input.Length - start;
                if (outSize < 1)
                    // return "";
                    // Need to know if this is occuring
                    throw new ConvException("BytesToString size error - Size: " + size + " - Start: " + start);

                char[] output = new char[outSize];
                int inPos = start;
                int strSize = outSize;

                for (int i = 0; i < outSize; i++)
                {
                    byte b = input[inPos];
                    if (cStringNull && b == 0)
                    {
                        strSize = inPos - start;
                        break;
                    }
                    output[i] = (char)b;
                    inPos++;
                }

                StringBuilder sb = new StringBuilder(output.Length);
                sb.Append(output, 0, strSize);

                return sb.ToString();
            }

            if (valueType == RegisterSettings.RegisterValueType.rv_bytes)
                return "";

            return RegisterNumber.BytesToDecimal(device, valueType, ref input, size, start, cStringNull).ToString();
        }
 internal static void LoadRegisters(string name, DeviceManagementSettings rootSettings, XmlElement parent, ref ObservableCollection<RegisterSettings> registerList)
 {
     registerList = new ObservableCollection<RegisterSettings>();
     foreach (XmlNode e in parent.ChildNodes)
     {
         if (e.NodeType == XmlNodeType.Element && e.Name == name)
         {
             RegisterSettings register = new RegisterSettings((DeviceManagementSettings)rootSettings, (XmlElement)e);
             registerList.Add(register);
         }
     }
 }
 public RegisterValueDecimal(RegisterSettings settings)
     : base(settings)
 {
 }
        protected internal Register GetRegister(DeviceBlock block, RegisterSettings settings)
        {
            String itemName = settings.Content;

            if (itemName != "")
            {
                VariableEntry var = FindVariable(itemName);

                if (var != null)
                {
                    if (var.GetType() == typeof(VariableEntry_Numeric))
                        return new RegisterNumber(block, settings, ((VariableEntry_Numeric)var).SetValueDelegate, ((VariableEntry_Numeric)var).GetValueDelegate);
                    else if (var.GetType() == typeof(VariableEntry_String))
                        return new RegisterString(block, settings, ((VariableEntry_String)var).SetValueDelegate, ((VariableEntry_String)var).GetValueDelegate);
                    else if (var.GetType() == typeof(VariableEntry_Bytes))
                        return new RegisterBytes(block, settings, ((VariableEntry_Bytes)var).SetValueDelegate, ((VariableEntry_Bytes)var).GetValueDelegate);
                }
                // some devices do not need external exposure of the Register entries - eg CC128
                // LogMessage("Device.GetRegister - Cannot find 'Content': " + itemName, LogEntryType.Trace);
            }

            RegisterSettings.RegisterValueType type = settings.Type;

            if (type == RegisterSettings.RegisterValueType.rv_bytes)
                return new RegisterBytes(block, settings, null);
            if (type == RegisterSettings.RegisterValueType.rv_string)
                return new RegisterString(block, settings, null);

            return new RegisterNumber(block, settings, null);
        }
 public RegisterValue(Register register)
 {
     Register = register;
     RegisterSettings = register.Settings;
 }
 public static RegisterValue BuildRegisterValue(RegisterSettings settings)
 {
     RegisterValueType type = settings.Type;
     if (type == RegisterValueType.rv_bytes)
         return new RegisterValueBytes(settings);
     if (type == RegisterValueType.rv_string)
         return new RegisterValueString(settings);
     else
         return new RegisterValueDecimal(settings);
 }
 public RegisterValue(RegisterSettings settings)
 {
     RegisterSettings = settings;
 }
 public RegisterValueString(RegisterSettings settings)
     : base(settings)
 {
 }
Esempio n. 14
0
 public RegisterBytes(DeviceBlock deviceBlock, RegisterSettings settings,
     SetBytesValueDelegate setValue, GetBytesValueDelegate getValue = null)
     : base(deviceBlock, settings)
 {
     String defaultValue = Settings.RegisterValue;
     if (defaultValue != null)
         RegisterValueBytes = new RegisterValueBytes(this, defaultValue);
     if (RegisterValueBytes != null)
     {
         HasFixedValue = true;
         MappedToRegisterData &= (Device.Params.Protocol.Type == ProtocolSettings.ProtocolType.Modbus);
         _Value = RegisterValueBytes.ValueBytes;
     }
     else
     {
         HasFixedValue = false;
         _Value = null;
     }
     SetBytesValueInternal = setValue;
     GetBytesValueInternal = getValue;
     LoadExtractor(settings.Extractor);
     LoadInserter(settings.Inserter);
 }
Esempio n. 15
0
        protected Register(DeviceBlock deviceBlock, RegisterSettings settings)
        {
            //SendBufferStartPos = 0;
            //ReceiveBufferStartPos = 0;
            PayloadPosition = settings.Position;

            Name = settings.Name;
            Content = settings.Content;

            Settings = settings;
            DeviceBlock = deviceBlock;
            Device = deviceBlock.Device;
            ValueType = settings.Type;
            Message = settings.Message;
            BindingName = settings.Binding;
            Binding = DeviceBlock.Conversation.GetVariable(BindingName);
            if (Binding == null)
            {
                BoundToSend = false;
                BoundToRead = false;
                BoundToFind = false;
                BoundToExtract = false;
            }
            else
            {
                bool res = DeviceBlock.Conversation.GetVariableUsage(BindingName, out BoundToSend, out BoundToRead, out BoundToFind, out BoundToExtract);
                if (!res)
                    LogMessage("Register Constructor - Variable: " + BindingName + " - not used in conversation: " + DeviceBlock.Conversation, LogEntryType.ErrorMessage);
            }
            MappedToRegisterData = (DeviceBlock.GetType() == typeof(DeviceBlock_Modbus) && settings.Id.HasValue)
                || (DeviceBlock.GetType() != typeof(DeviceBlock_Modbus) && BindingName == "");
            //IsContent = Content != "";
            StartRegister = settings.Id.HasValue ? settings.Id.Value : (UInt16)0;
            RegisterCount = settings.RegisterCount;
            UInt16? size = settings.Size;
            Size = size.HasValue ? size.Value : (UInt16)(RegisterCount * 2);
            FixedSize = settings.Size;
            IsAlarmFlag = settings.IsAlarmFlag;
            IsAlarmDetail = settings.IsAlarmDetail;
            IsErrorFlag = settings.IsErrorFlag;
            IsErrorDetail = settings.IsErrorDetail;
            IsHexadecimal = settings.IsHexadecimal;
            IsCString = settings.IsCString;

            LoadValueList();
        }
Esempio n. 16
0
        public RegisterNumber(DeviceBlock deviceBlock, RegisterSettings settings,
            SetNumberValueDelegate setValue, GetNumberValueDelegate getValue = null)
            : base(deviceBlock, settings)
        {
            UseScale = false;
            _ScaleFactor = 1;
            Inserter = null;
            String defaultValue = Settings.RegisterValue;
            if (defaultValue != null)
                RegisterValueNumber = new RegisterValueNumber(this, defaultValue);
            if (RegisterValueNumber != null)
            {
                HasFixedValue = true;
                MappedToRegisterData &= (Device.Params.Protocol.Type == ProtocolSettings.ProtocolType.Modbus);
                _Value = RegisterValueNumber.ValueDecimal;
            }
            else
                HasFixedValue = false;
            SetNumberValueInternal = setValue;
            GetNumberValueInternal = getValue;
            UseScale = settings.UseScale;
            ScaleValueType = settings.ScaleValueType;
            if (UseScale)
                _ScaleFactor = 1 / settings.DefaultScale;

            LoadExtractor(settings.Extractor);
            LoadInserter(settings.Inserter);
        }
 public RegisterValueBytes(RegisterSettings settings)
     : base(settings)
 {
     _Value = null;
 }