2using System.Collections.Generic;
3using System.Threading.Tasks;
25 this.Multiplier = 1.0;
32 [Page(4,
"Modbus", 100)]
33 [Header(13,
"Register Number:")]
34 [ToolTip(14,
"Register number on the Modbus unit.")]
42 [Page(4,
"Modbus", 100)]
43 [Header(25,
"Raw Name:")]
44 [ToolTip(26,
"Custom field name for raw value.")]
45 [DefaultValueStringEmpty]
51 [Page(4,
"Modbus", 100)]
52 [Header(11,
"Field Name:")]
53 [ToolTip(12,
"Custom field name for value.")]
54 [DefaultValueStringEmpty]
60 [Page(4,
"Modbus", 100)]
61 [Header(18,
"Multiplier:")]
62 [ToolTip(19,
"Multiplier will be multiplied to the register before reporting value.")]
64 [Text(
TextPosition.BeforeField, 24,
"Raw value will be transformed as follows: Value = ((Raw * Multiplier) / Divisor) + Offset. To this transformed value, the unit will be added.")]
70 [Page(4,
"Modbus", 100)]
71 [Header(20,
"Divisor:")]
72 [ToolTip(21,
"Divisor will be divided from the register (after multiplication) before reporting value.")]
79 [Page(4,
"Modbus", 100)]
80 [Header(22,
"Offset:")]
81 [ToolTip(23,
"Offset will be addded to the register (after division) before reporting value.")]
88 [Page(4,
"Modbus", 100)]
90 [ToolTip(17,
"Unit of register value (after scaling and offset).")]
91 [DefaultValueStringEmpty]
92 public string Unit {
get;
set; }
97 [Page(4,
"Modbus", 100)]
98 [Header(46,
"Switch byte order.")]
99 [ToolTip(47,
"If checked, byte order in registers will be reversed.")]
100 [DefaultValue(
false)]
121 LinkedList<Parameter> Result = await base.GetDisplayableParametersAsync(
Language, Caller) as LinkedList<Parameter>;
135 await Client.
Enter();
141 int NrDec = Math.Min(255, Math.Max(0, (
int)Math.Ceiling(-Math.Log10(
this.Multiplier /
this.Divisor))));
142 DateTime TP = DateTime.UtcNow;
145 List<Field> Fields =
new List<Field>
150 if (!
string.IsNullOrEmpty(this.
RawName))
161 await Client.
Leave();
171 if (
string.IsNullOrEmpty(this.
FieldName))
183 List<ControlParameter> Parameters =
new List<ControlParameter>()
190 await Client.
Enter();
198 await Client.
Leave();
201 async (Node, Value) =>
204 await Client.
Enter();
207 ushort Raw = (ushort)Math.Min(65535, Math.Max(0, ((Value -
this.Offset) *
this.Divisor) /
this.Multiplier));
211 if (WritenValue != Value)
212 throw new Exception(
"Register value not changed correctly.");
216 await Client.
Leave();
221 if (!
string.IsNullOrEmpty(this.
RawName))
227 await Client.
Enter();
235 await Client.
Leave();
238 async (Node, Value) =>
241 await Client.
Enter();
247 if (WritenValue != Value)
248 throw new Exception(
"Register value not changed correctly.");
252 await Client.
Leave();
257 return Task.FromResult(Parameters.ToArray());
264 ushort Value2 = (ushort)(Value & 0xff);
266 Value2 |= (ushort)(Value >> 8);
Task Leave()
Leaves unique access to the TCP client. Must be called exactly one for each call to Enter.
async Task< ushort[]> ReadMultipleRegisters(byte UnitAddress, ushort ReferenceNumber, ushort NrWords)
Reads multiple registers from a Modbus unit.
Task Enter()
Enters unique access to the TCP client. Must be followed by exactly one Leave call.
async Task< ushort > WriteRegister(byte UnitAddress, ushort ReferenceNumber, ushort Value)
Write to a single register
Contains information about a language.
Task< string > GetStringAsync(Type Type, int Id, string Default)
Gets the string value of a string ID. If no such string exists, a string is created with the default ...
Double control parameter.
Node representing a TCP/IP connection to a Modbus Gateway
Abstract base class for child nodes to Mobus Unit nodes.
async Task< ModbusGatewayNode > GetGateway()
Modbus Gateway node.
async Task< ModbusUnitNode > GetUnitNode()
Modbus Unit node.
async Task< ThingReference > GetReportAs()
Under what node fields are to be reported.
Represents a holding register on a Modbus unit node.
string FieldName
Custom field name
string RawName
Custom field name
override async Task< IEnumerable< Parameter > > GetDisplayableParametersAsync(Language Language, RequestOrigin Caller)
Gets displayable parameters.
string GetFieldName()
Gets the field name of the node.
int RegisterNr
Register number
override Task< string > GetTypeNameAsync(Language Language)
Gets the type name of the node.
Task< ControlParameter[]> GetControlParameters()
Get control parameters for the actuator.
async Task StartReadout(ISensorReadout Request)
Starts the readout of the sensor.
double Multiplier
Multiplier
ModbusUnitHoldingRegisterNode()
Represents a register on a Modbus unit node.
bool SwitchByteOrder
If the byte order in words should be switched.
Tokens available in request.
Represents a 32-bit integer value.
Represents a physical quantity value.
Contains information about an error on a thing
Contains a reference to a thing
Interface for actuator nodes.
Interface for sensor nodes.
Interface for classes managing sensor data readouts.
Task ReportErrors(bool Done, params ThingError[] Errors)
Report error states to the client.
Task ReportFields(bool Done, params Field[] Fields)
Report read fields to the client.
TextPosition
Where the instructions are to be place.
FieldQoS
Field Quality of Service flags
FieldType
Field Type flags