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型,没有一位的数据类型,因此是一字节整型,即I1
public bool [] filter=new bool[4];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I2)]//PLC的int型,实为2字节short型,即I2
public short[] count =new short[2];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2, ArraySub