Skip to content

Commit db2301f

Browse files
author
sven.ginka
committed
add: writing to modbus in advancedGUI
1 parent bd1555e commit db2301f

File tree

3 files changed

+208
-55
lines changed

3 files changed

+208
-55
lines changed

EasyModbusAdvancedClient/EasyModbusManager.cs

Lines changed: 173 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2929
using System.Xml.Linq;
3030
using System.Linq;
3131
using System.Xml;
32+
using EasyModbus;
3233

3334
namespace EasyModbusAdvancedClient
3435
{
@@ -94,6 +95,9 @@ public void EditConnection(ConnectionProperties connectionProperty, int connecti
9495

9596
public void AddFunctionProperty(FunctionProperties functionProperty, int connectionNumber)
9697
{
98+
// create link to connection
99+
functionProperty.Connection = connectionPropertiesList[connectionNumber];
100+
// add to list
97101
connectionPropertiesList[connectionNumber].FunctionPropertiesList.Add(functionProperty);
98102
if (connectionPropertiesListChanged != null)
99103
connectionPropertiesListChanged(this);
@@ -126,18 +130,18 @@ public void GetValues(ConnectionProperties connectionProperties, int functionPro
126130
modbusClient.Connect();
127131
}
128132

129-
switch (connectionProperties.FunctionPropertiesList[functionPropertyID].FunctionCode)
133+
switch (connectionProperties.FunctionPropertiesList[functionPropertyID].FunctionCodeRead)
130134
{
131-
case FunctionCode.ReadCoils:
135+
case FunctionCodeRd.ReadCoils:
132136
connectionProperties.FunctionPropertiesList[functionPropertyID].values = modbusClient.ReadCoils(connectionProperties.FunctionPropertiesList[functionPropertyID].StartingAdress, connectionProperties.FunctionPropertiesList[functionPropertyID].Quantity);
133137
break;
134-
case FunctionCode.ReadDiscreteInputs:
138+
case FunctionCodeRd.ReadDiscreteInputs:
135139
connectionProperties.FunctionPropertiesList[functionPropertyID].values = modbusClient.ReadDiscreteInputs(connectionProperties.FunctionPropertiesList[functionPropertyID].StartingAdress, connectionProperties.FunctionPropertiesList[functionPropertyID].Quantity);
136140
break;
137-
case FunctionCode.ReadHoldingRegisters:
141+
case FunctionCodeRd.ReadHoldingRegisters:
138142
connectionProperties.FunctionPropertiesList[functionPropertyID].values = modbusClient.ReadHoldingRegisters(connectionProperties.FunctionPropertiesList[functionPropertyID].StartingAdress, connectionProperties.FunctionPropertiesList[functionPropertyID].Quantity);
139143
break;
140-
case FunctionCode.ReadInputRegisters:
144+
case FunctionCodeRd.ReadInputRegisters:
141145
connectionProperties.FunctionPropertiesList[functionPropertyID].values = modbusClient.ReadInputRegisters(connectionProperties.FunctionPropertiesList[functionPropertyID].StartingAdress, connectionProperties.FunctionPropertiesList[functionPropertyID].Quantity);
142146
break;
143147
default: break;
@@ -157,18 +161,18 @@ public void GetValues(ConnectionProperties connectionProperties)
157161
modbusClient.Connect();
158162
}
159163
foreach (FunctionProperties functionProperty in connectionProperties.FunctionPropertiesList)
160-
switch (functionProperty.FunctionCode)
164+
switch (functionProperty.FunctionCodeRead)
161165
{
162-
case FunctionCode.ReadCoils:
166+
case FunctionCodeRd.ReadCoils:
163167
functionProperty.values = modbusClient.ReadCoils(functionProperty.StartingAdress, functionProperty.Quantity);
164168
break;
165-
case FunctionCode.ReadDiscreteInputs:
169+
case FunctionCodeRd.ReadDiscreteInputs:
166170
functionProperty.values = modbusClient.ReadDiscreteInputs(functionProperty.StartingAdress, functionProperty.Quantity);
167171
break;
168-
case FunctionCode.ReadHoldingRegisters:
172+
case FunctionCodeRd.ReadHoldingRegisters:
169173
functionProperty.values = modbusClient.ReadHoldingRegisters(functionProperty.StartingAdress, functionProperty.Quantity);
170174
break;
171-
case FunctionCode.ReadInputRegisters:
175+
case FunctionCodeRd.ReadInputRegisters:
172176
functionProperty.values = modbusClient.ReadInputRegisters(functionProperty.StartingAdress, functionProperty.Quantity);
173177
break;
174178
default: break;
@@ -181,29 +185,84 @@ public void GetValues(ConnectionProperties connectionProperties)
181185
public event ConnectionPropertiesListChanged connectionPropertiesListChanged;
182186

183187

184-
public static string getAddress(FunctionCode functionCode, int startingAddress, int quantity, int elementCount)
188+
public static string getAddress(FunctionCodeRd functionCode, int startingAddress, int quantity, int elementCount)
185189
{
186190
string returnValue = null;
187191
if ((startingAddress + elementCount) <= (startingAddress + quantity))
188192
switch (functionCode)
189193
{
190-
case FunctionCode.ReadCoils:
194+
case FunctionCodeRd.ReadCoils:
191195
returnValue = "0x" + (startingAddress + elementCount + 1).ToString();
192196
break;
193-
case FunctionCode.ReadDiscreteInputs:
197+
case FunctionCodeRd.ReadDiscreteInputs:
194198
returnValue = "1x" + (startingAddress + elementCount + 1).ToString();
195199
break;
196-
case FunctionCode.ReadHoldingRegisters:
200+
case FunctionCodeRd.ReadHoldingRegisters:
197201
returnValue = "4x" + (startingAddress + elementCount + 1).ToString();
198202
break;
199-
case FunctionCode.ReadInputRegisters:
203+
case FunctionCodeRd.ReadInputRegisters:
200204
returnValue = "3x" + (startingAddress + elementCount + 1).ToString();
201205
break;
202206
default: break;
203207
}
204208
return returnValue;
205209
}
206210

211+
public static int[] StrToValues(FunctionProperties functionProperties, string str)
212+
{
213+
int[] values = { };
214+
switch (functionProperties.FunctionCodeWrite)
215+
{
216+
case FunctionCodeWr.WriteHoldingRegisters:
217+
int value = 0;
218+
if (Int32.TryParse(str, out value))
219+
{
220+
// add
221+
int[] x = { value };
222+
return x;
223+
224+
}
225+
226+
break;
227+
}
228+
return values;
229+
}
230+
231+
public FunctionProperties FindPropertyFromGrid( int gridRow)
232+
{
233+
foreach (ConnectionProperties connection in connectionPropertiesList)
234+
{
235+
foreach (FunctionProperties functionProperty in connection.FunctionPropertiesList)
236+
{
237+
if (functionProperty.DataGridRow == gridRow)
238+
{
239+
return functionProperty;
240+
}
241+
}
242+
}
243+
244+
return null;
245+
}
246+
247+
public void WriteToServer(FunctionProperties prop, int[] values)
248+
{
249+
string text = "";
250+
text += "property " + prop.StartingAdress + "\n" + "type " + prop.FunctionCodeWrite.ToString() + "\n" + "new value: " + prop.values.ToString() + "\n";
251+
text += "connection " + prop.Connection.ConnectionName;
252+
MessageBox.Show(text, "updating register");
253+
254+
int startingAddress = prop.StartingAdress;
255+
switch(prop.FunctionCodeWrite)
256+
{
257+
case FunctionCodeWr.WriteHoldingRegisters:
258+
prop.Connection.modbusClient.WriteMultipleRegisters(startingAddress, values);
259+
break;
260+
261+
}
262+
263+
264+
}
265+
207266
public void WriteXML(DataGridView dataGridView)
208267
{
209268
XmlDocument xmlDocument = new XmlDocument();
@@ -233,8 +292,11 @@ public void WriteXML(DataGridView dataGridView)
233292
for (int j = 0; j < this.connectionPropertiesList[i].FunctionPropertiesList.Count; j++)
234293
{
235294
xmlNodeFunctionCodes = xmlDocument.CreateElement("functionCodes");
236-
xmlNodeFunctionCodesProp = xmlDocument.CreateElement("functionCode");
237-
xmlNodeFunctionCodesProp.InnerText = this.connectionPropertiesList[i].FunctionPropertiesList[j].FunctionCode.ToString();
295+
xmlNodeFunctionCodesProp = xmlDocument.CreateElement("functionCodeRead");
296+
xmlNodeFunctionCodesProp.InnerText = this.connectionPropertiesList[i].FunctionPropertiesList[j].FunctionCodeRead.ToString();
297+
xmlNodeFunctionCodes.AppendChild(xmlNodeFunctionCodesProp);
298+
xmlNodeFunctionCodesProp = xmlDocument.CreateElement("functionCodeWrite");
299+
xmlNodeFunctionCodesProp.InnerText = this.connectionPropertiesList[i].FunctionPropertiesList[j].FunctionCodeWrite.ToString();
238300
xmlNodeFunctionCodes.AppendChild(xmlNodeFunctionCodesProp);
239301
xmlNodeFunctionCodesProp = xmlDocument.CreateElement("quantity");
240302
xmlNodeFunctionCodesProp.InnerText = this.connectionPropertiesList[i].FunctionPropertiesList[j].Quantity.ToString();
@@ -295,10 +357,13 @@ public void ReadXML(DataGridView dataGridView)
295357
xmlNodeList = xmlDocument.GetElementsByTagName("connection");
296358
//connectionPropertiesList = new List<ConnectionProperties>();
297359
this.connectionPropertiesList.Clear();
360+
int slotId = 0;
298361

299362
foreach (XmlNode xmlNode in xmlNodeList)
300363
{
301364
ConnectionProperties connectionProperty = new ConnectionProperties();
365+
AddConnection(connectionProperty);
366+
302367
connectionProperty.ConnectionName = (xmlNode["connectionName"].InnerText);
303368
connectionProperty.ModbusTCPAddress = (xmlNode["ipAddress"].InnerText);
304369
connectionProperty.Port = Int32.Parse(xmlNode["port"].InnerText);
@@ -309,33 +374,56 @@ public void ReadXML(DataGridView dataGridView)
309374
{
310375
xmlNodeList2 = xmlNode3.ChildNodes;
311376
FunctionProperties functionProperty = new FunctionProperties();
377+
312378
foreach (XmlNode xmlNode2 in xmlNodeList2)
313379
{
314-
if (xmlNode2.Name == "functionCode")
380+
if (xmlNode2.Name == "functionCodeRead")
315381
switch (xmlNode2.InnerText)
316382
{
317383
case "ReadCoils":
318-
functionProperty.FunctionCode = FunctionCode.ReadCoils;
384+
functionProperty.FunctionCodeRead = FunctionCodeRd.ReadCoils;
319385
break;
320386
case "ReadDiscreteInputs":
321-
functionProperty.FunctionCode = FunctionCode.ReadDiscreteInputs;
387+
functionProperty.FunctionCodeRead = FunctionCodeRd.ReadDiscreteInputs;
322388
break;
323389
case "ReadHoldingRegisters":
324-
functionProperty.FunctionCode = FunctionCode.ReadHoldingRegisters;
390+
functionProperty.FunctionCodeRead = FunctionCodeRd.ReadHoldingRegisters;
325391
break;
326392
case "ReadInputRegisters":
327-
functionProperty.FunctionCode = FunctionCode.ReadInputRegisters;
393+
functionProperty.FunctionCodeRead = FunctionCodeRd.ReadInputRegisters;
328394
break;
329395
}
396+
if (xmlNode2.Name == "functionCodeWrite")
397+
{
398+
functionProperty.FunctionCodeWrite = FunctionCodeWr.WriteNone;
399+
switch (xmlNode2.InnerText)
400+
{
401+
case "WriteCoils":
402+
functionProperty.FunctionCodeWrite = FunctionCodeWr.WriteNone;
403+
break;
404+
case "WriteDiscreteInputs":
405+
functionProperty.FunctionCodeWrite = FunctionCodeWr.WriteNone;
406+
break;
407+
case "WriteHoldingRegisters":
408+
functionProperty.FunctionCodeWrite = FunctionCodeWr.WriteHoldingRegisters;
409+
break;
410+
case "WriteInputRegisters":
411+
functionProperty.FunctionCodeWrite = FunctionCodeWr.WriteNone;
412+
break;
413+
}
414+
415+
}
330416
if (xmlNode2.Name == "startingAddress")
331417
functionProperty.StartingAdress = Int32.Parse(xmlNode2.InnerText);
332418
if (xmlNode2.Name == "quantity")
333419
functionProperty.Quantity = Int32.Parse(xmlNode2.InnerText);
334420
}
335-
connectionProperty.FunctionPropertiesList.Add(functionProperty);
421+
//connectionProperty.FunctionPropertiesList.Add(functionProperty);
422+
this.AddFunctionProperty(functionProperty, slotId);
423+
336424
xmlNode3 = xmlNode3.NextSibling;
337425
}
338-
AddConnection(connectionProperty);
426+
slotId++;
339427
//this.connectionPropertiesList.Add(connectionProperty);
340428
}
341429
if (connectionPropertiesListChanged != null)
@@ -361,37 +449,59 @@ public void ReadXML(DataGridView dataGridView)
361449
if (xmlNode["columnDataType"] != null)
362450
dataGridView[3, dataGridView.Rows.Count - 1].Value = xmlNode["columnDataType"].InnerText;
363451
}
452+
453+
// trigger update of values manually
454+
//this.valuesChanged(this);
455+
364456
dataGridView.AllowUserToAddRows = true;
365457
}
366458
}
367459

368460

369-
public enum FunctionCode : int
461+
public enum FunctionCodeRd : int
370462
{
371463
ReadCoils = 1,
372464
ReadDiscreteInputs = 2,
373465
ReadHoldingRegisters = 3,
374466
ReadInputRegisters = 4,
375467
};
376-
377-
378-
public class FunctionProperties
468+
469+
public enum FunctionCodeWr : int
470+
{
471+
WriteNone = 0,
472+
WriteCoils = 1,
473+
WriteDiscreteInputs = 2,
474+
WriteHoldingRegisters = 3,
475+
WriteInputRegisters = 4,
476+
};
477+
478+
479+
public class FunctionProperties
379480
{
380481

381-
FunctionCode funtionCode = FunctionCode.ReadCoils;
382-
383-
[Browsable(true)]
482+
FunctionCodeRd functionCodeRd = FunctionCodeRd.ReadCoils;
483+
[Browsable(true)]
384484
[Category("Function code properties")]
385-
[Description("Function Code")]
386-
[DisplayName("Function Code")]
387-
public FunctionCode FunctionCode
485+
[Description("Function Code Read")]
486+
[DisplayName("Function Code Read")]
487+
public FunctionCodeRd FunctionCodeRead
388488
{
389-
get {return funtionCode;}
390-
set {funtionCode = value;}
489+
get {return functionCodeRd; }
490+
set { functionCodeRd = value;}
391491
}
392-
393-
394-
int startingAdress = 0;
492+
493+
FunctionCodeWr functionCodeWr = FunctionCodeWr.WriteNone;
494+
[Browsable(true)]
495+
[Category("Function code properties")]
496+
[Description("Function Code Write")]
497+
[DisplayName("Function Code Write")]
498+
public FunctionCodeWr FunctionCodeWrite
499+
{
500+
get { return functionCodeWr; }
501+
set { functionCodeWr = value; }
502+
}
503+
504+
int startingAdress = 0;
395505
[Browsable(true)]
396506
[Category("Function code properties")]
397507
[Description("Starting Address")]
@@ -413,7 +523,29 @@ public int Quantity
413523
get {return quantity;}
414524
set {quantity = value;}
415525
}
416-
417-
public object values;
526+
527+
int DataGridRowIdx = -1;
528+
[Browsable(false)]
529+
[Category("Function code properties")]
530+
[Description("Data Grid Row Idx")]
531+
[DisplayName("Data Grid Row Idx")]
532+
public int DataGridRow
533+
{
534+
get { return DataGridRowIdx; }
535+
set { DataGridRowIdx = value; }
536+
}
537+
538+
ConnectionProperties connection= null;
539+
[Browsable(false)]
540+
[Category("Function code properties")]
541+
[Description("connection")]
542+
[DisplayName("connection")]
543+
public ConnectionProperties Connection
544+
{
545+
get { return connection; }
546+
set { connection = value; }
547+
}
548+
549+
public object values;
418550
}
419551
}

EasyModbusAdvancedClient/MainForm.Designer.cs

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)