精华内容
下载资源
问答
  • Galil C#通讯链接范例

    2018-10-14 22:32:01
    Galil C#通讯链接范例 只是C#与Galil控制卡的链接,没有其他内容
  • SuperSocket Socket C# 通讯详细介绍,不错的 Socket,学习很有用处SuperSocket Socket 技能
  • C#通讯调试工具经典实用源码2019
  • 利用thrift实现js与C#通讯的实例代码,需要的朋友可以参考一下
  • C# 通讯TCP异步

    2019-09-22 15:16:29
    C# 实现的 TCP高并发异步通讯,本人自己所写,并测试! 一起学习!C# 实现的 TCP高并发异步通讯,本人自己所写,并测试! 一起学习!
  • Thrift初探:简单实现C#通讯服务程序
  • 松下PLC与C#通讯(串口调试入门教程),里面内容还可以,希望能帮到有需要的朋友们
  • 【C#串口编程计划】C#通讯类库构建

    千次阅读 2017-03-20 14:22:36
    这篇图文是关于【串口编程计划】的最后一篇“C#通讯类库的构建”,也就是把这次所做的关于串口系统的代码集成到团队的类库中,做到代码的可复用(以后写串口的系统,只需要写数据的定义,协议的解析部分就好,通讯的...

    这篇图文是关于【串口编程计划】的最后一篇“C#通讯类库的构建”,也就是把这次所做的关于串口系统的代码集成到团队的类库中,做到代码的可复用(以后写串口的系统,只需要写数据的定义,协议的解析部分就好,通讯的部分不用在重复写了)、可扩展(串口通讯系统转换成网口通讯系统只需要修改配置文件就好,不需要修改代码)、灵活性好(串口、网口、Wifi、蓝牙等等,做到AddIn,类似工业中的柔性生产线,按照需要定制就好,不需要修改代码)。
    这里写图片描述
    通讯的方式有许多种,比如串口通信、网口通信、WIFI通讯、蓝牙通信、射频卡通讯等等,但所有的通讯无外乎都是打开连接、关闭连接、读取数据、写入数据等操作,所以我们定义一个统一的接口ILSGOCommunication。其中事件DataReceived用于接收到数据时,来触发注入的执行方法。

    无论何种通信,都需要进行配置,所以定义一个通用的配置接口ILSGOCommunicationSetting。利用这个接口来实现通用的通讯配置。由于,我们刚做的系统是基于RS232串口的,所以我们写了两个实体类来实现这两个接口。后面我们会把基于网口Socket的实体类补充进来。其实都是一样,一样的。
    这里写图片描述
    有了这两个接口,我就可以编写依赖于此接口的功能或者软件了。当然,我们还需要写有关协议的分析。
    这里写图片描述
    协议通常分为两种,一种是基于文本的协议,一种是基于二进制的协议。

    虽然协议种类不同但对两种协议的处理逻辑是一样的。

    首先把接收的数据放入自定义的缓存区List buffer中,然后根据协议的约定:

    文本协议:报头+数据+报尾

    二进制协议:报头+长度+数据+校验

    从缓存区中取出每一帧的数据存入byte[] Raw利用Analyze方法进行解析。这样我们定义IAnalyzer接口,以便统一报文的处理逻辑,IAnalyzerCollection是IAnalyzer的集合类,枚举类型lsgoSearchResult用来标识SearchBuffer方法寻找报文的结果。
    这里写图片描述
    抽象类AnalyzeResult是IAnalyzer的默认实现。Data属性为解析后的数据,Raw属性为原始数据,TimeOut为数据失效的等待时间,比如你获取下位机发来的电压,过了几秒了,应该就无效了,所以要考虑定时失效(通过AnalyzeResult中的Timer开启线程检测),Valid标识了解析报文是否成功。GetNew事件为解析成功后,注入的执行方法。之所以这样写,是因为不同的系统,报文解析成功后所要处理的逻辑可能不同,有的系统直接写入数据库,有的系统直接写入文件,有的系统却仅仅需要界面显示一下就好。

    TextAnalyzeResult和BinaryAnalyzeResult是针对解析文本协议和二进制协议写的抽象类。

    BeginOfLine、EndOfLine对应报头与报尾,Encoding对应编码方式。常用的是ASCII码,若要支持中文,则需要设置为Unicode编码。

    Mask、LenLength、Checksum对应二进制协议的报头、长度和校验。由于校验的方法很多,常用的有CRC校验,异或校验等等,所以校验这块写成事件注入的方式(CheckSumHandler)以便实际应用中根据不用的校验方式注入不同的执行代码。
    这里写图片描述
    这些接口可以直接被外部使用,但是这样对不熟悉的使用者感到复杂。所以我们用一个实体类来包装这些接口。所以写一个带有分析功能的类:LSGOComm。

    _lstBuffer是接收到数据进行存放的缓冲区,ReadBufferSize为该缓冲区设置大小。Comm属性配置实际需要的通讯(比如上面写的串口通讯),Result属性配置需要解析的实际协议。OnDraw为接收到原始数据后注入的方法,即接收到原始数据,需要执行的代码。通过Comm_DataReceived方法整合分析的代码注入到通讯(ILSGOCommunication)的DataReceived事件中,这样,接收数据,分析数据,解析数据就全部串联起来了。至此,通讯类库的框架就完成了。而这也是使用通讯类库所需要关注的所有内容。

    下面举两个例子看看如何使用啊!

    第一个是基于文本协议的,后面使用这套代码处理基于文本协议报文的时候,只需要修改这块就好。
    这里写图片描述
    第二个是基于二进制协议的,后面使用这套代码处理二进制报文时就改这块就好。
    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • bartender与c#通讯示例

    2020-03-19 15:13:54
    c#与bartender通过调用con 组件实现通讯
  • C#通讯编程实例基于ICE 非常适合C#初学者编程
  • 一叶知秋 C#通讯调试工具v3.0测试版(含源码) 网络监控软件代码
  • Sharp7.cs C#通讯代码

    2019-06-30 22:17:39
    C#通过s7通讯,读写plc内部寄存器数值,可做上位机通讯
  • C#通讯封装

    2014-03-18 10:00:01
    对于高手,这一个封装可看可不看,对于新手,这一个封装可以学习,对于刚入门的,你看起来有点难度。 socket的传输封装,包含了client和server,socket是异步的,用了IOCP。... 工程并不是非常完善,我只是前期写好了,...
  • C#通讯编程(整理)

    千次阅读 2011-05-18 08:16:00
    C#通讯编程(整理)


        public class XmlSocket
        {

            
    //异步socket诊听
            
    // Incoming data from client.从客户端传来的数据

    public static string data =null;

            
    // Thread signal.线程 用一个指示是否将初始状态设置为终止的布尔值初始化 ManualResetEvent 类的新实例

    public static ManualResetEvent allDone =new ManualResetEvent(false);
            
    //static void Main(string[] args)
            
    //{
            
    //    StartListening();
            
    //}

    public static void StartListening()
            {
                
    // Data buffer for incoming data. 传入数据缓冲

    byte[] bytes =new Byte[1024];
                
    // Establish the local endpoint for the socket. 建立本地端口
                
    // The DNS name of the computer
                
    // running the listener is "host.contoso.com".

                IPAddress ipAddress;
                String ipString
    = ConfigurationManager.AppSettings.Get("SocketIP");
                
    if (ipString==null|| ipString ==String.Empty)
                {  
                    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
                    ipAddress
    = ipHostInfo.AddressList[0];
                }
                
    else
                {
                    ipAddress
    = IPAddress.Parse(ipString);
                }

                
    int port;
                String portString
    = ConfigurationManager.AppSettings.Get("SocketPort");
                
    if (portString==null || portString==String.Empty)
                {
                    port
    =11001;
                }
                
    else
                {
                    port
    =int.Parse(portString);
                }
                IPEndPoint localEndPoint
    =new IPEndPoint(ipAddress, port);

                
    // Create a TCP/IP socket.
                Socket listener =new Socket(AddressFamily.InterNetwork,
                 SocketType.Stream, ProtocolType.Tcp);

                
    // Bind the socket to the local endpoint and listen for incoming connections.绑定端口和数据

    try
                {
                    listener.Bind(localEndPoint);
                    listener.Listen(
    100);

                   
    while (true)
                    {
                        
    // Set the event to nonsignaled state.设置无信号状态的事件
                        allDone.Reset();
                        
    // Start an asynchronous socket to listen for connections.重新 启动异步连接
                        listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
                        
    // Wait until a connection is made before continuing.等待连接创建后继续
                        allDone.WaitOne();
                    }
                }
                
    catch (Exception e)
                {
                   
    //
                }
            }

            
    public static void AcceptCallback(IAsyncResult ar)
            {
                
    try
                {
                   
    // Signal the main thread to continue.接受回调方法 该方法的此节向主应用程序线程发出信号,
                   
    //让它继续处理并建立与客户端的连接
                    allDone.Set();
                   
    // Get the socket that handles the client request.获取客户端请求句柄
                    Socket listener = (Socket)ar.AsyncState;
                    Socket handler
    = listener.EndAccept(ar);
                   
    // Create the state object.
                    StateObject state =new StateObject();
                    state.workSocket
    = handler;
                    handler.BeginReceive(state.buffer,
    0, StateObject.BufferSize, 0,
                     
    new AsyncCallback(ReadCallback), state);
                }
                
    catch (Exception e)
                {
                   
    //
                }
            }

            
    ///
    <summary>
    /// 与接受回调方法一样,读取回调方法也是一个 AsyncCallback 委托。
            
    /// 该方法将来自客户端套接字的一个或多个字节读入数据缓冲区,然后再次调用 BeginReceive 方法,直到客户端发送的数据完成为止。
            
    /// 从客户端读取整个消息后,在控制台上显示字符串,并关闭处理与客户端的连接的服务器套接字。
            
    ///
    </summary>
    ///
    <param name="ar">IAsyncResult 委托</param>

    public static void ReadCallback(IAsyncResult ar)
            {
                
    try
                {
                    String content
    = String.Empty;
                   
    // Retrieve the state object and the handler socket创建自定义的状态对象 from the asynchronous state object.
                    StateObject state = (StateObject)ar.AsyncState;
                    Socket handler
    = state.workSocket;//处理的句柄
                   
    // Read data from the client socket. 读出

    int bytesRead = handler.EndReceive(ar);
                   
    if (bytesRead >0)
                    {
                        
    //业务代码

    string result = DoSomeThing(...);
                        String len
    = Encoding.UTF8.GetBytes(result).Length.ToString().PadLeft(8, '0');
                        log.writeLine(len);
                        Send(len
    + result, handler);
                    }
                }
                
    catch (Exception e)
                {
                   
    //
                }

            }
            
    private static void Send(String data, Socket handler)
            {
                
    try
                {
                   
    // Convert the string data to byte data using UTF8 encoding.

    byte[] byteData = Encoding.UTF8.GetBytes(data);
                   
    // Begin sending the data to the remote device.
                    handler.BeginSend(byteData, 0, byteData.Length, 0,
                     
    new AsyncCallback(SendCallback), handler);
                }
                
    catch (Exception e)
                {
                   
    //
                }
            }
            
    ///
    <summary>
    /// 发送
            
    ///
    </summary>
    ///
    <param name="ar"></param>

    private static void SendCallback(IAsyncResult ar)
            {
                
    try
                {
                   
    // Retrieve the socket from the state object.
                    Socket handler = (Socket)ar.AsyncState;

                   
    // Complete sending the data to the remote device.向远端发送数据

    int bytesSent = handler.EndSend(ar);
                    StateObject state
    =new StateObject();
                    state.workSocket
    = handler;

                    handler.BeginReceive(state.buffer,
    0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state);
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
                
    catch (Exception e)
                {
    //
                }
            }

            
    public static void StopListening()
            {
                allDone.Close();
                log.close();
            }

            
    ///
    <summary>
    /// 具体处理业务的方法
            
    ///
    </summary>
    ///
    <returns></returns>

    private static string DoSomething(int i)
            {
                
    //具体业务代码,返回需要返回的字符串信息
            }
            
    ///
    <summary>
    /// 写日志方法
            
    ///
    </summary>
    ///
    <param name="strLog">写入内容</param>

    public static void WriteLog(string strLog)
            {
                
    //写入日志代码
            }
        }
    展开全文
  • 简单的OPC与C#通讯,别想复杂了

    千次阅读 2020-05-12 21:50:30
    简单的OPC与C#通讯,别想复杂了 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using ...

    简单的OPC与C#通讯,别想复杂了

     

    复制代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using OPCAutomation;
    namespace OPC
    {
        public partial class Form1 : Form
        {
            OPCServer ObjOPCServer;
            OPCGroups ObjOPCGroups;
            OPCGroup ObjOPCGroup;
            string OPCServerName;
            public Form1()
            {
                try
                {
                    InitializeComponent();
                    OPCServerName = "{Here comes your OPC server’s name,(OPC服务器名称)}";
                    ObjOPCServer = new OPCServer();
                    ObjOPCServer.Connect(OPCServerName, "";);
                    ObjOPCGroups = ObjOPCServer.OPCGroups;
                    ObjOPCGroup = ObjOPCGroups.Add("OPCGroup1");
                    ObjOPCGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(ObjOPCGroup_DataChange);
                    ObjOPCGroup.OPCItems.AddItem("{tag name or address,(标签名称或地址名) (like {plc name on server}!%mw0)}", 1);
                    ObjOPCGroup.UpdateRate = 10;
                    ObjOPCGroup.IsActive = true;
                    ObjOPCGroup.IsSubscribed = true;
                }
                catch (Exception e){
                    MessageBox.Show(e.ToString());
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
            }
    
            private void ObjOPCGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
            {
                for (int i = 1; i <= NumItems; i++)
                {
                    if ((Convert.ToInt32(ClientHandles.GetValue(i)) == 1))
                    {
                        textBox1.Text =  ItemValues.GetValue(i).ToString();
                    }
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                OPCServerClass GlobalOPCServer = new OPCServerClass();
                Array ServerList = (Array)GlobalOPCServer.GetOPCServers(""); 
                for (int i = 1; i <= ServerList.Length; i++)
                {
                    comboBox1.Items.Add(ServerList.GetValue(i).ToString());
                }
            }
        }
    }

    复制代码

    在工业自动化领域,计算机早已成为必不可少的工具,计算机技术的不断发展,大大加速了工业自动化技术的进步,而各种各样的工业控制应用软件正是具体实现这一进程的最重要的工具。

    往,应用软件开发商要为每一种硬件开发驱动程序,由于硬件的种类繁多,特征各异,软件开发商的负担异常繁重,尤其是如果硬件特征发生了变化,整个应用软件
    相应的驱动程序也要相应地修改,这对软件开发商,对整个工程都是很不利的。而且由于驱动程序的不统一,不同应用程序访问同一硬件设备时常常发生冲突。
    OPC(OLE for Process Control)技术标准正是在这种情况下产生的。OPC基于微软的OLE、COM和DCOM技术,而且它本身
    就是一种特殊的COM,也正因为有微软的参与,以及以已经成熟的技术为基础,它比一般的工业标准制定的效率更高,它从开始制定到第一个可运行的规范开始运
    行,只用了不到一年的时间。
    二、OPC原理及应用

    OPC技术为工业自动化软件面向对象的开发提供了统一的
    标准。它大大减轻了软件开发商的负担,软件开发商不必再为每一硬件单独编写驱动程序,只要硬件的特征符合统一的OPC接口程序标准,或者硬件生产商提供
    OPC服务器,如图一所示,不同的应用软件开发商都可以采用OPC标准设计工控软件,以标准规定的统一接口通过OPC服务器存取现场数据。

    样,当现场设备发生变化或系统中加入新设备时,OPC服务器的提供商需要重新实现服务器接口,以适应硬件的变化,但由于服务器所提供的接口的一致性,工控
    软件不作更改即可继续使用,只是某些情况下可能需要重新组态(如添加新的PLC站点等),这样,软件开发商可以节省大量的时间致力于工控软件的性能方面的
    提高,不必再考虑硬件变化带来的影响,大大减小了软件维护的工作量。这正如OPC规范里所说,OPC将应用软件和硬件设备划清了界限。
    2.1 OPC基本结构

    OPC
    服务器有两类接口:定制接口(Custom Interface) 、自动化接口(Automation Interface),定制接口比较低级,它提
    供更多的功能,效率也比后者高,可以用C++语言调用此类接口,自动化接口主要用于VB、DELPHI等开发工具。按照OPC规范,定制接口是服务商必须
    提供的,而自动化接口则是可选的,不过,OPC基金会(管理OPC标准的国际组织)提供了一个叫做“自动化包装器”的动态连接库,用于在两者间转换。如图
    二所示:
    在OPC的早期规范里主要包括OPC数据存取规范、OPC报警和事件、OPC历史数据存取规范。OPC数据存取规范详细规定了客户程序
    和服务器程序进行数据通信的机制,其它类型的OPC服务器往往是在数据存取服务器的基础上通过增加对象、扩展接口而来的,所以该规范也是其它OPC规范的
    基础。OPC数据存取规范规定的基本对象有三类:OPC Server、OPC Group和OPC Item,OPC Server包含服务器的所有信
    息,也是OPC Group的容器,OPC Group除了包含它自身信息外,还负责管理OPC Item。它们的结构如图三所示。每一个
    OPC Item代表到数据源的一个连接,但它没有提供外部接口,客户端程序无法对OPC Item直接进行操作,应用程序必须依靠OPC Item的容
    器OPC Group来对它进行操作,这在下面的程序中会有具体说明。
    2.2 OPC数据访问方式

    OPC客户程序对
    OPC服务器中数据的存取方式分为同步读写方式和异步读写方式。客户程序可按照一定的周期调用OPC Group对象的IOPCSyncIO接口对服务器
    程序进行数据同步存取操作,此时客户方的调用函数一直运行到所有数据读写完成,然后才能执行其它操作,因此,这种方法适合与读取少量数据,如果数据多的
    话,会使系统处于假死状态,无法进行操作。IOPCSyncIO2是从3.0版才出现的,是对IOPCSyncIO的增强。IOPCAsyncIO2和
    IOPCAsyncIO3是异步方式中使用的接口,异步访问时,当客户端对服务器提出访问要求后,立即返回到OPC应用程序执行其它操作,无须等待,当
    OPC服务器完成数据读取后通知OPC应用程序,应用程序从而得到数据。其中前者是在2.0版本中新定义的,具有较高的通信性能;后者则是在3.0版本中
    才刚刚出现,同IOPCSyncIO2类似,IOPCAsyncIO3是对IOPCAsyncIO2的增强。在异步方式下,服务器程序收到读请求后,调用
    客户程序方的IOPCDataCallback接口,将数据发送给客户程序。异步方式中允许服务器将读写操作进行排队,使客户方的调用函数可立刻返回,当
    服务器读写操作完成后再通知客户程序。显然,异步通报方式的通信效率更高,这种方式也是本文所要讨论的方式,但有多个客户程序与服务器相连时,同步读写方
    式更具时效性。对于每个组对象,客户程序可根据需要采用其中一种数据存取方式,而不能两者都使用。
    异步读取还有一种特殊的方式,叫做订阅方式(Subscribe)这种情况下,应用程序不需要发出读请求,OPC服务器在定期更新数据的时候,如果发现数据有一定变化,则自动向应用程序发出通知和传输变化的数据。
    2.3 编写OPC客户端应用程序

    VB
    简单实用,是比较理想的OPC应用程序快速开发工具,若要用VB开发OPC应用程序,必须要使用OPC自动化包装器,这在前文已经提过,这种包装器一般由
    OPC服务器的供应商以DLL形式提供,下面就以SIEMENS提供的sopcdaauto.dll为例,介绍如何开发OPC应用程序,这也正是笔者在最
    近的工程中实际应用到的,这是基于DA2.0的版本。
    首先,新建VB工程后,作图四所示的引用:
    2.3.1 建立OPC对象

    首先申明OPC对象:
    Option Base 1
    Dim WithEvents ServerObj As OPCServer ''OPC Server对象,连接OPC服务器
    Dim GroupsObj As OPCGroups ''OPC Groups对象,添加OPC组
    Dim WithEvents GroupObj As OPCGroup ''OPC Group对象
    Dim ItemsObj As OPCItems ''OPC Item集合
    Dim ServerHandles() As Long ''服务器端OPC Item的句柄
    Dim ClientHandles() as Long ''客户端OPC Item的句柄
    Dim ItemId(2) As String
    Dim Errors() As Long
    接下来,生成各个对象:
    If ServerObj Is Nothing Then Set ServerObj = New OPCServer
    ''连接OPC服务器
    If ServerObj.ServerState = OPCDisconnected Then
    ServerObj.Connect ("OPC.SimaticNET") ''假设OPC服务器运行在本机
    End If
    If GroupsObj Is Nothing Then Set GroupsObj = ServerObj.OPCGroups
    If GroupObj Is Nothing Then Set GroupObj = GroupsObj.Add
    If ItemsObj Is Nothing Then Set ItemsObj = GroupObj.OPCItems
    GroupObj.IsActive = True ''设置组为活动状态
    ''假设有两个数据源,一个是8位开关量输入,一个是8位开关量输出
    ItemId(1) = "S7:[S7 connection_1]IB0"
    ItemId(2) = "S7:[S7 connection_1]QB0"
    ClientHandles(1) = 1
    ClientHandles(2) = 2
    ''添加组项目,ServerHandles数组的值为各个OPC Item的服务器句柄,
    '' ClientHandles数组的值为各个OPC Item的客户端句柄,由应用程序设定
    Call ItemsObj.AddItems(2, ItemId, ClientHandles, ServerHandles, Errors)

    2.3.2异步数据读取

    '' OPC Item的服务器句柄,添加OPC Item时由服务器分配
    Dim TempServerHandles(1) As Long
    ''事务标志符,由客户端产生,它包含的信息提供给OnReadComplete事件
    Dim TransactionID As Long
    ''取消标志符,服务器端产生,用于操作需要被取消的时候
    Dim CancelID As Long
    ''包含读取每个OPC Item时返回的信息
    Dim ErrorNr() As Long
    TempServerHandles(1) = ServerHandles(1) ''对应第一个OPC Item
    GroupObj.AsyncRead 1, TempServerHandles, ErrorNr, TransactionID, CancelID
    第一个参数是要读的OPC Item的个数,这里只含有一个OPC Item。读取的结果由OPC服务器通过IconnectionPointContainer接口配合IOPCDataCallback接口反调用应用程序的事务处理程序:

    Private Sub GroupObj_AsyncReadComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date, Errors() As Long)
    这里的参数ClientHandles和AddItems方法中的ClientHandles是对应的,用于判断哪一个OPC Item在被读取。其它参数的说明如下:
    TransactionID:客户端自由使用,应用程序开发商自定义;
    NumItems:表示读取的OPC Item的个数;
    ItemValues():各个OPC Item连接的数据源的值,类型为Variant;
    Qualities():OPC Item的品质值;
    TimeStamps():时间戳;
    Errors():记录服务器返回的信息。
    2.3.3 异步数据写入

    Dim TempServerHandles (1) As Long
    Dim VValue(1) As Variant
    Dim ErrorNr() As Long
    Dim TransactionID As Long
    Dim CancelID As Long
    TempServerHandles(1)=ServerHandles(2)
    VValue(1)=1''假设要将“1”写入ClientHandle为2的OPC Item
    GroupObj.AsyncWrite 1,TempServerHandles,VValue, ErrorNr, TransactionID, CancelID

    同样,AsyncWrite也对应一个事务处理程序:
    Private Sub groupObj_AsyncWriteComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, Errors() As Long)
    它的参数的含义和AsuncReadComplete中的含义是类似的,这里一般需要处理的是写数据之后的返回状态,这里不再赘述。
    2.3.4断开与服务器的连接

    ItemsObj.Remove ItemsObj.Count,ServerHandles, Errors ''清除OPC Item
    Set ItemsObj = Nothing ''释放资源,下同
    If Not GroupObj Is Nothing Then
    GroupsObj.Remove GroupObj.ServerHandle ''删除组
    End If
    If Not GroupsObj Is Nothing Then
    Set GroupsObj = Nothing
    End If
    If Not ServerObj Is Nothing Then
    If ServerObj.ServerState <> OPCDisconnected Then
    ServerObj.Disconnect ''断开与服务器的连接
    End If
    Set ServerObj = Nothing
    End If

    展开全文
  • C#通讯调试工具v3.0测试版发布

    千次阅读 热门讨论 2013-08-16 22:57:19
    这也是促使我开发C#通讯调试工具v3.0原因之一,因为3.0版本不光对2.0的各项设计都进行了优化改进,还加入了TCP,UDP的调试功能,故名字也改为了“通讯”调试工具。 我的腾讯微博 计划在下一版本中添加2个关键功能: 1...
    展开全文
  • C#通讯编程

    千次阅读 2014-02-27 13:15:23
    作者:sjm2003 转自:http://bbs.csdn.net/topics/240024868 Socket通讯: C# code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3
  • 三菱PLC和C#通讯.zip

    2019-09-28 09:45:38
    本例子是现在工业自动化采用得很多的方法,简单实用,里面的源代码已经测试过了,可以实用。本人已经亲自测试过,可以用
  • 1.C#语言开发,采用NET3.5框架,模块化设计,二次开发使用方便。 2.工程结构类似OPC通讯方式,采用Tag的方式,通过标签名就可以读写寄存器。 3.采用XML配置式标签的方式实时读写PLC内部寄存器,可读写寄存器包括0,1...
  • 在JAVA与C#通讯时, 由于开发语言的差异,发送端与接收端需要做转换才可以得到正确的值。 Java端的 int to byte public static byte[] ConvertIntToByteArray(int i)  {  byte[] arry = new byte[4]; ...
  • C#通讯学习

    2012-11-21 17:45:23
    想学习一下C#通讯的东西,谁能帮忙发点通讯相关的资料
  • Java中使用Socket和C#通讯的解决 2011年05月18日  由于JAVA使用的byte是有符号类型,而C#(包括C++)中的byte是无符号的,  因此,在收发byte[]时都要进行转换处理,发表解决方案如下:  public class Test {...
  • 乐视光源控制程序
  • c# public static byte[] StructToBytes(object obj)//传入结构体 { int len = Marshal.SizeOf(obj); byte[] bytes = new byte[len]; IntPtr structPtr = Marshal.AllocHGlobal(len); Marshal.StructureToPtr...
  • 1.C#语言开发,采用NET4.0框架,模块化设计,二次开发使用方便。 2.工程结构类似OPC通讯方式,采用Tag的方式,通过标签名就可以读写寄存器。 3.采用XML配置式标签的方式实时读写PLC内部寄存器,可读写寄存器包括I、Q...
  • 基于TCP的C#通讯窗口

    2020-07-06 22:30:01
    1.前言 这两天在公司刚入职没得电脑,师傅叫我用tcp/ip编写一个小的聊天Demo。刚好这两天才看设计模式,就寻思着将设计模式里面学的的东西应用到这个小Demo中。考虑到后期代码的界面的复用,这里用的是Build模式,...

空空如也

空空如也

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

c#通讯

c# 订阅