Skip to content

Commit 2d6368f

Browse files
Bugfix Modbus RTU and MQTT
1 parent 0a6e1bc commit 2d6368f

File tree

12 files changed

+530
-185
lines changed

12 files changed

+530
-185
lines changed

ConsoleApplication1/Program.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
@@ -35,16 +35,15 @@ static void Main(string[] args)
3535
Console.WriteLine(bufferout[i].ToString());
3636
serialport.Write("ddddddddd");*/
3737
EasyModbus.ModbusClient modbusClient = new EasyModbus.ModbusClient("COM3");
38-
modbusClient.SerialPort = "COM3";
38+
modbusClient.Baudrate = 19200;
39+
//modbusClient.SerialPort = "COM3";
3940
//EasyModbus.ModbusClient modbusClient = new EasyModbus.ModbusClient("127.0.0.1", 502);
40-
modbusClient.ConnectionTimeout = 5000;
41-
modbusClient.LogFileFilename = "test.txt";
42-
modbusClient.UnitIdentifier = 0xF7;
43-
41+
//modbusClient.LogFileFilename = "logfile.txt";
42+
modbusClient.UnitIdentifier = 247;
4443
modbusClient.Connect();
4544
while (true)
4645
{
47-
46+
4847

4948
// Console.WriteLine("Execute FC5");
5049
// modbusClient.WriteSingleCoil(0, true);
@@ -61,16 +60,21 @@ static void Main(string[] args)
6160
//Console.WriteLine("Execute FC3");
6261
//Console.WriteLine("Value of Holding Register 1000: " + modbusClient.ReadHoldingRegisters(1000, 1)[0]);
6362

64-
Console.WriteLine("Read and Publish Input Registers");
65-
modbusClient.WriteSingleRegister(60, 1234);
66-
int[] holdingRegister = modbusClient.ReadHoldingRegisters(60, 2);
67-
//Console.WriteLine(holdingRegister[0]);
63+
DateTime datetimeStart = DateTime.Now;
64+
for (int i = 1; i < 125; i++)
65+
{
66+
modbusClient.WriteSingleRegister(i,i);
67+
Console.WriteLine(modbusClient.ReadInputRegisters(i, 125)[0]);
68+
}
69+
DateTime datetimeEnd = DateTime.Now;
70+
71+
Console.WriteLine("Time elapsed: " + (datetimeEnd - datetimeStart));
6872

69-
70-
// System.Threading.Thread.Sleep(1000);
73+
// System.Threading.Thread.Sleep(1000);
7174
}
7275
modbusClient.Disconnect();
7376
Console.ReadKey();
7477
}
7578
}
7679
}
80+

ConsoleApplicationMqqt/Program.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,21 @@ static void Main(string[] args)
1313
EasyModbus.EasyModbus2Mqtt easyModbus2Mqtt= new EasyModbus.EasyModbus2Mqtt();
1414
//easyModbus2Mqtt.AutomaticReconnect = false;
1515
easyModbus2Mqtt.MqttUserName = "sr555";
16-
easyModbus2Mqtt.MqttPassword = "Ironsink51";
16+
easyModbus2Mqtt.MqttPassword = "Ironsink51";
1717
easyModbus2Mqtt.MqttBrokerPort = 18972;
1818
//easyModbus2Mqtt.MqttBrokerAddress = "broker.hivemq.com";
1919
//easyModbus2Mqtt.MqttBrokerAddress = "192.168.178.101";
2020
easyModbus2Mqtt.MqttBrokerAddress = "m21.cloudmqtt.com";
2121
easyModbus2Mqtt.ModbusIPAddress = "127.0.0.1";
2222
easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadCoils, 2, 0, 200, new string[] { "easymodbusclient/customtopic1", "easymodbusclient/customtopic2" });
23-
// easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadHoldingRegisters, 10, 0, 200);
2423
easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadInputRegisters, 2, 0, 200);
2524
EasyModbus.ReadOrder readOrder = new EasyModbus.ReadOrder();
2625
readOrder.Hysteresis = new int[10] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 };
2726
readOrder.Unit = new string[10] {"°C", "°C", "°C", "°C", "°C", "°C", "°C", "°C", "°C", "°C"};
2827
readOrder.Scale = new float[10] { 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f };
2928
readOrder.Quantity = 10;
3029
readOrder.StartingAddress = 10;
31-
readOrder.FunctionCode = EasyModbus.FunctionCode.ReadHoldingRegisters;
32-
30+
readOrder.FunctionCode = EasyModbus.FunctionCode.ReadHoldingRegisters;
3331
easyModbus2Mqtt.AddReadOrder(readOrder);
3432
easyModbus2Mqtt.start();
3533
}

EasyModbus/EasyModbus2Mqtt.cs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Threading.Tasks;
77
using uPLibrary.Networking.M2Mqtt.Messages;
88
using System.IO.Ports;
9+
using System.Diagnostics;
910

1011
namespace 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

Comments
 (0)