C#读写ADS结构体时,如果结构体成员复杂,有数组类型,必须指明数组兼容的c语言类型。有时需要结构体数组缓存这些结构体形式的数据,读取函数与非数组变量不一样。

首先添加以下两个命名空间的引用,ads还需要导入官方dll库。

using System.Runtime.InteropServices;//注意添加该引用,以实现未托管代码的互通
using TwinCAT.Ads;//ADS通信库,官方提供的dll文件

定义结构体,注意指明结构体的封装,数组类型成员的非托管类型为ByValArray,数组元素的成员类型要转化成非托管类型。

//结构体定义[StructLayout(LayoutKind.Sequential, Pack = 1)]public class Feedbacks{[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.I1)]//PLC的bool型,没有一位的数据类型,因此是一字节整型,即I1public bool [] filter=new bool[4];[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I2)]//PLC的int型,实为2字节short型,即I2public short[] count =new short[2];[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.R4)]//PLC的real型,实为4字节float型,即R4public float[] pressure=new float[2];}

TwinCAT中定义结构体

TYPE Feedbacks ://反馈至上位机的数据
STRUCTfilter:ARRAY[1..4] OF BOOL ;count:ARRAY[1..2] OF INT ;pressure:ARRAY[1..2] OF REAL;
END_STRUCT
END_TYPE

TwinCAT中MAIN程序定义缓存器

feedbacks:ARRAY[0..trans_buff_len-1] OF Feedbacks;//数据缓冲器

C#初始化通信,尤其要注意端口号

        TcAdsClient adsClient;int hfeedback;string NetId;//使用前赋值int port;//使用前赋值//初始化与下位机的通信private void initADS(){adsClient = new TcAdsClient();//创建ads通信客户端try{adsClient.Connect(NetId, port);//连接控制器,注意NetID和端口,按地址读取变量和按名称读取变量不是一个端口hfeedback = adsClient.CreateVariableHandle("MAIN.feedbacks");//获取变量句柄,注意变量名}catch (Exception ex){MessageBox.Show(ex.Message);}}

读取数组,因为C#的数组长度并不一定在定义的时候给定,因此读取函数包括数组长度参数,该参数是数组,读取的长度与TwinCAT中保持一致。

Feedbacks[] feedbacks;
feedbacks = (Feedbacks[])adsClient.ReadAny(hfeedback, typeof(Feedbacks[]), new int[] { Feedback_Buffer_Len});//注意长度要用数组表示,一维数组的长度只有一个元素

C# 倍福ADS带数组成员的结构体数组通信相关推荐

  1. python 结构体数组_python实现结构体数组(初始化并赋值)

    标签: C语言中结构体数组概念及定义 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这 ...

  2. matlab向结构体中的数组自动赋值_数组 – 在Matlab结构体数组的每个元素中更新一个字段...

    只是一个说明,交易是不必要的: [arr.val] = newVals{:}; % achieves the same as deal(newVals{:}) 唯一的其他方式我知道如何做(没有foor ...

  3. c语言删除结构体数组的数据库,结构体数组的删除问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 } } void menu() { int choice; int w=0; printf("\t\t********************* ...

  4. 【结构体】 结构体引用、结构体数组指针、包含结构的结构体

    目录 一.概念.变量的定义 初识结构体 结构体变量的定义.引用结构体类型的初始化 二.结构体的数组 认识结构体数组 初始化结构体数组 三.结构体指针 初识结构体指针 指向结构体数组的指针 结构体作为函 ...

  5. C语言 | 结构体数组

    C语言结构体数组概述 一个结构体变量中可以存放一组有关联的数据,如一个学生的学号.姓名.成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组. 结构体数组与之前介绍的数值型 ...

  6. C语言自定义数据类型(二)使用结构体数组

    一个结构体变量中可以存放一组有关联的数据(如一个学生的学号.姓名.成绩等数据).如果有 10 个学生的数据需要参加运算,显然应该用数组,这就是结构体数组.结构体数组与以前介绍过的数值型数组的不同之处在 ...

  7. C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用)

    C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用) 目录 C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数, ...

  8. 【C语言】结构体指针与结构体数组

    目录 一.结构体指针 二.结构体数组 1.结构体数组的定义 2.结构体数组的初始化 3.结构体数组的引用 4.结构体数组指针 一.结构体指针 与一般指针类似结构体也可以使用结构体指针进行引用使用.结构 ...

  9. C语言之结构体、结构体数组

    目录 前言 一.结构体的声明与定义 1.结构体的声明 2.结构体的定义 (1)先声明结构体类型,再定义该类型的变量 (2) 声明类型的同时定义变量 (3)不指定类型名而直接定义结构体类型变量 (4)使 ...

最新文章

  1. Java8 Optional,可以这样用啊
  2. 经典题---数组改“貌”
  3. Visual Studio中没有为此解决方案配置选中要生成的项目
  4. Go 语言编程 — 变量与常量
  5. matlab里矩阵相除,Matlab中的矩阵除法有问题???
  6. android访问重定向地址,如何从android中重定向url加载图像(示例代码)
  7. Nginx 的常用命令
  8. [转载] python zip 文件解压中文乱码问题解决
  9. Java编译带包文件
  10. zabbix3.2监测mysql_zabbix3.2监控MYSQL状态
  11. h5页面如何切图_HTML5自助切图
  12. 谷歌大脑提出gMLP:请多多关注MLP
  13. 单片机c语言双电源程序,基于单片机的双电源自动切换开关控制器
  14. 奔跑吧,旅行商 - 当机器学习遇上组合优化
  15. 如何理解IT、OT、CT?
  16. 位运算相关题目-一些小trick 1bit代表独立数字 求只出现一次的数字 无进位n进制数 n(-n) Boyer-Moore 投票算法 n(n-1)
  17. VUE xls文件的上传以及下载
  18. C++面向对象特性之多态
  19. python国际象棋ai程序_只需五步!手把手教你搭建国际象棋AI机器人
  20. 序列化和反序列化的底层实现原理是什么

热门文章

  1. 在axure中使用echarts
  2. 读书笔记-深度学习推荐系统1-概述章节
  3. 2021-2027全球与中国聊天机器人生成器软件市场现状及未来发展趋势
  4. 信息系统项目管理师:配置管理和软件文档
  5. 发货地址,收货地址中获取用户真实姓名
  6. 普通人小红书可以赚钱吗?实操结果告诉你
  7. JNI内存方面说明以及相关类型手动释放内存
  8. win10一个显示器怎么设置分屏显示
  9. 一个同步FIFO的实现
  10. oracle闪回空间使用率,oracle闪回区满了解决方案