Отправить массив из C# в TwinCat 3 через ADS.Net
Я хочу создать автоматизированный графический фонтан, используя TwinCat 3 для управления клапанами и Visual Studio C# для обработки изображения, которое нужно показать на фонтане.
Окончательная форма программы обработки изображений - это двоичный массив изображений (прилагается): Результат обработки изображений 1; Результат обработки изображения 2;
Я хочу использовать окончательную форму обработки изображений для управления клапаном на машине (клапан включится, когда будет 1, и клапан отключится, когда будет 0). Я очень новичок в TwinCat 3, особенно с ADS Библиотека.
Образец из infosys beckhoff не очень полезен для меня, кто-то может мне помочь с этим?
Благодарю вас
2 ответа
Я создал пример консольной программы, которая подключается к локальному ПЛК через порт 851 и записывает массив из 100 bools с именем "boolArray" в MAIN TC3 (TwinCAT 3):
using System;
using TwinCAT.Ads;
using System.Threading;
namespace WriteArrayToPLC
{
class Program
{
static void Main(string[] args)
{
TcAdsClient adsClient = new TcAdsClient();
byte[] boolArray = new byte[100];
// Fill array with 010101010...
for (int i = 0; i < 100; i++)
{
boolArray[i] = (i % 2 != 0) ? (byte)1 : (byte)0;
}
// Connect to PLC
try
{
if (adsClient != null)
{
Console.WriteLine("Connecting to PC");
adsClient.Connect(851);
}
}
catch (Exception err)
{
Console.WriteLine(err.Message);
adsClient = null;
}
if (adsClient != null)
{
try
{
// Get the handle for the array
int handle_array = adsClient.CreateVariableHandle("MAIN.boolArray");
// Write the array to PLC
Console.WriteLine("Writing the array at handle: " + handle_array.ToString());
adsClient.WriteAny(handle_array, boolArray);
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
// The end
Console.WriteLine("Done");
Thread.Sleep(3000);
}
}
}
}
Этот код хорошо представляет запись массива в TC3.
Я использовал System.Runtime.InteropServices.
MarshalAs
с TwinCAT 3.1.4022.0
Объявление массива:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] data;
И тогда я могу отправить его через
TcAdsClient.WriteAny( ixGroup, ixOffset, data )