66using System . Threading . Tasks ;
77using uPLibrary . Networking . M2Mqtt . Messages ;
88using System . IO . Ports ;
9+ using System . Diagnostics ;
910
1011namespace EasyModbus
1112{
@@ -47,6 +48,9 @@ public void AddReadOrder(ReadOrder readOrder)
4748 if ( readOrder . Scale != null )
4849 if ( readOrder . Scale . Length != readOrder . Quantity )
4950 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" ) ;
5054 if ( readOrder . CylceTime == 0 )
5155 readOrder . CylceTime = 500 ;
5256 if ( readOrder . Topic == null )
@@ -124,6 +128,7 @@ public void AddReadOrder(FunctionCode functionCode, int quantity, int startingAd
124128 readOrder . StartingAddress = startingAddress ;
125129 readOrder . CylceTime = cycleTime ;
126130 readOrder . Topic = topic ;
131+ readOrder . Retain = new bool [ quantity ] ;
127132 this . AddReadOrder ( readOrder ) ;
128133 }
129134
@@ -176,7 +181,7 @@ public void publish(string[] topic, string[] payload, string mqttBrokerAddress)
176181 }
177182
178183 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 ) ;
180185
181186 }
182187
@@ -198,7 +203,7 @@ public void publish(string topic, string payload, string mqttBrokerAddress)
198203 if ( payload != null )
199204 mqttClient . Publish ( topic , Encoding . UTF8 . GetBytes ( payload ) , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , RetainMessages ) ;
200205 else
201- mqttClient . Publish ( topic , null , MqttMsgBase . QOS_LEVEL_EXACTLY_ONCE , RetainMessages ) ;
206+ mqttClient . Publish ( topic , new byte [ 0 ] , 0 , RetainMessages ) ;
202207 }
203208
204209 public void Disconnect ( )
@@ -248,9 +253,9 @@ private void ProcessData(object param)
248253 for ( int i = 0 ; i < value . Length ; i ++ )
249254 {
250255 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 ) ;
252257 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 ) ;
254259 readOrder . oldvalue [ i ] = value [ i ] ;
255260 }
256261
@@ -261,9 +266,9 @@ private void ProcessData(object param)
261266 for ( int i = 0 ; i < value . Length ; i ++ )
262267 {
263268 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 ) ;
265270 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 ) ;
267272 readOrder . oldvalue [ i ] = value [ i ] ;
268273 }
269274 }
@@ -275,12 +280,12 @@ private void ProcessData(object param)
275280 float scale = readOrder . Scale != null ? ( readOrder . Scale [ i ] == 0 ) ? 1 : readOrder . Scale [ i ] : 1 ;
276281 if ( readOrder . oldvalue [ i ] == null )
277282 {
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 ) ;
279284 readOrder . oldvalue [ i ] = value [ i ] ;
280285 }
281286 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 ) )
282287 {
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 ) ;
284289 readOrder . oldvalue [ i ] = value [ i ] ;
285290 }
286291 }
@@ -294,12 +299,12 @@ private void ProcessData(object param)
294299 float scale = readOrder . Scale != null ? ( readOrder . Scale [ i ] == 0 ) ? 1 : readOrder . Scale [ i ] : 1 ;
295300 if ( readOrder . oldvalue [ i ] == null )
296301 {
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 ) ;
298303 readOrder . oldvalue [ i ] = value [ i ] ;
299304 }
300305 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 ) )
301306 {
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 ) ;
303308 readOrder . oldvalue [ i ] = value [ i ] ;
304309 }
305310 }
@@ -311,6 +316,8 @@ private void ProcessData(object param)
311316 Thread . Sleep ( 2000 ) ;
312317 if ( ! AutomaticReconnect )
313318 throw exc ;
319+ Debug . WriteLine ( exc . StackTrace ) ;
320+
314321 if ( ! modbusClient . Connected )
315322 {
316323 try
0 commit comments