2016-08-22 14 views
2

Я использую TwinCAT.Ads (TwinCAT 3) для связи Beckhoff plc через приложение C#. Приложение - это чтение и запись нескольких переменных plc. Я получаю сообщение об ошибке:Записать массив структуры, используя TwinCAT.Ads через приложение C#

“Unable to marshal object. Parameter name: value”

при записи массива переменной struct. Однако приложение читает его без каких-либо ошибок. Любая помощь будет оценена по достоинству. Ниже приведен пример моего кода.

Struct в Plc

TYPE Station : 
    STRUCT 
     ClusterID : STRING[10]; 
     Tech_Type : USINT; 
     Status  : BOOL; 
     Reject  : BOOL; 
     Rej_Detail : STRING[50]; 
     Rej_Catagory : USINT; 
    END_STRUCT 
END_TYPE 

класса в C#

[StructLayout(LayoutKind.Sequential, Pack = 0)] 
public class Station 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
    public string ClusterID; 
    public byte Tech_Type; 
    [MarshalAs(UnmanagedType.I1)] 
    public bool Status; 
    [MarshalAs(UnmanagedType.I1)] 
    public bool Reject; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 51)] 
    public string Rej_Detail; 
    public byte Rej_Catagory; 
} 

Я пишу с ниже код где ручки [0] является переменной ручкой и станций является массив класса с длина 5.

adsClient.WriteAny(handles[0], stations, new int[] { 5 }); 
+0

Можете ли вы опубликовать код для массива станций в ПЛК? Также объявление переменной в ПЛК и дескриптор кода C#. –

+0

Pack = 0 вздор, удалите его. –

ответ

1

Я предполагаю, что вам недостает аналога в ПЛК. Пожалуйста, убедитесь, что в вашем PLC вы объявили массив станций что-то вроде:

// I have it in a global variable list named: STG_Variables 
stat_array_Var : array [0..5] of Station; 

Этот C# код работает для меня:

TcAdsClient AdsComClient = new TcAdsClient(); 
AdsComClient.Connect(NetID_TwinCat, 851); 

int handle_array = AdsComClient.CreateVariableHandle("STG_Variables.stat_array_Var"); 

// get some test stations: 
Station station = new Station(); 
Station station2 = new Station(); 
Station station3 = new Station(); 
Station station4 = new Station(); 
Station station5 = new Station(); 

Station[] station_plural = new Station[] { station, station2, station3, station4, station5 }; 

// write some stuff to recognize that write test worked 
for (int i = 0; i < station_plural.Length; i++) 
{ 
    station_plural[i].ClusterID = "ID: " + i.ToString(); 
} 

// just use the normal WriteAny method without the new int[] { 5 } parameter! 
// send it down to the plc 
AdsComClient.WriteAny(handle_array, plural); 

Я не знаю, где ваша ручка handles[0] точки на. запись массива Station не должна заканчиваться в одной структуре в plc. Попробуйте мою версию и, пожалуйста, прокомментируйте, будет ли она работать для вас.

EDIT: Я использовал это определение класса в C#:

[StructLayout(LayoutKind.Sequential, Pack = 0)] 
public class Station 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)] 
    public string ClusterID; 
    public byte Tech_Type; 
    [MarshalAs(UnmanagedType.I1)] 
    public bool Status; 
    [MarshalAs(UnmanagedType.I1)] 
    public bool Reject; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 51)] 
    public string Rej_Detail; 
    public byte Rej_Catagory; 
} 

и создал DUT и использовал это определение структуры в ПЛКЕ:

TYPE Station : 
STRUCT 
    ClusterID : STRING[10]; 
    Tech_Type : USINT; 
    Status  : BOOL; 
    Reject  : BOOL; 
    Rej_Detail : STRING[50]; 
    Rej_Catagory : USINT; 
END_STRUCT 
END_TYPE 

и объявил переменный массив из Station с, как описано выше.

И это работает. Я могу написать структуру до ПЛК и посмотреть "ID: 0", "ID: 1", "ID: 2" и т. Д. Строки в массиве

+0

Спасибо Монжу Чжу за ваш ответ. У меня есть эта переменная массива, определенная в PLC, и Forget to упоминается в сообщении. Также 'handleles [0]' указывает на правильную переменную массива. Как я уже упоминал в сообщении, код правильно считывает значения, но бросает ошибку в письменной форме. Я ничего не вижу или делаю что-то неправильно в маршалировании свойств структуры. Не могли бы вы попытаться использовать такое же определение структуры, которое у меня есть. –

+0

Я действительно пробовал именно то определение структуры, которое у вас есть, см. Мое редактирование. –

+0

Я не вижу никаких обновлений в вашем сообщении. не могли бы вы помочь мне определить это? –