コード例 #1
0
        public void UpdateValue(Data data, bool readOnlyOverride = false)
        {
            var normalisedAddress = AddressTools.AddressNormalisation(data.Address);
            var addressType       = AddressTools.AddressType(data.Address);

            if (addressType != data.Type)
            {
                throw new DataTypeDoesNotMatchAddressException(data.Address.ToString());
            }

            if (ValueExists(data.Address))
            {
                switch (addressType)
                {
                case DataType.Coil:
                    Coils.Find(c => c.Address == normalisedAddress).Update(data.Value, readOnlyOverride);
                    break;

                case DataType.DiscreteInput:
                    DiscreteInputs.Find(c => c.Address == normalisedAddress).Update(data.Value, readOnlyOverride);
                    break;

                case DataType.InputRegister:
                    InputRegisters.Find(c => c.Address == normalisedAddress).Update(data.Value, readOnlyOverride);
                    break;

                case DataType.HoldingRegister:
                    HoldingRegisters.Find(c => c.Address == normalisedAddress).Update(data.Value, readOnlyOverride);
                    break;
                }
            }
            else
            {
                var normalisedData = Data.Create(normalisedAddress, data.Type);

                switch (addressType)
                {
                case DataType.Coil:
                    Coils.Add(normalisedData);
                    break;

                case DataType.DiscreteInput:
                    DiscreteInputs.Add(normalisedData);
                    break;

                case DataType.InputRegister:
                    InputRegisters.Add(normalisedData);
                    break;

                case DataType.HoldingRegister:
                    HoldingRegisters.Add(normalisedData);
                    break;
                }
            }
        }
コード例 #2
0
        public bool ValueExists(int address)
        {
            var normalisedAddress = AddressTools.AddressNormalisation(address);
            var addressType       = AddressTools.AddressType(address);

            switch (addressType)
            {
            case DataType.Coil:
                return(Coils.Exists(c => c.Address == normalisedAddress));

            case DataType.DiscreteInput:
                return(DiscreteInputs.Exists(c => c.Address == normalisedAddress));

            case DataType.InputRegister:
                return(InputRegisters.Exists(c => c.Address == normalisedAddress));

            case DataType.HoldingRegister:
                return(HoldingRegisters.Exists(c => c.Address == normalisedAddress));
            }

            return(false);
        }
コード例 #3
0
ファイル: Adam6000.cs プロジェクト: JMatveichik/BatteryTest
        public override void UpdateData()
        {
            int iDiStart = 1;  //start address for discrete inputs

            if (DiscreteInputs != null)
            {
                bool[] bData;

                if (socket.Modbus().ReadCoilStatus(iDiStart, DiscreteInputs.Count, out bData))
                {
                    for (int i = 0; i < DiscreteInputs.Count; i++)
                    {
                        DiscreteInputs.Set(i, bData[i]);
                    }

                    OnUpdateDI(DiscreteInputs);
                }
                else
                {
                }
            }

            int iDoStart = 17; //start address for discrete outputs

            if (DiscreteOutputs != null)
            {
                bool[] bData;

                if (socket.Modbus().ReadCoilStatus(iDoStart, DiscreteOutputs.Count, out bData))
                {
                    for (int i = 0; i < DiscreteOutputs.Count; i++)
                    {
                        DiscreteOutputs.Set(i, bData[i]);
                    }

                    OnUpdateDO(DiscreteOutputs);
                }
                else
                {
                }
            }


            int iAiStart       = 1;
            int iAiStartStatus = 101;

            if (AnalogInputs != null)
            {
                int[]     iData;
                double [] aiData = new double[AnalogInputs.Count];
                if (socket.Modbus().ReadInputRegs(iAiStart, AnalogInputs.Count, out iData))
                {
                    for (int i = 0; i < AnalogInputs.Count; i++)
                    {
                        aiData[i] = AnalogInput.GetScaledValue(Model, AIRanges[i], iData[i]);
                    }
                }

                int[] iAIStatus;

                if (socket.Modbus().ReadInputRegs(iAiStartStatus, (AnalogInputs.Count * 2), out iAIStatus))
                {
                    for (int i = 0; i < AnalogInputs.Count; i++)
                    {
                        ProcessAnalogInputStatus(i, (ushort)iAIStatus[i * 2]);
                    }
                }

                OnUpdateAI(aiData);
            }

            if (AnalogOutputs != null)
            {
            }

            if (CounterInputs != null)
            {
                int   iCounterStart = 1;
                int[] iData;
                int[] counterData = new int[CounterInputs.Count];
                if (socket.Modbus().ReadInputRegs(iCounterStart, CounterInputs.Count * 2, out iData))
                {
                    for (int i = 0; i < CounterInputs.Count; i++)
                    {
                        counterData[i] = iData[2 * i + 1] * 65535 + iData[2 * i];
                    }

                    OnUpdateCounter(counterData);
                }
            }
        }