TwinCAT 3中基于UDP协议通讯的C++实现

因为项目需要,学习了TwinCAT3中使用UDP协议进行通讯的基本知识。这个做个简单的笔记,方便以后查询。

1 概述

倍福为了实现从实时环境中直接访问网卡(network cards)专门提供了一个函数 “TCP/UDP Realtime”, 这个访问要么来自PLC(61131-3), 要么来自C++.这个函数对使用以下协议进行的通讯提供支持:

  • TCP/IP
  • UDP/IP
  • ARP/Ping

TC3中使用该函数实现网络通信的示意图如下所示:

不管使用何种协议, 在基于该协议的项目和TC3之间的通讯连接的实现都必须通过一对接口(interfaces)来实现:

  • 一个接口指针对发送数据和建立连接等功能提供支持
  • 基于回调形式(callbacks)实现一个接收器接口,该接收器接口以事件或数据的形式为项目提供反馈

通信组件是一个TcCom对象——TCP/UDP RT, 这个通信组件通过网卡完成实例化和配置。

2 TCP/UDP RT模块的配置

1)在实时的以太网适配器下创建TCP/UDP RT模块

2) 选择对应模块

3)参数化先前创建的模块实例

至此,我们完成了对TCP/UDP RT模块的实例化创建。

3 实现一个具有反射服务的例程

1) 在VS2012下创建一个TC3的解决方案

2)在Tasks下添加一个task. 然后在TMC Files里面实现一个ITcIoUdpProtocolRecv类型的接口。通过该接口的实现,TC3生成了一个method. 这个method在UDP数据包到达是被调用。

TCP/UDP RT模块需要一个接口指针ITcIoUdpProtocol,该指针包含了对TCP/UDP RT对象的引用。

3)创建一个名字为udpPort 的ITcIoUdpProtocol类型的接口指针

4)生成TMC code. 接下来我们着重描述一个代码实现细节

TCP/UDP RT 模块中的CycleUpdate() method 和CheckReceived() method作为模块的一部分必须被调用。

5)    CycleUpdate() method实现如下:

1 ///<AutoGeneratedContent id="ImplementationOf_ITcCyclic">
2 HRESULT CModule1::CycleUpdate(ITcTask* ipTask, ITcUnknown* ipCaller, ULONG_PTR context)
3 {
4 HRESULT hr = S_OK;
5     m_counter+=m_Inputs.Value;
6     m_Outputs.Value=m_counter;
7     m_spUdpProt->CheckReceived(); // ADDED
8     return hr;
9 }

ReceivedData() method通过接口的实现被创建,并且此method将被CheckReceived()反复调用。
        6)ReveiveData() method以发送的信息和数据作为输入参数

 1 ///<AutoGeneratedContent id="ImplementationOf_ITcIoUdpProtocolRecv">
 2 HRESULT CModule1::ReceiveData(ULONG ipAddr, USHORT udpDestPort, USHORT udpSrcPort, ULONG nData, PVOID pData, ETYPE_VLAN_HEADER* pVlan)
 3 {
 4     HRESULT hr = S_OK;
 5     // mirror incomming data
 6     hr = m_spUdpProt->SendData(ipAddr, udpSrcPort, udpDestPort, nData, pData, true);
 7     m_Trace.Log(tlInfo, FLEAVEA "UDP ReceiveData: IP: %d.%d.%d.%d udpSrcPort: %d DataSize: %d (hr2=%x) \n",
 8          ((PBYTE)&ipAddr)[3], ((PBYTE)&ipAddr)[2], ((PBYTE)&ipAddr)[1], ((PBYTE)&ipAddr)[0],
 9         udpSrcPort, nData, hr);
10     return hr;
11 }
12 ///</AutoGeneratedContent>

在开启和终止的过程中, 一个UdpProtocol接口的引用必须被设置。

7)端口开启在SafeOp到Op的过程中被触发,RegisterReceiver打开一个UDP端口以接收数据

 1 HRESULT CModule1::SetObjStateSO()
 2 {
 3     HRESULT hr = S_OK;
 4     //START EDITING
 5     if (SUCCEEDED(hr) && m_spUdpProt.HasOID())
 6     {
 7         m_Trace.Log(tlInfo, FLEAVEA "Register UdpProt");
 8         if (SUCCEEDED_DBG(hr = m_spSrv->TcQuerySmartObjectInterface(m_spUdpProt)))
 9         {
10             m_Trace.Log(tlInfo, FLEAVEA "Server: UdpProt listen to Port: %d", 10000);
11             if (FAILED(hr = m_spUdpProt->RegisterReceiver(10000,
12  THIS_CAST(ITcIoUdpProtocolRecv))))
13             {
14                 m_Trace.Log(tlError, FLEAVEA "Server: UdpProtRegisterReceiver failed on Port: %d", 10000);
15                 m_spUdpProt = NULL;
16             }
17     }
18     }
19
20     // If following call is successful the CycleUpdate method will be
21 called,
22     // eventually even before method has been left.
23     hr = FAILED(hr) ? hr : AddModuleToCaller();
24     // Cleanup if transition failed at some stage
25     if ( FAILED(hr) )
26     {
27         if (m_spUdpProt != NULL)
28             m_spUdpProt->UnregisterReceiver(10000);
29         m_spUdpProt = NULL;
30         RemoveModuleFromCaller();
31     }
32     //END EDITING
33     m_Trace.Log(tlVerbose, FLEAVEA "hr=0x%08x", hr);
34     return hr;
35 }

8) 停止操作在Op到SafeOp的过程中被执行

 1 HRESULT CModule1::SetObjStateOS()
 2 {
 3     m_Trace.Log(tlVerbose, FENTERA);
 4     HRESULT hr = S_OK;
 5
 6     if (m_spUdpProt != NULL)
 7            m_spUdpProt->UnregisterReceiver(10000);
 8     m_spUdpProt = NULL;
 9     m_Trace.Log(tlVerbose, FLEAVEA "hr=0x%08x", hr);
10     return hr;
11 }

至此,TCP/UDP RT模块实例化和配置完成。

时间: 2024-08-05 19:28:35

TwinCAT 3中基于UDP协议通讯的C++实现的相关文章

Java中基于UDP协议的的网络编程(基础篇)

---恢复内容开始--- 一:什么是网络编程? 通俗的来说, 网络编程就是编写程序,让联网的两个或多个设备(例如计算机)之间进行数据传输.Java语言也支持网络编程,JDK提供的 java.net包提供了很多于网络编程相关的类,来支持网络编程方面的学习. 二:java网络编程所使用的协议? 有了计算机网络的基础,我们不难理解,在java中,网络编程是基于网络传输协议的. java网络编程,可以是基于TCP协议的,也可以基于UDP协议的.那么首先我们得知道tcp协议和udp两种协议的区别. 区别:

Python中的端口协议之基于UDP协议的通信传输

UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) ------------------------------------------------------------------------------------------------------------------------------------- 一.UDP协议:OSI七层协议中的传输协议的一种(另外一种tcp协议),他们都是一种端口协议 与TCP协

JAVA基础知识之网络编程——-基于UDP协议的通信例子

UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramSocket类的receive和send方法即可,但消息需要通过一个特定的类封装(DatagramPacket) 下面是一个基于UDP协议的通信的例子, 服务器端, 1 package udp; 2 3 import java.io.IOException; 4 import java.net.Dat

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

基于 UDP 协议的网络编程

类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序 UDP 数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP 数据报一定能够安全送到目的地,也不能确定什么时候可以抵达 DatagramPacket 对象封装了 UDP 数据报(<64k),在数据报中包含了发送端的 IP 地址和端口号以及接收端的 IP 地址和端口号 UDP 协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接 举例: publ

基于UDP协议的网络编程

UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSocket代表基于UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报.Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送数据都是通过DatagramPacket对象完成的. Datagr

Android基础入门教程——7.6.4 基于UDP协议的Socket通信

Android基础入门教程--7.6.4 基于UDP协议的Socket通信 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家带来Socket的最后一节:基于UDP协议的Socket通信,在第一节中我们已经详细地 比较了两者的区别,TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行 数据传输,如果你学了前两节TCP的,传输前先开服务端,accept,等客户端接入,然后获得 客户端socket然后进行IO操作,而UDP则不用,UDP以数据报作为数据的传输载体,

基于UDP协议的网络程序

下图是基于UDP协议的客户端/服务器程序的一般流程: 图1.1 UDP协议通信流程 UDP套接口是无连接的.不可靠的数据报协议: 既然他不可靠为什么还要用呢?其一:当应用程序使用广播或多播时只能使用UDP协议:其二:由于他是无连接的,所以速度快.因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时. 建立UDP套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口:由于UDP是无连接的,所以服务器端并不需要listen或

网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,"报头"部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                      udp头                            数据                                            tcp协议(流式协议) 2.udp协议的特点 (1)传输数据以数据报的形