Пример #1
0
        public static async Task <bool> GetDateTime(ModbusRtuOverTcp client, int modbusAddress, IotDataOilOmeter tankmeasure, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            lock (ClientInfo.locker)
            {
                ClientInfo.RequestTime     = DateTime.Now;
                ClientInfo.ExpectedType    = 0x04;
                ClientInfo.ExpectedDataLen = regCount * 2;
            }
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                var year  = client.ByteTransform.TransByte(read.Content, 0);
                var month = client.ByteTransform.TransByte(read.Content, 1);
                var date  = client.ByteTransform.TransByte(read.Content, 2);
                var h     = client.ByteTransform.TransByte(read.Content, 3);
                var m     = client.ByteTransform.TransByte(read.Content, 4);
                var s     = client.ByteTransform.TransByte(read.Content, 5);

                if (year != 0 && month != 0 && date != 0)
                {
                    tankmeasure.DateTime = new DateTime(2000 + year, month, date, h, m, s);
                }
                return(true);
            }
            else
            {
                tryReadTimes--;
                if (tryReadTimes > 0)
                {
                    return(await GetDateTime(client, modbusAddress, tankmeasure, startAddress, regCount, tryReadTimes));
                }
                return(false);
            }
        }
Пример #2
0
        public static async Task <bool> GetDateTime(ModbusRtuOverTcp client, int modbusAddress, IotDataOilWellMovefluidlevel dytDiagram, ushort startAddress, ushort regCount, int tryReadTimes = 3)
        {
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                var year  = client.ByteTransform.TransUInt16(read.Content, 0);
                var month = client.ByteTransform.TransUInt16(read.Content, 1);
                var date  = client.ByteTransform.TransUInt16(read.Content, 2);
                var h     = client.ByteTransform.TransUInt16(read.Content, 3);
                var m     = client.ByteTransform.TransUInt16(read.Content, 4);
                var s     = client.ByteTransform.TransUInt16(read.Content, 5);

                dytDiagram.DateTime = new DateTime(2000 + year, month, date, h, m, s);
                return(true);
            }
            else
            {
                tryReadTimes--;
                if (tryReadTimes > 0)
                {
                    return(await GetDateTime(client, modbusAddress, dytDiagram, startAddress, regCount, tryReadTimes));
                }
                return(false);
            }
        }
Пример #3
0
        public static async Task <bool> GetCount(ModbusRtuOverTcp client, int modbusAddress, IotDataOilWellIndicatorDiagram indicatorDiagram, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            lock (ClientInfo.locker)
            {
                ClientInfo.RequestTime     = DateTime.Now;
                ClientInfo.ExpectedType    = 0x04;
                ClientInfo.ExpectedDataLen = regCount * 2;
            }
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                var value = client.ByteTransform.TransInt16(read.Content, 0);
                indicatorDiagram.Count = value;
                return(true);
            }
            else
            {
                tryReadTimes--;

                if (tryReadTimes > 0)
                {
                    return(await GetCount(client, modbusAddress, indicatorDiagram, startAddress, regCount, tryReadTimes));
                }

                return(false);
            }
        }
Пример #4
0
        public static async Task <bool> GetGJL(ModbusRtuOverTcp client, int modbusAddress, IotDataOilOmeter tankmeasure, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            lock (ClientInfo.locker)
            {
                ClientInfo.RequestTime     = DateTime.Now;
                ClientInfo.ExpectedType    = 0x04;
                ClientInfo.ExpectedDataLen = regCount * 2;
            }
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                var value = client.ByteTransform.TransInt16(read.Content, 0);

                //毫米
                tankmeasure.CurrentElevation = value;
                return(true);
            }
            else
            {
                tryReadTimes--;
                if (tryReadTimes > 0)
                {
                    return(await GetGJL(client, modbusAddress, tankmeasure, startAddress, regCount, tryReadTimes));
                }
                return(false);
            }
        }
Пример #5
0
        public static async Task Get_XAGL_WM3000KZG_ControllerParameter(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var modbusAddress = par.ModbusAddress;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 10;
                }

                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;7596", 5);

                if (read.IsSuccess && read.Content.Length == 2 * 5)
                {
                    // 电机额定功率  7596  变比 0.1
                    var value       = client.ByteTransform.TransInt16(read.Content, 0);
                    var eDingGongLv = Math.Round(value * 0.1, 2);

                    // 电机额定电压  7597  变比 1
                    value = client.ByteTransform.TransInt16(read.Content, 2);
                    var eDingDianYa = value;

                    // 电机额定电流  7598  变比 0.01
                    value = client.ByteTransform.TransInt16(read.Content, 4);
                    var eDingDianliu = Math.Round(value * 0.01, 2);

                    // 电机额定频率  7599  变比 0.01
                    value = client.ByteTransform.TransInt16(read.Content, 6);
                    var eDingPingLv = Math.Round(value * 0.01, 2);

                    // 电机额定转速  7600  变比 1
                    value = client.ByteTransform.TransInt16(read.Content, 8);
                    var eDingZhuanSu = value;
                }
            }
            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_LYQH_KZG_StartWellTime(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var modbusAddress = par.ModbusAddress;

                // 读取0x0081  开井时间

                var jo1 = (JObject)JsonConvert.DeserializeObject(par.CommandParameter);

                var slotId = Convert.ToInt32(jo1["1"].ToString());

                var startAddress = (ushort)((slotId * 0x100) + 0x0081);

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 4 * 2;
                }
                var read = await client.ReadAsync($"s={par.ModbusAddress};3;{startAddress}", 4);

                if (read.IsSuccess)
                {
                    var year  = client.ByteTransform.TransByte(read.Content, 0);
                    var month = client.ByteTransform.TransByte(read.Content, 1);
                    var date  = client.ByteTransform.TransByte(read.Content, 2);
                    var h     = client.ByteTransform.TransByte(read.Content, 3);
                    var m     = client.ByteTransform.TransByte(read.Content, 4);
                    var s     = client.ByteTransform.TransByte(read.Content, 5);

                    var DateTime = new DateTime(2000 + year, month, date, h, m, s);
                }

                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, read.IsSuccess ? 0 : -2, "ok");
                }
            }
            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);
                }
            }
        }
Пример #7
0
        public static async Task <bool> GetAll(ModbusRtuOverTcp client, int modbusAddress, IotDataOilWellMovefluidlevel dytDiagram, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            lock (ClientInfo.locker)
            {
                ClientInfo.RequestTime     = DateTime.Now;
                ClientInfo.ExpectedType    = 0x04;
                ClientInfo.ExpectedDataLen = regCount * 2;
            }
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                //读取时间
                var year  = client.ByteTransform.TransByte(read.Content, 0);
                var month = client.ByteTransform.TransByte(read.Content, 1);
                var date  = client.ByteTransform.TransByte(read.Content, 2);
                var h     = client.ByteTransform.TransByte(read.Content, 3);
                var m     = client.ByteTransform.TransByte(read.Content, 4);
                var s     = client.ByteTransform.TransByte(read.Content, 5);

                dytDiagram.DateTime = new DateTime(2000 + year, month, date, h, m, s);

                //采样周期
                var value = client.ByteTransform.TransInt16(read.Content, 6);

                dytDiagram.Period = (int)(value * 0.01);

                //模式
                value = client.ByteTransform.TransInt16(read.Content, 8);

                dytDiagram.Model = value;

                //点数
                value = client.ByteTransform.TransInt16(read.Content, 10);

                dytDiagram.Count = value;
                return(true);
            }
            else
            {
                tryReadTimes--;

                if (tryReadTimes > 0)
                {
                    return(await GetAll(client, modbusAddress, dytDiagram, startAddress, regCount, tryReadTimes));
                }

                return(false);
            }
        }
Пример #8
0
        public static async Task <bool> GetMode(ModbusRtuOverTcp client, int modbusAddress, IotDataOilWellMovefluidlevel dytDiagram, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                var value = client.ByteTransform.TransInt16(read.Content, 0);
                dytDiagram.Model = value;
                return(true);
            }
            else
            {
                tryReadTimes--;
                if (tryReadTimes > 0)
                {
                    return(await GetMode(client, modbusAddress, dytDiagram, startAddress, regCount, tryReadTimes));
                }
                return(false);
            }
        }
Пример #9
0
        public static async Task <bool> GetCData(ModbusRtuOverTcp client, int modbusAddress, IotDataOilWellCurrentDiagram currentDiagram, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            lock (ClientInfo.locker)
            {
                ClientInfo.RequestTime     = DateTime.Now;
                ClientInfo.ExpectedType    = 0x04;
                ClientInfo.ExpectedDataLen = regCount * 2;
            }
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                for (var j = 0; j < regCount; j++)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, j * 2);
                    if (value != 0)
                    {
                        //变比0.001,没有按协议文档,按实际的情况定
                        var L = value * 0.001;
                        currentDiagram.C.Add(Math.Round(L, 2));
                    }
                    else
                    {
                        currentDiagram.C.Add(value);
                    }
                }
                return(true);
            }
            else
            {
                tryReadTimes--;
                if (tryReadTimes > 0)
                {
                    return(await GetCData(client, modbusAddress, currentDiagram, startAddress, regCount, tryReadTimes));
                }
                return(false);
            }
        }
Пример #10
0
        public static async Task <bool> GetDData(ModbusRtuOverTcp client, int modbusAddress, IotDataOilWellMovefluidlevel dytDiagram, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            lock (ClientInfo.locker)
            {
                ClientInfo.RequestTime     = DateTime.Now;
                ClientInfo.ExpectedType    = 0x04;
                ClientInfo.ExpectedDataLen = regCount * 2;
            }
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                for (var j = 0; j < regCount; j++)
                {
                    //无符号数0-65535
                    var value = client.ByteTransform.TransUInt16(read.Content, j * 2);
                    if (value != 0)
                    {
                        var L = value;
                        dytDiagram.Y.Add(value);
                    }
                    else
                    {
                        dytDiagram.Y.Add(value);
                    }
                }
                return(true);
            }
            else
            {
                tryReadTimes--;
                if (tryReadTimes > 0)
                {
                    return(await GetDData(client, modbusAddress, dytDiagram, startAddress, regCount, tryReadTimes));
                }
                return(false);
            }
        }
Пример #11
0
        /// <summary>
        /// 读取控制器数据
        /// </summary>
        /// <param name="client"></param>
        /// <param name="redisClient"></param>
        /// <param name="messageString"></param>
        /// <returns></returns>
        public static async Task Get_XAGL_WM3000KZG_ControllerStatus(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var iotDataOilWellControllerState = new IotDataOilWellControllerState()
                {
                    NetworkNode = ClientInfo.ManyIpAddress,
                    AlarmCode   = 0,
                    AlarmMsg    = "正常"
                };
                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;
                iotDataOilWellControllerState.DateTime     = DateTime.Now;
                iotDataOilWellControllerState.DeviceTypeId = par.DeviceTypeId;
                iotDataOilWellControllerState.Mock         = false;

                var flag = true;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                iotDataOilWellControllerState.DateTime = DateTime.Now;
                iotDataOilWellControllerState.WellId   = par.DeviceId;

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 29 * 2;
                }

                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4096", 4124 - 4096 + 1);

                if (read.IsSuccess)
                {
                    // 耗电量  4096  变比 1
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    iotDataOilWellControllerState.FrequencyConversionActivePower = value;

                    // 当前冲次  4097  变比 0.1
                    value = client.ByteTransform.TransInt16(read.Content, 2);
                    iotDataOilWellControllerState.Stroke = Math.Round(value * 0.1, 2);

                    // 电流平衡度  4098  变比 0.01
                    value = client.ByteTransform.TransInt16(read.Content, 4);
                    iotDataOilWellControllerState.CurrentBalance = Math.Round(value * 0.01 * 100, 2);

                    // 上行最大电流  4099  变比 0.0
                    value = client.ByteTransform.TransInt16(read.Content, 6);
                    iotDataOilWellControllerState.MaxUpCurrent = Math.Round(value * 0.01, 2);

                    // 下行最大电流  4100  变比 0.01
                    value = client.ByteTransform.TransInt16(read.Content, 8);
                    iotDataOilWellControllerState.MaxDownCurrent = Math.Round(value * 0.01, 2);

                    //变频器报警代码  4101  变比 1
                    value = client.ByteTransform.TransInt16(read.Content, 10);
                    iotDataOilWellControllerState.AlarmCode = value;

                    // 起停状态  4103  变比 1--->4102
                    value = client.ByteTransform.TransInt16(read.Content, 16);
                    iotDataOilWellControllerState.StartAndStopStatus = value; //2020-04-15 由6变为8

                    #region 去掉启停状态抛弃  后期可修改为插入异常标识 yangzx 20201014
                    ////当启停状态非1和3时候,直接抛弃
                    //if (value != 1 && value != 3)
                    //{
                    //    iotDataOilWellControllerState.AlarmCode = -1;
                    //    iotDataOilWellControllerState.AlarmMsg = "数据异常";

                    //    iotDataOilWellControllerState.Mock = par.UseMockData;
                    //    logIotModbusPoll.DateTime = DateTime.Now;
                    //    logIotModbusPoll.State = -1;
                    //    logIotModbusPoll.Result = $"读取变频器启停状态异常,读取异常值为:{value}";

                    //    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    //    return;
                    //}
                    #endregion

                    // 运行频率  4105  变比 1--->4103
                    value = client.ByteTransform.TransInt16(read.Content, 14);
                    iotDataOilWellControllerState.Frequency = Math.Round(value * 0.01, 2);

                    // 运行状态  4106  变比 1--->4104
                    value = client.ByteTransform.TransInt16(read.Content, 12);
                    iotDataOilWellControllerState.RunState = value;  //2020-04-15 由8变为6

                    //变频累积运行时间4105
                    value = client.ByteTransform.TransInt16(read.Content, 18);
                    iotDataOilWellControllerState.TotalRunTime = value;

                    //变频母线电压4106
                    value = client.ByteTransform.TransInt16(read.Content, 20);
                    iotDataOilWellControllerState.BusBarVoltage = Math.Round(value * 0.1, 2);

                    //工变频切换 4122
                    value = client.ByteTransform.TransInt16(read.Content, 52);
                    iotDataOilWellControllerState.WorkAndChangeFrequencySwitch = value;

                    //就地远程切换4123
                    value = client.ByteTransform.TransInt16(read.Content, 54);
                    iotDataOilWellControllerState.LocalAndFarSwitch = value;
                }
                else
                {
                    flag = false;

                    iotDataOilWellControllerState.AlarmCode = -1;
                    iotDataOilWellControllerState.AlarmMsg  = "数据异常";

                    iotDataOilWellControllerState.Mock = par.UseMockData;
                    logIotModbusPoll.DateTime          = DateTime.Now;
                    logIotModbusPoll.State             = -1;
                    logIotModbusPoll.Result            = $"读取变频器状态数据异常!{read.Message}";

                    $"{logIotModbusPoll.Result}".Info();

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 4;
                    }
                    //抽油机冲程7632--
                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;7632", 2);

                    if (read.IsSuccess)
                    {
                        var value = client.ByteTransform.TransInt16(read.Content, 0);
                        iotDataOilWellControllerState.MaxDisplacement = Math.Round(value * 0.1, 2);
                    }
                    else
                    {
                        flag = false;

                        iotDataOilWellControllerState.AlarmCode = -1;
                        iotDataOilWellControllerState.AlarmMsg  = "数据异常";
                        iotDataOilWellControllerState.Mock      = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取冲程数据异常![{read.Message}]";
                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                iotDataOilWellControllerState.NetworkNode = ClientInfo.ManyIpAddress;

                //Redis中写入设备最后状态

                if (flag == true || par.UseMockData)
                {
                    iotDataOilWellControllerState.Mock = par.UseMockData;

                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_ControllerState", iotDataOilWellControllerState.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:ControllerState", iotDataOilWellControllerState);
                    redisClient.Set($"Single:OilWell:ControllerState:{par.DeviceName}-{par.DeviceId}", iotDataOilWellControllerState);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, iotDataOilWellControllerState.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);
                }
            }
        }
Пример #12
0
        /// <summary>
        /// 读取电表数据
        /// </summary>
        /// <param name="client"></param>
        /// <param name="redisClient"></param>
        /// <param name="messageString"></param>
        /// <returns></returns>
        public static async Task Get_XAAS_WII_PowerMeter(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var powerMeter = new IotDataOilWellPowerMeter()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                var modbusAddress = par.ModbusAddress;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;
                ClientInfo.LinkId = par.LinkId;

                powerMeter.DateTime = DateTime.Now;
                powerMeter.WellId   = par.DeviceId;

                powerMeter.DeviceTypeId = par.DeviceTypeId;
                powerMeter.Mock         = false;

                var flag = true;

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 2;
                }
                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;40532", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    if (value == 1)
                    {
                        powerMeter.NetworkNode = ClientInfo.ManyIpAddress;

                        powerMeter.AlarmCode = 3;
                        powerMeter.AlarmMsg  = "停井";
                    }
                }
                else
                {
                    flag = false;
                    powerMeter.AlarmCode = -1;
                    powerMeter.AlarmMsg  = "数据异常";

                    powerMeter.Mock           = par.UseMockData;
                    logIotModbusPoll.DateTime = DateTime.Now;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = $"读取电参数据异常![{read.Message}]";
                    $"DB:{par.DeviceName}-{par.DeviceId}{logIotModbusPoll.Result}".Info();

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }


                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 30;
                    }

                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;40533", 15);

                    if (read.IsSuccess)
                    {
                        // A相电流  40533  变比 0.01
                        var value = client.ByteTransform.TransInt16(read.Content, 0);
                        powerMeter.APhaseCurrent = Math.Round(value * 0.01, 1);

                        // B相电流   40534  变比 0.01
                        value = client.ByteTransform.TransInt16(read.Content, 2);
                        powerMeter.BPhaseCurrent = Math.Round(value * 0.01, 1);

                        // C相电流   40535  变比 0.01
                        value = client.ByteTransform.TransInt16(read.Content, 4);
                        powerMeter.CPhaseCurrent = Math.Round(value * 0.01, 1);

                        // A相电压  40536  变比 0.1
                        value = client.ByteTransform.TransInt16(read.Content, 6);
                        powerMeter.APhaseVoltage = Math.Round(value * 0.1, 1);

                        // B相电压  40537  变比 0.1
                        value = client.ByteTransform.TransInt16(read.Content, 8);
                        powerMeter.BPhaseVoltage = Math.Round(value * 0.1, 1);


                        // C相电压  40538  变比 0.1
                        value = client.ByteTransform.TransInt16(read.Content, 10);
                        powerMeter.CPhaseVoltage = Math.Round(value * 0.1, 1);


                        // 总有功功率  40539  变比0.01
                        value = client.ByteTransform.TransInt16(read.Content, 12);
                        powerMeter.TotalActivePower = Math.Round(value * 0.01, 1);

                        // 总无功功率  40540  变比0.01
                        value = client.ByteTransform.TransInt16(read.Content, 14);
                        powerMeter.TotalReactivePower = Math.Round(value * 0.01, 1);

                        //总视在功率  40541  变比0.01
                        value = client.ByteTransform.TransInt16(read.Content, 16);
                        powerMeter.TotalApparentPower = Math.Round(value * 0.01, 1);

                        // 总功率因素(功率因数) 40547  变比 0.01
                        value = client.ByteTransform.TransInt16(read.Content, 28);
                        powerMeter.TotalPowerFactor = Math.Round(value * 0.01, 1);
                    }
                    else
                    {
                        flag = false;
                        powerMeter.AlarmCode = -1;
                        powerMeter.AlarmMsg  = "数据异常";

                        powerMeter.Mock           = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取电参数据异常![{read.Message}]";

                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 8;
                    }
                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;40543", 4);

                    if (read.IsSuccess)
                    {
                        var value0 = client.ByteTransform.TransInt16(read.Content, 0);
                        var value1 = client.ByteTransform.TransInt16(read.Content, 2);
                        var value2 = client.ByteTransform.TransInt16(read.Content, 4);
                        var value3 = client.ByteTransform.TransInt16(read.Content, 6);
                        //总有功电能
                        powerMeter.TotalActiveEnergy = Math.Round(((value1 * 65536 + value0) * 0.01), 2);
                        //电参模型中缺少总无功电能
                        //powerMeter.TotalReactivePower = Math.Round(((value3 * 65536 + value2) * 0.01), 2);
                    }
                    else
                    {
                        flag = false;

                        powerMeter.AlarmCode = -1;
                        powerMeter.AlarmMsg  = "数据异常";

                        powerMeter.Mock           = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取总有功电能数据异常![{read.Message}]";

                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }
                powerMeter.NetworkNode = ClientInfo.ManyIpAddress;

                //用于将读取的结果写入Redis队列
                if (flag == true || par.UseMockData)
                {
                    $"DB:{par.DeviceName}-{par.DeviceId}已获取到数据".Info();
                    powerMeter.Mock = par.UseMockData;
                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_PowerMeter", powerMeter.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:PowerMeter", powerMeter);
                    redisClient.Set($"Single:OilWell:PowerMeter:{par.DeviceName}-{par.DeviceId}", powerMeter);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, powerMeter.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);
                }
            }
        }
Пример #13
0
        public static async Task Get_XAGL_WM2000GLT_PowerDiagram(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var powerDiagram = new IotDataOilWellPowerDiagram()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;
                powerDiagram.DeviceTypeId = par.DeviceTypeId;
                powerDiagram.Mock         = false;

                var flag = true;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                var jo1 = (JObject)JsonConvert.DeserializeObject(par.CommandParameter);
                powerDiagram.Displacement = Convert.ToDouble(jo1["0"].ToString());

                powerDiagram.D = new List <double>(); //位移
                powerDiagram.P = new List <double>(); //功率

                powerDiagram.DateTime = DateTime.Now;
                powerDiagram.WellId   = par.DeviceId;


                #region  判断井状态

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 2;
                }

                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4103", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);

                    if (value == 3)  //1:正转运行;3:变频停机
                    {
                        powerDiagram.NetworkNode = ClientInfo.ManyIpAddress;
                        powerDiagram.AlarmCode   = 3;
                        powerDiagram.AlarmMsg    = "停井";
                    }
                }
                else
                {
                    flag = false;
                    powerDiagram.AlarmCode = -1;
                    powerDiagram.AlarmMsg  = "数据异常";

                    powerDiagram.Mock         = par.UseMockData;
                    logIotModbusPoll.DateTime = DateTime.Now;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = $"读取功率图井状态数据异常![{read.Message}]";
                    $"GLT:{par.DeviceName}-{par.DeviceId}{logIotModbusPoll.Result}".Info();

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }
                #endregion

                const ushort step = 100;

                //ToDo:确认采样间隔和点数
                powerDiagram.Count = 300;

                if (flag && powerDiagram.Count <= 300 && powerDiagram.Count >= step)
                {
                    const ushort regAddress = 38268; //读取功率数据
                    for (ushort i = 0; i < powerDiagram.Count && flag; i += step)
                    {
                        var itemCount = (i + step > powerDiagram.Count) ? (ushort)(powerDiagram.Count - i) : step;
                        if (isDebug)
                        {
                            Logger.Info($"{i}:{itemCount}:{(ushort)(regAddress + i)}");
                        }

                        lock (ClientInfo.locker)
                        {
                            ClientInfo.RequestTime     = DateTime.Now;
                            ClientInfo.ExpectedType    = 0x03;
                            ClientInfo.ExpectedDataLen = itemCount * 2;
                        }
                        read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);

                        if (!read.IsSuccess)
                        {
                            read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);
                        }

                        if (read.IsSuccess)
                        {
                            for (var j = 0; j < itemCount; j++)
                            {
                                var value = client.ByteTransform.TransInt16(read.Content, j * 2);
                                var P     = Math.Round((value / 4000.0) * 36, 2);
                                powerDiagram.P.Add(P);
                            }
                        }
                        else
                        {
                            flag = false;

                            powerDiagram.AlarmCode = -1;
                            powerDiagram.AlarmMsg  = "数据异常";

                            powerDiagram.Mock         = par.UseMockData;
                            logIotModbusPoll.Type     = "Get_XAGL_WM2000GLT_PowerDiagram";
                            logIotModbusPoll.DateTime = DateTime.Now;
                            logIotModbusPoll.State    = -1;
                            logIotModbusPoll.Result   =
                                "从 " + (regAddress + i).ToString() + " 个开始,读取 " + itemCount.ToString() +
                                $" 个功率图功率数据异常!{read.Message}";

                            redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                        }

                        Thread.Sleep(100);
                    }

                    if (powerDiagram.P.Count > 0)
                    {
                        powerDiagram.MaxPower = powerDiagram.P.Max();                    //最大功率
                        powerDiagram.MinPower = powerDiagram.P.Min();                    //最小功率
                        powerDiagram.AvgPower = Math.Round(powerDiagram.P.Average(), 2); //平均功率
                    }
                }
                else
                {
                    flag = false;
                }

                powerDiagram.NetworkNode = ClientInfo.ManyIpAddress;

                //用于将读取的结果写入Redis队列

                if (flag == true || par.UseMockData)
                {
                    $"GLT:{par.DeviceName}-{par.DeviceId}已获取到数据".Info();
                    powerDiagram.Mock = par.UseMockData;

                    if (powerDiagram.Count != null)
                    {
                        if (powerDiagram.Displacement != null)
                        {
                            powerDiagram.D =
                                DisplacementUtils.FitDisplacement((ushort)powerDiagram.Count,
                                                                  (double)powerDiagram.Displacement);
                        }
                    }

                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_PowerDiagram", powerDiagram.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:PowerDiagram", powerDiagram);
                    redisClient.Set($"Single:OilWell:PowerDiagram:{par.DeviceName}-{par.DeviceId}", powerDiagram);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, powerDiagram.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);
                }
            }
        }
Пример #14
0
        public static async Task Get_XAGL_WM1000KZG_ControllerStatus(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var iotDataOilWellControllerState = new IotDataOilWellControllerState()
                {
                    NetworkNode = ClientInfo.ManyIpAddress,
                    AlarmCode   = 0,
                    AlarmMsg    = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;
                iotDataOilWellControllerState.DeviceTypeId = par.DeviceTypeId;
                iotDataOilWellControllerState.Mock         = false;

                var flag = true;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                iotDataOilWellControllerState.DateTime = DateTime.Now;
                iotDataOilWellControllerState.WellId   = par.DeviceId;

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 6;
                }
                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4116", 3);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 4);
                    iotDataOilWellControllerState.AlarmCode = value;

                    value = client.ByteTransform.TransInt16(read.Content, 2);
                    iotDataOilWellControllerState.StartAndStopStatus = value;

                    value = client.ByteTransform.TransInt16(read.Content, 0);
                    iotDataOilWellControllerState.LocalAndFarSwitch = value;
                }
                else
                {
                    flag = false;

                    iotDataOilWellControllerState.AlarmCode = -1;
                    iotDataOilWellControllerState.AlarmMsg  = "数据异常";

                    iotDataOilWellControllerState.Mock = par.UseMockData;
                    logIotModbusPoll.DateTime          = DateTime.Now;
                    logIotModbusPoll.State             = -1;
                    logIotModbusPoll.Result            = "读取变频器状态数据异常!";

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                iotDataOilWellControllerState.NetworkNode = ClientInfo.ManyIpAddress;

                //Redis中写入设备最后状态

                if (flag == true || par.UseMockData)
                {
                    iotDataOilWellControllerState.Mock = par.UseMockData;
                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_ControllerState", iotDataOilWellControllerState.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:ControllerState", iotDataOilWellControllerState);
                    redisClient.Set($"Single:OilWell:ControllerState:{par.DeviceName}-{par.DeviceId}", iotDataOilWellControllerState);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, iotDataOilWellControllerState.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);
                }
            }
        }
Пример #15
0
        public static async Task Get_XAGL_WM1000DB_PowerMeter(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var powerMeter = new IotDataOilWellPowerMeter()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                var modbusAddress = par.ModbusAddress;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                powerMeter.DateTime = DateTime.Now;
                powerMeter.WellId   = par.DeviceId;

                powerMeter.DeviceTypeId = par.DeviceTypeId;
                powerMeter.Mock         = false;

                var flag = true;

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 2;
                }
                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4117", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    if (value == 0)
                    {
                        powerMeter.NetworkNode = ClientInfo.ManyIpAddress;
                        powerMeter.AlarmCode   = 3;
                        powerMeter.AlarmMsg    = "停井";
                    }
                }
                else
                {
                }
                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 9 * 2;
                }
                read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4096", 9);

                if (read.IsSuccess)
                {
                    // A相电压  4097  变比 0.1
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    powerMeter.APhaseVoltage = Math.Round(value * 0.1, 1);

                    // B相电压  4098  变比 0.1
                    value = client.ByteTransform.TransInt16(read.Content, 2);
                    powerMeter.BPhaseVoltage = Math.Round(value * 0.1, 1);

                    // C相电压  4099  变比 0.1
                    value = client.ByteTransform.TransInt16(read.Content, 4);
                    powerMeter.CPhaseVoltage = Math.Round(value * 0.1, 1);

                    // A相电流  4100  变比 0.001
                    value = client.ByteTransform.TransInt16(read.Content, 6);
                    powerMeter.APhaseCurrent = Math.Round(value * 0.001, 1);

                    // B相电流   4101  变比 0.001
                    value = client.ByteTransform.TransInt16(read.Content, 8);
                    powerMeter.BPhaseCurrent = Math.Round(value * 0.001, 1);

                    // C相电流   4102  变比 0.001
                    value = client.ByteTransform.TransInt16(read.Content, 10);
                    powerMeter.CPhaseCurrent = Math.Round(value * 0.001, 1);

                    //有功电能
                    var value1 = client.ByteTransform.TransInt16(read.Content, 12);
                    var value2 = client.ByteTransform.TransInt16(read.Content, 14);
                    powerMeter.TotalActiveEnergy = Math.Round((value1 * 65535 + value2) * 0.15, 3);

                    //总功率因素  4105  变比 1
                    value = client.ByteTransform.TransInt16(read.Content, 16);
                    powerMeter.TotalPowerFactor = Math.Round(value * 0.001, 1);
                }
                else
                {
                    flag = false;
                    powerMeter.AlarmCode = -1;
                    powerMeter.AlarmMsg  = "数据异常";

                    powerMeter.Mock           = par.UseMockData;
                    logIotModbusPoll.DateTime = DateTime.Now;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = "读取电参数据异常!";

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                powerMeter.NetworkNode = ClientInfo.ManyIpAddress;

                //用于将读取的结果写入Redis队列
                if (flag == true || par.UseMockData)
                {
                    powerMeter.Mock = par.UseMockData;

                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_PowerMeter", powerMeter.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:PowerMeter", powerMeter);
                    redisClient.Set($"Single:OilWell:PowerMeter:{par.DeviceName}-{par.DeviceId}", powerMeter);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, powerMeter.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);
                }
            }

            //
        }
Пример #16
0
        public static async Task Get_ZJJH_WTPM_TrunkPressure(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par              = messageString.FromJson <ControlRequest>();
            var waterStation     = new IotDataWaterStation();
            var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

            var modbusAddress = par.ModbusAddress;

            ClientInfo.CurrentModbusPoolAddress = modbusAddress;

            waterStation.DeviceTypeId = par.DeviceTypeId;

            var flag = true;

            try
            {
                var read = await client.ReadAsync($"s={modbusAddress};x=3;220", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    waterStation.StationId     = par.DeviceId;  //注水间ID
                    waterStation.TrunkPressure = value / 100.0; //总汇管压力
                    waterStation.DateTime      = DateTime.Now;  //采集时间
                }
                else
                {
                    flag = false;
                    waterStation.AlarmCode = -1;
                    waterStation.AlarmMsg  = "数据异常";

                    waterStation.Mock         = par.UseMockData;
                    logIotModbusPoll.DateTime = DateTime.Now;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = "读取注水间干压数据异常!";

                    redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }
                waterStation.NetworkNode = ClientInfo.ManyIpAddress;

                if (flag == true || par.UseMockData)
                {
                    waterStation.Mock = par.UseMockData;
                    //用于将读取的结果写入Redis队列
                    redisClient.AddItemToList("YCIOT:IOT_Data_WaterStation", waterStation.ToJson().IndentJson());
                    redisClient.Set($"Group:WaterStation:{par.DeviceName}-{par.DeviceId}", waterStation);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, waterStation.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);
                }
            }
        }
Пример #17
0
        /// <summary>
        /// 读取控制器数据
        /// </summary>
        /// <param name="client"></param>
        /// <param name="redisClient"></param>
        /// <param name="messageString"></param>
        /// <returns></returns>
        public static async Task Get_XAGL_WM2000KZG_ControllerStatus(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var iotDataOilWellControllerState = new IotDataOilWellControllerState()
                {
                    NetworkNode = ClientInfo.ManyIpAddress,
                    AlarmCode   = 0,
                    AlarmMsg    = "正常"
                };
                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;
                iotDataOilWellControllerState.DateTime     = DateTime.Now;
                iotDataOilWellControllerState.DeviceTypeId = par.DeviceTypeId;
                iotDataOilWellControllerState.Mock         = false;

                var flag = true;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                iotDataOilWellControllerState.DateTime = DateTime.Now;
                iotDataOilWellControllerState.WellId   = par.DeviceId;


                #region  变频器基本监视参数

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 9 * 2;
                }

                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4096", 4104 - 4096 + 1);

                if (read.IsSuccess)
                {
                    // 耗电量  4096  变比 1
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    iotDataOilWellControllerState.FrequencyConversionActivePower = value;

                    //电流平衡度  4097 变比  0.01
                    value = client.ByteTransform.TransInt16(read.Content, 2);
                    iotDataOilWellControllerState.CurrentBalance = Math.Round(value * 0.01, 2);

                    // 上行最大电流  4098  变比 0.01
                    value = client.ByteTransform.TransInt16(read.Content, 4);
                    iotDataOilWellControllerState.MaxUpCurrent = Math.Round(value * 0.01, 2);

                    // 下行最大电流  4099  变比 0.01
                    value = client.ByteTransform.TransInt16(read.Content, 6);
                    iotDataOilWellControllerState.MaxDownCurrent = Math.Round(value * 0.01, 2);

                    //变频器报警代码  4100  变比 1
                    value = client.ByteTransform.TransInt16(read.Content, 8);
                    iotDataOilWellControllerState.AlarmCode = value;

                    // 起停状态  4101  变比 1
                    value = client.ByteTransform.TransInt16(read.Content, 10);
                    iotDataOilWellControllerState.StartAndStopStatus = value;

                    // 运行频率  4102  变比0.01
                    value = client.ByteTransform.TransInt16(read.Content, 12);
                    iotDataOilWellControllerState.Frequency = Math.Round(value * 0.01, 2);

                    // 运行状态  4103  变比 1
                    value = client.ByteTransform.TransInt16(read.Content, 14);
                    iotDataOilWellControllerState.RunState = value;

                    //变频功率因素角度
                    value = client.ByteTransform.TransInt16(read.Content, 16);
                    iotDataOilWellControllerState.PowerFactorAngle = value;
                }
                else
                {
                    flag = false;

                    iotDataOilWellControllerState.AlarmCode = -1;
                    iotDataOilWellControllerState.AlarmMsg  = "数据异常";

                    iotDataOilWellControllerState.Mock = par.UseMockData;
                    logIotModbusPoll.DateTime          = DateTime.Now;
                    logIotModbusPoll.State             = -1;
                    logIotModbusPoll.Result            = $"读取变频器基本监视参数异常!{read.Message}";

                    $"{logIotModbusPoll.Result}".Info();

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                #endregion


                #region   工变频切换、就地远程切换

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 4;
                    }

                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4128", 3);

                    if (read.IsSuccess)
                    {
                        //工变频切换 4128    0工;1变
                        var value = client.ByteTransform.TransInt16(read.Content, 0);
                        iotDataOilWellControllerState.WorkAndChangeFrequencySwitch = value;

                        //就地远程切换4129   0就;1远
                        value = client.ByteTransform.TransInt16(read.Content, 2);
                        iotDataOilWellControllerState.LocalAndFarSwitch = value;

                        //点数采集4130
                        value = client.ByteTransform.TransInt16(read.Content, 4);
                        iotDataOilWellControllerState.CountFetchAddress = value;
                    }
                    else
                    {
                        flag = false;

                        iotDataOilWellControllerState.AlarmCode = -1;
                        iotDataOilWellControllerState.AlarmMsg  = "数据异常";
                        iotDataOilWellControllerState.Mock      = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取工变频切换和就地远程切换异常![{read.Message}]";
                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                #endregion


                #region  双字节监视参数

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 8 * 2;
                    }

                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4133", 8);

                    if (read.IsSuccess)
                    {
                        //变频累积运行时间
                        var value0 = client.ByteTransform.TransInt16(read.Content, 0);
                        var value1 = client.ByteTransform.TransInt16(read.Content, 2);

                        iotDataOilWellControllerState.TotalRunTime = value1 * 10000 + value0;

                        //变频累积上电时间
                        value0 = client.ByteTransform.TransInt16(read.Content, 4);
                        value1 = client.ByteTransform.TransInt16(read.Content, 6);

                        iotDataOilWellControllerState.TotalPowerupTime = value1 * 10000 + value0;

                        //变频当前上电时间
                        value0 = client.ByteTransform.TransInt16(read.Content, 8);
                        value1 = client.ByteTransform.TransInt16(read.Content, 10);
                        iotDataOilWellControllerState.CurrentPowerupTime = value1 * 10000 + value0;

                        //变频当前运行时间
                        value0 = client.ByteTransform.TransInt16(read.Content, 12);
                        value1 = client.ByteTransform.TransInt16(read.Content, 14);
                        iotDataOilWellControllerState.CurrentRunTime = value1 * 10000 + value0;
                    }
                    else
                    {
                        flag = false;

                        iotDataOilWellControllerState.AlarmCode = -1;
                        iotDataOilWellControllerState.AlarmMsg  = "数据异常";
                        iotDataOilWellControllerState.Mock      = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取变频累积运行时间异常![{read.Message}]";
                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                #endregion


                #region 其它参数(井口压力)

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 3 * 2;
                    }

                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4166", 3);

                    if (read.IsSuccess)
                    {
                        //井口压力1   4166
                        var value = client.ByteTransform.TransInt16(read.Content, 0);

                        //井口压力2   4167
                        value = client.ByteTransform.TransInt16(read.Content, 2);

                        //井口压力3   4168
                        value = client.ByteTransform.TransInt16(read.Content, 4);
                    }
                    else
                    {
                        flag = false;

                        iotDataOilWellControllerState.AlarmCode = -1;
                        iotDataOilWellControllerState.AlarmMsg  = "数据异常";
                        iotDataOilWellControllerState.Mock      = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取井口压力数据异常![{read.Message}]";
                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                #endregion


                iotDataOilWellControllerState.NetworkNode = ClientInfo.ManyIpAddress;

                //写入设备最后状态

                if (flag == true || par.UseMockData)
                {
                    iotDataOilWellControllerState.Mock = par.UseMockData;

                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_ControllerState", iotDataOilWellControllerState.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:ControllerState", iotDataOilWellControllerState);
                    redisClient.Set($"Single:OilWell:ControllerState:{par.DeviceName}-{par.DeviceId}", iotDataOilWellControllerState);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, iotDataOilWellControllerState.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);
                }
            }
        }
Пример #18
0
        public static async Task Get_ZKAW_IndicatorDiagram(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var indicatorDiagram = new IotDataOilWellIndicatorDiagram()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                var modbusAddress = par.ModbusAddress;
                indicatorDiagram.DeviceTypeId = par.DeviceTypeId;
                indicatorDiagram.Mock         = false;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                indicatorDiagram.D = new List <double>();     //位移
                indicatorDiagram.L = new List <double>();     //载荷

                indicatorDiagram.DateTime = DateTime.Now;
                indicatorDiagram.WellId   = par.DeviceId;

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var flag = true;

                var read = await client.ReadAsync($"s={modbusAddress};x=3;980", 4);    //功图实际点数

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 6);
                    indicatorDiagram.Count = value;            //采样点数
                    value = client.ByteTransform.TransInt16(read.Content, 0);
                    indicatorDiagram.Interval = value * 0.001; //采样间隔
                }
                else
                {
                    flag = false;

                    indicatorDiagram.AlarmCode = -1;
                    indicatorDiagram.AlarmMsg  = "数据异常";

                    indicatorDiagram.Mock   = par.UseMockData;
                    logIotModbusPoll.State  = -1;
                    logIotModbusPoll.Result = "读取采样间隔、采样点数数据异常!";

                    redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                read = await client.ReadAsync($"s={modbusAddress};x=3;990", 2);    //冲次

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    indicatorDiagram.Stroke = value;       //冲次
                    value = client.ByteTransform.TransInt16(read.Content, 2);
                    indicatorDiagram.Displacement = value; //冲程
                }
                else
                {
                    flag = false;

                    indicatorDiagram.AlarmCode = -1;
                    indicatorDiagram.AlarmMsg  = "数据异常";

                    indicatorDiagram.Mock   = par.UseMockData;
                    logIotModbusPoll.State  = -1;
                    logIotModbusPoll.Result = "读取冲次、冲程数据异常!";

                    redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                const ushort step = 50;
                if (flag)
                {
                    //读取载荷数据
                    ushort regAddress = 1250;
                    for (ushort i = 0; i < indicatorDiagram.Count; i += step)
                    {
                        var itemCount = (i + step > indicatorDiagram.Count)
                                  ? (ushort)(indicatorDiagram.Count - i)
                                  : step;

                        Logger.Info($"{i}:{itemCount}:{(ushort)(regAddress + i)}");

                        read = await client.ReadAsync($"s={modbusAddress};x=3;{(ushort)(regAddress + i)}", itemCount);

                        if (!read.IsSuccess)
                        {
                            read = await client.ReadAsync($"s={modbusAddress};x=3;{(ushort)(regAddress + i)}", itemCount);
                        }

                        if (read.IsSuccess)
                        {
                            for (var j = 0; j < itemCount; j++)
                            {
                                var value = client.ByteTransform.TransInt16(read.Content, j * 2);
                                indicatorDiagram.L.Add(Math.Round(value * 0.01, 3));
                            }
                        }
                        else
                        {
                            flag = false;

                            indicatorDiagram.AlarmCode = -1;
                            indicatorDiagram.AlarmMsg  = "数据异常";

                            indicatorDiagram.Mock     = par.UseMockData;
                            logIotModbusPoll.DateTime = DateTime.Now;
                            logIotModbusPoll.State    = -1;
                            logIotModbusPoll.Result   = "从 " + (regAddress + i).ToString() + " 个开始,读取 " +
                                                        itemCount.ToString() + " 个有线功图载荷数据异常!";

                            redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll",
                                                      logIotModbusPoll.ToJson().IndentJson());
                        }

                        Thread.Sleep(20);
                    }
                }

                if (flag)
                {
                    //读取位移数据
                    var regAddress = 1000;
                    for (ushort i = 0; i < indicatorDiagram.Count; i += step)
                    {
                        var itemCount = (i + step > indicatorDiagram.Count)
                                  ? (ushort)(indicatorDiagram.Count - i)
                                  : step;

                        Logger.Info($"{i}:{itemCount}:{(ushort)(regAddress + i)}");

                        read = await client.ReadAsync($"s={modbusAddress};x=3;{(ushort)(regAddress + i)}", itemCount);

                        if (!read.IsSuccess)
                        {
                            read = await client.ReadAsync($"s={modbusAddress};x=3;{(ushort)(regAddress + i)}", itemCount);
                        }
                        if (read.IsSuccess)
                        {
                            for (var j = 0; j < itemCount; j++)
                            {
                                var value = client.ByteTransform.TransInt16(read.Content, j * 2);
                                indicatorDiagram.D.Add(Math.Round(value * 0.01, 3));
                            }
                        }
                        else
                        {
                            flag = false;

                            indicatorDiagram.AlarmCode = -1;
                            indicatorDiagram.AlarmMsg  = "数据异常";

                            indicatorDiagram.Mock     = par.UseMockData;
                            logIotModbusPoll.DateTime = DateTime.Now;
                            logIotModbusPoll.State    = -1;
                            logIotModbusPoll.Result   = "从 " + (regAddress + i).ToString() + " 个开始,读取 " +
                                                        itemCount.ToString() + " 个有线功图载荷数据异常!";

                            redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll",
                                                      logIotModbusPoll.ToJson().IndentJson());
                        }

                        Thread.Sleep(20);
                    }
                }

                if (flag)
                {
                    var maxLoad = indicatorDiagram.D.Max();
                    var minLoad = indicatorDiagram.D.Min();

                    for (var i = 0; i < indicatorDiagram.D.Count; i++)
                    {
                        indicatorDiagram.D[i] = Math.Round(((indicatorDiagram.D[i] - minLoad) / (maxLoad - minLoad) * (double)indicatorDiagram.Displacement), 2);
                    }

                    if (indicatorDiagram.D.Count > 0)
                    {
                        indicatorDiagram.Displacement = Math.Round(indicatorDiagram.D.Max(), 2);
                        indicatorDiagram.MaxLoad      = Math.Round(indicatorDiagram.L.Max(), 2);     //最大载荷
                        indicatorDiagram.MinLoad      = Math.Round(indicatorDiagram.L.Min(), 2);     //最小载荷
                        indicatorDiagram.AvgLoad      = Math.Round(indicatorDiagram.L.Average(), 2); //平均载荷
                    }
                }

                indicatorDiagram.NetworkNode = ClientInfo.ManyIpAddress;

                if (flag == true)
                {
                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_IndicatorDiagram", indicatorDiagram.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:IndicatorDiagram", indicatorDiagram);
                    redisClient.Set($"Single:OilWell:IndicatorDiagram:{par.DeviceName}-{par.DeviceId}", indicatorDiagram);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, indicatorDiagram.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);
                }
            }
        }
Пример #19
0
        public static async Task <bool> GetPowerMeter(ModbusRtuOverTcp client, int modbusAddress, IotDataOilWellPowerMeter powerMeter, ushort startAddress, ushort regCount, int tryReadTimes)
        {
            lock (ClientInfo.locker)
            {
                ClientInfo.RequestTime     = DateTime.Now;
                ClientInfo.ExpectedType    = 0x04;
                ClientInfo.ExpectedDataLen = regCount * 2;
            }
            var read = await client.ReadAsync($"s={modbusAddress};x=4;{startAddress}", regCount);

            if (read.IsSuccess)
            {
                var value = client.ByteTransform.TransInt16(read.Content, 0);

                // A相电压  1606  变比 0.1
                powerMeter.APhaseVoltage = Math.Round(value * 0.1, 1);

                value = client.ByteTransform.TransInt16(read.Content, 2);

                // B相电压  1607  变比 0.1
                powerMeter.BPhaseVoltage = Math.Round(value * 0.1, 1);

                value = client.ByteTransform.TransInt16(read.Content, 4);

                // C相电压  1608  变比 0.1
                powerMeter.CPhaseVoltage = Math.Round(value * 0.1, 1);

                value = client.ByteTransform.TransInt16(read.Content, 6);

                // A相电流  1609  变比 0.001 未按协议文档,按照实际情况定
                powerMeter.APhaseCurrent = Math.Round(value * 0.001, 1);

                value = client.ByteTransform.TransInt16(read.Content, 8);
                // B相电流   1610  变比 0.001
                powerMeter.BPhaseCurrent = Math.Round(value * 0.001, 1);

                value = client.ByteTransform.TransInt16(read.Content, 10);

                // C相电流   1611  变比 0.001
                powerMeter.CPhaseCurrent = Math.Round(value * 0.001, 1);

                value = client.ByteTransform.TransInt16(read.Content, 12);
                //当前有功功率  1612  变比 0.01
                var currentYGGL = Math.Round(value * 0.01, 2);

                Console.WriteLine("当前有功功率:" + currentYGGL);

                value = client.ByteTransform.TransInt16(read.Content, 14);
                //当前总功率  1613  变比 0.01
                powerMeter.TotalActivePower = Math.Round(value * 0.01, 2);

                value = client.ByteTransform.TransInt16(read.Content, 16);
                //当前功率因数 1614  变比 1
                var currentGLFactor = value;
                powerMeter.TotalPowerFactor = currentGLFactor;
                return(true);
            }
            else
            {
                tryReadTimes--;
                if (tryReadTimes > 0)
                {
                    return(await GetPowerMeter(client, modbusAddress, powerMeter, startAddress, regCount, tryReadTimes));
                }
                powerMeter.AlarmMsg = read.Message;
                return(false);
            }
        }
Пример #20
0
        public static async Task Get_XAGL_WM1000YXGT_IndicatorDiagram(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var indicatorDiagram = new IotDataOilWellIndicatorDiagram()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;
                indicatorDiagram.DeviceTypeId = par.DeviceTypeId;
                indicatorDiagram.Mock         = false;

                var flag = true;
                var jo1  = (JObject)JsonConvert.DeserializeObject(par.CommandParameter);
                indicatorDiagram.Displacement = Convert.ToDouble(jo1["0"].ToString());

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                indicatorDiagram.D = new List <double>();  //位移
                indicatorDiagram.L = new List <double>();  //载荷

                indicatorDiagram.DateTime = DateTime.Now;

                indicatorDiagram.WellId = par.DeviceId;
                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 2;
                }
                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4117", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    if (value == 0)
                    {
                        indicatorDiagram.NetworkNode = ClientInfo.ManyIpAddress;
                        indicatorDiagram.AlarmCode   = 3;
                        indicatorDiagram.AlarmMsg    = "停井";

                        redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_IndicatorDiagram",
                                                  indicatorDiagram.ToJson().IndentJson());
                        redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:IndicatorDiagram", indicatorDiagram);
                        redisClient.Set($"Single:OilWell:IndicatorDiagram:{par.DeviceName}-{par.DeviceId}", indicatorDiagram);

                        if (!par.UserName.IsNullOrEmpty())
                        {
                            ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0,
                                                             indicatorDiagram.ToJson().IndentJson());
                        }

                        return;
                    }
                }
                else
                {
                    flag = false;

                    indicatorDiagram.AlarmCode = -1;
                    indicatorDiagram.AlarmMsg  = "数据异常";

                    logIotModbusPoll.Type     = "Get_XAGL_WM1000YXGT_IndicatorDiagram";
                    logIotModbusPoll.DateTime = DateTime.Now;
                    indicatorDiagram.Mock     = par.UseMockData;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = $"读取采样间隔数据异常!{read.Message}";

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 2;
                    }
                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;8097", 1);

                    if (read.IsSuccess)
                    {
                        var value = client.ByteTransform.TransInt16(read.Content, 0);
                        indicatorDiagram.Count    = 250;
                        indicatorDiagram.Interval = Math.Round(value * 0.01, 3);
                        indicatorDiagram.Stroke   = Math.Round((60.0 / ((int)indicatorDiagram.Count * (float)indicatorDiagram.Interval)), 2);
                    }
                    else
                    {
                        flag = false;

                        indicatorDiagram.AlarmCode = -1;
                        indicatorDiagram.AlarmMsg  = "数据异常";

                        indicatorDiagram.Mock     = par.UseMockData;
                        logIotModbusPoll.Type     = "Get_XAGL_WM1000YXGT_IndicatorDiagram";
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取采样间隔数据异常![{read.Message}]";

                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                const ushort step = 100;
                if (flag && indicatorDiagram.Count <= 300 && indicatorDiagram.Count >= step)
                {
                    const ushort regAddress = 38268; //读取载荷数据

                    for (ushort i = 0; i < indicatorDiagram.Count && flag; i += step)
                    {
                        var itemCount = (i + step > indicatorDiagram.Count) ? (ushort)(indicatorDiagram.Count - i) : step;
                        if (isDebug)
                        {
                            Logger.Info($"{i}:{itemCount}:{(ushort)(regAddress + i)}");
                        }

                        lock (ClientInfo.locker)
                        {
                            ClientInfo.RequestTime     = DateTime.Now;
                            ClientInfo.ExpectedType    = 0x03;
                            ClientInfo.ExpectedDataLen = itemCount * 2;
                        }
                        read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);

                        if (read.IsSuccess)
                        {
                            for (var j = 0; j < itemCount; j++)
                            {
                                var value = client.ByteTransform.TransInt16(read.Content, j * 2);
                                if (value == 0)
                                {
                                    indicatorDiagram.L.Add(value);
                                }
                                else
                                {
                                    var L = (value - 800) * 150 / 3200.0;
                                    indicatorDiagram.L.Add(Math.Round(L, 2));
                                }
                            }
                        }
                        else
                        {
                            flag = false;

                            indicatorDiagram.AlarmCode = -1;
                            indicatorDiagram.AlarmMsg  = "数据异常";

                            indicatorDiagram.Mock     = par.UseMockData;
                            logIotModbusPoll.Type     = "Get_XAGL_WM1000YXGT_IndicatorDiagram";
                            logIotModbusPoll.DateTime = DateTime.Now;
                            logIotModbusPoll.State    = -1;
                            logIotModbusPoll.Result   = "从 " + (regAddress + i).ToString() + " 个开始,读取 " + itemCount.ToString() + $" 个有线功图载荷数据异常!{read.Message}";

                            redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                        }

                        Thread.Sleep(100);
                    }

                    //读取冲程
                    indicatorDiagram.MaxLoad = Math.Round(indicatorDiagram.L.Max(), 2);     //最大载荷
                    indicatorDiagram.MinLoad = Math.Round(indicatorDiagram.L.Min(), 2);     //最小载荷
                    indicatorDiagram.AvgLoad = Math.Round(indicatorDiagram.L.Average(), 2); //平均载荷

                    if (indicatorDiagram.D.Count > 0)
                    {
                        indicatorDiagram.D.Add(indicatorDiagram.D[0]);
                    }
                    if (indicatorDiagram.L.Count > 0)
                    {
                        indicatorDiagram.L.Add(indicatorDiagram.L[0]);
                    }
                }
                else
                {
                    flag = false;
                }

                indicatorDiagram.NetworkNode = ClientInfo.ManyIpAddress;

                //用于将读取的结果写入Redis队列
                if (flag == true || par.UseMockData)
                {
                    indicatorDiagram.Mock = par.UseMockData;

                    if (indicatorDiagram.Count != null)
                    {
                        indicatorDiagram.D = DisplacementUtils.FitDisplacement((ushort)indicatorDiagram.Count, (double)indicatorDiagram.Displacement);
                    }

                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_IndicatorDiagram", indicatorDiagram.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:IndicatorDiagram", indicatorDiagram);
                    redisClient.Set($"Single:OilWell:IndicatorDiagram:{par.DeviceName}-{par.DeviceId}", indicatorDiagram);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, indicatorDiagram.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);
                }
            }
        }
Пример #21
0
        /// <summary>
        /// 读取电表数据
        /// </summary>
        /// <param name="client"></param>
        /// <param name="redisClient"></param>
        /// <param name="messageString"></param>
        /// <returns></returns>
        public static async Task Get_XAGL_WM2000DB_PowerMeter(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var powerMeter = new IotDataOilWellPowerMeter()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                var modbusAddress = par.ModbusAddress;

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;
                ClientInfo.LinkId = par.LinkId;

                powerMeter.DateTime = DateTime.Now;
                powerMeter.WellId   = par.DeviceId;

                powerMeter.DeviceTypeId = par.DeviceTypeId;
                powerMeter.Mock         = false;

                var flag = true;

                #region  判断井状态

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 2;
                }

                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4103", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);

                    if (value == 3)  //1:正转运行;3:变频停机
                    {
                        powerMeter.NetworkNode = ClientInfo.ManyIpAddress;
                        powerMeter.AlarmCode   = 3;
                        powerMeter.AlarmMsg    = "停井";
                    }
                }
                else
                {
                    flag = false;
                    powerMeter.AlarmCode = -1;
                    powerMeter.AlarmMsg  = "数据异常";

                    powerMeter.Mock           = par.UseMockData;
                    logIotModbusPoll.DateTime = DateTime.Now;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = $"读取电参井状态数据异常![{read.Message}]";
                    $"DB:{par.DeviceName}-{par.DeviceId}{logIotModbusPoll.Result}".Info();

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }
                #endregion

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 18;
                    }

                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4121", 7);

                    if (read.IsSuccess)
                    {
                        // A相电流  4121  变比 0.01
                        var value = client.ByteTransform.TransInt16(read.Content, 0);
                        powerMeter.APhaseCurrent = Math.Round(value * 0.01, 1);

                        // B相电流   4122  变比 0.01
                        value = client.ByteTransform.TransInt16(read.Content, 2);
                        powerMeter.BPhaseCurrent = Math.Round(value * 0.01, 1);

                        // C相电流   4123  变比 0.01
                        value = client.ByteTransform.TransInt16(read.Content, 4);
                        powerMeter.CPhaseCurrent = Math.Round(value * 0.01, 1);

                        // 总功率因素  4124  变比 0.001
                        value = client.ByteTransform.TransInt16(read.Content, 6);
                        powerMeter.TotalPowerFactor = Math.Round(value * 0.001, 1);

                        // A相电压  4125  变比 0.1
                        value = client.ByteTransform.TransInt16(read.Content, 8);
                        powerMeter.APhaseVoltage = Math.Round(value * 0.1, 1);

                        // B相电压  4126  变比 0.1
                        value = client.ByteTransform.TransInt16(read.Content, 10);
                        powerMeter.BPhaseVoltage = Math.Round(value * 0.1, 1);

                        // C相电压  4127  变比 0.1
                        value = client.ByteTransform.TransInt16(read.Content, 12);
                        powerMeter.CPhaseVoltage = Math.Round(value * 0.1, 1);
                    }
                    else
                    {
                        flag = false;
                        powerMeter.AlarmCode = -1;
                        powerMeter.AlarmMsg  = "数据异常";

                        powerMeter.Mock           = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取电参数据异常![{read.Message}]";

                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 8;
                    }
                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4141", 4);

                    if (read.IsSuccess)
                    {
                        var value0 = client.ByteTransform.TransInt16(read.Content, 0);
                        var value1 = client.ByteTransform.TransInt16(read.Content, 2);
                        var value2 = client.ByteTransform.TransInt16(read.Content, 4);
                        var value3 = client.ByteTransform.TransInt16(read.Content, 6);
                        //这是总有功电能
                        powerMeter.TotalActivePower = Math.Round(((value1 * 10000 + value0) * 0.001) * 15, 2);
                        //这是总无功电能
                        powerMeter.TotalReactivePower = Math.Round(((value3 * 10000 + value2) * 0.001) * 15, 2);
                    }
                    else
                    {
                        flag = false;

                        powerMeter.AlarmCode = -1;
                        powerMeter.AlarmMsg  = "数据异常";

                        powerMeter.Mock           = par.UseMockData;
                        logIotModbusPoll.DateTime = DateTime.Now;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = $"读取总有功电能数据异常![{read.Message}]";

                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }
                powerMeter.NetworkNode = ClientInfo.ManyIpAddress;

                if (flag == true || par.UseMockData)
                {
                    $"DB:{par.DeviceName}-{par.DeviceId}已获取到数据".Info();
                    powerMeter.Mock = par.UseMockData;
                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_PowerMeter", powerMeter.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:PowerMeter", powerMeter);
                    redisClient.Set($"Single:OilWell:PowerMeter:{par.DeviceName}-{par.DeviceId}", powerMeter);
                }

                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, powerMeter.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);
                }
            }
        }
Пример #22
0
        public static async Task Get_XAGL_PumpPressure(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par              = messageString.FromJson <ControlRequest>();
            var pumpPressure     = new IotDataPumpPressure();
            var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

            var modbusAddress = par.ModbusAddress;

            pumpPressure.DeviceTypeId           = par.DeviceTypeId;
            ClientInfo.CurrentModbusPoolAddress = modbusAddress;

            var flag = true;

            try
            {
                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x04;
                    ClientInfo.ExpectedDataLen = 0x02;
                }
                //偏移地址根据项目待定
                var read = await client.ReadAsync($"s={modbusAddress};x=4;10", 1);

                if (read.IsSuccess)
                {
                    pumpPressure.PumpId = par.DeviceId; //泵编号
                    var value = client.ByteTransform.TransInt16(read.Content, 0);

                    //是否有变比根据项目待定
                    pumpPressure.PumpPressure = value / 100.0; //泵压
                    pumpPressure.DateTime     = DateTime.Now;  //采集时间
                }
                else
                {
                    flag = false;
                    pumpPressure.AlarmCode = -1;
                    pumpPressure.AlarmMsg  = "数据异常";

                    pumpPressure.Mock         = par.UseMockData;
                    logIotModbusPoll.DateTime = DateTime.Now;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = "读取泵压数据异常!";

                    redisClient.AddItemToList("YCIOT:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }

                if (flag == true || par.UseMockData)
                {
                    pumpPressure.Mock        = par.UseMockData;
                    pumpPressure.NetworkNode = ClientInfo.ManyIpAddress;
                    //用于将读取的结果写入Redis队列
                    redisClient.AddItemToList("YCIOT:IOT_Data_PumpPressure", pumpPressure.ToJson().IndentJson());
                    redisClient.Set($"Group:PumpPressure:{par.DeviceName}-{par.DeviceId}", pumpPressure);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, pumpPressure.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);
                }
            }
        }
Пример #23
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);
                }
            }
        }
Пример #24
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);
            }
        }
Пример #25
0
        public static async Task Get_XAAS_WTPM_TrunkPressure(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par              = messageString.FromJson <ControlRequest>();
            var waterStation     = new IotDataWaterStation();
            var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();
            var modbusAddress    = par.ModbusAddress;

            ClientInfo.LinkId = par.LinkId;
            ClientInfo.CurrentModbusPoolAddress = modbusAddress;
            waterStation.DeviceTypeId           = par.DeviceTypeId;

            var flag = true;

            try
            {
                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)
                {
                    waterStation.StationId = par.DeviceId; //注水间ID
                    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 };

                    waterStation.TrunkPressure = values.Max(); //总汇管压力
                    waterStation.DateTime      = DateTime.Now; //采集时间
                }
                else
                {
                    flag = false;
                    waterStation.AlarmCode = -1;
                    waterStation.AlarmMsg  = "数据异常";

                    waterStation.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());
                }

                waterStation.NetworkNode = ClientInfo.ManyIpAddress;
                waterStation.StationId   = par.DeviceId;

                if (flag == true || par.UseMockData)
                {
                    waterStation.Mock = par.UseMockData;
                    //用于将读取的结果写入Redis队列
                    redisClient.AddItemToList("YCIOT:IOT_Data_WaterStation", waterStation.ToJson().IndentJson());
                    redisClient.Set($"Group:WaterStation:{par.DeviceName}-{par.DeviceId}", waterStation);
                }
                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0, waterStation.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);
                }
            }
        }
Пример #26
0
        public static async Task Get_XAGL_WM2000YXGT_IndicatorDiagram(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var indicatorDiagram = new IotDataOilWellIndicatorDiagram()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;
                indicatorDiagram.DeviceTypeId = par.DeviceTypeId;
                indicatorDiagram.Mock         = false;

                var flag = true;

                var jo1 = (JObject)JsonConvert.DeserializeObject(par.CommandParameter);
                if (jo1["0"] != null)
                {
                    indicatorDiagram.Displacement = Convert.ToDouble(jo1["0"].ToString());
                }

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                indicatorDiagram.D = new List <double>();  //位移
                indicatorDiagram.L = new List <double>();  //载荷

                indicatorDiagram.DateTime = DateTime.Now;

                indicatorDiagram.WellId = par.DeviceId;


                #region  判断井状态

                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 2;
                }

                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4103", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);

                    if (value == 3)  //1:正转运行;3:变频停机
                    {
                        indicatorDiagram.NetworkNode = ClientInfo.ManyIpAddress;
                        indicatorDiagram.AlarmCode   = 3;
                        indicatorDiagram.AlarmMsg    = "停井";
                    }
                }
                else
                {
                    flag = false;
                    indicatorDiagram.AlarmCode = -1;
                    indicatorDiagram.AlarmMsg  = "数据异常";

                    indicatorDiagram.Mock     = par.UseMockData;
                    logIotModbusPoll.DateTime = DateTime.Now;
                    logIotModbusPoll.State    = -1;
                    logIotModbusPoll.Result   = $"读取功图井状态数据异常![{read.Message}]";
                    $"GT:{par.DeviceName}-{par.DeviceId}{logIotModbusPoll.Result}".Info();

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }
                #endregion


                const ushort step = 100;

                //ToDo:确认采样间隔和点数

                indicatorDiagram.Count = 300;

                if (flag && indicatorDiagram.Count <= 300 && indicatorDiagram.Count >= step)
                {
                    ushort regAddress = 38768;//读取载荷数据

                    for (ushort i = 0; i < indicatorDiagram.Count && flag; i += step)
                    {
                        var itemCount = (i + step > indicatorDiagram.Count) ? (ushort)(indicatorDiagram.Count - i) : step;
                        if (isDebug)
                        {
                            Logger.Info($"{i}:{itemCount}:{(ushort)(regAddress + i)}");
                        }

                        lock (ClientInfo.locker)
                        {
                            ClientInfo.RequestTime     = DateTime.Now;
                            ClientInfo.ExpectedType    = 0x03;
                            ClientInfo.ExpectedDataLen = itemCount * 2;
                        }

                        read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);

                        if (!read.IsSuccess)
                        {
                            read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);
                        }

                        if (read.IsSuccess)
                        {
                            for (var j = 0; j < itemCount; j++)
                            {
                                var value = client.ByteTransform.TransInt16(read.Content, j * 2);
                                if (value != 0)
                                {
                                    var Load = (value - 800) * 150 / 3200.0;
                                    indicatorDiagram.L.Add(Math.Round(Load, 2));
                                }
                                else
                                {
                                    indicatorDiagram.L.Add(value);
                                }
                            }
                        }
                        else
                        {
                            flag = false;

                            indicatorDiagram.AlarmCode = -1;
                            indicatorDiagram.AlarmMsg  = "数据异常";

                            indicatorDiagram.Mock     = par.UseMockData;
                            logIotModbusPoll.Type     = "Get_XAGL_WM2000YXGT_IndicatorDiagram";
                            logIotModbusPoll.DateTime = DateTime.Now;
                            logIotModbusPoll.State    = -1;
                            logIotModbusPoll.Result   = "从 " + (regAddress + i).ToString() + " 个开始,读取 " + itemCount.ToString() + $" 个有线功图载荷数据异常![{read.Message}]";

                            redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                        }
                        Thread.Sleep(100);
                    }

                    regAddress = 37268;//读取位移数据
                    for (var i = 0; i < indicatorDiagram.Count && flag; i += step)
                    {
                        var itemCount = (i + step > indicatorDiagram.Count) ? (ushort)(indicatorDiagram.Count - i) : step;
                        if (isDebug)
                        {
                            Logger.Info($"{i}:{itemCount}:{(ushort)(regAddress + i)}");
                        }

                        lock (ClientInfo.locker)
                        {
                            ClientInfo.RequestTime     = DateTime.Now;
                            ClientInfo.ExpectedType    = 0x03;
                            ClientInfo.ExpectedDataLen = itemCount * 2;
                        }
                        read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);

                        if (!read.IsSuccess)
                        {
                            read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);
                        }

                        if (read.IsSuccess)
                        {
                            for (var j = 0; j < itemCount; j++)
                            {
                                var value = client.ByteTransform.TransInt16(read.Content, j * 2);

                                var d = (value - 800) * 100 / 3200.0 - 50;
                                indicatorDiagram.D.Add(Math.Round(d, 2));
                            }
                        }
                        else
                        {
                            flag = false;

                            indicatorDiagram.AlarmCode = -1;
                            indicatorDiagram.AlarmMsg  = "数据异常";

                            indicatorDiagram.Mock     = par.UseMockData;
                            logIotModbusPoll.Type     = "Get_XAGL_WM2000YXGT_IndicatorDiagram";
                            logIotModbusPoll.DateTime = DateTime.Now;
                            logIotModbusPoll.State    = -1;
                            logIotModbusPoll.Result   = "从 " + (regAddress + i).ToString() + " 个开始,读取 " +
                                                        itemCount.ToString() + $" 个有线功图位移数据异常![{read.Message}]";

                            redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll",
                                                      logIotModbusPoll.ToJson().IndentJson());
                        }

                        Thread.Sleep(100);
                    }

                    var maxDis = indicatorDiagram.D.Max();
                    var minDis = indicatorDiagram.D.Min();

                    if (!indicatorDiagram.Displacement.HasValue)
                    {
                        indicatorDiagram.Displacement = maxDis;
                    }

                    for (var i = 0; i < indicatorDiagram.D.Count; i++)
                    {
                        if (Math.Abs(maxDis - minDis) > 0.1)
                        {
                            indicatorDiagram.D[i] = Math.Round(((indicatorDiagram.D[i] - minDis) / (maxDis - minDis) * (double)indicatorDiagram.Displacement), 2);
                        }
                    }

                    if (indicatorDiagram.D.Count > 0)
                    {
                        indicatorDiagram.MaxLoad = Math.Round(indicatorDiagram.L.Max(), 2);     //最大载荷
                        indicatorDiagram.MinLoad = Math.Round(indicatorDiagram.L.Min(), 2);     //最小载荷
                        indicatorDiagram.AvgLoad = Math.Round(indicatorDiagram.L.Average(), 2); //平均载荷
                        indicatorDiagram.D.Add(indicatorDiagram.D[0]);
                        indicatorDiagram.L.Add(indicatorDiagram.L[0]);
                    }
                }
                else
                {
                    flag = false;
                }

                indicatorDiagram.NetworkNode = ClientInfo.ManyIpAddress;

                if (flag == true)
                {
                    $"YXGT:{par.DeviceName}-{par.DeviceId}已获取到数据".Info();
                    indicatorDiagram.Mock = par.UseMockData;

                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_IndicatorDiagram", indicatorDiagram.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:IndicatorDiagram", indicatorDiagram);
                    redisClient.Set($"Single:OilWell:IndicatorDiagram:{par.DeviceName}-{par.DeviceId}", indicatorDiagram);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, indicatorDiagram.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);
                }
            }
        }
Пример #27
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);
                }
            }
        }
Пример #28
0
        public static async Task Get_XAGL_WM1000DLT_CurrentDiagram(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequest>();

            try
            {
                var currentDiagram = new IotDataOilWellCurrentDiagram()
                {
                    NetworkNode = ClientInfo.ManyIpAddress,
                    AlarmCode   = 0,
                    AlarmMsg    = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;

                var jo1 = (JObject)JsonConvert.DeserializeObject(par.CommandParameter);
                currentDiagram.Displacement = Convert.ToDouble(jo1["0"].ToString());

                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                currentDiagram.D = new List <double>(); //位移
                currentDiagram.C = new List <double>(); //电流

                currentDiagram.DateTime = DateTime.Now;
                currentDiagram.WellId   = par.DeviceId;

                currentDiagram.DeviceTypeId = par.DeviceTypeId;
                currentDiagram.Mock         = false;

                var flag = true;
                lock (ClientInfo.locker)
                {
                    ClientInfo.RequestTime     = DateTime.Now;
                    ClientInfo.ExpectedType    = 0x03;
                    ClientInfo.ExpectedDataLen = 2;
                }
                var read = await client.ReadAsync($"s={par.ModbusAddress};x=3;4117", 1);

                if (read.IsSuccess)
                {
                    var value = client.ByteTransform.TransInt16(read.Content, 0);
                    if (value == 0)
                    {
                        currentDiagram.NetworkNode = ClientInfo.ManyIpAddress;
                        currentDiagram.AlarmCode   = 3;
                        currentDiagram.AlarmMsg    = "停井";

                        redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_CurrentDiagram", currentDiagram.ToJson().IndentJson());
                        redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:CurrentDiagram", currentDiagram);
                        redisClient.Set($"Single:OilWell:CurrentDiagram:{par.DeviceName}-{par.DeviceId}", currentDiagram);

                        if (!par.UserName.IsNullOrEmpty())
                        {
                            ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, 0,
                                                             currentDiagram.ToJson().IndentJson());
                        }

                        return;
                    }
                }
                else
                {
                    flag = false;

                    currentDiagram.AlarmCode = -1;
                    currentDiagram.AlarmMsg  = "数据异常";

                    currentDiagram.Mock     = par.UseMockData;
                    logIotModbusPoll.State  = -1;
                    logIotModbusPoll.Result = "读取采样间隔数据异常!";

                    redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                }


                if (flag)
                {
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 2;
                    }
                    read = await client.ReadAsync($"s={par.ModbusAddress};x=3;8097", 1);

                    if (read.IsSuccess)
                    {
                        var value = client.ByteTransform.TransInt16(read.Content, 0);
                        currentDiagram.Count    = 250;
                        currentDiagram.Interval = Math.Round(value * 0.01, 3);
                    }
                    else
                    {
                        flag = false;

                        currentDiagram.AlarmCode = -1;
                        currentDiagram.AlarmMsg  = "数据异常";

                        logIotModbusPoll.Type     = "Get_XAGL_WM1000DLT_CurrentDiagram";
                        logIotModbusPoll.DateTime = DateTime.Now;
                        currentDiagram.Mock       = par.UseMockData;
                        logIotModbusPoll.State    = -1;
                        logIotModbusPoll.Result   = "读取采样间隔数据异常!";

                        redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                    }
                }

                ushort step = 100;
                if (flag && currentDiagram.Count <= 300 && currentDiagram.Count >= step)
                {
                    var regAddress = 37768;//读取电流数据
                    for (ushort i = 0; i < currentDiagram.Count && flag; i += step)
                    {
                        var itemCount = (i + step > currentDiagram.Count) ? (ushort)(currentDiagram.Count - i) : step;
                        if (isDebug)
                        {
                            Logger.Info($"{i}:{itemCount}:{(ushort)(regAddress + i)}");
                        }

                        lock (ClientInfo.locker)
                        {
                            ClientInfo.RequestTime     = DateTime.Now;
                            ClientInfo.ExpectedType    = 0x03;
                            ClientInfo.ExpectedDataLen = itemCount * 2;
                        }
                        read = await client.ReadAsync($"s={par.ModbusAddress};x=3;{(regAddress + i)}", itemCount);

                        if (read.IsSuccess)
                        {
                            for (var j = 0; j < itemCount; j++)
                            {
                                var value = client.ByteTransform.TransInt16(read.Content, j++);
                                if (value != 0)
                                {
                                    var C = Math.Round(((value - 800) * 5 / 3200.0) * 15, 2);
                                    currentDiagram.C.Add(C);
                                }
                                else
                                {
                                    currentDiagram.C.Add(value);
                                }
                            }
                        }
                        else
                        {
                            flag = false;

                            currentDiagram.AlarmCode = -1;
                            currentDiagram.AlarmMsg  = "数据异常";

                            currentDiagram.Mock       = par.UseMockData;
                            logIotModbusPoll.Type     = "Get_XAGL_WM1000DLT_CurrentDiagram";
                            logIotModbusPoll.DateTime = DateTime.Now;
                            logIotModbusPoll.State    = -1;
                            logIotModbusPoll.Result   = "从 " + (regAddress + i).ToString() + " 个开始,读取 " + itemCount.ToString() + " 个电流图电流数据异常!";

                            redisClient.AddItemToList("YCIOT:ERROR:Log_IOT_Modbus_Poll", logIotModbusPoll.ToJson().IndentJson());
                        }

                        Thread.Sleep(100);
                    }

                    currentDiagram.MaxCurrent = currentDiagram.C.Max();                    //最大电流
                    currentDiagram.MinCurrent = currentDiagram.C.Min();                    //最小电流
                    currentDiagram.AvgCurrent = Math.Round(currentDiagram.C.Average(), 2); //平均电流
                }
                else
                {
                    flag = false;
                }

                currentDiagram.NetworkNode = ClientInfo.ManyIpAddress;

                if (flag == true || par.UseMockData)
                {
                    currentDiagram.Mock = par.UseMockData;

                    if (currentDiagram.Count != null)
                    {
                        currentDiagram.D = DisplacementUtils.FitDisplacement((ushort)currentDiagram.Count,
                                                                             (double)currentDiagram.Displacement);
                    }
                    redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_CurrentDiagram", currentDiagram.ToJson().IndentJson());
                    redisClient.Set($"Group:OilWell:{par.DeviceName}-{par.DeviceId}:CurrentDiagram", currentDiagram);
                    redisClient.Set($"Single:OilWell:CurrentDiagram:{par.DeviceName}-{par.DeviceId}", currentDiagram);
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, currentDiagram.ToJson().IndentJson());
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
                Logger.Error(ex.StackTrace);
                Logger.Error(ex.Source);

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, -1, ex.Message);
                }
            }
        }
Пример #29
0
        public static async Task Get_DEHUI_LLJ(ModbusRtuOverTcp client, RedisClient redisClient, string messageString)
        {
            var par = messageString.FromJson <ControlRequestDeHui>();

            try
            {
                var lLJ = new IotDataOilwellDHMeasure()
                {
                    AlarmCode = 0,
                    AlarmMsg  = "正常"
                };

                var logIotModbusPoll = par.ConvertTo <LogIotModbusPoll>();

                logIotModbusPoll.State  = 0;
                logIotModbusPoll.Result = "ok";

                var modbusAddress = par.ModbusAddress;
                lLJ.DeviceTypeId  = par.DeviceTypeId;
                lLJ.Mock          = false;
                ClientInfo.LinkId = par.LinkId;
                ClientInfo.CurrentModbusPoolAddress = modbusAddress;

                lLJ.DateTime = DateTime.Now;

                var flag = true;

                //计量自动   0地址表示线圈寄存器,读取线圈寄存器,功能码为1
                var startAddress = (ushort)(2059 - 1);
                flag = await ReadCoil(modbusAddress, startAddress, client, (value) => lLJ.JLZD = value, redisClient, par, lLJ, logIotModbusPoll, "计量自动");

                #region 批量按位读取线圈,从切井:002569 到温度保护:002576
                if (flag)
                {
                    "从切井自动批量开始读取8个线圈,读到温度保护:                ---------------".Info();
                    startAddress = (ushort)(2569 - 1);
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x01;
                        ClientInfo.ExpectedDataLen = 1;
                    }

                    var readCoil = await client.ReadCoilAsync($"s={modbusAddress};x=1;{startAddress}", 8);

                    if (readCoil.IsSuccess)
                    {
                        //False,False,False,False,True,True,False,True
                        var values = readCoil.Content;

                        lLJ.QJZD = values[0];  //切井自动
                        lLJ.WXAN = values[1];  //维修按钮

                        //[2];  //定时判断
                        //[3];  //循井测液

                        lLJ.SBGYBH = values[4]; //设备高压保护

                        lLJ.QTBH = values[5];   //气体保护

                        lLJ.SDBH = values[6];   //湿度保护

                        lLJ.WDBH = values[7];   //温度保护
                    }
                    else
                    {
                        FailLog.Write(redisClient, par, lLJ, logIotModbusPoll, "Get_LLJ", "读取切井自动批量异常!");
                        flag = false;
                    }
                    "切井自动批量结束:                ---------------".Info();
                }
                #endregion

                //排风机
                if (flag)
                {
                    startAddress = (ushort)(1281 - 1);
                    flag         = await ReadCoil(modbusAddress, startAddress, client, (value) => lLJ.PFJ = value, redisClient, par, lLJ, logIotModbusPoll, "排风机");
                }

                //加热器
                if (flag)
                {
                    startAddress = (ushort)(1282 - 1);
                    flag         = await ReadCoil(modbusAddress, startAddress, client, (value) => lLJ.JRQ = value, redisClient, par, lLJ, logIotModbusPoll, "加热器");
                }

                #region from:进液压力:404097  to:分钟含水:404121
                if (flag)
                {
                    startAddress = (ushort)(4097 - 1);
                    ("进液压力开始:                ---------------").Info();

                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 26 * 2;
                    }
                    var read = await client.ReadAsync($"s={modbusAddress};x=3;{startAddress}", 26);

                    if (read.IsSuccess)
                    {
                        var souce = Tools.CDAB(read.Content, 0);
                        var value = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.JYYL = value;

                        souce    = Tools.CDAB(read.Content, 4);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.CYYL = value;

                        souce    = Tools.CDAB(read.Content, 8);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.HJWD = value;

                        souce    = Tools.CDAB(read.Content, 12);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.HJSD = value;

                        souce    = Tools.CDAB(read.Content, 16);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.HJND = value;

                        souce    = Tools.CDAB(read.Content, 20);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.HSWZ = value;

                        souce    = Tools.CDAB(read.Content, 24);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.SFFK = value;

                        souce    = Tools.CDAB(read.Content, 28);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.XFFK = value;

                        souce      = Tools.CDAB(read.Content, 32);
                        value      = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.WTF1FK = value;

                        souce      = Tools.CDAB(read.Content, 36);
                        value      = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.WTF2FK = value;

                        souce      = Tools.CDAB(read.Content, 40);
                        value      = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.WTF3FK = value;

                        souce    = Tools.CDAB(read.Content, 44);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.PGWD = value;

                        souce    = Tools.CDAB(read.Content, 48);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.FZHS = value;
                    }
                    else
                    {
                        FailLog.Write(redisClient, par, lLJ, logIotModbusPoll, "Get_LLJ", "读取进液压力异常!");
                        flag = false;
                    }
                    "进液压力结束:                ---------------".Info();
                }

                #endregion

                #region  from:累计产液:404505  to:右限液位:404553

                if (flag)
                {
                    startAddress = (ushort)(4505 - 1);
                    "累计产液开始:                ---------------".Info();

                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 50 * 2;
                    }
                    var read = await client.ReadAsync($"s={modbusAddress};x=3;{startAddress}", 50);

                    if (read.IsSuccess)
                    {
                        var souce = Tools.CDAB(read.Content, 0);
                        var value = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.LJCY = value;

                        souce = Tools.CDAB(read.Content, 4);

                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.DCRJ = value;

                        souce    = Tools.CDAB(read.Content, 8);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.SSCY = value;

                        souce      = Tools.CDAB(read.Content, 12);
                        value      = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.SSPJHS = value;

                        souce    = Tools.CDAB(read.Content, 16);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.ZRHS = value;

                        souce    = Tools.CDAB(read.Content, 20);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.YLGX = value;

                        souce    = Tools.CDAB(read.Content, 24);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.ZRCY = value;

                        souce    = Tools.CDAB(read.Content, 28);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.YLDX = value;

                        var valueInt = client.ByteTransform.TransInt16(read.Content, 32);
                        lLJ.QYBH = valueInt;

                        valueInt  = client.ByteTransform.TransInt16(read.Content, 34);
                        lLJ.JLQLX = valueInt;

                        souce    = Tools.CDAB(read.Content, 36);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.SFKZ = value;

                        souce    = Tools.CDAB(read.Content, 40);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.XFKZ = value;

                        valueInt   = client.ByteTransform.TransInt16(read.Content, 44);
                        lLJ.SSYJH  = valueInt;
                        lLJ.WellId = valueInt;

                        value     = client.ByteTransform.TransInt16(read.Content, 46);
                        lLJ.ZRYJH = valueInt;

                        value    = client.ByteTransform.TransInt16(read.Content, 48);
                        lLJ.ZRJH = valueInt;

                        value    = client.ByteTransform.TransInt16(read.Content, 50);
                        lLJ.SSJH = valueInt;

                        value    = client.ByteTransform.TransInt16(read.Content, 52);
                        lLJ.ZCJS = valueInt;

                        value    = client.ByteTransform.TransInt16(read.Content, 54);
                        lLJ.SZXS = valueInt;

                        value    = client.ByteTransform.TransInt16(read.Content, 56);
                        lLJ.SZFZ = valueInt;

                        //巡井手切小时、分钟没有读

                        value      = client.ByteTransform.TransInt16(read.Content, 62);
                        lLJ.YCYSSJ = valueInt;

                        //加热器次数、排风机次数没有读

                        value     = client.ByteTransform.TransInt16(read.Content, 68);
                        lLJ.ZTMFM = valueInt;

                        value      = client.ByteTransform.TransInt16(read.Content, 70);
                        lLJ.ZTMJSY = valueInt;

                        value        = client.ByteTransform.TransInt16(read.Content, 72);
                        lLJ.SZZDQJZQ = valueInt;

                        //4542预留
                        souce    = Tools.CDAB(read.Content, 76);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.WDDX = value;

                        souce    = Tools.CDAB(read.Content, 80);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.WDGX = value;

                        souce    = Tools.CDAB(read.Content, 84);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.NDDX = value;

                        souce    = Tools.CDAB(read.Content, 88);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.NDGX = value;

                        souce    = Tools.CDAB(read.Content, 92);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.ZXYW = value;

                        souce    = Tools.CDAB(read.Content, 96);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.YXYW = value;
                    }
                    else
                    {
                        FailLog.Write(redisClient, par, lLJ, logIotModbusPoll, "Get_LLJ", "读取累计产液异常!");
                        flag = false;
                    }
                    "累计产液结束:                ---------------".Info();
                }
                #endregion

                #region 湿度高限:404567 to:湿度低限:404569
                if (flag)
                {
                    startAddress = (ushort)(4567 - 1);
                    ("湿度高限开始:                ---------------").Info();
                    lock (ClientInfo.locker)
                    {
                        ClientInfo.RequestTime     = DateTime.Now;
                        ClientInfo.ExpectedType    = 0x03;
                        ClientInfo.ExpectedDataLen = 4 * 2;
                    }
                    var read = await client.ReadAsync($"s={modbusAddress};x=3;{startAddress}", 4);

                    if (read.IsSuccess)
                    {
                        var souce = Tools.CDAB(read.Content, 0);
                        var value = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.SDGX = value;

                        souce    = Tools.CDAB(read.Content, 4);
                        value    = client.ByteTransform.TransSingle(souce, 0);
                        lLJ.SDDX = value;
                    }
                    else
                    {
                        flag = false;
                        FailLog.Write(redisClient, par, lLJ, logIotModbusPoll, "Get_LLJ", "读取湿度高限异常!");
                    }
                    "湿度高限结束:                ---------------".Info();
                }
                #endregion

                lLJ.NetworkNode = ClientInfo.ManyIpAddress;

                if (flag == true || par.UseMockData)
                {
                    lLJ.Mock = par.UseMockData;

                    $"CommandParameter;{par.CommandParameter}".Info();
                    //根据获取的井映射到实际的井
                    var wellIdDic = JsonConvert.DeserializeObject <Dictionary <int, int> >(par.CommandParameter);
                    if (wellIdDic.ContainsKey(lLJ.SSJH))
                    {
                        lLJ.WellId        = wellIdDic[lLJ.SSJH];
                        lLJ.StationId     = par.StationId;
                        lLJ.StationName   = par.StationName;
                        lLJ.WellFieldId   = par.DeviceId;
                        lLJ.WellFieldName = par.DeviceName;
                        redisClient.AddItemToList("YCIOT:IOT_Data_OilWell_lLJ", lLJ.ToJson().IndentJson());
                        redisClient.Set($"Group:OilWell:{lLJ.WellId}:lLJ", lLJ);
                        redisClient.Set($"Single:OilWell:lLJ:{lLJ.WellId}", lLJ);
                    }
                }

                //用于通过ServerEvent给调用着返回消息
                if (!par.UserName.IsNullOrEmpty())
                {
                    ServerEventHelper.SendSseMessage(par.UserName, par.SessionId, flag ? 0 : -2, lLJ.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);
                }
            }
        }