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
我假设它用于捕获更改(并从线程调用)
有没有人可以给我一些指导:
- 如何在 运行 时间从 list/array/structure
声明我的 PLC
- 如何在 运行 时为每个 PLC 声明扫描组(这些被称为每个 PLC 都有一组)
- 如何在 运行 时添加标签。
我假设这个例子是在正确的轨道上进行的,但不是 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# 编写的,但它们应该能让您走上正轨。
我想在我的应用程序启动时或从内部调用时在 运行 时创建变量。这个要求的情况是我正在从网站上的各种设备读取数据,目前这是在应用程序中硬编码的。我想做的是创建一个应用程序,从数据库中加载所需变量的列表,并根据需要创建和分配它们。
我正在使用 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
我假设它用于捕获更改(并从线程调用)
有没有人可以给我一些指导:
- 如何在 运行 时间从 list/array/structure 声明我的 PLC
- 如何在 运行 时为每个 PLC 声明扫描组(这些被称为每个 PLC 都有一组)
- 如何在 运行 时添加标签。
我假设这个例子是在正确的轨道上进行的,但不是 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# 编写的,但它们应该能让您走上正轨。