20 апреля 2011 г.

TwinCAT ADS: Чтение/запись данных

Один из самых актуальных и востребованных вопросов в АСУ ТП — это разработка недорогих (но надёжных) систем удалённой диспетчеризации "под ключ". Для этих целей у BECKHOFF имеется очень хорошее решение — TwinCAT ADS, набор бесплатных программных средств для организации обмена данными между TwinCAT/Windows-устройствами.


TwinCAT ADS поддерживает платформы DLL, OCX, VB Script, J Script, .NET, Java и позволяет осуществлять удалённый контроль за любым ПЛК производства BECKHOFF. Сама по себе организация связи и обмена данными при помощи функционала TwinCAT ADS элементарна, но степень сложности приложения, разработанного для диспетчеризации, в большинстве случаев ограничивается лишь профессиональным уровнем программиста.

Рассмотрим пример простейшего обмена данными между ПК (Windows XP) и ПЛК (Windows CE 6.0) с помощью TwinCAT ADS, а заодно напишем ADS-клиент. Для этого требуется наличие установленных пакетов TwinCAT I/O, Visual Studio (в моём случае версия 2010 года), контроллер CX9010 c Ethernet TCP/IP, кабель связи, блок питания и час свободного времени. Подключаем наш CX9010 к ПК, ищем по DHCP с помощью TwinCAT System Manager. С этого момента мы знаем AmsNetId нашего ПЛК и можем в TwinCAT PLC Control написать простенькую программу с тремя переменными. Допустим они будут такими:

PROGRAM MAIN
VAR
   diSignal AT %I*: ARRAY [1..8] OF BOOL;
   doSignal AT %Q*: ARRAY [1..8] OF BOOL;
   aoSignal AT %Q*: INT;
   iVar1: INT;
   iVar2: BYTE;
END_VAR


Видно, что массивы diSignaldiSignal и переменная aoSignal залинкованы на модули дискретных и аналоговых входов/выходов. Но для нас это не имеет значения. В нашем приложении, которое мы собираемся писать на Visual Studio C#, будут использоваться iVar1 (чтение), iVar2 (запись) и, как пример с использованием массива, doSignal (запись). Открываем Visual Studio C#, подключаем библиотеку TwinCAT.ADS.dll, по умолчанию расположенную по адресуC:\TwinCAT\ADS Api\.NET\v2.0.50727\. Открываем конструктор форм и первым делом в обязательном порядке прописываем две строки, подключающие соответствующие сервисы:

using System.IO;
using TwinCAT.Ads;


Объявляем дескрипторы искомых переменных для записи/чтения и создаём ADS-клиент:

private int hVar1, hVar2, hArray;            //Дескрипторы переменных
private bool[] bArray;                       //Массив
TcAdsClient tcClient = new TcAdsClient();    //Создание ADS-клинета


Поскольку мы уже подключались к CX9010 с помощью TwinCAT System Manager, то нам известен его уникальный сетевой идентификатор (5.3.101.187.1.1), ровно как и порт (801) для подключения. Организуем соединение нашего ADS-клиента с ПЛК:

if (!tcClient.IsConnected)
{
   try
   {
      //Подключение к ПЛК по AmsNetId
      tcClient.Connect("5.3.101.187.1.1", 801);
   }
   catch (Exception errConnection)
   {
      MessageBox.Show(errConnection.Message);
   }
}
//Уничтожение дескрипторов переменных
else
{
   tcClient.DeleteVariableHandle(hVar1);
   tcClient.DeleteVariableHandle(hVar2);
   tcClient.DeleteVariableHandle(hArray);
   tcClient.Dispose();
}


Теперь можно получить доступ сначала к дескрипторам искомых переменных, а затем и непосредственно к записи/чтению. Для этого необходимо и достаточно знать полное наименование переменной. Если она прописана глобально, то получить дескриптор можно по имени .[имя_переменной], если же в к конкретном POU, то вот так: [имя_POU].[имя_переменной].


Теперь наш ADS-клиент может осуществлять запись и чтение значений искомых переменных, дело за малым. Для того, чтобы он делал это циклически, я бы рекомендовал ставить таймер. Интервал "тика" зависит от задачи, в этом примере он равен 100 мс. Ну и конечно же неплохо было бы прописать этот "тик" в программе:

private void mainTimer_Tick(object sender, EventArgs e)
{
   UpdateAllData();
}


Напоследок хотелось бы добавить, что не лишним будет уничтожение всех дескрипторов и полный дисконнект нашего ADS-клиента в случае закрытия приложения. Это делается примерно так:

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
   tcClient.DeleteVariableHandle(hVar1);
   tcClient.DeleteVariableHandle(hVar2);
   tcClient.DeleteVariableHandle(hArray);
   tcClient.Dispose();
}


Всё, теперь можно "навернуть" дополнительных фишек, кнопочек, чекбоксов и наслаждаться результатом проделанной работы. Проверить работоспособность ADS-клиента можно также и из TwinCAT PLC Control.

Комментариев нет:

Отправить комментарий