在组态软件中开发脚本功能的方法

一、概述

大多数的组态软件都具有脚本功能,脚本可能是VBS、Lua、C#等语言,也可能是厂家自定义的一种语言。通过脚本,组态软件可以实现非常灵活的功能。

脚本的功能,基本可以定义为:读入外部数据,改变可视化元素。外部数据,最重要的是采集到的数据,也可能是用户创建的配置文件。而改变可视化元素,则包括创建、改变位置、改变状态、删除等操作。

本文通过一个示例,介绍在组态软件中实现脚本功能的方法。示例有以下假定:

开发语言C#
脚本语言C#
软件类型WPF

二、示例描述

本文所使用的示例是简单且具有代表性的。本文所使用的脚本为:

string x = GetParameter("A"); //读取参数A,作为X位移
string y = GetParameter("B"); //读取参数B,作为Y位移

string id = CreateComponent("rect"); //在画布中创建一个矩形
MoveComponent(id, x, y); //将矩形移动到参数所定义的位置

可以看出,脚本首先读入外部数据(通过GetParameter方法),然后对可视化元素进行了改变(通过CreateComponent创建,通过MoveComponent移动)。读者在此肯定会提出疑问,GetParameter这些函数是哪里来的?这些是脚本跟主程序交互的API,我们会在一个类中事先定义好,然后传递到脚本中,下文会有详细介绍。

然后我们看软件的界面,如下图所示:

 界面左侧,有两个框输入两个参数,然后是输入脚本内容,还有一个运行按钮。在右侧,则是一个画布,用于绘制脚本产生的效果。

三、开发过程

3.1 项目准备

1、新建一个WPF工程,然后通过NuGet获取Microsoft.CodeAnalysis.CSharp.Scripting包。

2、在WPF中创建好界面需要的内容(也就是各输入框、按钮、Canvas)。

3.2 书写实际执行代码

对应于脚本,实际执行的代码包括获取参数、创建矩形和移动矩形。在本示例中,我们全在MainWindow.cs中实现功能。

private string GetParameter(string name)
{
    switch (name)
    {
        case "A":
            return ParaA.Text;
        case "B":
            return ParaB.Text;
        default:
            return "";
    }
}

private string CreateComponent(string type)
{
    if (type == "rect")
    {
        Random rand = new Random();
        string id = $"com{rand.Next(10000):D4}";
        var rect = new Rectangle() { Name = id, Width = 200, Height = 100, Fill = Brushes.Red };
        RegisterName(id, rect);
        DisplayCanvas.Children.Add(rect);
        return id;
    }
    return "";
}

private void MoveComponent(string para)
{
    string[] parts = para.Split(',');
    string id = parts[0];
    double x = double.Parse(parts[1]);
    double y = double.Parse(parts[2]);

    var rect = FindName(id) as Rectangle;
    Canvas.SetLeft(rect, x);
    Canvas.SetTop(rect, y);
}

GetParameter方法,根据参数的内容,返回相应输入框的内容。在实际情况中,也可能是根据采集数据的ID,获取采集数据的值。

CreateComponent方法,创建了一个红色矩形,添加到画布中,并返回了矩形的Name。

MoveComponent方法,假定参数的格式是"id,x,y",分解后,找到矩形并移动它。

3.3 书写脚本交互类

也就是定义脚本与主程序交互的API。本示例中,没有传入数据对象,而是直接传入函数委托,这样的脚本中可以主动拉取数据或推送动作。

新建一个ScriptInteract类,内容如下所示:

public class ScriptInteract
{
    private Func<string, string, string> Callback;

    public ScriptInteract(Func<string, string, string> callback)
    {
        Callback = callback;
    }

    public string GetParameter(string name)
    {
        return Callback("GetParameter", name);
    }

    public string CreateComponent(string type)
    {
        return Callback("CreateComponent", type);
    }

    public void MoveComponent(string id, string x, string y)
    {
        Callback("MoveComponent", $"{id},{x},{y}");
    }
}

由于API很多,为每一个API方法创建一个委托过于繁琐,故只创建一个通用委托,输入函数名和参数,返回一个字符串。

可以看到,上文中的脚本所调用的“未知函数”,就是ScriptInteract类中的方法。

3.4 主程序与交互类的关联

交互类中只有一个通用委托,我们在MainWindow.cs中定义此委托的实现:

private string Callback(string func, string para)
{
    switch (func)
    {
        case "GetParameter":
            return GetParameter(para);
        case "CreateComponent":
            return CreateComponent(para);
        case "MoveComponent":
            MoveComponent(para);
            return "";
        default:
            return "";
    }
}

可以看到,通过回调函数调用了之前在MainWindow.cs中定义的实际执行函数。

然后把此函数作为参数传入到ScriptInteract对象中即可。

ScriptInteract interact = new ScriptInteract(Callback);

3.5 执行脚本

执行脚本,也就是点击运行按钮的动作。先摆出代码:

private void RunBtn_Click(object sender, RoutedEventArgs e)
{
    ScriptInteract interact = new ScriptInteract(Callback);

    var code = ScriptText.Text;
    var options = ScriptOptions.Default
        .WithImports("System")
        .WithReferences(typeof(ScriptInteract).Assembly);

    var script = CSharpScript.Create(code, options, typeof(ScriptInteract));
    script.RunAsync(interact).Wait();
}

此代码,先创建一个ScriptInteract对象,关联了MainWindow.cs中的回调函数。然后把此参数传给脚本对象。那么,在脚本中就可以调用ScriptInteract所定义的API。

至此,所有功能开发完成。

示例Demo下载

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SuperCx 是面向过程监控与工业自动化的 HMI/SCADA 软件开发平台(俗称组态软件),运行于Windows系统上,可以广泛应用于需要数据采集、对象控制、过程监视与控制等的各种应用,如:石油、化工、钢铁、电力、环保、机械、楼宇自动化等行业。 丰富的图形系统 先进的图形绘制技术 包括矩形、菜单、按钮、定时器、曲线、报警表等近20种基本图形组件,支持插入各种格式图片。 图形对象均是 COM 对象,均能通过脚本控制,并能触发事件。 图形能以任意点为心、任意角度旋转,可以相对不同位置水平和垂直方向缩放。 具备包括过渡色等多达 23 种填充风格,水平、垂直方向能分别指定不同的填充方向和填充百分比。 画面窗口分为 30 个层,每个图形对象在其一层,层可以锁定和隐藏。 支持使用图像文件作为画面背景。 按钮对象可以在常规、鼠标掠过、按下、禁止等四种状态下显示不同的图片。 支持随意绘制3D管道,并具有液体流动效果。 趋势曲线支持多笔、多坐标轴,能显示实时和历史数据,具备缩放、滚动,在线添加或删除画笔等操作。 报警表能同时显示多个数据节点的报警记录,具备过滤、排序、确认报警等功能。 兼容第三方ActiveX控件 可以使用属性编辑器修改控件属性。 支持对控件属性进行动画连接。 允许脚本调用控件。 控件事件能触发脚本动作。 可由用户完全自由扩展的图库 图库由符号和模块两种不同形式的复合元素组成。 符号和模块均能由用户创建并进行管理。 支持用户扩展符号属性。 用户制作好的符号可以直接拖放到符号库保存。 可以把制作好的画面以模块的形式保存到模块库重用。 高效全面的动画实现 全部类型对象的所有属性均能连接动画。 数据源可以是变量,更可以是复杂的表达式。 数据源表达式用到的变量可以是标签变量,也可以是画面的局部变量。 支持表格、线性、表格、直接等四种不同的动画连接方式。 优化的动画刷新,效率更高。 强大的脚本语言 强大的功能 使用VBScript作为脚本语言,VBScript脚本语言是微软VBA的一个子集。VBScrip易学易懂,功能强大,广泛使用于web动态网页的开发。 VBScript具备丰富的函数库,可以轻松与第三方基于COM模型的软件系统交换,如使用ADO访问数据库,调用Excel等。 强大的编辑器 支持事件响应函数框架自动生成。 结合上下文列出方法和属性表帮助用户输入。 提示函数参数。 根据语法彩色显示文本。 伸缩显示代码块。 语法错误定位。 灵活的报表系统 报表生成向导能快速生成常用格式报表。 不仅可以打印SuperCx内置历史数据库,更可以打印第三方关系数据库。 类似水晶报表式的报表格式编辑,功能更加强大,可灵活定义输出格式,如报警数值特殊颜色显示等。 支持毫秒级时间打印。 支持直接调用Excel输出报表。 标签:SuperCxHMI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值