精华内容
下载资源
问答
  • C#版OPCClient代码总结

    千次阅读 2019-05-29 22:12:16
    C#版OPCClient代码总结 ​ 读这篇文章的朋友请提前了解下什么是opc, opc技术的产生在这里我不再多缀述了 ​ 本篇文章主要讲解一下c#调用Interop.OPCAutomation.dll实现OPC Client的注意事项,已通过正规项的检验...

    ​ 读这篇文章的朋友请提前了解下什么是opc, opc技术的产生在这里我不再多缀述了

    ​ 本篇文章主要讲解一下c#调用Interop.OPCAutomation.dll实现OPC Client的注意事项,已通过正规项的检验,在这里给大家分享一下核心经验, 此文代码版权所有,仅供参考学习,不得转载或用于商业用途,如果引起
    商业利益纠纷后果自负

    ​ 这里我的OPC Client从OPC Server端读到的数据是一个分层级的Tree状数据结构,所以Connect上服务后通过OPCBrowser对象来遍历整个Tree, 一般网上提供的例子大多无法动态的读到所有的OPCGroup,而且无法分辨多
    层级的Branch或是Leaf,经过我对数据多次调试终于找到一种通用的解决方案,基上可以适用多种OPCServer的
    数据结构,包括Kepware公司的OPCServer, OPCServer Simulator等等的一些测试。你也可以用Kassl-dOPC-Explorer工具验证你的OPCClient读到的数据结构是否一样,经过验证我的OPCClient和此工具的结果是吻合的,
    OPCBrowser通过递归调用将数据的各个节点加载到TreeView控件中,Leaf认为是OPCItem, Leaf的上一级为OPCGroup.Leaf不在TreeView的TreeNode中显示.具体实现请看以下代码

    private OPCServer kepServer;
    private OPCBrowser opcBrowser;
    private Dictionary<string, OPCGroup> groupMap = new Dictionary<string, OPCGroup>();
    private Dictionary<int, OPCItem> itemMap = new Dictionary<int, OPCItem>();
    
    //此方法通过OPCBrowser将数据结节加载到TreeView中.
    private bool LoadDataToTree(TreeNode node, string nodeName)
    {
        TreeNode childNode = null;
        OPCGroup group = null;
        try
        {
            this.opcBrowser.ShowBranches();
            int count = this.opcBrowser.Count;
            if (count == 0)
            {
                this.opcBrowser.ShowLeafs(true);
                group = this.kepServer.OPCGroups.Add(nodeName);
                group.UpdateRate = 1000;
                group.IsSubscribed = true;
                group.IsActive = true;
                node.Tag = group;
                this.groupMap.Add(nodeName, group);
            }
            HashSet<string> itemList = new HashSet<string>();
            foreach (object turn in this.opcBrowser)
            {
                string path = nodeName;
                string name = turn.ToString();
    
                if (count != 0)
                {
                    childNode = node.Nodes.Add(name);
                    if (path != "")
                    {
                        path += ".";
                    }
                    path += name;
                    this.opcBrowser.MoveDown(name);
                    LoadDataToTree(childNode, path);
                    this.opcBrowser.MoveUp();
                }
                else
                {
                    OPCItem opcItem = group.OPCItems.AddItem(name, 0);
                    itemList.Add(name);
                    if (!this.itemMap.ContainsKey(opcItem.GetHashCode()))
                    {
                        this.itemMap.Add(opcItem.GetHashCode(), opcItem);
                    }
                }
            }
    
            this.opcBrowser.ShowLeafs(false);
            List<string> leafItems = new List<string>();
            foreach (object t in this.opcBrowser)
            {
                string itemId = this.opcBrowser.GetItemID(t.ToString());
                if (itemList.Contains(itemId))
                {
                    continue;
                }
                leafItems.Add(itemId);
            }
    
            if (leafItems.Count != 0)
            {
                group = this.kepServer.OPCGroups.Add(nodeName);
                group.UpdateRate = 1000;
                group.IsSubscribed = true;
                group.IsActive = true;
                this.groupMap.Add(nodeName, group);
                node.Tag = group;
                foreach (string t in leafItems)
                {
                    OPCItem opcItem = group.OPCItems.AddItem(t, 0);
                    //childNode = node.Nodes.Add(t.ToString());
                    if (!this.itemMap.ContainsKey(opcItem.GetHashCode()))
                    {
                        this.itemMap.Add(opcItem.GetHashCode(), opcItem);
                    }
                }
            }
        }
        catch(Exception ex)
        {
            LogHelper.Error(ex);
        }
        return true;
    }
    
    //用来标识每一个OPCItem数据的唯一标识
    private void SetItemsClientHandle()
    {
        foreach(OPCItem item in this.itemMap.Values)
        {
            item.ClientHandle = item.GetHashCode();
        }
    }
    
    
    //此方法连接OPCServer上的一个Program.
    public bool Connect(string host, string prog)
    {
        try
        {
            if (connected)
            {
                if (this.kepServer != null)
                {
                    this.kepServer.Disconnect();
                    this.connected = false;
                }
            }
            this.tvwGroupList.Nodes.Clear();
            this.groupMap.Clear();
            this.itemMap.Clear();
            this.kepServer.Connect(prog, host);
            this.tsslblServerState.Text = "OPC服务[" + prog + "]已连接";
            TreeNode node = this.tvwGroupList.Nodes.Add(prog);
            node.Tag = this.kepServer;
            this.opcBrowser = this.kepServer.CreateBrowser();
            LoadDataToTree(node, "");
            this.SetItemsClientHandle();
            this.LoadConfig(prog);
            this.tsslblItemCount.Text = "Item Count " + this.itemMap.Count.ToString();
            this.tsslblGroupCount.Text = "Group Count " + this.groupMap.Count.ToString();
            this.connected = true;
        }
        catch (Exception ex)
        {
            LogHelper.Error(ex);
        }
        return true;
    }
    
    //此方法将选中的叶子节点(OPCGroup)下的所有OPCItem显示在ListView中.
    private void tvwGroupList_MouseDown(object sender, MouseEventArgs e)
    {
        try
        {
            TreeNode crtNode = this.tvwGroupList.GetNodeAt(e.X, e.Y);
            TreeNode oldNode = this.tvwGroupList.SelectedNode;
            if (oldNode != null)
            {
                this.lstviewItems.Items.Clear();
                if (oldNode.Tag is OPCGroup)
                {
                    OPCGroup old_group = oldNode.Tag as OPCGroup;
                }
            }
            this.tvwGroupList.SelectedNode = crtNode;
    
            if (e.Button == MouseButtons.Right)
            {
                if (crtNode.Tag is OPCServer)
                {
                    this.opcServercontextMenuStrip.Show(this.tvwGroupList, new Point(e.X, e.Y));
                }
                else if (crtNode.Tag is OPCGroup)
                {
                    this.opcGroupcontextMenuStrip.Show(this.tvwGroupList, new Point(e.X, e.Y));
                }
            }
            if (crtNode.Tag is OPCGroup)
            {
                OPCGroup crt_group = crtNode.Tag as OPCGroup;
                OPCItems items = crt_group.OPCItems;
                if (items.Count != 0)
                {
                    foreach (OPCItem item in items)
                    {
                        string itemId = item.ItemID;
                        string itemValue = Convert.ToString(item.Value);
                        if (item.CanonicalDataType == 11)
                        {
                            itemValue = Convert.ToInt32(Convert.ToBoolean(itemValue)).ToString();
                        }
                        ListViewItem listitem = new ListViewItem(new string[] {
                        itemId,
                        item.CanonicalDataType.ToString(),
                        itemValue,
                        item.TimeStamp.ToString(),
                        OPCEnumHelper.GetQuality((OPCQuality)item.Quality),
                        "0"});
                        listitem.Tag = item.ClientHandle;
                        this.lstviewItems.Items.Add(listitem);
                    }
                }
                else
                {
                    Array branches = crt_group.Name.Split('.');
                    this.opcBrowser.MoveTo(ref branches);
                    this.opcBrowser.ShowLeafs(true);
                    foreach (object turn in this.opcBrowser)
                    {
                        string name = turn.ToString();
                        //crt_group.OPCItems.AddItem(name, this.itemHandleClient);
    
                        ListViewItem listitem = new ListViewItem(new string[] {
                                name,
                                "",
                                "",
                                "",
                                "",
                                ""});
                        this.lstviewItems.Items.Add(listitem);
                    }
    
                    this.opcBrowser.ShowLeafs(true);
                    this.opcBrowser.MoveToRoot();
                }
            }
        }
        catch (Exception ex)
        {
            LogHelper.Error(ex);
        }
    }
    
    展开全文
  • SCIM Bridge Client代码分析

    千次阅读 2009-02-26 13:03:00
    作者:刘旭晖 Raymond 转载请注明出处 ...端代码都实现了,大概很少人会需要做这个工作了。(可以考虑做 Clutter 的 Client 实现 :)不过,可以由这篇文档学习了解一下 Client 端的工作机制。 ...

     作者:刘旭晖 Raymond转载请注明出处

    Emailcolorant@163.com

    BLOGhttp://blog.csdn.net/colorant/

    主页:http://sites.google.com/site/rgbbones/

          

           SCIM bridge端一开始的出现是为了解决C++ ABI兼容性。在Agent端使用C++,而为GTK写的Client则是基于C实现的。为了学习它的IM ProtocolSocket通讯机制,简单分析了一下Client端的代码实现。C++学得不好,Agent端就顾不上了。。。

     

    1         相关参考资料

    http://os.cqu.edu.au/usr/share/doc/scim-bridge-0.4.5/doc/developer/index.html 这篇文档按题目来说是给scim-bridgedeveloper看的,不过想想现在GTKQTClient端代码都实现了,大概很少人会需要做这个工作了。(可以考虑做ClutterClient实现 :)不过,可以由这篇文档学习了解一下Client端的工作机制。

    http://os.cqu.edu.au/usr/share/doc/scim-bridge-0.4.5/doc/user/index.html scim-bridge的用户文档,基本上就是如何安装scim-bridge和查看调试信息。

     

    2         工作机制

    2.1        ClientIMContext工作流程

    Ø       Im_module_init函数:注册ScimBridgeClientIMContext类。创建messenger用于ClientAgent之间的进程间通讯:如果scim-bridgeagent端没有启动,则用system命令启动agent,建立messengeragent端的socket链接。将gtk-im-simple-context设置为缺省fallbackIMContext

    Ø       Im_module_create函数:创建ScimBridgeClientIMContext对象实例。

    Ø       类初始化函数:设置成员函数。

    Ø       对象初始化函数:向Agent端注册自身IMContext实例,从返回的message中得到自身被注册的ID号(ID号将被用于track message的发送接收方,从而进一步将信息发送到正确的GTK Widget),并在Client本地端维护一个注册过的IMContext链表。

    Ø       set_client_window:通常这是GtkIMContext第一个被调用到的函数,Scim-bridge client端处理了改调用请求,并不将该函数调用发送到Agent端处理。

    Ø       其它GtkIMContext相关函数:基本上都是做二传手的工作,将函数调用转换为message通过messenger发送给Agent端,同时将messenger接收到的message转换为对应的函数调用通知GTK或者更新IMContext状态。其中filter_keypress函数会先将key_event中各个modifie的状态解析出来,插入到message中。此外,在Developer文档中对每个函数都做了简单描述。

    2.2        Messenger的工作流程

    Messenger用于处理scim-bridge client端和agent端之间的通讯。

    http://os.cqu.edu.au/usr/share/doc/scim-bridge-0.4.5/doc/developer/protocol.html 这部分文档描述了Messenger所使用的通讯协议。

     

    Message的收发过程:

    Ø       Message的创建:首先根据Message的类型和参数的数量创建Message数据结构,填充类型信息,并分配其参数所需的buffer空间。每个参数默认的buffer size10个字节。设置每个参数的具体内容,参数的结构为字符串。

    Ø       Message的打包:Message数据结构并不是最终在socket上传送的数据包,还需要经过打包处理,调用scim_bridge_messenger_push_messageMessage的内容打包后存储在messengersending buffer里。此后既可释放Message结构所占据的空间。

    Ø       Message的发送:通过Send函数将Messengersending_buffer中的数据由socket发送出去。

    Ø       Message的接收:通过scim_bridge_messenger_receive_messagesocket接收数据,当接收buffer尺寸不够时,重新分配内存。当检测到’/n’字符时,判定接收到一条完整的Message,并设置Messenger相应的标志位。

    Ø       Message的解包:当Messenger中接收到Message的标志位被设置后,通过调用scim_bridge_messenger_poll_message函数,将Receiving buffer中的数据再次解包出来,填充到Message结构中。

     

    ClientMessenger相关工作流程:

    Ø       Messenger初始化: Scim-bridge Client模块初始化过程中或IMContext Focus in过程中,初始化一个全局Messenger,首先建立和Agentsocket链接。由获得的socket文件句柄,创建并初始化Messenger相关数据结构。

    Ø       Messenger的销毁:在Scim-bridge Client模块退出过程中或者在clientagentsocket通讯失败后,Messengerclose并销毁。

    Ø       Messenger socket数据的监听:在GTK Client的实现中,当Messenger创建成功后,由对应的socket文件句柄获得g_io_channel并通过g_io_add_watch添加到GTKmainloop中,实现数据的监听。

     

     

    展开全文
  • 今天按照IdentityServer4官方文档写了一下代码测试下来报错,官方文档配置ConfigureService代码如下图 官方配置Configure代码如下图 运行报错效果如下图 完全按照官方文档跑的,然后找了一圈原来是没有加上...

    今天按照IdentityServer4官方文档写了一下代码测试下来报错,官方文档配置ConfigureService代码如下图

    官方配置Configure代码如下图

    运行报错效果如下图

    完全按照官方文档跑的,然后找了一圈原来是没有加上响应类型,代码如下

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
                JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
                services.AddAuthentication(option =>
                {
                    option.DefaultScheme = "Cookies";
                    option.DefaultChallengeScheme = "oidc";
                })
                .AddCookie("Cookies")
                .AddOpenIdConnect("oidc", options =>
                {
                    options.Authority = "http://localhost:5000";
                    options.RequireHttpsMetadata = false;
                    options.ClientId = "mvc client";
                    options.SaveTokens = true;
                    options.ResponseType = "code";
                });
            }

    加上ResponseType以后不报错了,登录确实可以了,但是登录以后点击授权按钮又报错,如下图

    额,无语了,找了一圈发现是少了设置秘钥代码加上以后如下

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
                JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
                services.AddAuthentication(option =>
                {
                    option.DefaultScheme = "Cookies";
                    option.DefaultChallengeScheme = "oidc";
                })
                .AddCookie("Cookies")
                .AddOpenIdConnect("oidc", options =>
                {
                    options.Authority = "http://localhost:5000";
                    options.RequireHttpsMetadata = false;
                    options.ClientId = "mvc client";
                    options.ClientSecret = "mvc secret";
                    options.SaveTokens = true;
                    options.ResponseType = "code";
                });
            }

    然后不报错了,官方文档感觉很不严谨啊。。。

    展开全文
  • fmt.Printf("Client: Sending '%s'\n", message) _, err = stream.Write([]byte(message)) if err != nil { fmt.Println(err) return } buf := make([]byte, len(message)) _, err = io.ReadFull(stream, ...
  • 最普通的XFire Client代码

    千次阅读 2007-07-24 14:56:00
    需要把Service接口,相应的javabean, aegis文件打成jar包,部署到Client工程的classpath中 使用如下代码访问WebService package client;import java.net.MalformedURLException;import org.codehaus.xfire....

    需要把Service接口,相应的javabean, aegis文件打成jar包,部署到Client工程的classpath中 

    使用如下代码访问WebService

     

    package client;

    import java.net.MalformedURLException;

    import org.codehaus.xfire.XFireFactory;
    import org.codehaus.xfire.client.XFireProxyFactory;
    import org.codehaus.xfire.service.Service;
    import org.codehaus.xfire.service.binding.ObjectServiceFactory;

    import Test.User;

    public class TestWS2 {

        
    /**
         * 
    @param args
         
    */

        
    public static void main(String[] args) {
            Service srvcModel 
    = new ObjectServiceFactory().create(IHelloWorldService.class);
            XFireProxyFactory factory 
    = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
            String helloWorldURL 
    = "http://localhost:8080/XFireStudy/services/IHelloWorldService";
            
    try {
                IHelloWorldService srvc 
    = (IHelloWorldService) factory.create(
                        srvcModel, helloWorldURL);
                System.out.print(srvc.HelloWorld(
    new User("gaoxiang","1234")).getUsername());
            }
     catch (MalformedURLException e) {
                e.printStackTrace();
            }

        }


    }

    展开全文
  • go 代码里面这一句 resp, err := http.DefaultClient.Do(req) 是什么作用?
  • udp的server和client例子代码

    千次阅读 2018-12-27 15:11:56
    写在这里,方便调试时使用参考,代码如有雷同,纯属巧合 服务端 udp_server.c #include &lt;stdio.h&gt; #include &lt;sys/types.h&gt; #include &lt;sys/socket.h&gt; #include &lt...
  • 学习开源项目,首要应该是了解其机制。拿来主义固然可以加速开发,但是也会带来潜在的风险。如果你想把自己的应用做的...ZooKeeper用了不少代码维护ZK client和ZK server之间的session。基本架构是一个NIO server,后
  • 基于开源代码编写SIP客户端。SIP的主要协议;MTSIPClient的开源库选型;MTSIPClient的设计;MTSIPClient的编译。
  • Axis2 基于新的体系结构进行了全新编写,而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化更强、灵活性更高和更有效的体系结构,这种体系结构可以很容易地插入到其他相关 Web 服务标准和协议...
  • Eclipse For JavaEE SVN更新代码时提示“unable to load default svn client ”错误
  • 基于CSOCKET的Client简单实例

    千次阅读 2017-11-01 09:35:26
    第一步:创建一个基类为CSOCKET类的新类,Cclient,并在主对话框类创建对象Cclient client1 ...// TODO: 在此添加额外的初始化代码 client1.Create(); client1.Connect(_T("192.168.42.87"),20000);
  • 在jenkins拉取代码的时候,报错 stderr: client_loop: send disconnect: Broken pipe 发现公钥秘钥都配置正确,但是还是无法解决问题 解决办法 比较无奈的方法,保留 jenkins_home 更新jenkins版本即可解决问题。 ....
  • 报错内容: fatal : ...JAVA_OPTS=”-Xms4096m -Xmx4096m -XX:MaxNewSize=512m -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=6000” ./bin/catalina.sh stop ./bin/catalina.sh start
  • -p 后面配置的是代码所在的包名 产生出来的有个类名比较长的以 _Client 结尾的java 文件 就是调用的测试文件, 里面包含 main 方法。 如果在eclipse 测试的话, 可以新建 一个java project, 把cxf lib 下所有的 jar...
  • 一台Windows Server 2003,在更新重启后发现DHCP Client 服务无法启动,错误代码5:访问被拒绝。 于是Google+Baidu,发现微软已有解决的办法:http://support.microsoft.com/kb/895149。但是它提到的是从2K的域控制...
  • 一、cxf生成 1、首先需要下载cxf,cmd进入bin目录 2、执行命令 "wsdl2java -p 包名 -d 本地路径 -...2、选择Webservice Client 3、输入webservice接口地址,选择finish   4、代码如下
  • 其中,sourceRoot标签表示client代码输出路径,wsdl标签表示wsdl文件所在位置,可填url,也可填本地文件名字。该maven插件绑定了generate-sources这个生命段落,因此,执行generate-sources可自动生成本地stub代码...
  • import websocket import time import threading SERVER_URL = "ws://192.168.1.208:7600/box/reader-" ...如果需用作socket client的测试,直接修改启动连接的函数为socket连接方式
  • OSSClient

    万次阅读 2016-10-18 11:09:15
    OSSClient是OSS服务的Java客户端,它为调用者...新建一个OSSClient很简单,如下面代码所示: String key = ""; String secret = ""; OSSClient client = new OSSClient(key, secret); 上面的方式使用默认域
  • java -jar lib\swift-generator-cli-0.14.2-standalone.jar ^ TestService.thrift ^ -generate_beans ^ -override_package net.gdface.facelog.client ^ -out client/java
  • : 需要把 android view client 的 src添加到path路径中 from com . android . monkeyrunner import MonkeyRunner , MonkeyDevice sys . path . append ( '/path/to/android_view_client_home/src' ) ...
  • 最近一直在纠结这个问题,公司要用opc来读取plc上的数据,现在首要的问题是先解决客户端连接服务端的问题,代码这一块也不会。谁能帮帮我
  • eureka: client: service-url: defaultZone: http://localhost:8797/eureka

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 822,171
精华内容 328,868
关键字:

代码client