继续C# OPC Server开发,本单节实现OPC标准接口IOPCServer里的AddGroup方法代码如下
/// <summary>
        /// 新增一个 OPCGroup 
        /// </summary>
        /// <param name="szName">组名。组名必须为UNICODE 码,不能是ASC码,而且不能和同一个客户程序创建的其它组的名字相同。如果没有定义组名,服务器会给它定义一个独有的名字。</param>
        /// <param name="bActive">如果值为FALSE,那么组被定义为不活动的。如果为TRUE,组被定义为活动的。</param>
        /// <param name="dwRequestedUpdateRate">客户程序定义的组最快的刷新速率,单位为毫秒,主要在OnDataChage 中使用。同样说明了要求CACHED DATA 的期望速率。如果此值为0,那么服务器必须以最快的实际速率刷新。</param>
        /// <param name="hClientGroup">客户程序提供的组句柄。</param>
        /// <param name="pTimeBias">时间戳指针。如果指针为空表示你希望使用系统默认时间戳。</param>
        /// <param name="pPercentDeadband">定义了死区参数。这个参数仅仅对本组内的模拟量有效。当模拟量的值变化超出死区,必须产生一个回调给客户程序。NULL 值代表0.0,即没有死区。</param>
        /// <param name="dwLCID">本组字符串操作时,服务器使用的语言。</param>
        /// <param name="phServerGroup">服务器为新的组产生的句柄。客户程序将采用服务器提供的句柄来要求服务器对组进行其它的操作。</param>
        /// <param name="pRevisedUpdateRate">服务器返回的实际刷新速率,这个值可能与客户程序要求的刷新速率不一样。注意:这个值可能也比服务器实际从设备获取数据和刷新CACHE 的速率要慢。</param>
        /// <param name="riid">期望接口类型 (如 IID_IOPCItemMgt)</param>
        /// <param name="ppUnk">返回接口指针,如果操作失败,返回NULL。</param>
        /// <returns>操作代码</returns>
        [PreserveSig]
        public int AddGroup(string szName, bool bActive, int dwRequestedUpdateRate, int hClientGroup,
            IntPtr pTimeBias, IntPtr pPercentDeadband, int dwLCID,
            out int phServerGroup, out int pRevisedUpdateRate, ref Guid riid,
            [MarshalAs(UnmanagedType.IUnknown), Out]out object ppUnk)
        {
            #region 数据准备 验证
            phServerGroup = 0;
            pRevisedUpdateRate = 0;
            ppUnk = null;
            if (OPCDAGlobal.ServerState == OpcServerState.Failed)
            {
                return HRESULTS.E_FAIL;
            }
            if (!string.IsNullOrEmpty(szName))
            {
                if (_opcDAGroups.Count(p => p.GroupName == szName) > 0)
                {
                    return HRESULTS.OPC_E_DUPLICATENAME;
                }
            }
            #endregion

#region 获得组名
            if (string.IsNullOrEmpty(szName))
            {
                int groupindex = 0;
                while (!string.IsNullOrEmpty(szName))
                {
                    string nszName = "Group" + groupindex.ToString();
                    if (_opcDAGroups.Count(p => p.GroupName == nszName) == 0)
                    {
                        szName = nszName;
                    }
                    groupindex++;
                }
            }
            #endregion

#region 实例化Group 对像
            OPCDAGroup opcdagroup = new OPCDAGroup(this);
            pRevisedUpdateRate = OPCDAGlobal.GetRevisedKeepAliveTime(dwRequestedUpdateRate);
            opcdagroup.TimeBias = Marshal.ReadInt32(pTimeBias);
            float[] pdb = new float[1];
            Marshal.Copy(pPercentDeadband, pdb, 0, 1);
            opcdagroup.LCID = dwLCID;
            opcdagroup.Active = bActive;
            opcdagroup.GroupName = szName;
            opcdagroup.PercentDeadband = pdb[0];
            opcdagroup.RevisedUpdateRate = pRevisedUpdateRate;
            opcdagroup.ClientGroup = hClientGroup;
            phServerGroup = opcdagroup.ServerGroup;
            ppUnk = opcdagroup;
            #endregion

_opcDAGroups.Add(opcdagroup);

//服务器实际使用的数据更新率与客户请求的更新率不同
            if (pRevisedUpdateRate != dwRequestedUpdateRate)
            {
                return HRESULTS.OPC_S_UNSUPPORTEDRATE;
            }
            return HRESULTS.S_OK;
        }

如有不明白的欢迎留言

转载于:https://www.cnblogs.com/xgd224743/archive/2012/09/05/2665215.html

C# 开发 OPC Server 系列之二相关推荐

  1. [Axis2与Eclipse整合开发Web Service系列之二] Top-Down方式,通过WSDL逆向生成服务端(续)

    前言 本篇是承接上一篇: [Axis2与Eclipse整合开发Web Service系列之二] Top-Down方式,通过WSDL逆向生成服务端 在上一篇粗略地介绍了如何使用Top-Down的方式创建 ...

  2. 敏捷开发用户故事系列之二:如何面向客户价值编写故事

    这是敏捷开发用户故事系列的第二篇.(之一,之二,之三,之四,之五,之六,之七,之八,之九) 敏捷开发中的用户故事采用的语法模式看似简单,却蕴含着深刻的思想. "作为一个--,可以--,以(以 ...

  3. 敏捷开发团队管理系列之二:程序与测试团队I

    这是敏捷开发团队管理系列的第二篇.(之一,之二,之三,之四) 几个真实案例 这几个团队都是我自己亲身经历的团队,从质量的角度来分析敏捷团队的工作方式. 第一个是一个较为大型的团队,约有25-30人,研 ...

  4. 敏捷开发般若敏捷系列之二:什么是敏捷(上)(无住,不住于法,破法执)...

    这是敏捷开发般若敏捷系列的第二篇.(之一,之二,之三,之四,之五,之六,之七,之八,之九) 所谓无住,包括两个含义:不住于法,不住于空.前者比较好理解,后者会在下篇详述. 不住于法,就是不执着于具体方 ...

  5. 敏捷开发日常跟进系列之二:燃尽图(中)

    这是敏捷开发日常跟进系列的第二篇(栏目目录). 迭代及燃尽图的目标 燃尽图的目标是完成迭代的目标,迭代的目标是什么呢? 1. 按产品经理的要求,交付计划会中计划的用户故事 2. 尽量完成1 之后还会看 ...

  6. 敏捷开发产品管理系列之二:产品版本规划

    本文是敏捷开发产品管理系列的第二篇.(序言及设立迭代目标,产品版本规划,产品用户群规划,新产品研发,预估会议,Product Servant,Product Owner团队,产品线管理) 本文是一篇旧 ...

  7. [Axis2与Eclipse整合开发Web Service系列之二] Top-Down方式,通过WSDL逆向生成服务端

    开始本篇之前, 先说说 Buttom-up(从下到上)和Top-down(从上到下)的概念 这是开发WebService的两种方式. bottom-up 方式: 先创建Java Bean或EJB, 然 ...

  8. 【Linux】【开发环境】【RHEL】开发环境搭建系列之二——更换RHEL原生的yum源

    背景 在使用RHEL安装软件包的过程中,经常会遇到两个问题: 安装好RHEL的Linux后,如果是未注册的,执行yum install命令安装软件会报错: This system is not reg ...

  9. Community Server系列之二:页面之间的关系1[介绍]

    当我们第一眼见到CS的时候你是不是被他那么纷繁复杂的结构看傻眼呢.那么在认识CS之前最好对它的页面间关系做一个全面的了解,这对我门改造CS有较大的帮助.        首先我们对整体一个简单的了解,如 ...

  10. [Axis2与Eclipse整合开发Web Service系列之三] 服务端返回值

    前言 在前面的三篇中 [Axis2与Eclipse整合开发Web Service系列之一] 生成Web Service Client(将WSDl 转化成 Java代码) [Axis2与Eclipse整 ...

最新文章

  1. arduino Pro Mini和nano​替代芯片LGT8F328P,上传报错Cannot run program解决方法
  2. cordova 蓝牙_Ionic通过Cordova插件使用设备能力
  3. Python3.6学习笔记(三)
  4. [react] 怎样动态导入组件?
  5. 数据结构之图:有向图的拓扑排序,Python代码实现——26
  6. IE浏览器下如何低延迟播放RTSP或RTMP流
  7. 蚂蚁(挑战程序设计竞赛)
  8. 树莓派raspi-config配置工具
  9. JavaScript星星连线技巧
  10. 绘画教程:动漫角色中男生女生脸部画法
  11. JavaWeb——EL 函数
  12. 软件测试---性能测试
  13. 智能硬件产品经理手册
  14. 算力≠智慧! MIT教授抛出「意识来源」新理论:人类认知与计算根本没关系
  15. Nginx四层代理和7层反向代理
  16. 阿里巴巴王坚:不理解在线,就没有真懂互联网
  17. 鸡兔同笼,共有头48个,脚132只,求鸡和兔各有多少只?
  18. ubuntu19.10 配置拨号上网 ASDL 不使用pppoeconf
  19. XP 蓝屏代码查询表 错误代码
  20. access的未来发展 ieee_IEEE Access 期刊怎么样,在国外认可度高吗?

热门文章

  1. Java JDK 配置环境变量
  2. [译] 如何在 keras 中使用循环神经网络创作音乐
  3. Linux shell 上机编程-----习题
  4. HTMLTestRunner修改Python3的版本
  5. 使用Faker.NET仿造数据
  6. GPS时钟模块授时仪 与 同步时钟,1PPS
  7. python中eval函数作用
  8. MyBatis3与Spring3的整合配置(初级篇)
  9. 简易CPU的C++实现
  10. Linux 实现与宿主机共享文件夹 Centos7