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; } } }
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); }
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); } } }