• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

倍福ADS通讯(二)——TwinCat ADS通讯方式

武飞扬头像
听风ツ
帮助1

★ 异步方式(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、使用中需考虑不同变量的偏移地址,容易出错。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghfaaj
系列文章
更多 icon
同类精品
更多 icon
继续加载