TwinCat ADS通讯方式(同步和异步两种方式)

  • ★ 异步方式(Asynchronous)
  • ★ 同步方式(Synchronous)
    • 读取方式——变量名句柄方式
    • 读取方式——变量地址方式
    • 不同方式的读取优缺点

★ 异步方式(Asynchronous)

ADS 客户端向ADS 服务器发送ADS 请求,同时客户端继续自己的工作。ADS 服务器处理请求后,把响应以Call-back 函数方式发给客户端。

优点:不会造成系统堵塞

缺点:不能确保每次请求都有返回

★ 同步方式(Synchronous)

ADS 客户端向ADS 服务器发送ADS 请求,在通讯过程中客户端程序停止执行,直到获得ADS 服务器返回的响应

优点:能即时返回结果

缺点:如果通讯故障会造成系统堵塞

同步方式(Synchronous)通讯分为两种,即读操作和写操作,针对于读和写操作又分别分为两种方式,即按变量名进行读写和按照地址进行读写。

读取方式——变量名句柄方式

通讯读取方式倍福可以按变量名读写或者按照地址进行读写两种方式
在TwinCAT PLC程序中每个变量都有一个句柄(Handle)。在对变量进行操作之前,首先我们要通过相关路径得到变量的句柄,然后进行读写操作,操作完毕后对句柄进行释放。

句柄读取类型示例 注:变量名及PLC程序内部变量名
ReadAny读取

1.ReadAny读取
(1)读取BooL
1.var Data= adsClient.CreateVariableHandle("MAIN.bool");
2.var val = (Boolean)client.ReadAny(Data, typeof(Boolean));
3.adsClient.DeleteVariableHandle(Data);
(2)读取double
1.var Data= adsClient.CreateVariableHandle("MAIN.Double");
2.var val = (Double)client.ReadAny(Data, typeof(Double));
3.adsClient.DeleteVariableHandle(Data);
其他数据类型读取相同略..........
(3)读取数组
1. //定义数组,含有五个元素
2.short[] arraytest = new short[5];
3.var Data3 = adsClient.CreateVariableHandle("MAIN.plcarraytest");
4.arraytest = (short[])(adsClient.ReadAny(Data3, typeof(short[]), new int[] { 5 }));
5.adsClient.DeleteVariableHandle(Data);
(4)读取结构体
1.//Mystruct如多个不同类型的数据结构 ,需要跟PLC的数据结构相对应
2. public class Mystruct
3.       {   public double Thickness_Channle_Setting;
4.           public bool Thickness_Channle_Setting_Button;
5.           public UInt16 Thickness_Offset_Value_Button;
6.       }
6.var Data4 = adsClient.CreateVariableHandle("MAIN.Mystruct");
7.Mystruct struct1 = (Mystruct)adsClient.ReadAny(Data4, typeof(Mystruct));
(5)读取String
1.Data= adsClient.CreateVariableHandle("Main.Date_string");
2.Var s =adsClient.ReadAny(Data,typeof(string), new int[]{ 16 }).ToString();
3.adsClient.DeleteVariableHandle(Data);
(6)读取WString(中文编码)
1.Encoding defaultEncoding = Encoding.Default;  //系统默认用"BGK"进行解码与编码
2.Encoding utf8Encoding = Encoding.UTF8;
3.string temStr = adsClient.ReadAny(Data, typeof(string), new int[] { 32 }).ToString();
4.byte[] tempBytes = defaultEncoding.GetBytes(temStr);
5.//解码:将字符、符号等转换为二进制机器语言
6.string str = utf8Encoding.GetString(tempBytes);      //编码:将二进制机器语言
7.adsClient.DeleteVariableHandle(Data)

WriteAny写入

2.WriteAny写入
(1)写入BooL
client.WriteAny(Data, Convert.ToBoolean(true));
(2)写入Int16
_client.WriteAny(Data, Convert.ToInt16(123));  (3)写入数组
short[] temArr = new short[3]{5,9,15};
_client.WriteAny(Data, temArr);  (4)写入结构体
Mystruct tempStruct = new Mystruct();
tempStruct.Triggle = Boolean.Parse(true);
tempStruct.Velocity = double.Parse(13.14);
_client.WriteAny(_myStructHand, tempStruct);   (5)写入String
string str = “ADSYYDS”;
byte[] tempBytes = Encoding.UTF8.GetBytes(str);  _client.WriteAny(Data,tempBytes);

ReadSymbol && WriteSymbol

(1)根据变量名读取
var val = (Int16)client.ReadSymbol(varName, typeof(Int16), true);
Console.WriteLine($"MAIN.iTest: {val}");
(2)根据变量名读取数组
Int16[] arrTests = (Int16[])client.ReadSymbol("MAIN.arrTests", typeof(Int16[]), true);
Console.WriteLine($"MAIN.arrTests:{string.Join("-", arrTests)}");
(3)根据变量名读取结构体
Cmd c = (Cmd)client.ReadSymbol("MAIN.sCmd", typeof(Cmd), true);
Console.WriteLine($"MAIN.sCmd:{c.done},{c.iLastCaller},{c.udExeCnt}");
(4)根据变量名写入
client.WriteSymbol(varName, 100, true);
(5)根据变量名写入数组
Int16[] arrTestsW = new Int16[] { 9, 8, 7 };
client.WriteSymbol("MAIN.arrTests", arrTestsW, true);
(6)根据变量名写入结构体
Cmd cw = new Cmd();
cw.done = true;
cw.iLastCaller = 100;
client.WriteSymbol("MAIN.sCmd", cw, true);

读取方式——变量地址方式

在TwinCAT PLC中一个变量的地址由两部分组成,即GroupIndex和OffsetIndex, GroupIndex为该变量所在的寄存器类型,为一常量; OffsetIndex为该变量在寄存器中得地址偏移量,为一变量。
在TwinCAT PLC中一个变量的地址由两部分组成,即GroupIndex和OffsetIndex, GroupIndex为该变量所在的寄存器类型,为一常量; OffsetIndex为该变量在寄存器中得地址偏移量,为一变量。
一个是寄存器的句柄,一个地址所在的位置


1.对于MX,IX,QX寄存器的偏移地址的单位是“位”,而不是字节,计算地址需要注意
2.M寄存器偏移地址最大值为0x0000FFFF,而MX,I,IX,Q,QX偏移地址最大值为0xFFFFFFFF。
说明:

1:首先根据地址类型获取对应的GroupIndex
2:根据地址的位置获取对应的OffsetIndex
3:根据获取的GroupIndex和 OffsetIndex 获取值

读取

1.Object obj=Client.ReadAny((int)GroupIndex,(int)OffsetIndex,typeof(T));

多读取

 AdsStream rStream = new AdsStream(count);
//根据读取长度及数据类型转换对应字节长度
AdsBinaryReader reader = new AdsBinaryReader(rStream);
adsClient.Read((int)addrInfo.Index_Group, (int)addrInfo.Index_Offset, rStream);
//读取设备中的数据并写入到文件流stream中
ParseReadRecv(rStream.ToArray(), valueType, addrInfo, ref rst);
读取出来的字节根据数据类型跟长度解析转换成集合返回

不同方式的读取优缺点

1.变量名方式
优点:
A、 无需知道变量的具体地址;
B、 可以省略计算地址的工作;
C、 可对过程变量进行操作;
D、 可读取结构体拿到整个类数据,只要变量类PLC与上位机对应上
缺点:
A、 因为要抓放句柄(10ms),和地址方式比较通讯速度慢
B、 对BC、BX系列不能进行操作
2. 地址方式
优点:
A、 直接对地址进行操作,省去抓放句柄时间,通讯速度快;
B、 无需知道变量的具体路径;
C、 可以操作BC、BX系列控制器
缺点:
A、使用中需考虑不同变量的偏移地址,容易出错。

倍福ADS通讯(二)——TwinCat ADS通讯方式相关推荐

  1. matlab与倍福,倍福|TwinCAT|自动化软件-倍福展示最新版TwinCAT 3.1自动化软件

    倍福展示最新版TwinCAT 3.1自动化软件 2012年11月20-22日,Beckhoff在2012德国纽伦堡国际电气自动化系统及元件展览会上展示了其3.1版本的TwinCAT自动化软件.该软件的 ...

  2. 倍福控制器(Beckhoff Twincat 3)的ADS通讯相关知识及测试

    ADS简介 YapethsDY 2020/08/27 PM 基于ADS的twincat系统架构 在Beckhoff TwinCAT 系统中,各个软件模块(如TwinCAT PLC.TwinCAT NC ...

  3. 倍福PLC和C#通过ADS通信传输Bool数组变量

    在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入bool类型数组变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C# ...

  4. 倍福PLC和C#通过ADS通信传输int类型变量

    在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入int类型变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C#和倍福 ...

  5. 倍福PLC和C#通过ADS通信传输bool类型变量

    在倍福PLC和C#通信,采用ADS通信,本文讲解C#如何读取和写入bool类型变量. 操作流程 1.1. PLC程序设计 首先定义相关的变量,如下所示,激活配置: 1.2. C#程序设计 关于C#和倍 ...

  6. 倍福服务器维修,Beckhoff TwinCAT

    发行说明 6.9.636.0 2021/8/10Fixed an issue that could cause some tags to fail to generate during ATG. 6. ...

  7. 倍福ads通讯软件_倍福TwinCAT ADS通讯-高级语言.ppt

    倍福TwinCAT ADS通讯-高级语言 * ADS组件库文件组成简介 ADS组件库集成在TwinCAT软件中,安装任何版本的TwinCAT软件都包含ADS通讯组件,如果用户希望在没有安装TwinCA ...

  8. 倍福ADS协议讲解及 Notification模式通讯应用案例

    ADS设备概念 先看几个关键术语的缩写以明白他们的来由,方便后续理解 TwinCAT(The Windows Control and Automation Technology) ADS(Automa ...

  9. 倍福beckhoff详细知识库展示

    教材(一) TwinCAT 2.0 从入门到精通 1 系统概述 1.1 TwinCAT 软件介绍 1.2 PC 控制的原理 1.3 选型设计 1.4 安装和接线 1.5 常见问题 2 编程入门 2.1 ...

  10. 倍福beckhoff知识库

    本内容只是为了方便用搜索工具查找信息,具体知识请咨询陈利君获取详细资料或通过京东购买书籍. 教材(一) TwinCAT 2.0 从入门到精通 1 系统概述 1.1 TwinCAT 软件介绍 1.2 P ...

最新文章

  1. js判断是否在iframe和禁止网页在iframe中显示
  2. localdate计算相差天数_干掉 Date,LocalDate 真香!
  3. 论文阅读笔记(四)【ACL 2021】FEW-NERD: A Few-shot Named Entity Recognition Dataset
  4. 软件概要设计与详细设计的区别
  5. sql 触发器嵌套条件_SQL Server中的嵌套触发器
  6. 从入门到入土:python爬虫|SCU每日打卡自动填写|测试训练|
  7. 开发自测,到底该从哪里做起?
  8. html验证用户名长度,JQuery表单字符串长度验证
  9. [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
  10. IGT-DSER智能网关不用PLC编程,实现多台不同品牌PLC之间的通讯案例
  11. 时间计算题100道_史上最全50道初中数学几何必刷题(上)
  12. 单片机芯片——电子秤芯片
  13. bou计算机术语,2012年计算机一级考试模拟试题及参考答案(27)
  14. 遇见未来 | 对话叶毓睿:人类文明运行在软件之上(下篇)
  15. shader篇-纹理-遮罩纹理
  16. 测试用户名字 陈一王二张三李四钱五赵六钱七张八周九吴十
  17. Nginx的 HTTP 499 状态码处理
  18. mysql datesub interval_Mysql之INTERVAL与DATE_SUB与EXTRACT函数的使用
  19. 【20191025】考试
  20. 深度解读AMBA、AHB、APB、AXI总线

热门文章

  1. mysql 中的any_value 函数
  2. 最近羊毛小更新 青龙面板 薅羊毛 22/6/6更新
  3. 【Unity3D】使用Unity做一个简单的游戏,roll_a_ball,第一步创建游戏。
  4. 网页加载过程+性能优化+安全
  5. 路虎:独到所处,揽胜极致.
  6. 前端html与css学习笔记总结篇(超详细)
  7. springboot基于协同过滤算法的书籍推荐毕业设计源码101555
  8. Red5与Nginx Rtmp性能对比
  9. win7环境下计算机互联,win7系统多台电脑互联起来的操作方法
  10. 我们很高兴地宣布我们正在与 OKC 整合