Ejemplo n.º 1
0
        public override void SimulatorStart()
        {
            if (simulatorTimer == null)
            {
                simulatorTimer = new Timer(delegate
                {
                    Task.Run(() =>
                    {
                        for (int i = 0; i < this.IODevices.Count; i++)
                        {
                            try
                            {
                                ParaPack devicePack = new ParaPack(this.IODevices[i].IO_DEVICE_PARASTRING);
                                //构造Json模拟数据
                                MqttJsonObject mqttJsonObject = new MqttJsonObject();
                                mqttJsonObject.paras          = new List <MqttJsonPara>();
                                mqttJsonObject.device         = new MqttJsonDevice()
                                {
                                    hard_version = "1.0.0",
                                    run_time     = "",
                                    soft_version = "1.0.0",
                                    status       = "normal",
                                    uid          = devicePack.GetValue("设备识别号")
                                };
                                for (int p = 0; p < this.IODevices[i].IOParas.Count; p++)
                                {
                                    if (this.IODevices[i].IOParas[p].IO_POINTTYPE == "模拟量" || this.IODevices[i].IOParas[p].IO_POINTTYPE == "开关量")
                                    {
                                        int simulatorValue = 0;
                                        if (this.IODevices[i].IOParas[p].IO_MINVALUE != this.IODevices[i].IOParas[p].IO_MAXVALUE)
                                        {
                                            int min = -100;
                                            if (this.IODevices[i].IOParas[p].IO_MINVALUE != null && this.IODevices[i].IOParas[p].IO_MINVALUE != "")
                                            {
                                                min = int.Parse(this.IODevices[i].IOParas[p].IO_MINVALUE);
                                            }
                                            int max = 100;
                                            if (this.IODevices[i].IOParas[p].IO_MAXVALUE != null && this.IODevices[i].IOParas[p].IO_MAXVALUE != "")
                                            {
                                                min = int.Parse(this.IODevices[i].IOParas[p].IO_MAXVALUE);
                                            }
                                            simulatorValue = random.Next(min, max);
                                        }
                                        else
                                        {
                                            simulatorValue = random.Next(-100, 100);
                                        }
                                        ParaPack paraPack = new ParaPack(this.IODevices[i].IOParas[p].IO_PARASTRING);

                                        mqttJsonObject.paras.Add(new MqttJsonPara()
                                        {
                                            name     = paraPack.GetValue("JSON名称"),
                                            datatype = paraPack.GetValue("数据类型"),
                                            iotype   = "analog",
                                            version  = "1.0.0",
                                            data     = new List <object>()
                                            {
                                                DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                                paraPack.GetValue("版子地址"),
                                                paraPack.GetValue("端口号"),
                                                simulatorValue
                                            }
                                        });
                                    }
                                }
                                //
                                string json = ScadaHexByteOperator.ObjectToJson(mqttJsonObject);

                                if (mqttJsonObject != null)
                                {
                                    byte[] datas = ScadaHexByteOperator.StringToUTF8Byte(json);
                                    this.ReceiveData(this.IOServer, this.IOCommunication, this.IODevices[i], datas, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                                }
                                this.SimulatorAppendLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 时间初始化一条设备模拟数据!");
                            }
                            catch (Exception emx)
                            {
                                this.SimulatorAppendLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 接收数据错误! " + emx.Message);
                            }
                        }
                    });
                }, null, 1000, Internal * 1000);
            }
        }
Ejemplo n.º 2
0
        protected override IOData Analysis(IO_SERVER server, IO_COMMUNICATION Communication, IO_DEVICE device, IO_PARA para, byte[] datas, DateTime datatime, object sender)
        {
            ParaPack commPack   = new ParaPack(Communication.IO_COMM_PARASTRING);
            ParaPack devicePack = new ParaPack(device.IO_DEVICE_PARASTRING);
            IOData   data       = new IOData();

            data.QualityStamp = QualityStamp.BAD;
            if (device == null)
            {
                return(data);
            }

            if (para == null)
            {
                return(data);
            }

            if (sender == null)
            {
                return(data);
            }

            if (datas.Length <= 0)
            {
                return(data);
            }


            if (commPack.GetValue("数据格式") == "江苏协昌环保股份有限公司")
            {
                #region 江苏协昌环保股份有限公司

                try
                {
                    ParaPack paraPack = new ParaPack(para.IO_PARASTRING);

                    string deviceUid = devicePack.GetValue("设备识别号").Trim();
                    data.CommunicationID = Communication.IO_COMM_ID;
                    data.ID       = device.IO_DEVICE_ADDRESS;
                    data.ParaName = para.IO_NAME;
                    data.ServerID = server.SERVER_ID;

                    data.Date = DateTime.Now;
                    string str = ScadaHexByteOperator.UTF8ByteToString(datas);

                    MqttJsonObject mqttJsonObject = (MqttJsonObject)sender;

                    if (mqttJsonObject != null && !string.IsNullOrEmpty(deviceUid) && mqttJsonObject.device.uid.Trim() == deviceUid.Trim())
                    {
                        //由于一次性获取的是所有数据,所以需要解析所有数据
                        data.QualityStamp = QualityStamp.GOOD;
                        string jsonname     = paraPack.GetValue("JSON名称").Trim();
                        string boardAddress = paraPack.GetValue("版子地址");
                        string boardIndex   = paraPack.GetValue("版子索引号");
                        string port         = paraPack.GetValue("端口号");
                        string portIndex    = paraPack.GetValue("端口索引号");
                        string DataType     = paraPack.GetValue("数据类型");
                        string valueIndex   = paraPack.GetValue("采集值索引号");
                        if (mqttJsonObject.paras != null)
                        {
                            MqttJsonPara selectObj = mqttJsonObject.paras.Find(x => x.name.Trim() == jsonname.Trim());
                            if (selectObj != null)
                            {
                                if (selectObj.data != null && selectObj.data.Count > 0)
                                {
                                    string date = selectObj.data[0].ToString();
                                    try
                                    {
                                        ///解析Json数据

                                        DateTime?dateTime = GetDateTime(date);
                                        if (dateTime != null)
                                        {
                                            string pboardAddress = selectObj.data[int.Parse(boardIndex)].ToString();
                                            string pport         = selectObj.data[int.Parse(portIndex)].ToString();
                                            string value         = selectObj.data[int.Parse(valueIndex)].ToString();
                                            data.QualityStamp = QualityStamp.GOOD;
                                            data.ParaValue    = value;
                                            data.Date         = dateTime;
                                        }
                                        else
                                        {
                                            data.QualityStamp = QualityStamp.BAD;
                                            data.ParaValue    = data.QualityStampValue.ToString();
                                        }
                                    }
                                    catch (Exception emx)
                                    {
                                        this.DeviceException(emx.Message);
                                        data.QualityStamp = QualityStamp.BAD;
                                        data.ParaValue    = data.QualityStampValue.ToString();
                                    }
                                }
                            }
                            else
                            {
                                data.QualityStamp = QualityStamp.BAD;
                                data.ParaValue    = data.QualityStampValue.ToString();
                            }
                        }
                    }
                    else
                    {
                        data.QualityStamp = QualityStamp.BAD;
                        data.ParaValue    = data.QualityStampValue.ToString();
                    }
                }
                catch (Exception emx)
                {
                    data.QualityStamp = QualityStamp.BAD;
                    data.ParaValue    = data.QualityStampValue.ToString();
                    this.DeviceException(emx.Message);
                }

                #endregion
            }
            else if (commPack.GetValue("数据格式") == "通用MQTT解析")
            {
                #region 通用MQTT解析

                try
                {
                    ParaPack paraPack  = new ParaPack(para.IO_PARASTRING);
                    string   deviceUid = devicePack.GetValue("设备ID编码").Trim();
                    data.CommunicationID = Communication.IO_COMM_ID;
                    data.ID       = device.IO_DEVICE_ADDRESS;
                    data.ParaName = para.IO_NAME;
                    data.ServerID = server.SERVER_ID;
                    data.Date     = DateTime.Now;
                    string str = ScadaHexByteOperator.UTF8ByteToString(datas);

                    CommonMqttJsonObject mqttJsonObject = (CommonMqttJsonObject)sender;

                    if (mqttJsonObject != null && !string.IsNullOrEmpty(deviceUid) && mqttJsonObject.device.uid.Trim() == deviceUid.Trim())
                    {
                        //由于一次性获取的是所有数据,所以需要解析所有数据
                        data.QualityStamp = QualityStamp.GOOD;
                        string jsonname = paraPack.GetValue("IO标识").Trim();

                        string timeIndex  = paraPack.GetValue("时间值索引");
                        string DataType   = paraPack.GetValue("数据类型");
                        string valueIndex = paraPack.GetValue("采集值索引");
                        if (DataType == "命令参数")
                        {
                            data.QualityStamp = QualityStamp.GOOD;
                            data.ParaValue    = data.QualityStampValue.ToString();
                            return(data);
                        }
                        //采集参数
                        if (mqttJsonObject.paras != null)
                        {
                            CommonMqttJsonPara selectObj = mqttJsonObject.paras.Find(x => x.name.Trim() == jsonname.Trim());
                            if (selectObj != null)
                            {
                                if (selectObj.data != null && selectObj.data.Count > 0)
                                {
                                    string date = selectObj.data.Count > (int.Parse(timeIndex) + 1)? selectObj.data[int.Parse(timeIndex)].ToString():DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,f");
                                    try
                                    {
                                        ///解析Json数据

                                        DateTime?dateTime = GetDateTime(date);
                                        if (dateTime != null)
                                        {
                                            string value = selectObj.data.Count > (int.Parse(valueIndex) + 1) ? selectObj.data[int.Parse(valueIndex)].ToString():"-9999";
                                            data.QualityStamp = value != "-9999"?QualityStamp.GOOD: QualityStamp.BAD;
                                            data.ParaValue    = value;
                                            data.Date         = dateTime;
                                        }
                                        else
                                        {
                                            data.QualityStamp = QualityStamp.BAD;
                                            data.ParaValue    = data.QualityStampValue.ToString();
                                        }
                                    }
                                    catch (Exception emx)
                                    {
                                        this.DeviceException(emx.Message);
                                        data.QualityStamp = QualityStamp.BAD;
                                        data.ParaValue    = data.QualityStampValue.ToString();
                                    }
                                }
                            }
                            else
                            {
                                data.QualityStamp = QualityStamp.BAD;
                                data.ParaValue    = data.QualityStampValue.ToString();
                            }
                        }
                    }
                    else
                    {
                        data.QualityStamp = QualityStamp.BAD;
                        data.ParaValue    = data.QualityStampValue.ToString();
                    }
                }
                catch (Exception emx)
                {
                    data.QualityStamp = QualityStamp.BAD;
                    data.ParaValue    = data.QualityStampValue.ToString();
                    this.DeviceException(emx.Message);
                }

                #endregion
            }


            return(data);
        }