倍福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

相关文章

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.

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式