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实现如下:
///<AutoGeneratedContent id="ImplementationOf_ITcCyclic">
HRESULT CModule1::CycleUpdate(ITcTask* ipTask, ITcUnknown* ipCaller, ULONG_PTR context)
{
HRESULT hr = S_OK;
m_counter+=m_Inputs.Value;
m_Outputs.Value=m_counter;
m_spUdpProt->CheckReceived(); // ADDED
return hr;
}
ReceivedData() method通过接口的实现被创建,并且此method将被CheckReceived()反复调用。
6)ReveiveData() method以发送的信息和数据作为输入参数
///<AutoGeneratedContent id="ImplementationOf_ITcIoUdpProtocolRecv">
HRESULT CModule1::ReceiveData(ULONG ipAddr, USHORT udpDestPort, USHORT udpSrcPort, ULONG nData, PVOID pData, ETYPE_VLAN_HEADER* pVlan)
{
HRESULT hr = S_OK;
// mirror incomming data
hr = m_spUdpProt->SendData(ipAddr, udpSrcPort, udpDestPort, nData, pData, true);
m_Trace.Log(tlInfo, FLEAVEA "UDP ReceiveData: IP: %d.%d.%d.%d udpSrcPort: %d DataSize: %d (hr2=%x) \n",
((PBYTE)&ipAddr)[], ((PBYTE)&ipAddr)[], ((PBYTE)&ipAddr)[], ((PBYTE)&ipAddr)[],
udpSrcPort, nData, hr);
return hr;
}
///</AutoGeneratedContent>
在开启和终止的过程中, 一个UdpProtocol接口的引用必须被设置。
7)端口开启在SafeOp到Op的过程中被触发,RegisterReceiver打开一个UDP端口以接收数据
HRESULT CModule1::SetObjStateSO()
{
HRESULT hr = S_OK;
//START EDITING
if (SUCCEEDED(hr) && m_spUdpProt.HasOID())
{
m_Trace.Log(tlInfo, FLEAVEA "Register UdpProt");
if (SUCCEEDED_DBG(hr = m_spSrv->TcQuerySmartObjectInterface(m_spUdpProt)))
{
m_Trace.Log(tlInfo, FLEAVEA "Server: UdpProt listen to Port: %d", );
if (FAILED(hr = m_spUdpProt->RegisterReceiver(,
THIS_CAST(ITcIoUdpProtocolRecv))))
{
m_Trace.Log(tlError, FLEAVEA "Server: UdpProtRegisterReceiver failed on Port: %d", );
m_spUdpProt = NULL;
}
}
} // If following call is successful the CycleUpdate method will be
called,
// eventually even before method has been left.
hr = FAILED(hr) ? hr : AddModuleToCaller();
// Cleanup if transition failed at some stage
if ( FAILED(hr) )
{
if (m_spUdpProt != NULL)
m_spUdpProt->UnregisterReceiver();
m_spUdpProt = NULL;
RemoveModuleFromCaller();
}
//END EDITING
m_Trace.Log(tlVerbose, FLEAVEA "hr=0x%08x", hr);
return hr;
}
8) 停止操作在Op到SafeOp的过程中被执行
HRESULT CModule1::SetObjStateOS()
{
m_Trace.Log(tlVerbose, FENTERA);
HRESULT hr = S_OK; if (m_spUdpProt != NULL)
m_spUdpProt->UnregisterReceiver();
m_spUdpProt = NULL;
m_Trace.Log(tlVerbose, FLEAVEA "hr=0x%08x", hr);
return hr;
}
至此,TCP/UDP RT模块实例化和配置完成。
最新文章
- Scala学习(二)
- css特效
- WCF两种方式
- ExtJs布局之table
- vector.resize 与 vector.reserve的区别 .xml
- 驱动开发 - WDK 调试及 SVN 环境搭建
- C# 操作数据库的几种方式(数据库使用SQL SERVER2008)
- MySQL master/slave 模式
- 【总算解决了】A network-related or instance-specific error occurred while establishing a connection to SQL Server
- mybatis中sql语句的批量插入
- postgresql的psql常用命令-4
- ajax 提交Dictionary
- 线性空间和异或空间(线性基)bzoj4004贪心+高斯消元优秀模板
- Googlenet 中1*1 卷积核分析
- Linux下的JDK和OpenJDK有什么具体的区别
- 五笔xu
- mongodb千万级写入怎么优化
- java安装1.8和1.7,报错:Error: Registry key &#39;Software\JavaSoft\Java Runtime Environment&#39;\CurrentVers
- ESLint 规则详解(二)
- HOJ Recoup Traveling Expenses(最长递减子序列变形)
热门文章
- 紫书 习题11-11 UVa 1644 (并查集)
- HTTP——学习笔记(7)
- mysql关联更新表
- 收集整理的openstack java封装 api的第三方实现的选择
- [MST] Restore the Model Tree State using Hot Module Reloading when Model Definitions Change
- 2015年开源项目荣登GitHub十强榜单
- NSURLConnection和NSRunLoop
- Zico源代码分析:执行启动过程分析和总结
- 经常使用传感器协议1:CJ/T-188 水表协议解析1
- Hadoop入门进阶步步高(二)-文件夹介绍