public static async Task Post_XAGY_WII_InjectionAllocation(ModbusRtuOverTcp client, RedisClient redisClient, string messageString) { var par = messageString.FromJson <ControlRequest>(); var waterWell = new IotDataWaterWell(); var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>(); var modbusAddress = par.ModbusAddress; waterWell.DeviceTypeId = par.DeviceTypeId; ClientInfo.CurrentModbusPoolAddress = modbusAddress; try { if (!par.CommandParameter.IsNullOrEmpty()) { var parDict = par.CommandParameter.FromJson <Dictionary <long, double> >(); if (parDict != null) { foreach (var item in parDict) { var slotId = item.Key; var startAddress = (ushort)(1 + slotId - 2); var value = (ushort)(item.Value * 100); var read = await client.WriteOneRegisterAsync($"s={par.ModbusAddress};{startAddress}", value); if (read.IsSuccess) { if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, "ok"); } } else { if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, -1, "error"); } } } } } } catch (Exception ex) { Logger.Error(ex.Message); Logger.Error(ex.StackTrace); Logger.Error(ex.Source); if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, -1, ex.Message); } } }
public static IotDataWaterWell GetCacularResult(byte[] data) { //0.5配注 //0.38瞬时 //6682.76 当日累计 //11.53 管压 IotDataWaterWell waterWell = new IotDataWaterWell(); //配注仪状态: 0 var r0 = data[4]; //设定流量回读: 0.17 var t = BCDUtils.BCDToUshort((ushort)(data[5] << 8 | data[6])); var r1 = t / 100.0; //瞬时流量: 0.15 t = BCDUtils.BCDToUshort((ushort)(data[7] << 8 | data[8])); var r2 = t / 100.0; //累计流量: 6682.89 var t1 = BCDUtils.BCDToUshort((ushort)(data[9] << 8 | data[10])); var t2 = BCDUtils.BCDToUshort((ushort)(data[11] << 8 | data[12])); var r3 = t1 * 100 + t2 / 100.0; //扩展: 0.0 //水井压力: 10.83 t = BCDUtils.BCDToUshort((ushort)(data[17] << 8 | data[18])); var r4 = t / 100.0; waterWell.SettedFlow = r1; //设定流量回读 waterWell.TubePressure = r4; //管压 waterWell.InstantaneousFlow = r2; //瞬时流量 waterWell.CumulativeFlow = r3; //表头累计 Console.WriteLine("waterWell:" + waterWell.ToJson()); waterWell.PrintDump(); return(waterWell); }
public static void Get_XAGY_WII_WaterInjectingInstrument_Mock(ModbusRtuOverTcp client, RedisClient redisClient, string messageString) { var par = messageString.FromJson <ControlRequest>(); var waterWell = new IotDataWaterWell { AlarmCode = 0, AlarmMsg = "" }; try { waterWell.AlarmCode = 0; waterWell.AlarmMsg = "Mock数据"; waterWell.Mock = par.UseMockData; waterWell.WellId = par.DeviceId; waterWell.DateTime = DateTime.Now; redisClient.AddItemToList("YCIOT:IOT_Data_WaterWell", waterWell.ToJson().IndentJson()); redisClient.Set($"Group:WaterWell:{par.DeviceName}-{par.DeviceId}", waterWell); //用于通过ServerEvent给调用着返回消息 if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, waterWell.ToJson().IndentJson()); } } catch (Exception ex) { Logger.Error(ex.Message); Logger.Error(ex.StackTrace); Logger.Error(ex.Source); if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, -1, ex.Message); } } }
public static async Task Get_ZJJH_WII_WaterInjectingInstrument(ModbusRtuOverTcp client, RedisClient redisClient, string messageString) { var par = messageString.FromJson <ControlRequest>(); var waterWell = new IotDataWaterWell { AlarmCode = 0, AlarmMsg = "" }; var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>(); var modbusAddress = par.ModbusAddress; waterWell.DeviceTypeId = par.DeviceTypeId; ClientInfo.CurrentModbusPoolAddress = modbusAddress; try { if (!par.CommandParameter.IsNullOrEmpty()) { var dic = (JObject)JsonConvert.DeserializeObject(par.CommandParameter); if (dic != null) { var slotId = Convert.ToInt32(dic["1"]); var flag = true; var startAddress = (ushort)(1 + 6 * (slotId - 1)); var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", 6); if (read.IsSuccess) { var value = client.ByteTransform.TransInt16(read.Content, 10); waterWell.SettedFlow = value / 100.0; //设定流量回读 value = client.ByteTransform.TransInt16(read.Content, 4); waterWell.InstantaneousFlow = value / 100.0; //瞬时流量 var value3 = client.ByteTransform.TransInt16(read.Content, 6); var value4 = client.ByteTransform.TransInt16(read.Content, 8); waterWell.CumulativeFlow = (value3 << 16 + value4) / 100.0;//表头累计 value = client.ByteTransform.TransInt16(read.Content, 0); waterWell.ValveStatus = value; //阀门状态 value = client.ByteTransform.TransInt16(read.Content, 2); waterWell.ValveMode = value; //阀门工作模式 waterWell.DateTime = DateTime.Now; //采集时间 //var result1 = await client.ReadHoldingRegisters(modbusAddress, (ushort)(30015 + 6 + 6 * (slotId - 1)), 1); //waterWell.TubePressure = result1[0].Value / 100.0;//管压 } else { flag = false; waterWell.AlarmCode = -1; waterWell.AlarmMsg = "数据异常"; waterWell.Mock = par.UseMockData; logIotModbusPoll.DateTime = DateTime.Now; logIotModbusPoll.State = -1; logIotModbusPoll.Result = "读取注水井数据异常!"; redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson()); } waterWell.NetworkNode = ClientInfo.ManyIpAddress; if (flag == true || par.UseMockData) { waterWell.Mock = par.UseMockData; redisClient.AddItemToList("YCIOT:IOT_Data_WaterWell", waterWell.ToJson().IndentJson()); redisClient.Set($"Group:WaterWell:{par.DeviceName}-{par.DeviceId}", waterWell); } //用于通过ServerEvent给调用着返回消息 if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, waterWell.ToJson().IndentJson()); } } } } catch (Exception ex) { Logger.Error(ex.Message); Logger.Error(ex.StackTrace); Logger.Error(ex.Source); } }
/// <summary> /// 获取油压套压 /// </summary> /// <param name="client"></param> /// <param name="redisClient"></param> /// <param name="messageString"></param> /// <returns></returns> public static async Task Get_XAAS_WII_Pressure(ModbusRtuOverTcp client, RedisClient redisClient, string messageString) { var par = messageString.FromJson <ControlRequest>(); var waterWell = new IotDataWaterWell(); var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>(); var modbusAddress = par.ModbusAddress; waterWell.DeviceTypeId = par.DeviceTypeId; ClientInfo.LinkId = par.LinkId; ClientInfo.CurrentModbusPoolAddress = modbusAddress; var flag = true; try { if (!par.CommandParameter.IsNullOrEmpty()) { var parDict = par.CommandParameter.FromJson <Dictionary <long, string> >(); if (parDict != null) { var startAddress = (ushort)30044; lock (ClientInfo.locker) { ClientInfo.RequestTime = DateTime.Now; ClientInfo.ExpectedType = 0x04; ClientInfo.ExpectedDataLen = 0x04; } var read = await client.ReadAsync($"s={par.ModbusAddress};x=4;{startAddress}", 2); if (read.IsSuccess) { //油压,默认值:0 var value = client.ByteTransform.TransInt16(read.Content, 0); //套压,默认值:0 value = client.ByteTransform.TransInt16(read.Content, 2); waterWell.DateTime = DateTime.Now; //采集时间 } else { flag = false; waterWell.AlarmCode = -1; waterWell.AlarmMsg = "数据异常"; waterWell.Mock = par.UseMockData; logIotModbusPoll.DateTime = DateTime.Now; logIotModbusPoll.State = -1; string msg = $"{par.DeviceName}-{par.DeviceId}"; Logger.Warn($"{msg}:读取油压套压数据异常![{read.Message}]"); logIotModbusPoll.Result = $"{msg}:读取油压套压数据异常![{read.Message}]"; redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson()); } if (flag) { startAddress = 40083; lock (ClientInfo.locker) { ClientInfo.RequestTime = DateTime.Now; ClientInfo.ExpectedType = 0x04; ClientInfo.ExpectedDataLen = 16; } //读取油压套压系数 read = await client.ReadAsync($"s={par.ModbusAddress};x=4;{startAddress}", 8); if (read.IsSuccess) { waterWell.WellId = par.DeviceId; //水井ID //油压增益系数,float-ABCD,默认值:0.059 var value1 = client.ByteTransform.TransUInt16(read.Content, 0); var value2 = client.ByteTransform.TransUInt16(read.Content, 2); var value = value1 << 16 | value2; //油压偏移系数,float-ABCD,默认值:786.3 value1 = client.ByteTransform.TransUInt16(read.Content, 4); value2 = client.ByteTransform.TransUInt16(read.Content, 6); value = value1 << 16 | value2; //套压增益系数,float-ABCD,默认值:0.059 value1 = client.ByteTransform.TransUInt16(read.Content, 8); value2 = client.ByteTransform.TransUInt16(read.Content, 10); value = value1 << 16 | value2; //套压偏移系数,float-ABCD,默认值:786.3 value1 = client.ByteTransform.TransUInt16(read.Content, 12); value2 = client.ByteTransform.TransUInt16(read.Content, 14); value = value1 << 16 | value2; } else { flag = false; waterWell.AlarmCode = -1; waterWell.AlarmMsg = "数据异常"; waterWell.Mock = par.UseMockData; logIotModbusPoll.DateTime = DateTime.Now; logIotModbusPoll.State = -1; string msg = $"{par.DeviceName}-{par.DeviceId}"; Logger.Warn($"{msg}:读取油压套压系数异常![{read.Message}]"); logIotModbusPoll.Result = $"{msg}:读取油压套压系数异常![{read.Message}]"; redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson()); } waterWell.NetworkNode = ClientInfo.ManyIpAddress; if (flag == true || par.UseMockData) { waterWell.Mock = par.UseMockData; redisClient.AddItemToList("YCIOT:IOT_Data_WaterWell", waterWell.ToJson().IndentJson()); redisClient.Set($"Group:WaterWell:{par.DeviceName}-{par.DeviceId}", waterWell); } //用于通过ServerEvent给调用着返回消息 if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, waterWell.ToJson().IndentJson()); } } } } } catch (Exception ex) { Logger.Error(ex.Message); Logger.Error(ex.StackTrace); Logger.Error(ex.Source); if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, -1, ex.Message); } } }
public static async Task Get_XAAS_WII_WaterInjectingInstrument(ModbusRtuOverTcp client, RedisClient redisClient, string messageString) { var par = messageString.FromJson <ControlRequest>(); var waterWell = new IotDataWaterWell(); var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>(); //par.ModbusAddress = 1; var modbusAddress = par.ModbusAddress; waterWell.DeviceTypeId = par.DeviceTypeId; ClientInfo.LinkId = par.LinkId; ClientInfo.CurrentModbusPoolAddress = modbusAddress; var flag = true; try { if (!par.CommandParameter.IsNullOrEmpty()) { var parDict = par.CommandParameter.FromJson <Dictionary <long, string> >(); if (parDict != null) { var startAddress = (ushort)10; lock (ClientInfo.locker) { ClientInfo.RequestTime = DateTime.Now; ClientInfo.ExpectedType = 0x04; ClientInfo.ExpectedDataLen = 0x08; } var read = await client.ReadAsync($"s={par.ModbusAddress};x=4;{startAddress}", 4); if (read.IsSuccess) { var value1 = client.ByteTransform.TransInt16(read.Content, 0); var value2 = client.ByteTransform.TransInt16(read.Content, 2); var value3 = client.ByteTransform.TransInt16(read.Content, 4); var value4 = client.ByteTransform.TransInt16(read.Content, 6); var v1 = BCDUtils.BCDToUshort((ushort)value1) / 100.0; var v2 = BCDUtils.BCDToUshort((ushort)value2) / 100.0; var v3 = BCDUtils.BCDToUshort((ushort)value3) / 100.0; var v4 = BCDUtils.BCDToUshort((ushort)value4) / 100.0; double[] values = { v1, v2, v3, v4 }; waterWell.TrunkPressure = values.Max(); //总汇管压力 waterWell.DateTime = DateTime.Now; //采集时间 } else { flag = false; waterWell.AlarmCode = -1; waterWell.AlarmMsg = "数据异常"; waterWell.Mock = par.UseMockData; logIotModbusPoll.DateTime = DateTime.Now; logIotModbusPoll.State = -1; string msg = $"{par.DeviceName}-{par.DeviceId}"; Logger.Warn($"{msg}:读取注水间干压数据异常![{read.Message}]"); logIotModbusPoll.Result = $"{msg}:读取注水间干压数据异常![{read.Message}]"; redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson()); } if (flag) { var dic = (JObject)JsonConvert.DeserializeObject(par.CommandParameter); if (dic != null) { var slotId = Convert.ToInt32(dic["1"]); flag = true; startAddress = (ushort)(14 + 10 * (slotId - 1)); lock (ClientInfo.locker) { ClientInfo.RequestTime = DateTime.Now; ClientInfo.ExpectedType = 0x04; ClientInfo.ExpectedDataLen = 0x14 + 2; } read = await client.ReadAsync($"s={par.ModbusAddress};x=4;{startAddress}", 11); if (read.IsSuccess) { waterWell.WellId = par.DeviceId; //水井ID var value = client.ByteTransform.TransInt16(read.Content, 0); waterWell.ValveStatus = (BCDUtils.BCDToUshort(read.Content[0]) >> 4) & 0x01; //阀门状态 waterWell.ValveMode = (BCDUtils.BCDToUshort(read.Content[0]) >> 1) & 0x01; //阀门工作模式 value = client.ByteTransform.TransInt16(read.Content, 2); waterWell.SettedFlow = BCDUtils.BCDToUshort((ushort)value) / 100.0; //设定流量回读 value = client.ByteTransform.TransInt16(read.Content, 4); waterWell.InstantaneousFlow = BCDUtils.BCDToUshort((ushort)value) / 100.0; //瞬时流量 var value1 = client.ByteTransform.TransInt16(read.Content, 6); var value2 = client.ByteTransform.TransInt16(read.Content, 8); waterWell.CumulativeFlow = BCDUtils.BCDToUshort((ushort)value1) * 100 + BCDUtils.BCDToUshort((ushort)value2) / 100.0;//表头累计 value = client.ByteTransform.TransInt16(read.Content, 14); waterWell.TubePressure = BCDUtils.BCDToUshort((ushort)value) / 100.0; //管压 waterWell.DateTime = DateTime.Now; //采集时间 } else { flag = false; waterWell.AlarmCode = -1; waterWell.AlarmMsg = "数据异常"; waterWell.Mock = par.UseMockData; logIotModbusPoll.DateTime = DateTime.Now; logIotModbusPoll.State = -1; string msg = $"{par.DeviceName}-{par.DeviceId}"; Logger.Warn($"{msg}:读取注水井数据异常![{read.Message}]"); logIotModbusPoll.Result = $"{msg}:读取注水井数据异常![{read.Message}]"; redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson()); } } waterWell.NetworkNode = ClientInfo.ManyIpAddress; if (flag == true || par.UseMockData) { waterWell.Mock = par.UseMockData; redisClient.AddItemToList("YCIOT:IOT_Data_WaterWell", waterWell.ToJson().IndentJson()); redisClient.Set($"Group:WaterWell:{par.DeviceName}-{par.DeviceId}", waterWell); } //用于通过ServerEvent给调用着返回消息 if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, waterWell.ToJson().IndentJson()); } } } } } catch (Exception ex) { Logger.Error(ex.Message); Logger.Error(ex.StackTrace); Logger.Error(ex.Source); if (!par.UserName.IsNullOrEmpty()) { ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, -1, ex.Message); } } }