public object[] Read(ReadParameter[] readParameters) { var values = new object[readParameters.Length]; for (var i = 0; i < readParameters.Length; i++) { ReadParameter readParameter = readParameters[i]; object value; if (_values.TryGetValue(readParameter.Address, out value)) { if (value == null || value.GetType() == readParameter.ValueType) { values[i] = value; } else { throw new Exception(string.Format( Res.TypeMismatchMessage, readParameter.Address, readParameter.ValueType, value.GetType())); } } else { if (readParameter.ValueType.IsClass) { ConstructorInfo constructor = readParameter.ValueType.GetConstructor(new Type[0]); if (constructor == null) { throw new Exception(string.Format( Res.ConstructorErrorMessage, readParameter.Address, readParameter.ValueType)); } values[i] = constructor.Invoke(new object[0]); } else { value = Activator.CreateInstance(readParameter.ValueType); values[i] = value; } } } return(values); }
public object[] ReadOnce(ReadParameter[] readParameters) { if (readParameters == null) { return(null); } var values = new List <object>(); Dictionary <byte, SlaveReadInfo> readInfos; List <KeyValuePair <ReadParameter, byte?> > readParamSlaveAddresses; GetParametersReadInfo(readParameters, out readInfos, out readParamSlaveAddresses); var result = new Dictionary <byte, SlaveReadResult>(); foreach (var slaveReadInfo in readInfos) { byte slaveAddress = slaveReadInfo.Key; var r = new SlaveReadResult(); result.Add(slaveAddress, r); SlaveReadInfo readInfo = slaveReadInfo.Value; SortReadInfoDevices(readInfo); r.CoilsData = new Dictionary <ushort, bool>(readInfo.Coils.Count); r.ContactsData = new Dictionary <ushort, bool>(readInfo.Contacts.Count); r.InputRegistersData = new Dictionary <KeyValuePair <ushort, int>, byte[]>(readInfo.InputRegisters.Count); r.HoldingRegistersData = new Dictionary <KeyValuePair <ushort, int>, byte[]>(readInfo.HoldingRegisters.Count); ReadBits(readInfo.Coils, slaveAddress, r.CoilsData, _mb.ReadCoils, "discrete coils"); ReadBits(readInfo.Contacts, slaveAddress, r.ContactsData, _mb.ReadContacts, "discrete contacts"); ReadRegisters(readInfo.InputRegisters, slaveAddress, r.InputRegistersData, _mb.ReadInputRegisters, "input registers"); ReadRegisters(readInfo.HoldingRegisters, slaveAddress, r.HoldingRegistersData, _mb.ReadHoldingRegisters, "holding registers"); } foreach (var k in readParamSlaveAddresses) { if (k.Value == null) { values.Add(null); continue; } byte slaveAddress = k.Value.Value; SlaveReadResult r; if (!result.TryGetValue(slaveAddress, out r)) { values.Add(null); continue; } SlaveReadInfo slaveReadInfo; if (readInfos.TryGetValue(slaveAddress, out slaveReadInfo)) { ReadParameter readParameter = k.Key; ushort bitAddress; KeyValuePair <ushort, int> registerAddress; if (slaveReadInfo.CoilsAddresses.TryGetValue(readParameter, out bitAddress)) { bool value; if (r.CoilsData.TryGetValue(bitAddress, out value)) { values.Add(value); } else { values.Add(null); } } else if (slaveReadInfo.ContactsAddresses.TryGetValue(readParameter, out bitAddress)) { bool value; if (r.ContactsData.TryGetValue(bitAddress, out value)) { values.Add(value); } else { values.Add(null); } } else if (slaveReadInfo.InputRegistersAddresses.TryGetValue(readParameter, out registerAddress)) { byte[] value; values.Add(r.InputRegistersData.TryGetValue(registerAddress, out value) ? GetValue(value, readParameter.ValueType) : null); } else if (slaveReadInfo.HoldingRegistersAddresses.TryGetValue(readParameter, out registerAddress)) { byte[] value; values.Add(r.HoldingRegistersData.TryGetValue(registerAddress, out value) ? GetValue(value, readParameter.ValueType) : null); } } else { values.Add(null); } } return(values.ToArray()); }