Commit 6d9c15c0 authored by leon.huang's avatar leon.huang

add Send down control and relate alarm

parent ae9d62a8
......@@ -12,17 +12,19 @@ namespace ModbusDemo.Common
public static class ModualAlarm
{
public const ushort usChannelNumber = 8;
private const string sAlarmTopic = "Witium/WTDS78X/66666666/Alarm";
public static string sAlarmJson;
public static string sAlarmJsonPackage;
//private IMqttClient mqttClient = null;
public enum eAlarmCode : ushort
{
ChannelNoError = 0,
ChannelCommunError = 1,
ChannelCollectDataError = 2,
ChannelDataRespError = 4,
ChannelDataChangeError = 8
ChannelNoError = 0,
ChannelCommunError = 1,
ChannelCollectDataError = 2,
ChannelDataRespError = 4,
ChannelDataChangeError = 8,
ChannelLevelError = 16,
ChannelControlError = 32,
}
public static void vSetAlarmList(ushort usAddress, ushort[] usChannel, ushort[] usChannelAlarmcode)
{
......@@ -46,7 +48,7 @@ namespace ModbusDemo.Common
public static async Task vPublishAlarmPackageJson(IMqttClient mqttClient)
{
var message = new MqttApplicationMessageBuilder()
.WithTopic(sAlarmTopic)
.WithTopic(Form1.sAlarmTopic)
.WithPayload(sAlarmJson)
.WithAtMostOnceQoS()
.WithRetainFlag(false)
......
......@@ -200,7 +200,7 @@ namespace ModbusDemo.MessageFormat
return ModbusErrorCode;
}
}
public static eModbusErrorCode Modbus_WriteSingleCoil(byte slaveAddress, ushort startAddress, bool[] value)
public static eModbusErrorCode Modbus_WriteSingleCoil(byte slaveAddress, ushort startAddress, bool value)
{
object oLock = new object();
lock (oLock)
......@@ -208,7 +208,7 @@ namespace ModbusDemo.MessageFormat
eModbusErrorCode ModbusErrorCode;
try
{
Modbus.WriteMultipleCoils(slaveAddress, startAddress, value);
Modbus.WriteSingleCoil(slaveAddress, startAddress, value);
ModbusErrorCode = eModbusErrorCode.MB_ENOERR;
}
catch (Exception exception)
......
......@@ -6,14 +6,19 @@ using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ModbusDemo.windows;
using ModbusDemo;
using ModbusDemo.Modular;
using ModbusDemo.Common;
namespace ModbusDemo.MessageFormat
{
public class ModualControl
{
public class Op
{
public UInt64 duration { get; set; }
public UInt64 startTime { get; set;}
public ushort duration { get; set; }
public UInt64 startTime { get; set; }
public int d0 { get; set; }
public int d1 { get; set; }
public int d2 { get; set; }
......@@ -23,6 +28,14 @@ namespace ModbusDemo.MessageFormat
public int d6 { get; set; }
public int d7 { get; set; }
public UInt64 ts { get; set; }
public bool bD0HasConfig { get; set; }
public bool bD1HasConfig { get; set; }
public bool bD2HasConfig { get; set; }
public bool bD3HasConfig { get; set; }
public bool bD4HasConfig { get; set; }
public bool bD5HasConfig { get; set; }
public bool bD6HasConfig { get; set; }
public bool bD7HasConfig { get; set; }
}
public class SsItem
......@@ -36,10 +49,389 @@ namespace ModbusDemo.MessageFormat
public string taskId { get; set; }
public List<SsItem> ss { get; set; }
}
public static List<MqttRoot> liModuualControl = new List<MqttRoot>();
public static void vGetaWay_Receive_Control(string sDataString)
{
MqttRoot cControl = JsonConvert.DeserializeObject<MqttRoot>(sDataString);
public class ModualCntrol
{
public bool bStartControl;
public byte sbModbusID;
public byte sbModualIndex;
public bool[] bControlData;
public ushort usDurationTime;
public UInt64 ulStartTime;
public bool[] bControlBit = new bool[8];
}
public static List<ModualCntrol> liModuualControl = new List<ModualCntrol>();
public static void vGetaWay_Receive_Control(string sDataString, out string stResponseData)
{
byte byModualIndex = 0;
MqttRoot cControl = new MqttRoot();
var jsonObj = new JObject();
try
{
cControl = JsonConvert.DeserializeObject<MqttRoot>(sDataString);
jsonObj = JObject.Parse(sDataString);
}
catch (Exception exception)
{
Form1.totxt.Log(exception + "Control Mqtt Parse Fail");
}
for (int i = 0; i < cControl.ss.Count; i++)
{
bool[] btReadTempData = new bool[6];
ModbusComm.eModbusErrorCode ModbusErrorCode = ModbusComm.eModbusErrorCode.MB_EMASTERNOERR;
ModualCntrol cModualCntrol = new ModualCntrol
{
sbModbusID = byte.Parse(cControl.ss[i].addr),
usDurationTime = cControl.ss[i].op.duration,
ulStartTime = cControl.ss[i].op.startTime
};
ModbusErrorCode |= ModbusComm.Modbus_ReadCoilsTask(out cModualCntrol.bControlData, cModualCntrol.sbModbusID, 16, 6);
for (byte j = 0; j < ModualPoll.byX66cNumber; j++)
{
if (cModualCntrol.sbModbusID == ModualPoll.byX66cIdlist[j])
{
byModualIndex = j;
cModualCntrol.sbModualIndex = j;
break;
}
else
{
byModualIndex = 0;
cModualCntrol.sbModualIndex = j;
}
}
if (jsonObj["ss"][i]["op"] != null)
{
if (jsonObj["ss"][i]["op"]["d0"] != null)
{
cControl.ss[i].op.bD0HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d0);
cModualCntrol.bControlBit[0] = true;
}
if (jsonObj["ss"][i]["op"]["d1"] != null)
{
cControl.ss[i].op.bD1HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d1);
cModualCntrol.bControlBit[1] = true;
}
if (jsonObj["ss"][i]["op"]["d2"] != null)
{
cControl.ss[i].op.bD2HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d2);
cModualCntrol.bControlBit[2] = true;
}
if (jsonObj["ss"][i]["op"]["d3"] != null)
{
cControl.ss[0].op.bD3HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d3);
cModualCntrol.bControlBit[3] = true;
}
if (jsonObj["ss"][i]["op"]["d4"] != null)
{
cControl.ss[i].op.bD4HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d4);
cModualCntrol.bControlBit[4] = true;
}
if (jsonObj["ss"][i]["op"]["d5"] != null)
{
cControl.ss[i].op.bD5HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d5);
cModualCntrol.bControlBit[5] = true;
}
if (jsonObj["ss"][i]["op"]["d6"] != null)
{
cControl.ss[i].op.bD6HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d6);
cModualCntrol.bControlBit[6] = true;
}
if (jsonObj["ss"][i]["op"]["d7"] != null)
{
cControl.ss[i].op.bD7HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d7);
cModualCntrol.bControlBit[7] = true;
}
if (ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && cModualCntrol.ulStartTime <= Form1.GetTimeStamp())
{
cModualCntrol.bStartControl = true;
ModbusErrorCode |= ModbusComm.Modbus_WriteMultipleCoils(cModualCntrol.sbModbusID, 16, cModualCntrol.bControlData);
ModbusErrorCode |= ModbusComm.Modbus_ReadCoilsTask(out btReadTempData, cModualCntrol.sbModbusID, 16, 6);
}
if (jsonObj["ss"][i]["op"]["ts"] != null)
{
jsonObj["ss"][i]["op"]["ts"] = Form1.GetTimeStamp();
}
if (ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
{
liModuualControl.Add(cModualCntrol);
}
else if (cModualCntrol.bStartControl == false)
{
liModuualControl.Add(cModualCntrol);
}
}
if (cControl.ss[i].op.bD0HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d0"] = 1;
if (byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
else if (cControl.ss[i].op.bD0HasConfig == true)
{
jsonObj["ss"][i]["op"]["d0"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
if (cControl.ss[i].op.bD1HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d1"] = 1;
if (byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
else if (cControl.ss[i].op.bD1HasConfig == true)
{
jsonObj["ss"][i]["op"]["d1"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
if (cControl.ss[i].op.bD2HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d2"] = 1;
if (byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
else if (cControl.ss[i].op.bD2HasConfig == true)
{
jsonObj["ss"][i]["op"]["d2"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
if (cControl.ss[i].op.bD3HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d3"] = 1;
if (byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
else if (cControl.ss[i].op.bD3HasConfig == true)
{
jsonObj["ss"][i]["op"]["d3"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
if (cControl.ss[i].op.bD4HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d4"] = 1;
if (byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
else if (cControl.ss[i].op.bD4HasConfig == true)
{
jsonObj["ss"][i]["op"]["d4"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
if (cControl.ss[i].op.bD5HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d5"] = 1;
if (byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
else if (cControl.ss[i].op.bD5HasConfig == true)
{
jsonObj["ss"][i]["op"]["d5"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
if (cControl.ss[i].op.bD6HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d6"] = 1;
}
else if (cControl.ss[i].op.bD6HasConfig == true)
{
jsonObj["ss"][i]["op"]["d6"] = 0;
}
if (cControl.ss[i].op.bD7HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d7"] = 1;
}
else if (cControl.ss[i].op.bD7HasConfig == true)
{
jsonObj["ss"][i]["op"]["d7"] = 0;
}
}
}
stResponseData = jsonObj.ToString();
}
public static void vControl_Poll()
{
while (true)
{
for (sbyte i = 0; i < liModuualControl.Count; i++)
{
if (liModuualControl[i].bStartControl == false)
{
if (liModuualControl[i].ulStartTime <= Form1.GetTimeStamp())
{
ModbusComm.eModbusErrorCode ModbusErrorCode = ModbusComm.eModbusErrorCode.MB_EMASTERNOERR;
liModuualControl[i].bStartControl = true;
bool[] bControlData = new bool[6];
bool[] btReadTempData;
ModbusErrorCode |= ModbusComm.Modbus_ReadCoilsTask(out bControlData, liModuualControl[i].sbModbusID, 16, 6);
for (sbyte j = 0; j < 6; j++)
{
if (liModuualControl[i].bControlBit[j] == true)
{
bControlData[j] = liModuualControl[i].bControlData[j];
}
else
{
liModuualControl[i].bControlData[j] = bControlData[j];
}
ModbusErrorCode |= ModbusComm.Modbus_WriteMultipleCoils(liModuualControl[i].sbModbusID, 16, bControlData);
ModbusErrorCode |= ModbusComm.Modbus_ReadCoilsTask(out btReadTempData, liModuualControl[i].sbModbusID, 16, 6);
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
}
else if (ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (Enumerable.SequenceEqual(bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
}
}
}
}
else
{
if ((liModuualControl[i].usDurationTime + liModuualControl[i].ulStartTime) <= Form1.GetTimeStamp())
{
ModbusComm.eModbusErrorCode ModbusErrorCode = ModbusComm.eModbusErrorCode.MB_EMASTERNOERR;
bool[] bControlData = new bool[6];
bool[] btReadTempData;
ModbusErrorCode |= ModbusComm.Modbus_ReadCoilsTask(out bControlData, liModuualControl[i].sbModbusID, 16, 6);
for (sbyte j = 0; j < 6; j++)
{
if (liModuualControl[i].bControlBit[j] == true)
{
bControlData[j] = !liModuualControl[i].bControlData[j];
}
}
ModbusErrorCode |= ModbusComm.Modbus_WriteMultipleCoils(liModuualControl[i].sbModbusID, 16, bControlData);
ModbusErrorCode |= ModbusComm.Modbus_ReadCoilsTask(out btReadTempData, liModuualControl[i].sbModbusID, 16, 6);
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
}
}
else if (ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
if (Enumerable.SequenceEqual(bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
}
liModuualControl.Remove(liModuualControl[i]);
break;
}
}
}
}
}
}
}
......@@ -10,6 +10,7 @@ using MQTTnet;
using MQTTnet.Client;
using Newtonsoft.Json;
using ModbusDemo;
namespace ModbusDemo.Modular
{
class ModualPoll
......@@ -70,8 +71,8 @@ namespace ModbusDemo.Modular
public static modual.pcx78C cx78c = new modual.pcx78C(byX78cIdlist);
#if DEBUG_TEST
public const byte byX66cNumber = 2;
public static byte[] byX66cIdlist = {16,31};
public const byte byX66cNumber = 3;
public static byte[] byX66cIdlist = {16,31,35};
#else
public const byte byX66cNumber = 32;
public static byte[] byX66cIdlist = {4,5,7,8,9,10,14,15,19,22,23,24,26,30,32,36,37,38,40,41,42,43,44,46,47,48,49,50,51,52,54,57};
......
......@@ -27,9 +27,8 @@ namespace ModbusDemo
public partial class Form1 : Form
{
//Pond FunctionalService = new Pond();
const bool LOCALDEBUG = false;
const bool LOCALDEBUG = true;
private bool bStart = false;
FileStream fsl;
AutoResetEvent exitEvent;
private int waitTime;
private Thread t_UpgradeConn;
......@@ -39,7 +38,7 @@ namespace ModbusDemo
BackgroundWorker m_bgw0 = new BackgroundWorker();
bool m_Isbgw0_CanContinueRun = true;
bool State_enable = true;
bool bCretaThead = false;
public static ModbusDemo.windows.Totxt totxt = new windows.Totxt(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
public Form1()
......@@ -69,45 +68,28 @@ namespace ModbusDemo
System.Environment.Exit(0);
}
#region 参数
/// <summary>
/// 串口变量
/// </summary>
SerialPort serialPort;
string portName;
int baudRate;
int dataBits;
Parity parity;
StopBits stopBits;
private SerialPort comPort = new SerialPort();
public static ModbusMaster master;
//////////////////////////////////////////////////////////////
private MethodInvoker MQTT_thread;
string mqttIp;
string mqttClientId;
int mqttPort;
string mqttUsername;
string mqttPwd;
string mqttTopic;
string mqttSubscribeTopic;
string mqttBackTopic;
string mqttSn = "66666666";
public const string mqttSn = "66666666";
public const string mqttSubscribeControlTopic = "Witium/WTDS78X/" + mqttSn + "/Ctrl";
public const string mqttBackTopic = "Witium/WTDS78X/" + mqttSn + "/Back";
public const string mqttTopic = "Witium/WTDS78X/" + mqttSn + "/Data";
public const string sAlarmTopic = "Witium/WTDS78X/" + mqttSn + "/Alarm";
string mqttData;//数据
string mqttData_Back;//数据
private IMqttClient mqttClient = null;
private bool isReconnect = true;
ushort address;
byte ID;
int readyState;
bool[] DI = new bool[10];
bool[] DO = new bool[10];
float[] AI = new float[10];
float[] AO = new float[10];
#endregion
private void SetMqtt()
{
mqttTopic = "Witium/WTDS78X/" + mqttSn + "/Data";
if (LOCALDEBUG == true)
{
mqttIp = "47.101.50.24";
......@@ -125,12 +107,6 @@ namespace ModbusDemo
mqttPwd = "Pasture37774020";
}
}
private void SetTopic()
{
mqttSubscribeTopic = "Witium/WTDS78X/" + mqttSn + "/Ctrl";
mqttBackTopic = "Witium/WTDS78X/" + mqttSn + "/Back";
}
void m_bgw0_DoWork(object sender, DoWorkEventArgs e)
{
while (m_Isbgw0_CanContinueRun)
......@@ -156,66 +132,12 @@ namespace ModbusDemo
}
#endregion
#region 方法
public void control(byte SlaveAddress, ushort startAddress, bool value)
{
bool OutputValue;
int Caution = 0;
bool[] StateValue = { };
int[] WOnOff = { 0 };
//Modbus_ReadCoilsTask(out StateValue, SlaveAddress, 16, 6, out int signW);
//WOnOff = state.IO(StateValue);
if (WOnOff[0] == 1)
{
if (startAddress == 18)
{
return;
}
else
{
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, startAddress, value, out Caution);
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, (ushort)(startAddress + 1), value, out Caution);
}
}
else if(WOnOff[2]==1)
{
if(startAddress==16)
{
return;
}
else
{
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, startAddress, value, out Caution);
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, (ushort)(startAddress + 1), value, out Caution);
}
}
else
{
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, startAddress, value, out Caution);
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, (ushort)(startAddress + 1), value, out Caution);
}
}
public static byte[] getByte(bool[] array)
{
byte[] data = new byte[array.Length];
for (int i = 0; i < array.Length; i++)
{
if (array[i])
data[i] = 1;
else
data[i] = 0;
}
return data;
}
#endregion
#region mqtt服务
//创建一个委托,是为访问TextBox控件服务的。
public delegate void UpdateTxt(string msg);
//定义一个委托变量
public UpdateTxt updateTxt;
private Thread ModbusControlThread;
private async Task Publish()
{
var message = new MqttApplicationMessageBuilder()
......@@ -229,7 +151,7 @@ namespace ModbusDemo
await mqttClient.PublishAsync(message);
}
}
private async Task Back()
private async Task vControlResponseBack()
{
var message = new MqttApplicationMessageBuilder()
.WithTopic(mqttBackTopic)
......@@ -250,7 +172,7 @@ namespace ModbusDemo
// Subscribe to a topic
await mqttClient.SubscribeAsync(new TopicFilterBuilder()
.WithTopic(mqttSubscribeTopic)
.WithTopic(mqttSubscribeControlTopic)
.WithAtMostOnceQoS()
.Build()
);
......@@ -259,13 +181,12 @@ namespace ModbusDemo
{
Console.WriteLine("已订阅[{topic}]主题{Environment.NewLine}");
txtReceiveMessage.AppendText($"已订阅[{mqttSubscribeTopic}]主题{Environment.NewLine}");
txtReceiveMessage.AppendText($"已订阅[{mqttSubscribeControlTopic}]主题{Environment.NewLine}");
//totxt.Log($"已订阅[{mqttSubscribeTopic}]主题{Environment.NewLine}");
//txtReceiveMessage.AppendText($"已订阅[{Data}]主题{Environment.NewLine}");
})));
}
private async Task ConnectMqttServerAsync()
{
// Create a new MQTT client.
......@@ -274,7 +195,6 @@ namespace ModbusDemo
{
var factory = new MqttFactory();
mqttClient = factory.CreateMqttClient();
mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
mqttClient.Connected += MqttClient_Connected;
mqttClient.Disconnected += MqttClient_Disconnected;
......@@ -316,7 +236,6 @@ namespace ModbusDemo
}
}
private void MqttClient_Connected(object sender, EventArgs e)
{
Invoke((new Action(() =>
......@@ -327,7 +246,6 @@ namespace ModbusDemo
//Console.WriteLine("已连接到MQTT服务器!" + Environment.NewLine);
})));
}
private void MqttClient_Disconnected(object sender, EventArgs e)
{
Invoke((new Action(() =>
......@@ -387,7 +305,6 @@ namespace ModbusDemo
})));
}
}
private void MqttClient_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
{
Invoke((new Action(() =>
......@@ -404,91 +321,17 @@ namespace ModbusDemo
})));
Invoke((new Action(async () =>
{
bool on_off = true;
string passageway;
string stConvertString;
//消息的内容
txtReceiveMessage.AppendText($">> Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}{Environment.NewLine}");
totxt.Log($">> Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}{Environment.NewLine}");
stConvertString = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
Console.WriteLine(stConvertString);
ModualControl.vGetaWay_Receive_Control(stConvertString);
Ctrl ctrl = JsonConvert.DeserializeObject<Ctrl>(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
Ctrl ctrl_Back = new Ctrl();
Ctrl2 ctrl2 = new Ctrl2();
List<Sss> ssses = new List<Sss>();
ssses.Add(new Sss());
List<Ss> ctrl_Back_ss = new List<Ss>();
ctrl_Back_ss.Add(new Ss());
string txt = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
for (int i = 0; i < 6; i++)
{
if (txt.Contains("d" + i))
{
address = (ushort)(16 + i);
ctrl2.taskId= ctrl.taskId.ToString();
passageway = "d" + i;
if (passageway=="d0")
{
readyState = ctrl.ss[0].op.d0;
}
if(passageway =="d2")
{
readyState = ctrl.ss[0].op.d2;
}
if (passageway == "d4")
{
readyState = ctrl.ss[0].op.d4;
}
ssses[0].addr = ctrl.ss[0].getAddr();
ssses[0].op.Add("duration", ctrl.ss[0].op.getDuration());
ssses[0].op.Add("startTime", ctrl.ss[0].op.getStartTime());
ssses[0].op.Add(passageway, readyState);
ssses[0].op.Add("ts",GetTimeStamp());
ctrl2.ss = ssses;
}
if (ctrl.ss[0].op.d1 == 1 ||
ctrl.ss[0].op.d0 == 1 ||
ctrl.ss[0].op.d2 == 1 ||
ctrl.ss[0].op.d3 == 1 ||
ctrl.ss[0].op.d4 == 1 ||
ctrl.ss[0].op.d5 == 1)
{
on_off = true;
}
else
on_off = false;
}
ID = ctrl.ss[0].getAddr();
ctrl_Back.taskId = ctrl.taskId.ToString();
ctrl_Back_ss[0] = ctrl.ss[0];
totxt.Log("我在469_ctrl_Back_ss[0] = ctrl.ss[0];");
//ctrl_Back.ss[0].op.setStartTime(long.Parse(GetTimeStamp()));
if (ctrl.ss[0].op.getStartTime() != 0)
if (e.ApplicationMessage.Topic == mqttSubscribeControlTopic)
{
Thread objThread = new Thread(new ThreadStart(async delegate
{
await ThreadMethodTxtAsync(Convert.ToInt32(ctrl.ss[0].op.getDuration()));
}));
objThread.Start();
ModualControl.vGetaWay_Receive_Control(stConvertString, out mqttData_Back);
await vControlResponseBack();
}
if (State_enable == true)
{
control(ctrl.ss[0].getAddr(), address, on_off);//根据下发确定控制通道
mqttData_Back = JsonConvert.SerializeObject(ctrl2);
//Modbus_polling();
await Publish();
await Back();
}
//订阅内容部分jSON 解析转对象 根据modbusID或者设备类型处理设备消息
//解析控制部分
})));
Invoke((new Action(() =>
{
......@@ -501,31 +344,6 @@ namespace ModbusDemo
//totxt.Log($">> Retain = {e.ApplicationMessage.Retain}{Environment.NewLine}");
})));
mqttData = null ;
}
public async Task ThreadMethodTxtAsync(int n)
{
this.BeginInvoke(updateTxt, "线程开始执行,执行" + n + "次,每一秒执行一次");
int time = n * 60;
for (int i = 0; i < time; i++)
{
State_enable = false;
this.BeginInvoke(updateTxt, i.ToString());
//一秒 执行一次
Thread.Sleep(1000);
if (i > time - 2)
{
control(ID, address, false);//根据下发确定控制通道
control(ID, (ushort)(address+1), false);//根据下发确定控制通道
//Modbus_polling();
await Publish();
time = 0;
n = 0;
State_enable = true;
}
}
this.BeginInvoke(updateTxt, "线程结束");
}
#endregion
......@@ -533,18 +351,6 @@ namespace ModbusDemo
private static bool bSetDataIsRunning = false;
private Thread ModbusPollThread;
private bool bModbusPollThreadStart = false;
private void GetData()
{
//timer.Interval = 12000;
//timer.Enabled = true;
//timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
//timer.Start();
//timer.Elapsed += (o, a) =>
//{
// SetData();
//};
}
private void vModbusPoll()
{
while(bModbusPollThreadStart)
......@@ -603,92 +409,6 @@ namespace ModbusDemo
bSetDataIsRunning = false;
}
}
}
#region PoolTest
#endregion
//声明委托
private delegate void ShowMessageDelegate(string message);
private void ShowMessage(string message)
{
if (this.InvokeRequired)
{
ShowMessageDelegate showMessageDelegate = ShowMessage;
this.Invoke(showMessageDelegate, new object[] { message });
}
else
{
//txtbox.Text = message;
//totxt.Log(message);
}
}
#endregion
#region json字符串转对象
/// <summary>
/// json字符串转对象
/// </summary>
/// <typeparam name="RData">接收的对象</typeparam>
/// <param name="rd">json字符串</param>
/// <returns></returns>
public RData DataConversion<RData>(string rd)
{
try
{
return JsonConvert.DeserializeObject<RData>(rd);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return default(RData);
}
}
public UData DataConverion<UData>(string ud)
{
try
{
return JsonConvert.DeserializeObject<UData>(ud);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return default(UData);
}
}
/// <summary>
/// 对象转json字符串
/// </summary>
/// <param name="ud">上传实体</param>
/// <returns></returns>
public string DataConversion(UData ud)
{
try
{
return JsonConvert.SerializeObject(ud);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "";
}
}
/// <summary>
///
/// </summary>
/// <param name="rD"></param>
/// <returns></returns>
public string DataConversion(RData rD)
{
try
{
return JsonConvert.SerializeObject(rD);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "";
}
}
#endregion
......@@ -706,12 +426,10 @@ namespace ModbusDemo
MonitorThread.IsBackground = true;
MonitorThread.Start();
}
public void MonitorThreadStop()
{
network.Set();
}
private void MonitorNetWork()
{
while (!network.WaitOne(500))
......@@ -819,8 +537,6 @@ namespace ModbusDemo
// isconn = true;
return isconn;
}
#endregion
#region 更新线程
......@@ -931,7 +647,6 @@ namespace ModbusDemo
const int Singlepackage = 100;
const int PerBlockPacket = Singlepackage;
const int MB_ENOERR = 0;
int iFileSizeNow = 0;
int iFileSize = 0;
int iMaxBufSize = 1024 * 100;
......@@ -944,7 +659,6 @@ namespace ModbusDemo
ushort[] usTrans = new ushort[Singlepackage];
UInt16[] u16unlock = { 0x5749, 0x5449, 0x554D };
int ret;
int errCnt = 0;
FileStream fsl = File.Open(ImagefilePath, FileMode.Open, FileAccess.ReadWrite);
......@@ -1176,19 +890,15 @@ namespace ModbusDemo
private async void SubscribeBut_Click(object sender, EventArgs e)
{
SetTopic();
await Subscribe();
}
private MethodInvoker simpleDelegate1;
private MethodInvoker MQTT_thread;
[Obsolete]
private void btOpenCOM_Click(object sender, EventArgs e)
{
if (LOCALDEBUG == true)
{
comPort.PortName = "COM14";
comPort.PortName = "COM6";
comPort.BaudRate = 9600;
comPort.Parity = Parity.None;
comPort.StopBits = StopBits.One;
......@@ -1230,16 +940,20 @@ namespace ModbusDemo
comPort.Open();
isReconnect = true;
SetMqtt();
if (ModbusPollThread == null)
if (bCretaThead == false)
{
bCretaThead = true;
ModbusPollThread = new Thread(vModbusPoll);
ModbusPollThread.Start();
ModbusControlThread = new Thread(ModualControl.vControl_Poll);
ModbusControlThread.Start();
}
else
{
ModbusPollThread.Resume();
bModbusPollThreadStart = true;
//simpleDelegate1 = new MethodInvoker(GetData);
//simpleDelegate1.BeginInvoke(null, null);
}
bModbusPollThreadStart = true;
MQTT_thread = new MethodInvoker(Sendout);
MQTT_thread.BeginInvoke(null, null);
Task.Run(async () => { await ConnectMqttServerAsync(); });
......@@ -1267,7 +981,6 @@ namespace ModbusDemo
private void btCloseCOM_Click(object sender, EventArgs e)
{
//Close comport first,then stop and dispose slave.
//timer.Stop();
bModbusPollThreadStart = false;
if(ModbusPollThread.IsAlive)
ModbusPollThread.Suspend();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment