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; }
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; }
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++]; }
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"; }
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; }
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) { }
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); }
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(); }
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; }