Используя TwinCAT 3 ADS.Net для чтения из ПЛК, я пытаюсь прочитать структуру, содержащую массив структур, но при выполнении команды ReadAny происходит сбой с исключением «Unable to marshal type».
Однако прямое чтение массива структур работает нормально.
public object ReadAny(long indexGroup, long indexOffset, Type type, int[] args);
В примечании к заголовку метода ReadAny говорится: «Если тип объекта для чтения является типом массива, количество элементов для каждого измерения должно быть указано в параметре 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);