Достичь этого не так сложно. Достаточно в программе завести свою логическую переменную для каждой лампочки, и написать программу в контроллере так, что если переменная = TRUE. то лампочка включена, а если FALSE - то выключена. Таким образом, если извне мы имеем возможность посмотреть, какое значение сейчас у конкретной переменной, то мы можем знать какие лампочки у нас включены, а если сможем извне поменять ее значение, то соотвественно можем включать - выключать лампочку.
Для общения с контроллером у BECKHOFF разработан специальный протокол обмена данными ADS на базе TCP/IP. Протокол открытый. Инструментарий для работы с этим протоколом предоставляется бесплатно в виде файлов библиотек и поддерживает DLL, OCX, VB Script, J Script, .NET, Java для Windows, а также есть open source проект для реализации этого протокола под Linux.
Для своего проекта я использую Visual Basic 2010 для программ и ASP для web страниц. Соотвественно использую компоненту для .NET для VB2100 и VBScript для ASP. Я буду приводить примеры на ASP и VBScript так как это более упрощенно и наглядно.
Набор базовых функций для общения с контроллером очень простой - они просто дают возможность читать и писать в память контроллера значения... Главное знать, за что каждый байт памяти отвечает.
Итак, возвращаясь к нашим лампочкам, то описание переменной в программе есть ни что иное, как резервирование в памяти контроллера места, где хранится значение данной переменной. Весь вопрос в том, в каком месте памяти контроллер зарезервирует соотвествующую ячейку.
Для этих задач у языка программирования контроллера МЭК есть возможность фиксированной адресации переменных. Работает в контроллере BC9000 это так - есть фиксированная область в памяти размером 4 кб. И при объявлении переменной мы можем четко указать, где именно в этой области будет хранится значение этой переменной. Выглядит это так:
Код: Выделить всё
VAR_GLOBAL
MyInt :INT; (* Обычная целочисленная переменная, разместиться хрен знает где *)
MyBool :BOOL; (*Обычная булева пременная, разместиться там же*)
MySuperInt AT %MW0: INT; (* Целое число разместили в первых 2 байтах памяти *)
MySuperBool AT %MX2.0: BOOL := FALSE; (* Булева переменная в 3-м байте в первом бите*)
MySuperBool2 AT %MX2.1: BOOL := FALSE; (* Булева переменная в 3-м байте во втором бите*)
END_VAR
Теперь на VBScript пишем простенькую програмку. Для этого используем COM объект TCSCRIPT.TcScriptSync, который устанавливается при установке TwinCat.
Код: Выделить всё
Dim TcClient, VarBool, VarInt16
Set TcClient = CreateObject("TCSCRIPT.TcScriptSync") ' загружаем COM объект
Call TcClient.ConnectTo("192.168.208.188.1.1", 800) ' подключаемся к контроллеру на 800 порт
VarInt16 = TcClient.ReadInt16(&H4020, 0) ' читаем целое двухбайтовое число из памяти
VarBool = TcClient.ReadBool(&H4021, 9) ' читаем значение переменной MySuperBool
Call TcClient.WriteBool(&H4021, 9, NOT VarBool) ' меняем значение булевой переменной на противоположное
Call TcClient.WriteInt16(&H4020, 0, VarInt16 + 1) ' увеличиваем значение целого на единицу
Ну и собственно "Вот и все что было, ты как хочешь это назови", как пел известный грузинский певец... Таким образом мы можем доставать из контроллера любые данные, а также менять значение переменных, управляя ходом исполнения программы внутри контроллера. Можно циклично опрашивать переменные в контроллере и ловить события типа "лампочка включилась" и по этому событию исполнять какую либо операцию на компьютере. А сделать web-интерфейс для удаленного включения лампочки вообще превращается в простейшую задачу. Вообщем, имея возможность коммуникации с контроллером он превращается в полнофункциональный модуль в единой системе "УМНЫЙ ДОМ"