TwinCAT3 实时核中ADS实现C++ server、clinet数据传输
一、基本概念
ADS :Automation Device Specification,ADS设备间进行通信的协议规范。协议定义了ADS device之间如何寻址对方、ADS device之间可以执行哪些操作、执行这些操作需要哪些参数,以及操作完成后如何返回结果等。从编程角度看,协议涵盖了AMS netID,port number(二者用于寻址ADS device)以及AdsReadWriteInd、AdsReadWriteRes、AdsReadWriteReq、AdsReadWriteCon、AdsReadReq……等一系列函数(用于在ADS device之间传输数据)。
ADS device:具备ADS接口的软件模块。 下图是从倍福官网拷贝的,从图中可以看出,所有的ADS device连接在ADS Router Engine上,那么通过ADS通讯时,是如何识别通讯的ADS device双方呢?这就涉及到后面提到的AMS了。
AMS :Automation Message Specification,指定了ADS数据的交互格式。从编程的角度,需要关心Ams NetId、Ams Prot,二者用于寻址通讯双方的 ADS device。
AMS NetId:默认的AMS NetId是本机IP地址后面加上.1.1,比如192.168.56.1.1.1。但是,AMS NetId与IP地址是没有任何关系的,可以通过下面步骤改成其他值。
AMS Port:通过AMS NetId只能找到对应的PC或控制器,PC或控制器中可能运行很多ADS device,所以还需要AMS Port识别具体的ADS device。AMS Port与linux、Windows中的端口一样,用于识别应用程序,每个应用程序分配有唯一的端口号,port的范围见参考资料4。
Route :通讯的server、client双方必须配置路由信息,路由包含路由名称、AmsNetId、对方的ip地址、路由类型。 TwinCAT 3中添加路由操作如下:
TwinCAT device:装有TwinCAT runtime的PC或控制器。
实时核:TwinCAT可以设置共享实时核、独占实时核,用于对运行时间要求严格的任务。
二、Server与Client通讯模型
与非实时ADS通讯不同,实时核中通信双方不能阻塞,需要采用异步的方式,TwinCAT提供的实时核通信接口见参考资料3。ADS通讯模型是Client-Server模式,客户端发起请求,服务端进行响应。
图中的Req()可以是AdsReadWriteReq、AdsReadReq、AdsWriteReq、AdsReadStateReq等等。 这些函数都有对应的Ind()、Res()、Con(),比如AdsReadWriteReq--AdsReadWriteInd--AdsReadWriteRes--AdsReadWriteCon等等,见参考资料3。
以Client读写Server端的变量为例,流程如下:
1)Client端申请一个AMS port,其他的ADS device(比如Server)可通过该port识别到该Client。
并且获取服务端的AMS NetId和AMS Port。
// State transition from PREOP to SAFEOPHRESULT CClient::SetObjStatePS(PTComInitDataHdr pInitData)
{/** Client端的端口范围是32768–65535,* m_AmsPort 的值不要与其它ADS device Client用的端口重复。*/WORD m_AmsPort = 33275;AmsAddr m_Addr;HRESULT hr = S_OK;IMPLEMENT_ITCOMOBJECT_EVALUATE_INITDATA(pInitData);hr = SUCCEEDED(hr) ? InitAmsPort(m_spSrv, m_AmsPort) : hr;m_Addr.netId = AmsGetNetId(); //服务端AMS NetIdm_Addr.port = 25100; //服务端AMS Port// cleanup on failureif (FAILED(hr)) {ShutdownAmsPort();}m_Trace.Log(tlVerbose, FLEAVEA "hr=0x%08x", hr);return hr;
}
2)Server端申请一个AMS Port,用于识别本ADS device。
// State transition from PREOP to SAFEOPHRESULT CModule1::SetObjStatePS(PTComInitDataHdr pInitData)
{/** Server端的端口范围是25000–25999,* m_AmsPort 的值不要与其它ADS device Server用的端口重复。*/WORD m_AmsPort = 25100;m_Trace.Log(tlVerbose, FENTERA);HRESULT hr = S_OK;IMPLEMENT_ITCOMOBJECT_EVALUATE_INITDATA(pInitData);hr = SUCCEEDED(hr) ? InitAmsPort(m_spSrv, m_AmsPort) : hr;// cleanup on failureif (FAILED(hr)) {ShutdownAmsPort();}m_Trace.Log(tlVerbose, FLEAVEA "hr=0x%08x", hr);return hr;
}
3)与Client端需获取Server端的AMS NetId、Port不同,Server端不需要获取Clinet的这些信息。因为TwinCAT采用的是请求-响应的方式,请求发送至Server端时,是含有Client端的AMS NetId、Port这些信息的。
4)Client通过AdsReadWriteReq发送一个读写Server端的请求。
int nErr;
ULONG test_data;
ULONG InvokeId = 0x00000001;
ULONG IndexGroup = 0x08;
ULONG IndexOffset = 0x09;
ULONG cbReadLength = sizeof(test_data);
ULONG cbWriteLength = 0;/** m_Addr,服务端的AMS NetId、AMS Port* InvokeId是一个ULONG数值,用于代表Client端的这个请求。* 因为实时核ADS通讯不能阻塞,是异步的,所以Client端收到Server端的响应时,* 需要通过invoke id响应对应的是哪个请求。** IndexGroup、IndexOffset用于识别具体的命令。比如服务端识别出0x08、0x09后,* 就将数值拷贝到test_data中。* cbReadLength,读数据的长度,本例中是都一个ULONG类型的数值,读到test_data* 变量中。* cbWriteLength,写数据的长度,本例中只读不写,该参数可忽略。
nErr = AdsReadWriteReq(m_Addr, InvokeId, IndexGroup, IndexOffset, cbReadLength, cbWriteLength, & test_data);
5)Server端收到Client的请求,自动触发AdsReadWriteInd函数执行。
AdsReadWriteInd通过解析参数indexGroup、indexOffset,执行对应的处理操作,填充Client端请求的数据。还有重要的一点,需要执行AdsReadWriteRes(rAddr, invokeId, ADSERR_NOERR, cbReadLength, pData)把响应发送给Client端。
enum Module1IndexGroups : ULONG
{Module1IndexGroup1 = 0x00000001,Module1IndexGroup2 = 0x00000002,IG_OVERWRITE = 0x00000003,ServerIndexGroup8 = 0x00000008
};enum Module1IndexOffsets : ULONG
{Module1IndexOffset1 = 0x00000001,Module1IndexOffset2 = 0x00000002,ServerIndexGroup9 = 0x00000009
};void CModule1::AdsReadWriteInd
(AmsAddr& rAddr,ULONG invokeId,ULONG indexGroup,ULONG indexOffset,ULONG cbReadLength,ULONG cbWriteLength,PVOID pData
)
{m_Trace.Log(tlVerbose, FENTERA "oid=0x%08x, invokeId=%d, indexGroup=0x%08x, indexOffset=0x%08x, cbReadLength=%d, cbWriteLength=%d, pData=0x%p",m_objId.value, invokeId, indexGroup, indexOffset, cbReadLength, cbWriteLength, pData);switch(indexGroup){case ServerIndexGroup8:switch (indexOffset){case ServerIndexGroup9:// TODO: add custom code here // override counter with value provided by ADS-clientunsigned long* pCounter = (unsigned long*)pData;//m_Counter = *pCounter;*pCounter = 8234;AdsReadWriteRes(rAddr, invokeId, ADSERR_NOERR, cbReadLength, pData);break;}break;default:__super::AdsReadWriteInd(rAddr, invokeId, indexGroup, indexOffset, cbReadLength, cbWriteLength, pData); break;}m_Trace.Log(tlVerbose, FLEAVEA);
}
7)Client收到Server端的响应,自动触发AdsReadWriteCon函数执行。
函数的参数@cbLength,服务端响应数据的长度。
@pData,响应数据的起始地址。
void CClient::AdsReadWriteCon(AmsAddr& rAddr, ULONG invokeId, ULONG nResult, ULONG cbLength, PVOID pData)
{if (nResult == S_OK && invokeId == ClientIndexGroup1) {m_bCount_client = *(int*)pData;m_Trace.Log(tlAlways, FNAMEA "AdsReadWrite for ads-variable getHdl got invokeid=0x%08x and nresult=0x%08x", invokeId, nResult);} else {m_Trace.Log(tlAlways, FNAMEA "AdsReadWrite for ads-variable getHdl failed nresult=0x%08x - retrying", nResult);}
}
三、参考资料
1,ADS、AMS、Router官网说明
手册左侧:TwinCAT 3 --> Technologies --> ADS --> AmsNAT --> Introduction
ADS (Automation Device Specification) is the TwinCAT communication protocol that specifies the interaction between two ADS devices. For example, it defines what operations can be executed on another ADS device, what parameters are necessary for that and what return value is sent after execution.
AMS (Automation Message Specification) specifies the exchange of the ADS data. A major component of the communication protocol is the AmsNetId. This is specified in the AMS/ADS package for the source and target device. An ADS device can be explicitly addressed using the AmsNetId.
A route between two devices must be setup in TwinCAT so that they can communicate. This route is configured on both sides and typically contains the route name, the AmsNetId and the address of the communication partner as well as the type of connection. The configuration of new routes and an overview of existing routes in a TwinCAT system are shown in the following figure.
2, ADS device官网说明
手册左侧:TwinCAT 3 --> Technologies --> ADS --> ADS Basics --> ADS device concept
The TwinCAT system architecture allows the individual modules of the software (e.g. TwinCAT PLC, User HMI, ...) to be treated as independent devices: For every task there is a software module ("Server" or "Client"). The servers in the system are the executing working "devices" in the form of software, whose operating behaviour is exactly like that of a hardware device. For this reason we can speak of "virtual" devices implemented in the software. The "clients" are programs which request the services of the "servers", e.g. a visualisation, or even a "programming device" in the form of a program. It is thus possible for TwinCAT to grow, since there can always be new servers and clients for tasks such as camshaft controllers, oscilloscopes, PID controllers etc.
3,ADS实时核函数官网说明
手册左侧:TwinCAT 3 --> TE1000 XAE --> C/C++ --> Programming Reference --> ADS Communication
- AdsReadDeviceInfo
- AdsRead
- AdsWrite
- AdsReadWrite
- AdsReadState
- AdsWriteControl
- AdsAddDeviceNotification
- AdsDelDeviceNotification
- AdsDeviceNotification
4,AMS Port官网说明
手册左侧:TwinCAT 3 --> Technologies --> ADS --> ADS Basics --> ADS device indentification
The unique identification of ADS devices is implemented with the aid of two identifiers:
- PortNr
- NetId
相关文章:

TwinCAT3 实时核中ADS实现C++ server、clinet数据传输
一、基本概念 ADS :Automation Device Specification,ADS设备间进行通信的协议规范。协议定义了ADS device之间如何寻址对方、ADS device之间可以执行哪些操作、执行这些操作需要哪些参数,以及操作完成后如何返回结果等。从编程角度看&#…...

apt:Debian 高级包管理器
apt 是 Advanced Package Tool 的缩写。 apt 是一个在 Debian 及其衍生版本(如 Ubuntu)上管理软件包的工具。以下是一些常见的 apt 命令和用法: 1. 更新软件包列表 sudo apt update2. 安装软件包 sudo apt install package_nam…...

基于React+JsonServer+Antddesign的读书笔记关联系统
文章目录 涉及技术系统功能JsonServer介绍JsonServer安装JsonServer使用创建React项目我的书架显示效果关键代码笔记显示效果关键代码人物关系显示效果关键代码个人中心显示效果关键代码完整代码和数据下载地址项目启动步骤启动json-server启动react项目涉及技术 React Antddes…...

【win工具】win安装flameshot并设置截图快捷键
1.下载flameshot软件2.windows端配置flameshot快捷键3.取消win自带截图快捷键 1.下载flameshot软件 https://flameshot.org/#download installer版本为安装包 portable版本为免安装版 2.windows端配置flameshot快捷键 https://cloud.tencent.com/developer/article/2114952 W…...

react 安装使用 antd+国际化+定制化主题+样式兼容
安装antd 现在从 yarn 或 npm 或 pnpm 安装并引入 antd。 yarn add antd修改 src/App.js,引入 antd 的按钮组件。 import React from react; import { Button } from antd;const App: React.FC () > (<div className"App"><Button type&q…...

【Kubernetes】常见面试题汇总(十六)
目录 48.简述 Kubernetes PodsecurityPolicy 机制能实现哪些安全策略? 49.简述 Kubernetes 网络模型? 50.简述 Kubernetes CNl 模型? 48.简述 Kubernetes PodsecurityPolicy 机制能实现哪些安全策略? 在 PodSecurityPolicy 对象…...

【mysql】mysql之优化
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

Django REST framework 实现缓存机制以优化性能
Django REST framework 实现缓存机制以优化性能 页面首页中,导航菜单或轮播广告在项目中每一个页面都会被用户频繁访问到,所以我们可以实现缓存,减少MySQL数据库的查询压力,使用内存缓存可以加快数据查询速度。 cache_page 装饰…...

快速了解高并发解决方案
对《高并发的哲学原理》的个人总结,原书地址如下 https://pphc.lvwenhan.com/ 本书的核心思想就是拆分,服务细化拆分多资源并行。 通用设计方法 例子:每秒100万次http请求 通过架构解决性能问题,在面对并发需求时ÿ…...

SpringBoot框架下的房产销售系统设计与实现
摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产销售系统,它彻底改变了过去传统的…...

基于RFID的门禁系统的设计(论文+源码)
1系统方案设计 通过需求分析,基于RFID的门禁系统总体设计框图。系统采用STM32单片机作为系统主控核心,利用独立按键与RFID识别模块能够实现门禁系统密码与IC卡开门功能。WiFi模块实现系统与手机APP的通信,用户可以通过手机APP进行门禁开关操…...

湖仓一体-Paimon篇-简介
什么是Paimon? 2021年末,Flink官方提出打造一个全新的存储 Flink Table Store,一个 Flink 完全内置的存储。 为了让 Flink Table Store 能够有更大的发展,Flink PMC经过讨论决定将其捐赠Apache进行独立孵化。 2023 年 3 月 12 日…...

React Native 0.76版本发布
关于 React Native 的 New Architecture 概念,最早应该是从 2018 年 RN 团队决定重写大量底层实现开始,因为那时候 React Native 面临各种结构问题和性能瓶颈,最终迫使 RN 团队开始进行重构。 而从 React Native 0.68 开始,New A…...

yolo自动化项目实例解析(一)日志格式输出、并发异步多线程、websocket、循环截图、yolo推理、3d寻路
本系列是为了学习自动化操作相关知识点,对开源项目原神ai的技术理解,开源地址如下,拉取版本号为1.78 https://gitee.com/LanRenZhiNeng/lanren-genshin-impact-ai 一、main入口主要函数说明 vi main.py 封装的函数较多,我们拆分…...

获取无人机经纬度是否在指定禁飞区内
1. 计算公式: (AB X AE ) * (CD X CE) >= 0 && (DA X DE ) * (BC X BE) >= 0 参考: 判断点是否在矩形框(多边形)内_qt opencv 判断一点是否在矩形内-CSDN博客 2.测试结果: 3.实现完整代码: #include<cstd...

解读:以RTC为基,AI为脑的“超拟人”AI实时互动解决方案
我们打造了一款满足想象与应用的智能体——AI实时互动。 谈谈AI智能体 当AI变得足够聪明时,用户与AI的交互将变得真实自然。于是,构建高拟真AI与用户的实时交互,已经成为企业提升数智化生产力的新思路。 在这个交互过程中,存在一…...

软件测试学习笔记丨Postman基础使用
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32096 一、Postman基础使用 1.1 简介 Postman是一款流行的API测试工具和开发环境,旨在简化API开发过程、测试和文档编制。优势: Postman可以快速构建请求,…...

HTML5+CSS3面试题:(第一天)
目录 1.HTML5有哪些新特性,移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分HTML和HTML5? 2.谈谈iframe标签的优缺点? iframe的优点: iframe的缺点: 3.CSS3有哪些新特性? 4.让chrome支持小于12px的…...

微信小程序中的模块化、组件化开发:完整指南
文章目录 前言一、模块化与组件化开发的优势1.1模块化开发的优势1.2 组件化开发的优势 二、组件的抽离标准及规范2.1 抽离组件的标准2.2 组件化开发规范 三、模块化规范的种类及优劣比较3.1 CommonJS3.2 ES6 Modules3.3 优劣对比 四、组件封装:全局组件、分包组件、…...

9.第二阶段x86游戏实战2-初识易语言
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

Cortex-A7:__disable_irq和GIC_DisableIRQ、__enable_irq和GIC_EnableIRQ的区别(1)API介绍
0 相关资料 ARM Generic Interrupt Controller Architecture version 2.0.pdf 1 API介绍 1.1 __disable_irq __disable_irq函数的作用是失能IRQ,也就是不响应中断。实现代码如下: /**\brief Disable IRQ Interrupts\details Disables IRQ interrupt…...

MATLAB在嵌入式系统设计中的最佳实践
嵌入式系统设计是一个复杂的过程,涉及硬件和软件的紧密集成。MATLAB提供了一套全面的解决方案,从算法开发到代码生成,再到硬件验证,极大地简化了这一过程。本文将探讨使用MATLAB进行嵌入式系统设计的最佳实践,包括模型…...

wpf 使用Oxyplot 库制作图表示例
方法: InitTable 方法:负责初始化图表模型,包括设置图表的样式、坐标轴、系列和注释。这个方法包括多个 Init 方法的调用,表示图表的初始化过程可以分步骤进行。 InitGoalPoint 方法:当前未实现,但预留了子…...

CSS3中的@media查询
CSS3的media查询是一种强大的功能,允许我们根据不同的媒体类型和设备特性来应用不同的样式规则。这使得我们能够创建响应式设计,确保网站或应用在各种设备和屏幕尺寸上都能提供良好的用户体验。本文将详细探讨media查询的定义、语法、使用场景及常见问题…...

fly专享
要逐步熟悉实验中的各个步骤,下面是详细的说明,包括如何下载软件以及相关操作步骤。 1. 熟悉VMware 15虚拟机的使用 步骤说明: 下载VMware Workstation 15: 打开浏览器,访问VMware官方网站:VMware Workst…...

初识Linux · 进程(3)
目录 前言: 进程的创建 前言: 继上文介绍了着重介绍了进程的内部属性,以及在操作系统层面进程如何被组织起来的,如何调用系统接口,有关task_struct,进程的部分理解等,今天,我们就…...

【spring】spring bean对象生命周期,spring容器如何管理bean,spring容器的名称是叫什么
【spring】spring bean对象生命周期,spring容器如何管理bean,spring容器的名称是叫什么 DefaultListableBeanFactory开始 spring 容器 DefaultListableBeanFactory DefaultListableBeanFactory是Spring的核心BeanFactory实现,它负责Bean的创…...

基于51单片机的电饭锅控制系统proteus仿真
地址: https://pan.baidu.com/s/1CGyg6uPhFI0MeaBWwe_HAg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...

创建dataSource错误
说明:记录一次启动项目时的异常,如下: Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-09-14 23:27:27.338 ERROR 42260 --- [ main] o.s.boot.SpringA…...

为解决bypy大文件上传报错—获取百度云文件直链并使用Aria2上传文件至服务器
问题描述 一方面组内的服务器的带宽比较小,另一方面使用bypy方式进行大文件(大于15G)上传时会报错(虽然有时可以成功上传,但是不稳定): 解决方式 总体思路: 获得云盘需要下载文件的直链复制直链到服务器中使用自带…...