6
6
using System . Threading . Tasks ;
7
7
using uPLibrary . Networking . M2Mqtt . Messages ;
8
8
using System . IO . Ports ;
9
+ using System . Diagnostics ;
9
10
10
11
namespace EasyModbus
11
12
{
@@ -47,6 +48,9 @@ public void AddReadOrder(ReadOrder readOrder)
47
48
if ( readOrder . Scale != null )
48
49
if ( readOrder . Scale . Length != readOrder . Quantity )
49
50
throw new ArgumentOutOfRangeException ( "Size of the Scale array must mach with quantity" ) ;
51
+ if ( readOrder . Retain != null )
52
+ if ( readOrder . Retain . Length != readOrder . Quantity )
53
+ throw new ArgumentOutOfRangeException ( "Size of the Retain array must mach with quantity" ) ;
50
54
if ( readOrder . CylceTime == 0 )
51
55
readOrder . CylceTime = 500 ;
52
56
if ( readOrder . Topic == null )
@@ -124,6 +128,7 @@ public void AddReadOrder(FunctionCode functionCode, int quantity, int startingAd
124
128
readOrder . StartingAddress = startingAddress ;
125
129
readOrder . CylceTime = cycleTime ;
126
130
readOrder . Topic = topic ;
131
+ readOrder . Retain = new bool [ quantity ] ;
127
132
this . AddReadOrder ( readOrder ) ;
128
133
}
129
134
@@ -176,7 +181,7 @@ public void publish(string[] topic, string[] payload, string mqttBrokerAddress)
176
181
}
177
182
178
183
for ( int i = 0 ; i < payload . Length ; i ++ )
179
- mqttClient . Publish ( topic [ i ] , Encoding . UTF8 . GetBytes ( payload [ i ] ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , false ) ;
184
+ mqttClient . Publish ( topic [ i ] , Encoding . UTF8 . GetBytes ( payload [ i ] ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , RetainMessages ) ;
180
185
181
186
}
182
187
@@ -198,7 +203,7 @@ public void publish(string topic, string payload, string mqttBrokerAddress)
198
203
if ( payload != null )
199
204
mqttClient . Publish ( topic , Encoding . UTF8 . GetBytes ( payload ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , RetainMessages ) ;
200
205
else
201
- mqttClient . Publish ( topic , null , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , RetainMessages ) ;
206
+ mqttClient . Publish ( topic , new byte [ 0 ] , 0 , RetainMessages ) ;
202
207
}
203
208
204
209
public void Disconnect ( )
@@ -248,9 +253,9 @@ private void ProcessData(object param)
248
253
for ( int i = 0 ; i < value . Length ; i ++ )
249
254
{
250
255
if ( readOrder . oldvalue [ i ] == null )
251
- mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
256
+ mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
252
257
else if ( ( bool ) readOrder . oldvalue [ i ] != value [ i ] )
253
- mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
258
+ mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
254
259
readOrder . oldvalue [ i ] = value [ i ] ;
255
260
}
256
261
@@ -261,9 +266,9 @@ private void ProcessData(object param)
261
266
for ( int i = 0 ; i < value . Length ; i ++ )
262
267
{
263
268
if ( readOrder . oldvalue [ i ] == null )
264
- mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
269
+ mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
265
270
else if ( ( bool ) readOrder . oldvalue [ i ] != value [ i ] )
266
- mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
271
+ mqttClient . Publish ( readOrder . Topic [ i ] , Encoding . UTF8 . GetBytes ( value [ i ] . ToString ( ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
267
272
readOrder . oldvalue [ i ] = value [ i ] ;
268
273
}
269
274
}
@@ -275,12 +280,12 @@ private void ProcessData(object param)
275
280
float scale = readOrder . Scale != null ? ( readOrder . Scale [ i ] == 0 ) ? 1 : readOrder . Scale [ i ] : 1 ;
276
281
if ( readOrder . oldvalue [ i ] == null )
277
282
{
278
- mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
283
+ mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
279
284
readOrder . oldvalue [ i ] = value [ i ] ;
280
285
}
281
286
else if ( ( ( int ) readOrder . oldvalue [ i ] != value [ i ] ) && ( readOrder . Hysteresis != null ? ( ( value [ i ] < ( int ) readOrder . oldvalue [ i ] - ( int ) readOrder . Hysteresis [ i ] ) | ( value [ i ] > ( int ) readOrder . oldvalue [ i ] + ( int ) readOrder . Hysteresis [ i ] ) ) : true ) )
282
287
{
283
- mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
288
+ mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
284
289
readOrder . oldvalue [ i ] = value [ i ] ;
285
290
}
286
291
}
@@ -294,12 +299,12 @@ private void ProcessData(object param)
294
299
float scale = readOrder . Scale != null ? ( readOrder . Scale [ i ] == 0 ) ? 1 : readOrder . Scale [ i ] : 1 ;
295
300
if ( readOrder . oldvalue [ i ] == null )
296
301
{
297
- mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
302
+ mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
298
303
readOrder . oldvalue [ i ] = value [ i ] ;
299
304
}
300
305
else if ( ( ( int ) readOrder . oldvalue [ i ] != value [ i ] ) && ( readOrder . Hysteresis != null ? ( ( value [ i ] < ( int ) readOrder . oldvalue [ i ] - ( int ) readOrder . Hysteresis [ i ] ) | ( value [ i ] > ( int ) readOrder . oldvalue [ i ] + ( int ) readOrder . Hysteresis [ i ] ) ) : true ) )
301
306
{
302
- mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , readOrder . Retain [ i ] ) ;
307
+ mqttClient . Publish ( readOrder . Topic [ i ] , ( readOrder . Unit == null ? Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) ) : Encoding . UTF8 . GetBytes ( ( ( float ) value [ i ] * scale ) . ToString ( ) + " " + readOrder . Unit [ i ] ) ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , ( readOrder . Retain != null ) ? readOrder . Retain [ i ] : false ) ;
303
308
readOrder . oldvalue [ i ] = value [ i ] ;
304
309
}
305
310
}
@@ -311,6 +316,8 @@ private void ProcessData(object param)
311
316
Thread . Sleep ( 2000 ) ;
312
317
if ( ! AutomaticReconnect )
313
318
throw exc ;
319
+ Debug . WriteLine ( exc . StackTrace ) ;
320
+
314
321
if ( ! modbusClient . Connected )
315
322
{
316
323
try
0 commit comments