示例#1
0
        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);
                }
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
                }
            }
        }
示例#4
0
        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);
            }
        }
示例#5
0
        /// <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);
                }
            }
        }
示例#6
0
        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);
                }
            }
        }