Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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());
        }