如何从 TwinCat 到 C# 读取包含结构数组的结构

使用 TwinCAT 3 ADS.Net 从 PLC 读取数据,我尝试读取包含结构数组的结构,但 ReadAny 命令因“无法编组类型”异常而崩溃。


不过,直接读取结构数组效果很好。


public object ReadAny(long indexGroup, long indexOffset, Type type, int[] args);

ReadAny方法的头部注释中写道:“如果要读取的对象类型是数组类型,则必须在参数args中指定每个维度的元素数量。”


但是对于包含结构数组的结构,args 应该是什么?(如果没有“args”,它也会失败。)


我目前使用 .NET 4.7、VS 2013。


有选择吗?


[StructLayout(LayoutKind.Sequential, Pack = 0)]

public class WholeData

{

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]

    public Station[] StationArray;

    // Potentially more fields...


[StructLayout(LayoutKind.Sequential, Pack = 0)]

public class Station

{

    [MarshalAs(UnmanagedType.I1)]

    public bool isPass;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 81)]

    public string name;

    // More fields...

}


// -- Main --

int[] args = { 5 };


// Works fine:

Station[] stationArray = (Station[])m_AdsClient.ReadAny(indexGroup, indexOffset, typeof(Station[]), args);


// Fail:

WholeData wholeData = (WholeData)m_AdsClient.ReadAny(indexGroup, indexOffset, typeof(WholeData), args);

// - OR -

WholeData wholeData = (WholeData)m_AdsClient.ReadAny(m_VarHandle, typeof(WholeData), args);


拉莫斯之舞
浏览 177回答 1
1回答

慕森卡

我测试成功以下代码:代码:    class Program    {        public static TcAdsClient client;        static void Main(string[] args)        {            // Create the ADS Client            using (client = new TcAdsClient())            {                // Establish Connection                client.Connect(new AmsAddress("10.1.2.95.1.1", 851));                int handle = client.CreateVariableHandle("PRG_AIS.stAds");                AdsClass ads = (AdsClass)client.ReadAny(handle, typeof(AdsClass));                ads.boolArr[0] = 1;                client.WriteAny(handle, ads);                Console.ReadLine();            }        }    }    [StructLayout(LayoutKind.Sequential, Pack = 1)]    class AdsClass    {        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]        public byte[] boolArr = new byte[10];    }ST代码:TYPE AdsStruct :STRUCT    bTestArray : ARRAY[0..9] OF BOOL;END_STRUCTEND_TYPEAdsStruct 在 PRG_AIS 中定义为 stAds。或者,如果您有一个结构数组,请按以下方式修改代码:代码:[StructLayout(LayoutKind.Sequential, Pack = 1)]class AdsClass{    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]    public InnerStruct[] strArr = new InnerStruct[10];}struct InnerStruct{    public byte bBoolTest;    public int nIntTest;}ST代码:TYPE AdsStruct  :STRUCT    stTestArray : ARRAY[0..9] OF InnerStruct;END_STRUCTEND_TYPETYPE InnerStruct :STRUCT    bBoolTest : BOOL;    nIntTest  : DINT;END_STRUCTEND_TYPE
打开App,查看更多内容
随时随地看视频慕课网APP