当前位置: 首页 > news >正文

倍福——ADS协议解析及C语言读写库

虽说ADS协议公开,但是我查了一番也只找到零星的资料,虽说项目完成了,但是在这里想要把自己积累的所有ADS协议的资料写出来,以供大家查阅。

目录

1.协议简介

2.ADS协议解析

1.ADS数据包格式如下

2.AMS/TCP Header 

3.AMS Header主体包格式

1.AMS Target Net ld和port 以及 AMS Sender Net ld和port

2.CMD ID

3.StateFlags

4.Lenth

5.ErrorCode

6.InvokeID

4.ADS Data

1.请求

2.回应

3.C语言读写库

4.类型读写


1.协议简介

ADS协议是倍福PLC的公开协议,基于TCP/IP进行收发。

ADS协议分为client 和 server端,client负责请求,server负责答复

2.ADS协议解析

注意:ADS 协议是大端在前。

1.ADS数据包格式如下

数据包大小(bytes)描述
AMS/TCP Header6包含了ADS Data的长度。
AMS Header32此处包含了通讯的发送方和接收方地址,以及ADS错误代码、ADS命令代码和其他一些信息
ADS DataN此处包含了一个ADS命令的参数。参数的数据结构由ADS命令所决定,一些ADS品令也可以没有附加的数据。

2.AMS/TCP Header 

名称大小(bytes)描述
起始20x00 0x00
指令长度(4bytes)4为整个ADS协议中减去AMS/TCP Header的指令的字节长度即32 + N

3.AMS Header主体包格式

名称

大小(bytes)

描述

AMS Target Net ld

6

目标ID

AMS Target port

2

目标端口

AMS Sender Net ld

6

发送者ID

AMS Sender port

2

发送者端口

CMD ID

2

控制字

StateFlags

2

状态字

Lenth

4

数据域长度

ErrorCode

4

错误代码

InvokeID

4

通信计数,每次完成一次读写即加1

1.AMS Target Net ld和port 以及 AMS Sender Net ld和port

注意这里需要分清,设备的实际IP和端口并不是AMS Net ld和port。

ADS会给每个设备分配一个虚拟Id,假设目标实际IP和端口是10.100.173.2:48863

那么此时ADS会给设备分配虚拟ID AMS  Net 为10.100.173.2.1.1

注意,这里不是直接在实际IP后加1.1就可以进行通讯,而是在TwinCAT路由中加入IP后才可以。

作为client端我们的AMS Net port可以随便写1-65535都可以,而若是作为server端我们的AMS Target Net port是固定的。

主要如下

端口号设备描述
100日志记录
110Eventlogger
300IO
301,302addtional Task1,2....(TC2)
351,352addtional Task1,2....(TC3)
500NC
801,811,821,831PLC runtimeSystem1,2,3,4(TC2)
851PLC runtimeSystem1,2,3,4(TC3)
900Camshaft controller
10000System Service
1400Scope

而协议中AMS Target Net ld是如何表现的呢?例如10.100.173.2.1.1

即将10,100,173,2,1,1转换为十六进制即0A 64 AD 02 01 01

假设AMS Target Net port是851,转换为十六进制即0x0353,转换为大端在前即0x5303

故可以知道AMS Header主体包格式中

AMS Target Net ld以及port即为

0A 64 AD 02 01 01 53 03

同理AMS Sender Net ld也是一样。

2.CMD ID

控制字,主要具有以下内容

Commnd描述
0x0000无效
0x0001读取ADS设备名称和版本号
0x0002可以对ADS设备读取数据
0x0003可以对ADS设备写入数据
0x0004读取ADS设备的ADS状态和设备状态
0x0005改变ADS设备的ADS状态和设备状态        
0x0006在ADS设备中创建一个通知
0x0007在ADS设备中删除一个通知
0x0008数据将独立的从ADS设备发送到ADS客户端
0x0009可以对ADS设备写入数据,同时也能从ADS设备中读取数据

同样的,本部分也是大端在前,比如0x0001,实际写入的时候要转换成0x0100。

3.StateFlags

4.Lenth

数据域的长度,即ADS Data部分的字节长度,大端在前。

5.ErrorCode

这里的错误码内容非常多,建议大家可以直接看这些文章

倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何查看错误代码_0x4225倍福-CSDN博客

倍福TwinCAT3 Ads错误快查_twincat.ads.adsinitializeexception:鈥淎ds could not -CSDN博客

一般大家知道0x00000000代表无错误就可以。

同样大端在前

6.InvokeID

通信计数,每次完成一个数据读写后由数据请求方进行自增,回应方则直接在回应报文中将该字节返回。

4.ADS Data

数据域,在请求与回应帧中不相同,这里简单介绍。

1.请求

名称描述长度(bytes)
IndexGroup寄存器4
IndexOffset地址偏移4
CbLength读取字节长度4

IndexGroup主要有以下内容

IndexGroup描述
0x00004020M寄存器(用%M声明)
0x00004021MX寄存器(用MX声明)
0x0000F020I寄存器(用%I声明)
0x0000F01IX寄存器(用IX声明)
0x0000F030Q寄存器(用%Q声明)
0x0000F031QX寄存器(用QX声明)
0x0000F003取变量句柄
0x0000F005通过变量句柄访问变量值
0x0000F006释放句柄

这里IndexGroup、IndexOffset、CbLength全都是大端在前。

2.回应

名称描述大小(bytes)
Result即错误码4
cblenthdata部分的字节长度4
data数据n

3.C语言读写库

这里写了一个C语言的ADS协议读写库,大家可以直接在文章开头链接下载使用。

4.类型读写

其实大家可以看到ADS协议中没有规定按照类型读取,实际上我们可以直接读取该类型的字节长度即可。

变量类型C++C#长度
INTshortshort,INT162
UINTunsigned shortunsigned short,UINT162
DINTintint, UINT324
UDINTunsigned intUINT324
realfloatfloat4
LREALdoubledouble8
stringchar[81]char[81]81
boolboolbool1

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024年6月第2套英语四级真题PDF
  • 第二章 深信服超融合测试历程第二天
  • 【计算机视觉前沿研究 热点 顶会】ECCV 2024中Mamba有关的论文
  • macOS系统介绍与特点
  • Oracle(106)如何实现透明数据加密?
  • 93. UE5 GAS RPG 应用负面效果表现
  • 批处理常用指令与脚本的例子
  • web渗透:SSRF漏洞
  • 海康二次开发学习笔记7-流程相关操作
  • 深度学习——基于MTCNN算法实现人脸侦测
  • 实现A-Z滑动检索菜单
  • 论俄国留学对计算机系大学生的帮助
  • 在Unity中使用C#进行Xml序列化时保留特定小数位的方法参考
  • MobaXterm 终端工具使用
  • 从0开始深度学习(5)——线性回归的逐步实现
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Computed property XXX was assigned to but it has no setter
  • docker-consul
  • HashMap ConcurrentHashMap
  • Hibernate【inverse和cascade属性】知识要点
  • HTML-表单
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • php ci框架整合银盛支付
  • vue中实现单选
  • Yeoman_Bower_Grunt
  • 闭包--闭包之tab栏切换(四)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从tcpdump抓包看TCP/IP协议
  • 将回调地狱按在地上摩擦的Promise
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 异常机制详解
  • ​虚拟化系列介绍(十)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (JS基础)String 类型
  • (阿里云万网)-域名注册购买实名流程
  • (二十六)Java 数据结构
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (力扣)1314.矩阵区域和
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (学习日记)2024.01.19
  • (转)Scala的“=”符号简介
  • .net core 管理用户机密
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET开发人员必知的八个网站
  • /etc/sudoers (root权限管理)
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • @取消转义
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [docker]docker网络-直接路由模式