VB.NET 在运行时动态创建变量

VB.NET Dynamically creating variables at runtime

我想在我的应用程序启动时或从内部调用时在 运行 时创建变量。这个要求的情况是我正在从网站上的各种设备读取数据,目前这是在应用程序中硬编码的。我想做的是创建一个应用程序,从数据库中加载所需变量的列表,并根据需要创建和分配它们。

我正在使用 INGEAR 驱动程序包来读取数据,我需要声明多个 PLC,并且对于这些 PLC 中的每一个,我都需要声明多个 ScanGroup,并且每个 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% 确定其工作原理以及如何进一步实施。

当他们在应用程序 运行ning 时添加标签时,他们会一起做一些事情:

newTag = New Tag(MyPLC, _tagName.Text)

还有

AddHandler newTag.Changed, AddressOf newTag_Changed

我假设它用于捕获更改(并从线程调用)

有没有人可以给我一些指导:

我假设这个例子是在正确的轨道上进行的,但不是 100% 确定每个项目试图实现的目标。 如果有人想了解有关 application/sample 的更多详细信息,请告诉我。

额外

所以通过这段代码,我假设在我的数据库中有 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)

创建 "Controllers" 非常简单,使用:

    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)

之后,系统扫描组将自动执行线程更新它的时间间隔。在示例项目中,动态添加标签时,使用以下内容:

AddHandler newTag.Changed, AddressOf newTag_Changed

这是我有点卡住的地方。如何在 运行 时为每个标签添加处理程序更正并捕获它们的更改

您可以使用字典或类似结构来跟踪您创建的所有项目。

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# 编写的,但它们应该能让您走上正轨。