Skip to content

Commit 5492e4a

Browse files
Bugfix MQTT
1 parent 7d81ed3 commit 5492e4a

File tree

4 files changed

+78
-38
lines changed

4 files changed

+78
-38
lines changed

ConsoleApplication1/Program.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ static void Main(string[] args)
3838
EasyModbus.ModbusClient modbusClient = new EasyModbus.ModbusClient("127.0.0.1", 502);
3939
modbusClient.ConnectionTimeout = 5000;
4040
modbusClient.LogFileFilename = "logData.txt";
41-
41+
modbusClient.Connect();
4242
while (true)
4343
{
44-
modbusClient.Connect();
44+
4545

4646
// Console.WriteLine("Execute FC5");
4747
// modbusClient.WriteSingleCoil(0, true);
@@ -62,10 +62,11 @@ static void Main(string[] args)
6262
modbusClient.ReadInputRegisters(0, 10, "www.mqtt-dashboard.com");
6363
modbusClient.ReadHoldingRegisters(0, 10, "www.mqtt-dashboard.com");
6464

65-
modbusClient.Disconnect();
65+
6666
System.Threading.Thread.Sleep(1000);
6767
}
68-
Console.ReadKey();
68+
modbusClient.Disconnect();
69+
Console.ReadKey();
6970
}
7071
}
7172
}

ConsoleApplicationMqqt/Program.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ class Program
1111
static void Main(string[] args)
1212
{
1313
EasyModbus.EasyModbus2Mqtt easyModbus2Mqtt= new EasyModbus.EasyModbus2Mqtt();
14-
// easyModbus2Mqtt.AutomaticReconnect = false;
15-
easyModbus2Mqtt.MqttUserName = "sr555";
16-
easyModbus2Mqtt.MqttPassword = "Ironsink51";
14+
//easyModbus2Mqtt.AutomaticReconnect = false;
15+
easyModbus2Mqtt.MqttUserName = "sr555";
16+
easyModbus2Mqtt.MqttPassword = "Ironsink51";
1717
easyModbus2Mqtt.MqttBrokerPort = 18972;
1818
//easyModbus2Mqtt.MqttBrokerAddress = "broker.hivemq.com";
19-
// easyModbus2Mqtt.MqttBrokerAddress = "192.168.178.101";
19+
//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" });
2323
// easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadHoldingRegisters, 10, 0, 200);
24-
easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadInputRegisters, 10, 0, 200);
24+
easyModbus2Mqtt.AddReadOrder(EasyModbus.FunctionCode.ReadInputRegisters, 2, 0, 200);
2525
EasyModbus.ReadOrder readOrder = new EasyModbus.ReadOrder();
2626
readOrder.Hysteresis = new int[10] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 };
2727
readOrder.Unit = new string[10] {"°C", "°C", "°C", "°C", "°C", "°C", "°C", "°C", "°C", "°C"};

EasyModbus/EasyModbus2Mqtt.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,12 @@ public void publish(string[] topic, string[] payload, string mqttBrokerAddress)
169169

170170
}
171171

172+
public void Disconnect()
173+
{
174+
mqttClient.Disconnect();
175+
}
176+
177+
172178
public void stop()
173179
{
174180
modbusClient.Disconnect();

EasyModbus/ModbusClient.cs

Lines changed: 62 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System.IO.Ports;
1111
using System.Reflection;
1212
using System.Text;
13+
using System.Collections.Generic;
1314

1415
namespace EasyModbus
1516
{
@@ -42,9 +43,17 @@ public enum RegisterOrder { LowHigh = 0, HighLow = 1 };
4243
private Parity parity = Parity.Even;
4344
private StopBits stopBits = StopBits.One;
4445
private bool connected = false;
46+
private bool[] mqttCoilsOldValues;
47+
private bool[] mqttDiscreteInputsOldValues;
48+
private int[] mqttInputRegistersOldValues;
49+
private int[] mqttHoldingRegistersOldValues;
50+
private EasyModbus2Mqtt easyModbus2Mqtt;
51+
4552
string mqttRootTopic = "easymodbusclient";
4653
public string MqttUserName { get; set; }
4754
public string MqttPassword { get; set; }
55+
public bool MqttPushOnChange { get; set; } = true;
56+
4857
public int MqttBrokerPort = 1883;
4958

5059
public delegate void ReceiveDataChanged(object sender);
@@ -785,18 +794,26 @@ public static bool DetectValidModbusFrame(byte[] readBuffer, int length)
785794
public bool[] ReadDiscreteInputs(int startingAddress, int quantity, string mqttBrokerAddress)
786795
{
787796
bool[] returnValue = this.ReadDiscreteInputs(startingAddress, quantity);
788-
string[] topic = new string[returnValue.Length];
789-
string[] payload = new string[returnValue.Length];
797+
List<String> topic = new List<String>();
798+
List<String> payload = new List<String>();
799+
if (MqttPushOnChange && mqttDiscreteInputsOldValues == null)
800+
mqttDiscreteInputsOldValues = new bool[65535];
790801
for (int i = 0; i < returnValue.Length; i++)
791802
{
792-
topic[i] = mqttRootTopic+"/discreteinputs/" + (i+startingAddress).ToString();
793-
payload[i] = returnValue[i].ToString();
803+
if (mqttDiscreteInputsOldValues == null ? true : (mqttDiscreteInputsOldValues[i] != returnValue[i]))
804+
{
805+
topic.Add(mqttRootTopic + "/discreteinputs/" + (i + startingAddress).ToString());
806+
payload.Add(returnValue[i].ToString());
807+
mqttDiscreteInputsOldValues[i] = returnValue[i];
808+
}
809+
794810
}
795-
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
811+
if (easyModbus2Mqtt == null)
812+
easyModbus2Mqtt = new EasyModbus2Mqtt();
796813
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
797814
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
798815
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
799-
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
816+
easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress);
800817

801818
return returnValue;
802819
}
@@ -986,18 +1003,24 @@ public bool[] ReadDiscreteInputs(int startingAddress, int quantity)
9861003
public bool[] ReadCoils(int startingAddress, int quantity, string mqttBrokerAddress)
9871004
{
9881005
bool[] returnValue = this.ReadCoils(startingAddress, quantity);
989-
string[] topic = new string[returnValue.Length];
990-
string[] payload = new string[returnValue.Length];
1006+
List<String> topic = new List<String>();
1007+
List<String> payload = new List<String>();
1008+
if (MqttPushOnChange && mqttCoilsOldValues == null)
1009+
mqttCoilsOldValues = new bool[65535];
9911010
for (int i = 0; i < returnValue.Length; i++)
9921011
{
993-
topic[i] = mqttRootTopic+"/coils/" + (i + startingAddress).ToString();
994-
payload[i] = returnValue[i].ToString();
1012+
if (mqttCoilsOldValues == null ? true : (mqttCoilsOldValues[i] != returnValue[i]))
1013+
{
1014+
topic.Add(mqttRootTopic + "/coils/" + (i + startingAddress).ToString());
1015+
payload.Add(returnValue[i].ToString());
1016+
mqttCoilsOldValues[i] = returnValue[i];
1017+
}
9951018
}
996-
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
997-
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
1019+
if (easyModbus2Mqtt == null)
1020+
easyModbus2Mqtt = new EasyModbus2Mqtt(); easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
9981021
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
9991022
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
1000-
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
1023+
easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress);
10011024

10021025

10031026
return returnValue;
@@ -1187,18 +1210,24 @@ public bool[] ReadCoils(int startingAddress, int quantity)
11871210
public int[] ReadHoldingRegisters(int startingAddress, int quantity, string mqttBrokerAddress)
11881211
{
11891212
int[] returnValue = this.ReadHoldingRegisters(startingAddress, quantity);
1190-
string[] topic = new string[returnValue.Length];
1191-
string[] payload = new string[returnValue.Length];
1213+
List<String> topic = new List<String>();
1214+
List<String> payload = new List<String>();
1215+
if (MqttPushOnChange && mqttHoldingRegistersOldValues == null)
1216+
mqttHoldingRegistersOldValues = new int[65535];
11921217
for (int i = 0; i < returnValue.Length; i++)
11931218
{
1194-
topic[i] = mqttRootTopic+"/holdingregisters/" + (i + startingAddress).ToString();
1195-
payload[i] = returnValue[i].ToString();
1219+
if (mqttHoldingRegistersOldValues == null ? true : (mqttHoldingRegistersOldValues[i] != returnValue[i]))
1220+
{
1221+
topic.Add(mqttRootTopic + "/holdingregisters/" + (i + startingAddress).ToString());
1222+
payload.Add(returnValue[i].ToString());
1223+
mqttHoldingRegistersOldValues[i] = returnValue[i];
1224+
}
11961225
}
1197-
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
1198-
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
1226+
if (easyModbus2Mqtt == null)
1227+
easyModbus2Mqtt = new EasyModbus2Mqtt(); easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
11991228
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
12001229
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
1201-
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
1230+
easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress);
12021231
return returnValue;
12031232
}
12041233

@@ -1387,20 +1416,24 @@ public int[] ReadHoldingRegisters(int startingAddress, int quantity)
13871416
public int[] ReadInputRegisters(int startingAddress, int quantity, string mqttBrokerAddress)
13881417
{
13891418
int[] returnValue = this.ReadInputRegisters(startingAddress, quantity);
1390-
string[] topic = new string[returnValue.Length];
1391-
string[] payload = new string[returnValue.Length];
1419+
List<String> topic = new List<String>();
1420+
List<String> payload = new List<String>();
1421+
if (MqttPushOnChange && mqttInputRegistersOldValues == null)
1422+
mqttInputRegistersOldValues = new int[65535];
13921423
for (int i = 0; i < returnValue.Length; i++)
13931424
{
1394-
topic[i] = mqttRootTopic+"/inputregisters/" + (i + startingAddress).ToString();
1395-
payload[i] = returnValue[i].ToString();
1425+
if (mqttInputRegistersOldValues == null ? true : (mqttInputRegistersOldValues[i] != returnValue[i]))
1426+
{
1427+
topic.Add(mqttRootTopic + "/inputregisters/" + (i + startingAddress).ToString());
1428+
payload.Add(returnValue[i].ToString());
1429+
mqttInputRegistersOldValues[i] = returnValue[i];
1430+
}
13961431
}
1397-
EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt();
1398-
easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
1432+
if (easyModbus2Mqtt == null)
1433+
easyModbus2Mqtt = new EasyModbus2Mqtt(); easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
13991434
easyModbus2Mqtt.MqttUserName = this.MqttUserName;
14001435
easyModbus2Mqtt.MqttPassword = this.MqttPassword;
1401-
easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress);
1402-
1403-
1436+
easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress);
14041437
return returnValue;
14051438
}
14061439

0 commit comments

Comments
 (0)