C# 倍福ADS带数组成员的结构体数组通信
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带数组成员的结构体数组通信相关推荐
- python 结构体数组_python实现结构体数组(初始化并赋值)
标签: C语言中结构体数组概念及定义 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这 ...
- matlab向结构体中的数组自动赋值_数组 – 在Matlab结构体数组的每个元素中更新一个字段...
只是一个说明,交易是不必要的: [arr.val] = newVals{:}; % achieves the same as deal(newVals{:}) 唯一的其他方式我知道如何做(没有foor ...
- c语言删除结构体数组的数据库,结构体数组的删除问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 } } void menu() { int choice; int w=0; printf("\t\t********************* ...
- 【结构体】 结构体引用、结构体数组指针、包含结构的结构体
目录 一.概念.变量的定义 初识结构体 结构体变量的定义.引用结构体类型的初始化 二.结构体的数组 认识结构体数组 初始化结构体数组 三.结构体指针 初识结构体指针 指向结构体数组的指针 结构体作为函 ...
- C语言 | 结构体数组
C语言结构体数组概述 一个结构体变量中可以存放一组有关联的数据,如一个学生的学号.姓名.成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组. 结构体数组与之前介绍的数值型 ...
- C语言自定义数据类型(二)使用结构体数组
一个结构体变量中可以存放一组有关联的数据(如一个学生的学号.姓名.成绩等数据).如果有 10 个学生的数据需要参加运算,显然应该用数组,这就是结构体数组.结构体数组与以前介绍过的数值型数组的不同之处在 ...
- C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用)
C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,const变量使用) 目录 C++结构体(结构体创建,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数, ...
- 【C语言】结构体指针与结构体数组
目录 一.结构体指针 二.结构体数组 1.结构体数组的定义 2.结构体数组的初始化 3.结构体数组的引用 4.结构体数组指针 一.结构体指针 与一般指针类似结构体也可以使用结构体指针进行引用使用.结构 ...
- C语言之结构体、结构体数组
目录 前言 一.结构体的声明与定义 1.结构体的声明 2.结构体的定义 (1)先声明结构体类型,再定义该类型的变量 (2) 声明类型的同时定义变量 (3)不指定类型名而直接定义结构体类型变量 (4)使 ...
最新文章
- Java8 Optional,可以这样用啊
- 经典题---数组改“貌”
- Visual Studio中没有为此解决方案配置选中要生成的项目
- Go 语言编程 — 变量与常量
- matlab里矩阵相除,Matlab中的矩阵除法有问题???
- android访问重定向地址,如何从android中重定向url加载图像(示例代码)
- Nginx 的常用命令
- [转载] python zip 文件解压中文乱码问题解决
- Java编译带包文件
- zabbix3.2监测mysql_zabbix3.2监控MYSQL状态
- h5页面如何切图_HTML5自助切图
- 谷歌大脑提出gMLP:请多多关注MLP
- 单片机c语言双电源程序,基于单片机的双电源自动切换开关控制器
- 奔跑吧,旅行商 - 当机器学习遇上组合优化
- 如何理解IT、OT、CT?
- 位运算相关题目-一些小trick 1bit代表独立数字 求只出现一次的数字 无进位n进制数 n(-n) Boyer-Moore 投票算法 n(n-1)
- VUE xls文件的上传以及下载
- C++面向对象特性之多态
- python国际象棋ai程序_只需五步!手把手教你搭建国际象棋AI机器人
- 序列化和反序列化的底层实现原理是什么