Beispiel #1
0
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="dataName">获取数据别名</param>
        /// <param name="data_sensor_list">返回数据集合</param>
        /// <returns></returns>
        private int get_data(string dataName, ref pb_data_sensor_list data_sensor_list)
        {
            int result = 1;

            log.Debug(string.Format("server received:command:{0}, dataName:{1}", "get_data", dataName));

            // 判断dataName在dataDict集合中是否存在
            if (!dataDict.ContainsKey(dataName))
            {
                result = (int)eErrorCode.GET_NONAME_ERR;
                log.Debug("get_data error:param " + dataName + " not exist");
            }
            else
            {
                data_sensor_list = new pb_data_sensor_list();

                data_sensor_list.ListId = 1;
                Hashtable TmpTable = (Hashtable)dataDict[dataName];
                foreach (var value in TmpTable.Values)
                {
                    data_sensor_list.PbDataSensors.Add((pb_data_sensor)value);
                }
            }
            return(result);
        }
Beispiel #2
0
        /// <summary>
        /// 设置数据
        /// </summary>
        /// <param name="dataName">请求点集合名称</param>
        /// <param name="dataList">点数据集合</param>
        /// <returns></returns>
        public override int SetData(string dataName, Hashtable dataList)
        {
            int result = 1;

            pb_data_sensor_list data_sensor_list = new pb_data_sensor_list();

            try
            {
                foreach (var data in dataList.Values)
                {
                    data_sensor_list.PbDataSensors.Add((pb_data_sensor)data);
                }
                MemoryStream mStream = new MemoryStream();
                data_sensor_list.WriteTo(mStream);

                result = Rtds.rtds_set_data(mStream.ToArray(), mStream.ToArray().Length);
                if (result != 1)
                {
                    log.Debug(string.Format("SetData Error:calling rtds_set_data method ,method returns:{0}", result));

                    result = (int)eErrorCode.SETDATA_ERR;
                }
            }
            catch (Exception ex)
            {
                result = (int)eErrorCode.SETDATA_ERR;
                log.Debug(string.Format("SetData Error:set data failed,because {0}", ex.Message.ToString()));
            }

            return(result);
        }
Beispiel #3
0
        /// <summary>
        /// 绑定数据
        /// </summary>
        /// <param name="pbDataType">数据类型</param>
        /// <param name="pbData">数据信息</param>
        /// <param name="dataName">绑定数据别名</param>
        /// <returns>1:成功 -1:失败 -2:请求点不在集合中</returns>
        private int bind_data(string pbDataType, byte[] pbData, string dataName)
        {
            int result = 1;
            pb_data_sensor_list data_sensor_list = pb_data_sensor_list.Parser.ParseFrom(pbData);

            log.Debug(string.Format("server received:command:{0}, pbDataType:{1}, dataName:{2}, {3} tags in bind_data", "bind_data", pbDataType.ToLower(), dataName, data_sensor_list.PbDataSensors.Count));

            if (pbDataType.ToLower() != "pb_data_sensor_list")
            {
                result = (int)eErrorCode.BIND_PARAM_ERR;
                log.Debug(string.Format("bind_data error:params {0} ≠ pb_data_sensor_list", pbDataType));
            }
            else
            {
                // 判断绑定数据是否为空
                if (data_sensor_list.PbDataSensors.Count > 0)
                {
                    // 判断请求点是否在集合中
                    foreach (var data_sensor in data_sensor_list.PbDataSensors)
                    {
                        if (!RDB.AllDataDict.ContainsKey(data_sensor.Name))
                        {
                            result = (int)eErrorCode.BIND_NOTIN_ERR;
                            log.Debug("bind_data error:the tag " + data_sensor.Name + " not exist");
                            break;
                        }
                    }
                    if (result != 0x03090203)
                    {
                        Hashtable PbList = new Hashtable();
                        foreach (var data_sensor in data_sensor_list.PbDataSensors)
                        {
                            pb_data_sensor dataSensor = (pb_data_sensor)RDB.AllDataDict[data_sensor.Name];
                            if (!PbList.Contains(dataSensor.Name))
                            {
                                PbList.Add(dataSensor.Name, dataSensor);
                            }
                        }
                        // 绑定dataName与AllDataDict
                        if (!dataDict.ContainsKey(dataName))
                        {
                            dataDict.Add(dataName, PbList);
                        }
                        else
                        {
                            dataDict[dataName] = PbList;
                        }
                    }
                }
                else
                {
                    result = (int)eErrorCode.BIND_NOTAG_ERR;
                    log.Debug("bind_data error:bind data is empty");
                }
            }
            return(result);
        }
Beispiel #4
0
        /// <summary>
        /// 设置数据
        /// </summary>
        /// <param name="dataName">数据别名</param>
        /// <param name="pbDataType">数据类型</param>
        /// <param name="pbData">数据内容</param>
        /// <returns></returns>
        private int set_data(string dataName, string pbDataType, byte[] pbData)
        {
            int result = 1;
            pb_data_sensor_list data_sensor_list = pb_data_sensor_list.Parser.ParseFrom(pbData);

            log.Debug(string.Format("server received:command:{0}, pbDataType:{1}, dataName:{2}, {3} tags need set_data", "set_data", pbDataType.ToLower(), dataName, data_sensor_list.PbDataSensors.Count));

            if (pbDataType.ToLower() != "pb_data_sensor_list")
            {
                result = (int)eErrorCode.SET_PARAM_ERR;
                log.Debug(string.Format("set_data error:param {0} ≠ pb_data_sensor_list", pbDataType));
            }
            else
            {
                if (!dataDict.ContainsKey(dataName))
                {
                    result = (int)eErrorCode.SET_NONAME_ERR;
                    log.Debug("set_data error:param " + dataName + " not exist");
                }
                else
                {
                    Hashtable dataList = new Hashtable();
                    Hashtable bind_data_sensor_list = (Hashtable)dataDict[dataName];

                    // 以绑定的数据为准
                    if (data_sensor_list.PbDataSensors.Count > 0)
                    {
                        // 要设置的标签点必须是绑定数据的子集
                        if (data_sensor_list.PbDataSensors.Count <= bind_data_sensor_list.Count)
                        {
                            // 校验要设置的标签点是否绑定
                            foreach (var data_sensor_l in data_sensor_list.PbDataSensors)
                            {
                                if (bind_data_sensor_list.Contains(data_sensor_l.Name))
                                {
                                    if (!dataList.ContainsKey(data_sensor_l.Name))
                                    {
                                        dataList.Add(data_sensor_l.Name, data_sensor_l);
                                    }
                                }
                                else
                                {
                                    result = (int)eErrorCode.SET_NOTBIND_ERR;
                                    log.Debug("set_data error:the tag " + data_sensor_l.Name + " not bind");
                                    break;
                                }
                            }
                            if (result != 0x03090605)
                            {
                                result = rdb.SetData(dataName, dataList);
                                if (result != 1)
                                {
                                    result = (int)eErrorCode.SET_DATA_ERR;
                                }
                            }
                        }
                        else
                        {
                            result = (int)eErrorCode.SET_MORE_ERR;
                            log.Debug("set_data error:set data is too much,is more than bind data");
                        }
                    }
                    else
                    {
                        result = (int)eErrorCode.SET_NOTAG_ERR;
                        log.Debug("set_data error:set data is empty");
                    }
                }
            }
            return(result);
        }
Beispiel #5
0
        /// <summary>
        /// ZMQ通信、接收到命令及参数、根据命令进行相应处理
        /// </summary>
        public void Run()
        {
            int result = 1;

            while (true)
            {
                // 等待接收Message
                var message = serverSocket.ReceiveMultipartMessage();
                // 获取命令
                var Command = message[0].ConvertToString();

                string typeName   = "";
                string configName = "";
                string dataName   = "";
                byte[] pbData     = null;
                // switch case 进行判断
                switch (Command)
                {
                case "bind_config":
                    typeName = message[1].ConvertToString();
                    byte[] configData = message[2].Buffer;
                    configName = message[3].ConvertToString();
                    result     = bind_config(typeName, configData, configName);
                    break;

                case "bind_data":
                    typeName = message[1].ConvertToString();
                    pbData   = message[2].Buffer;
                    dataName = message[3].ConvertToString();
                    result   = bind_data(typeName, pbData, dataName);
                    break;

                case "start_service":
                    configName = message[1].ConvertToString();
                    result     = start_service(configName);
                    break;

                case "stop_service":
                    configName = message[1].ConvertToString();
                    result     = stop_service(configName);
                    break;

                case "set_data":
                    typeName = message[1].ConvertToString();
                    pbData   = message[2].Buffer;
                    dataName = message[3].ConvertToString();
                    result   = set_data(dataName, typeName, pbData);
                    break;

                case "get_data":
                    dataName = message[1].ConvertToString();
                    pb_data_sensor_list data_sensor_list = null;
                    result = get_data(dataName, ref data_sensor_list);
                    if (result == 1)
                    {
                        var msg = new NetMQMessage();
                        msg.Append("pb_data_sensor_list");
                        MemoryStream sm = new MemoryStream();
                        data_sensor_list.WriteTo(sm);
                        msg.Append(sm.ToArray());
                        serverSocket.SendMultipartMessage(msg);
                        log.Debug(string.Format("server response:{0} pb_data_sensor in data_sensor_list", data_sensor_list.PbDataSensors.Count));
                    }
                    else
                    {
                        serverSocket.SendFrame(result.ToString());
                        log.Debug(string.Format("server response:result = 0x{0:X2}", result));
                    }
                    break;

                case "dispose_data":
                    // 清空绑定的数据 缺少判断状态
                    configName = message[1].ConvertToString();
                    dataName   = message[2].ConvertToString();
                    result     = dispose_data(configName, dataName);
                    break;

                case "auto_get_data":
                    break;
                }
                Thread.Sleep(100);
                if (Command != "get_data")
                {
                    serverSocket.SendFrame(result.ToString());
                    log.Debug(string.Format("server response:result = 0x{0:X2}", result));
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// 开始读取数据并更新内存AllDataDict
        /// </summary>
        /// <param name="configObj">配置项名称</param>
        private void Work(object configObj)
        {
            string configName = configObj.ToString();
            // 获取数据更新周期
            int cycle = 0;

            foreach (KeyValuePair <string, PbConfig> kvp in AllConfigDict)
            {
                if (kvp.Key == configName)
                {
                    cycle = ((pb_config_rtds)kvp.Value).UpdateCycle;
                    break;
                }
            }
            while (GetThreadStt(configName))
            {
                var now = DateTime.Now;
                try
                {
                    pb_data_sensor_list pbDataList = new pb_data_sensor_list();
                    foreach (KeyValuePair <string, List <string> > kvp in TagAndConfigDict)
                    {
                        if (kvp.Value.Contains(configName))
                        {
                            pb_data_sensor dataObject = new pb_data_sensor();
                            dataObject.Name = kvp.Key;

                            pbDataList.PbDataSensors.Add(dataObject);
                        }
                    }

                    MemoryStream mStream = new MemoryStream();
                    pbDataList.WriteTo(mStream);

                    // 定义这个c#中用来接收c++返回数据的指针类型
                    IntPtr unmanaged_ptr = IntPtr.Zero;
                    int    length        = Rtds.rtds_get_cur_data(mStream.ToArray(), mStream.ToArray().Length, out unmanaged_ptr);

                    if (length > 0)
                    {
                        byte[] managed_data = new byte[length];
                        // 将非托管内存拷贝成托管内存,才能在c#里面使用
                        Marshal.Copy(unmanaged_ptr, managed_data, 0, length);

                        // 遍历返回标签点数据 并更新到内存中
                        pb_data_sensor_list data_sensor_list = pb_data_sensor_list.Parser.ParseFrom(managed_data);
                        foreach (pb_data_sensor pb_data_sensor in data_sensor_list.PbDataSensors)
                        {
                            if (AllDataDict.ContainsKey(pb_data_sensor.Name))
                            {
                                ((pb_data_sensor)AllDataDict[pb_data_sensor.Name]).Type    = pb_data_sensor.Type;
                                ((pb_data_sensor)AllDataDict[pb_data_sensor.Name]).Size    = pb_data_sensor.Size;
                                ((pb_data_sensor)AllDataDict[pb_data_sensor.Name]).Value   = pb_data_sensor.Value;
                                ((pb_data_sensor)AllDataDict[pb_data_sensor.Name]).Time    = pb_data_sensor.Time;
                                ((pb_data_sensor)AllDataDict[pb_data_sensor.Name]).Quality = pb_data_sensor.Quality;
                                ((pb_data_sensor)AllDataDict[pb_data_sensor.Name]).Status  = pb_data_sensor.Status;
                                ((pb_data_sensor)AllDataDict[pb_data_sensor.Name]).Unit    = pb_data_sensor.Unit;
                            }
                        }
                        // 清理C++内存空间
                        Rtds.rtds_release_mem(out unmanaged_ptr);
                    }
                    else
                    {
                        log.Debug(string.Format("GetData Error:calling rtds_get_cur_data method,method returns data length:{0}", length));
                    }
                    // 实时更新状态 为已运行 3
                    SetRtdsStatus("3");
                }
                catch (Exception ex)
                {
                    // 实时更新状态 为异常 4
                    SetRtdsStatus("4");
                    log.Debug(string.Format("GetData Error:update cache data failed,because {0}", ex.Message.ToString()));
                }
                // 如果数据更新周期为0 则只取一次数据
                if (cycle == 0)
                {
                    break;
                }
                else
                {
                    var      cur = DateTime.Now;
                    TimeSpan ts  = cur - now;
                    if (ts.TotalMilliseconds < cycle * 1000)
                    {
                        Thread.Sleep(cycle * 1000 - (int)ts.TotalMilliseconds);
                    }
                }
            }
        }