
倍福ADS通讯(二)——TwinCat ADS通讯方式
TwinCat ADS通讯方式(同步和异步两种方式)★ 异步方式(Asynchronous)★ 同步方式(Synchronous)读取方式——变量名句柄方式读取方式——变量地址方式不同方式的读取优缺点★ 异步方式(Asynchronous)ADS 客户端向ADS 服务器发送ADS 请求,同时客户端继续自己的工作。ADS 服务器处理请求后,把响应以Call-back 函数方式发给客户端。优点:不会造
TwinCat ADS通讯方式(同步和异步两种方式)
★ 异步方式(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、使用中需考虑不同变量的偏移地址,容易出错。
更多推荐
所有评论(0)