|
10 | 10 | using System.IO.Ports;
|
11 | 11 | using System.Reflection;
|
12 | 12 | using System.Text;
|
| 13 | +using System.Collections.Generic; |
13 | 14 |
|
14 | 15 | namespace EasyModbus
|
15 | 16 | {
|
@@ -42,9 +43,17 @@ public enum RegisterOrder { LowHigh = 0, HighLow = 1 };
|
42 | 43 | private Parity parity = Parity.Even;
|
43 | 44 | private StopBits stopBits = StopBits.One;
|
44 | 45 | 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 | + |
45 | 52 | string mqttRootTopic = "easymodbusclient";
|
46 | 53 | public string MqttUserName { get; set; }
|
47 | 54 | public string MqttPassword { get; set; }
|
| 55 | + public bool MqttPushOnChange { get; set; } = true; |
| 56 | + |
48 | 57 | public int MqttBrokerPort = 1883;
|
49 | 58 |
|
50 | 59 | public delegate void ReceiveDataChanged(object sender);
|
@@ -785,18 +794,26 @@ public static bool DetectValidModbusFrame(byte[] readBuffer, int length)
|
785 | 794 | public bool[] ReadDiscreteInputs(int startingAddress, int quantity, string mqttBrokerAddress)
|
786 | 795 | {
|
787 | 796 | 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]; |
790 | 801 | for (int i = 0; i < returnValue.Length; i++)
|
791 | 802 | {
|
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 | + |
794 | 810 | }
|
795 |
| - EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt(); |
| 811 | + if (easyModbus2Mqtt == null) |
| 812 | + easyModbus2Mqtt = new EasyModbus2Mqtt(); |
796 | 813 | easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort;
|
797 | 814 | easyModbus2Mqtt.MqttUserName = this.MqttUserName;
|
798 | 815 | easyModbus2Mqtt.MqttPassword = this.MqttPassword;
|
799 |
| - easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress); |
| 816 | + easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress); |
800 | 817 |
|
801 | 818 | return returnValue;
|
802 | 819 | }
|
@@ -986,18 +1003,24 @@ public bool[] ReadDiscreteInputs(int startingAddress, int quantity)
|
986 | 1003 | public bool[] ReadCoils(int startingAddress, int quantity, string mqttBrokerAddress)
|
987 | 1004 | {
|
988 | 1005 | 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]; |
991 | 1010 | for (int i = 0; i < returnValue.Length; i++)
|
992 | 1011 | {
|
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 | + } |
995 | 1018 | }
|
996 |
| - EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt(); |
997 |
| - easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort; |
| 1019 | + if (easyModbus2Mqtt == null) |
| 1020 | + easyModbus2Mqtt = new EasyModbus2Mqtt(); easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort; |
998 | 1021 | easyModbus2Mqtt.MqttUserName = this.MqttUserName;
|
999 | 1022 | easyModbus2Mqtt.MqttPassword = this.MqttPassword;
|
1000 |
| - easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress); |
| 1023 | + easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress); |
1001 | 1024 |
|
1002 | 1025 |
|
1003 | 1026 | return returnValue;
|
@@ -1187,18 +1210,24 @@ public bool[] ReadCoils(int startingAddress, int quantity)
|
1187 | 1210 | public int[] ReadHoldingRegisters(int startingAddress, int quantity, string mqttBrokerAddress)
|
1188 | 1211 | {
|
1189 | 1212 | 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]; |
1192 | 1217 | for (int i = 0; i < returnValue.Length; i++)
|
1193 | 1218 | {
|
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 | + } |
1196 | 1225 | }
|
1197 |
| - EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt(); |
1198 |
| - easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort; |
| 1226 | + if (easyModbus2Mqtt == null) |
| 1227 | + easyModbus2Mqtt = new EasyModbus2Mqtt(); easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort; |
1199 | 1228 | easyModbus2Mqtt.MqttUserName = this.MqttUserName;
|
1200 | 1229 | easyModbus2Mqtt.MqttPassword = this.MqttPassword;
|
1201 |
| - easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress); |
| 1230 | + easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress); |
1202 | 1231 | return returnValue;
|
1203 | 1232 | }
|
1204 | 1233 |
|
@@ -1387,20 +1416,24 @@ public int[] ReadHoldingRegisters(int startingAddress, int quantity)
|
1387 | 1416 | public int[] ReadInputRegisters(int startingAddress, int quantity, string mqttBrokerAddress)
|
1388 | 1417 | {
|
1389 | 1418 | 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]; |
1392 | 1423 | for (int i = 0; i < returnValue.Length; i++)
|
1393 | 1424 | {
|
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 | + } |
1396 | 1431 | }
|
1397 |
| - EasyModbus2Mqtt easyModbus2Mqtt = new EasyModbus2Mqtt(); |
1398 |
| - easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort; |
| 1432 | + if (easyModbus2Mqtt == null) |
| 1433 | + easyModbus2Mqtt = new EasyModbus2Mqtt(); easyModbus2Mqtt.MqttBrokerPort = this.MqttBrokerPort; |
1399 | 1434 | easyModbus2Mqtt.MqttUserName = this.MqttUserName;
|
1400 | 1435 | easyModbus2Mqtt.MqttPassword = this.MqttPassword;
|
1401 |
| - easyModbus2Mqtt.publish(topic, payload, mqttBrokerAddress); |
1402 |
| - |
1403 |
| - |
| 1436 | + easyModbus2Mqtt.publish(topic.ToArray(), payload.ToArray(), mqttBrokerAddress); |
1404 | 1437 | return returnValue;
|
1405 | 1438 | }
|
1406 | 1439 |
|
|
0 commit comments