亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 TwinCat 到 C# 讀取包含結構數組的結構

如何從 TwinCat 到 C# 讀取包含結構數組的結構

C#
拉莫斯之舞 2023-07-23 14:20:52
使用 TwinCAT 3 ADS.Net 從 PLC 讀取數據,我嘗試讀取包含結構數組的結構,但 ReadAny 命令因“無法編組類型”異常而崩潰。不過,直接讀取結構數組效果很好。public object ReadAny(long indexGroup, long indexOffset, Type type, int[] args);ReadAny方法的頭部注釋中寫道:“如果要讀取的對象類型是數組類型,則必須在參數args中指定每個維度的元素數量?!钡菍τ诎Y構數組的結構,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);
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

我測試成功以下代碼:


代碼:


    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_STRUCT

END_TYPE

AdsStruct 在 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_STRUCT

END_TYPE


TYPE InnerStruct :

STRUCT

    bBoolTest : BOOL;

    nIntTest  : DINT;

END_STRUCT

END_TYPE


查看完整回答
反對 回復 2023-07-23
  • 1 回答
  • 0 關注
  • 242 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號