2015-08-06 6 views
0

Я хотел бы создавать переменные во время выполнения приложения или при вызове изнутри. Ситуация для этого требования заключается в том, что я читаю данные с разных устройств по всему сайту, и в настоящее время это жестко закодировано в приложении. Я хотел бы создать приложение, которое загружает список из базы данных требуемых переменных и создает и назначает их по мере необходимости.VB.NET Динамически создавая переменные во время выполнения

Я использую пакет драйверов INGEAR для чтения данных, мне потребуется объявить несколько ПЛК, и для каждого из этих ПЛК мне нужно будет объявить несколько групп сканирования, и каждая группа ScanGroup будет иметь несколько тегов для нее. Затем прочитанные данные будут записаны в базу данных для каждого чтения.

Заявляя каждый из этого во время разработки (с приложением образца InGear обеспечивает) является

' ***************************** 
' * Initialize Controller class 
Public MyPLC As New Controller 

' ****************************** 
' * Initialize TagGroup class 
Public scanGroup As New TagGroup 

' ****************************** 
' * un-initialized Tag class 
Dim WithEvents newTag As Tag 

Используя «WithEvents» они в состоянии создать тег динамически, но не 100% уверен в том, как это работает и как реализовать это дальше.

Когда они добавляют тег, когда приложение работает, они делают что-то вместе:

newTag = New Tag(MyPLC, _tagName.Text) 

, а также

AddHandler newTag.Changed, AddressOf newTag_Changed 

Что я предполагаю, что используется для захвата изменения (и вызвать из нить)

Есть ли кто-нибудь, кто может дать мне рекомендации:

  • Как я могу объявить мой ПЛК во время выполнения из списка/массива/структур
  • Как я могу Объявляю scangroups для каждого ПЛКА во время выполнения (они известны как там будет набор для каждого PLC)
  • Как Могу ли я добавить теги во время выполнения.

Я предполагаю, что пример идет по правильному пути, но не был на 100% уверен, что каждый элемент пытается достичь. Если кто-то хочет получить более подробную информацию о приложении/образце, пожалуйста, дайте мне знать.

ДОПОЛНИТЕЛЬНЫЕ

Так работает через этот код, я буду считать, что в моей базе данных у меня есть 3 таблицы.

PLC Table - PLC_ID, PLC Name, PLC_IPaddress 
SCAN Group - GROUP_ID, Group_Name, Group_Time 
TAGS - TAG_ID, PLC_ID, GROUP_ID, Tag_Value 

Переменные:

Dim ALLPLCs As New Dictionary(Of String, Controller) 
Dim ScanGroups As New Dictionary(Of String, TagGroup) 
Dim AllTags As New Dictionary(Of String, Tag) 

Создание "контролеры" будет достаточно просто с помощью:

For Each row In PLCTable.Rows 
     ALLPLCs.Add(row("PLC_ID"), New Controller(row("PLC_IP"), 1000)) 
    Next 

Создание своих групп ниже, но начинают беспокоиться о отслеживания элементов. Это позволит создать его с именем, как «1_1», «2_4» с первым номером является PLC_ID и второе GROUP_ID

For Each row In ScanGroupTable.Rows 
     For Each thePLC In ALLPLCs 
      Dim tg As New TagGroup 
      tg.Controller = thePLC.Value 
      tg.ScanningMode = TagGroup.SCANMODE.ReadOnly 
      tg.Interval = Convert.ToInt16(row("GROUP_TIME")) 
      ScanGroups.Add(thePLC.Key & row("GROUP_ID"), tg) 'Add the 1 second scangroup 
     Next 
    Next 

Теперь следующий вопрос, как добавить свои теги в словарь для каждого PLC_ID и GROUP_ID. Любое руководство по этому вопросу?При создании статического тега я делал бы что-то по строкам ниже, но как это сделать правильно, выбирая правильный PLC и Scangroup?

Dim tg As New Tag 
    tg.Controller = "CONTROLLER" 
    tg.Name = "TAG_NAME" 
    ScanGroups.Add(tg) 

После этого система scangroups автоматически выполняет потоки для обновления на своем интервале. В примере проекта, при добавлении тега динамически, использование следующее:

AddHandler newTag.Changed, AddressOf newTag_Changed 

Здесь я немного застрял. Как добавить обработчик для каждого из тегов во время выполнения и откорректировать их изменения

+1

Вы действительно должны показать нам интерфейсы, с которыми вы работаете, и формат данных, которые вы загружаете, что сделало бы этот вопрос намного лучше. – Enigmativity

+0

Привет @Enigmativity, Не знаете, какие интерфейсы вы имеете в виду. Рад предоставить любую информацию, относящуюся к этому. На этом этапе типы данных i будут получать от каждого тега, может быть String, Integer или Float –

+0

. Интерфейсом будут типы классов и подписи методов и свойств, которые они поддерживают, и являются «IDisposable» и т. Д. Именно то, что должно быть в коде для «Public Interface IController», например. Достаточно для того, чтобы кто-то запрограммировал код, чтобы дать вам ответ. – Enigmativity

ответ

1

Вы можете использовать словарь или подобную структуру, чтобы отслеживать все элементы, которые вы создаете.

public Dictionary<string, Controller> AllPLCs { get; set; } 
public Dictionary<string, TagGroup> ScanGroups { get; set; } 
public Dictionary<string, WithEvents> AllNewTags { get; set; } 

Здесь вы можете загрузить из базы данных и добавить в словарях в цикле, используя имя в качестве ключа строки.

foreach(var foundItem in LoadedData) 
{ 
    AllPLCs.Add(foundItem.Name, new Controller()); 
    ScanGroups.Add(foundItem.Name, new TagGroup()); 
    AllNewTags.Add(foundItem.Name, new WithEvents()); 
} 

Позже вы можете получить доступ к каждому из следующим образом:

foreach(var foundItem in LoadedData) 
{ 
    Controller currentController = AllPLCs[foundItem.Name] as Controller()); 
    TagGroup currentGroup = ScanGroups[foundItem.Name] as TagGroup; 
    WithEvents currentEvent = AllNewTags[foundItem.Name] as WithEvents; 
} 

Мои примеры кода в C#, но они должны получить Вас на правильном пути.

+0

Спасибо, что делает «WithEvents» на самом деле? У меня будет попытка на следующей неделе, когда у меня снова будет свободное время. –

+0

Это было основано на «Dim WithEvents newTag As Tag» из вашего кода. При необходимости отрегулируйте. :) –

+0

Спасибо, я просто скопировал код из предоставленного примера проекта, какие-либо указания о том, как я могу создать потоки, необходимые для каждого чтения, и получить их результаты во время выполнения? –