逻辑模块开发
逻辑模块具有以下特点:
- 以尽可能最快的速度接收当前、历史数据和事件进行处理。
- 在档案中记录数据和事件。
- 控制命令传入服务器。
- 发送命令。
让我们看一下一个简单模块的逻辑部分和用户界面的开发,该模块将被命名为修改Abc。要开发复杂的模块,请学习并使用源代码GitHub 上的现有模块作为示例。
逻辑实现
根据以下内容创建一个新项目类库模板。输入项目名称ModAbc.Logic,然后选择 .NET 8.0 框架。
添加依赖项ScadaCommon.dll,ScadaCommon.Log.dll和ScadaServerCommon.dll图书馆。库的二进制文件可以在RapidSCADA 安装目录中找到,或者从源代码编译。
双击项目节点解决方案浏览器打开项目文件ModAbc.Logic.csproj并编辑其属性,如下所示。
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
<RootNamespace>Scada.Server.Modules.ModAbc.Logic</RootNamespace>
</PropertyGroup>
创建一个ModAbcLogic类并复制下面的代码。该类实现了模块的逻辑。请注意,命名空间和类名必须包含ModAbc模块代码。探索源代码模块逻辑基类和服务器上下文接口来了解实现模块逻辑时可用的功能。
using Scada.Data.Models;
namespace Scada.Server.Modules.ModAbc.Logic
{
public class ModAbcLogic : ModuleLogic
{
private const int InputChannel = 105;
private const int OutputChannel = 104;
private const int UserID = 11;
private const double Threshold = 10.0;
private bool high = false;
private bool low = false;
public ModAbcLogic(IServerContext serverContext)
: base(serverContext)
{
}
public override string Code => "ModAbc";
public override void OnServiceStart()
{
Log.WriteAction("Модуль ModAbc запущен");
}
public override void OnServiceStop()
{
Log.WriteAction("Модуль ModAbc остановлен");
}
public override void OnIteration()
{
CnlData curData = ServerContext.GetCurrentData(InputChannel);
if (curData.IsDefined)
{
if (curData.Val >= Threshold)
{
if (!high)
{
ServerContext.SendCommand(new TeleCommand(OutputChannel, 1, UserID));
high = true;
}
}
else
{
high = false;
}
if (curData.Val < Threshold)
{
if (!low)
{
ServerContext.SendCommand(new TeleCommand(OutputChannel, 0, UserID));
low = true;
}
}
else
{
low = false;
}
}
}
}
}
构建项目并复制ModAbc.Logic.dll到服务器模块目录ScadaServer\Mod
接口实现
根据以下内容创建一个新项目Windows 窗体类库模板。输入项目名称ModAbc.View,然后选择 .NET 8.0 框架。
添加依赖项ScadaCommon.dll,ScadaCommon.Forms.dll,ScadaCommon.Log.dll和ScadaServerCommon.dll图书馆。
双击项目节点解决方案浏览器打开项目文件ModAbc.View.csproj并编辑其属性,如下所示。
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>disable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>Scada.Server.Modules.ModAbc.View</RootNamespace>
</PropertyGroup>
创建一个ModAbcView类并复制下面的代码。该类实现模块的用户界面。请注意,命名空间和类名必须包含ModAbc模块代码。在该示例中,该模块实际上没有用户界面,但是,需要对该界面进行最小程度的实现,以便该模块可以在管理员应用程序中使用。查看源代码模块视图基类来了解可用的功能。
namespace Scada.Server.Modules.ModAbc.View
{
public class ModAbcView : ModuleView
{
public override string Name => "Модуль ABC";
public override string Descr => "Простой пример модуля";
}
}
构建项目并复制ModAbc.View.dll到管理员库目录ScadaAdmin\Lib
运行模块
启动管理员应用程序或重新启动它(如果它已打开)。创建并打开该文件的副本HelloWorld项目中,然后找到开发的模块服务器 > 模块部分。选择模块并确保其描述正确显示。如果显示模块描述时发生错误,则很可能是模块用户界面的命名空间或类名称不准确。
激活修改Abc模块并上传项目以供执行。有关模块启动和停止的信息应显示在服务器日志中。当通道 105 的值超过常数指定的阈值 10 时,命令 0 或 1 被发送到通道 104。