倍福TwinCAT ADS通讯:变量读写

2024-08-22 05:08

本文主要是介绍倍福TwinCAT ADS通讯:变量读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1、PLC变量类型对应C#变量
  • 2、读写任意类型变量
    • 2.0 官方例程
    • 2.1、TcAdsClient类 ReadAny() 方法
    • 2.2、TcAdsClient类 WriteAny()方法
  • 3、对上面ReadAny()、WriteAny()方法 做一些集成
    • 3.1、使用泛型
    • 3.2、使用List泛型 - 实现PLC变量的批量读写


1、PLC变量类型对应C#变量

C# 基本数据类型,值类型隐式继承自System.ValueType->System.Object
基本类型占用字节
在这里插入图片描述

PLC变量C#
BOOLbool
INTshort
UINTushort
DINTint
UDINT(包括时间类型TIME)uint
REALfloat
LREALdouble
STRING(80)string, new int[] { 80 }
ARRAY[0…3] OF REALfloat[], new int[]{ 4 }
结构体结构体(考虑字节对齐问题)

2、读写任意类型变量

2.0 官方例程

TwinCAT 3 -> TE1000 XAE -> Technologies ->ADS -> TwinCAT ADS
在这里插入图片描述

2.1、TcAdsClient类 ReadAny() 方法

	//readbool bTest1 = (bool)tcAdsClient.ReadAny(pHandle_bool1, typeof(Boolean));//read by handleshort nTest1 = (short)tcAdsClient.ReadAny(pHandle_int1, typeof(short));//read by handleint dintTest1 = (int)tcAdsClient.ReadAny(pHandle_dint1, typeof(int));//read by handledouble dfTest1 = (double)tcAdsClient.ReadAny(pHandle_lreal1, typeof(double));//read by handlestring strTest1 = (string)tcAdsClient.ReadAny(pHandle_str1, typeof(string), new int[] { 11 });//read by handlefloat fTest1 = (float)tcAdsClient.ReadAny(pHandle_array_real1, typeof(float));MyStruct1 StructTest1 = (MyStruct1)tcAdsClient.ReadAny(pHandle_complexStruct1, typeof(MyStruct1))//数组读写方式1,readanyfloat[] arrfTest1 = (float[])tcAdsClient.ReadAny(pHandle_array_real1, typeof(float[]), new int[] { 4 });//read by handleConsole.Write("=====结果=====:");Console.Write("\n{0}\n{1}\n{2}\n{3}\n{4}\n", bTest1, nTest1, dintTest1, dfTest1, strTest1);for (int i = 0; i < 4; i++){Console.Write("{0} ",arrfTest1[i]);}

2.2、TcAdsClient类 WriteAny()方法

3、对上面ReadAny()、WriteAny()方法 做一些集成

3.1、使用泛型

/// <summary>
/// ReadAny<T> 泛型方法 实现
/// </summary>
/// <typeparam name="T">PLC数据类型,BOOL->bool, INT->short, REAL->float, LREAL->double 。</typeparam>
/// <param name="plcVariableName">plc变量名,字符串类型。</param>
/// <param name="Args">0:单个PLC变量; >0:PLC变量的字符串字符个数或数组元素个数。</param>
/// <returns>返回PLC变量值</returns>
public T ReadAny<T>(string plcVariableName, int Args = 0)
{if (base.ClientIsConnected){try{int varHandle = this.tcAdsClient.CreateVariableHandle(plcVariableName);if (Args != 0)//是数组类型 或 字符串类型{return (T)this.tcAdsClient.ReadAny(varHandle, typeof(T), new int[] { Args });//read by handle}else//单个变量{return (T)this.tcAdsClient.ReadAny(varHandle, typeof(T));}}catch (Exception){return default(T);throw;}}else{return default(T);//throw new Exception("base.ClientIsConnected 没有连接");}
}
/// <summary>
///  WriteAny<T> 泛型方法 实现
/// </summary>
/// <typeparam name="T">PLC数据类型,BOOL->bool, INT->short, REAL->float, LREAL->double 。</typeparam>
/// <param name="plcVariableName">plc变量名,字符串类型。</param>
/// <param name="value">写入的值。</param>
/// <param name="Args">0:单个PLC变量; >0:PLC变量的字符串字符个数或数组元素个数。</param>
/// <returns>true:写成功。</returns>
public bool WriteAny<T>(string plcVariableName, T value, int Args = 0)
{if (base.ClientIsConnected){try{int varHandle = this.tcAdsClient.CreateVariableHandle(plcVariableName);if (Args != 0)//是数组类型 或 字符串类型{this.tcAdsClient.WriteAny(varHandle, value, new int[] { Args });}else//单个变量{this.tcAdsClient.WriteAny(varHandle, value);}return true;}catch (Exception){    throw;}}else{return false;// throw new Exception("base.ClientIsConnected 没有连接");}
}

3.2、使用List泛型 - 实现PLC变量的批量读写

/// <summary>
/// 批量读取 PLC变量值
/// </summary>
/// <typeparam name="T">PLC变量类型</typeparam>
/// <param name="plcVariableName">PLC 变量名</param>
/// <param name="args">0:单个变量,>0:数组/字符串型PLC变量元素个数</param>
/// <returns>.NET 批量访问变量列表</returns>
public List<T> ReadAnyBatch<T>(List<string> plcVariableName, int args = 0)
{List<T> result = new List<T>();try{foreach (var item in plcVariableName){result.Add(ReadAny<T>(item, args));}return result;}catch (Exception){return result;throw;//读PLC变量失败}
}/// <summary>
/// 批量写
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="plcVariableName"></param>
/// <param name="value"></param>
/// <param name="args"></param>
/// <returns></returns>
public bool WriteAnyBatch<T>(List<string> plcVariableName, T value, int args = 0)
{try{foreach (var item in plcVariableName){if (WriteAny<T>(item, value, args) !=true){return false;//写PLC变量失败  }}return true;}catch (Exception){throw;}
}

这篇关于倍福TwinCAT ADS通讯:变量读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095327

相关文章

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Python变量与数据类型全解析(最新整理)

《Python变量与数据类型全解析(最新整理)》文章介绍Python变量作为数据载体,命名需遵循字母数字下划线规则,不可数字开头,大小写敏感,避免关键字,本文给大家介绍Python变量与数据类型全解析... 目录1、变量变量命名规范python数据类型1、基本数据类型数值类型(Number):布尔类型(bo

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.