@@ -29,6 +29,7 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2929using System . Xml . Linq ;
3030using System . Linq ;
3131using System . Xml ;
32+ using EasyModbus ;
3233
3334namespace 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}
0 commit comments