Architecture

TwinCAT Scope2

TwinCAT Scope2 结构

TwinCAT Scope2由以下几个分级元素构成：

  • Scope: Scope建立最高级的结构层。Scope下的所有分支元素都遵循一样的记录设定。 TwinCATScopeView2_Elements_Scope.htm
  • Chart: 绘图工作在图表上完成。它包含了规定Scope公用时间的X-轴。每个图表包含一个用于配置当前视图的工具条。在第二条工具条中显示了三个时间分别是记录的开始时间(B) 、结束时间 (E) 以及图表原点相对开始时间的当前位置 (P)。格式为：“小时.分钟.秒.毫秒”。类似颜色等基本属性可以在chart设定中改变。TwinCATScopeView2_Elements_Chart.htm
  • (Y-)Axis: 通过Y轴可以在一个图表中组合多个通道。每个轴定义了相连通道的作图范围，可进行手动或自动缩放。 TwinCATScopeView2_Elements_Axis.htm
  • Channel: 通道显示了需要分析的系统变量。他们被分配以确定的地址来采集信号 。TwinCATScopeView2_Elements_Acquisition.htm 类似颜色或线宽等基本属性可以在channel设定中改变。TwinCATScopeView2_Elements_Channel.htm

窗口

上述元素均有一个属性窗口。所有窗口可以通过双击object browser 中的元素标签或在View菜单中选择打开。

Scope窗口以任意次序和大小被安排在主窗口中央。也可以标签形式将他们并列在一起。Scope窗口的布局与Chart窗口是一致的。所有其他的窗口都可以以多种方式锚定在主窗口的边界上，也可以作为屏幕上的一个独立窗口放置。在自由窗口中亦可放置多个标签页。已锁定的窗口可以通过其顶部的针形标志解锁。窗口边上以标签显示的隐藏窗口是锚定的，当鼠标在上面停留时它将展开一小段时间。

以下菜单条目是所有属性窗口的解释：

配置

下面解释如何创建或改变Scope的配置：

添加元素：

  • File -> Add -> Element -> New: 添加一个新的元素，若其没有上级元素，则会创建。
  • ToolBar -> New Element Button ->: 添加新元素。
  • object browser快捷菜单 -> Element -> New: 添加新元素。
  • 从object browser 中的 acquisition 来创建通道：菜单条目：target browser。

移除元素：

  • File -> Delete: 移除选中的元素及其所有子元素。
  • Toolbar -> Delete-Button: 移除选中的元素及其所有子元素。
  • object browser 右键菜单-> Delete: 移除选中的元素及其所有子元素。
  • 在object browser 中选中一个元素并点击<Del> 来移除它及其子元素。

移动/复制元素：

  • 在object browser 中拖放来移动元素。如果你将一个元素从同一个Scope移至另一个，那它仅仅被复制了，元素依然存在于原来的Scope中。
  • 在运行时依然可以移动元素。
  • 在object browser 中单机右键，然后使用复制和粘贴选项“copy / paste” 。

保存Scope配置：

  • File -> Save :保存当前配置。
  • File -> Save As: 以新名字保存当前配置。
  • object browser 右键菜单 -> Save:保存当前配置。
  • object browser 右键菜单 -> Save As: 以新名字保存当前配置。

读取示波器配置：

  • File -> Add -> Scope-> Load:打开已有的配置文件，选择 .sv2文件。
  • object browser 右键菜单-> Add ->Scope-> Load:打开已有的配置文件。
  • 从file browser 拖动一个示波器配置文件(.sv2)到object browser 中。
  • File -> Recent Files:最近使用文件列表。
  • object browser 右键菜单 ->Recent Files: 最近使用文件列表。

保存数据 (包括配置)：

  • 见菜单： Scope设置。

加载包含数据的示波器:

  • 与读取Scope配置相同，不过要选择.svd文件。

失效/使能通道：

通道可以被关闭，因此它也将不会被记录。但是已关闭的通道仍将被保存在配置中。

  • object browser 中通道的右键菜单 -> Disable / Enable: 按要求设置。


Scope Settings

TwinCAT Scope2

Scope 设置

打开scope settings 窗口配置记录设置。

记录设置必须在连接相关的Scope Server之前完成：

Record Mode 记录模式

  • Record Time（记录时间）: 设置记录缓冲区的长度。
  • File-Store（文件存储方式）: 文件存储选项决定server 是使用本地文件还是仅仅使用系统内存来存储记录的数据，对于像闪存这样的寿命受到数据读写次数的限制的设备，由此可以决定对记录数据的数量及系统特性的最优考虑。

Start Record 开始记录

  • Auto Start（自动开始）：当点击记录按钮时立即开始记录。
  • Trigger Start（触发开始）：当关联的触发事件发生时才开始记录。

StopRecord 停止记录

记录模式决定当记录时间到达时如何反应。

  • Ring Buffer（环形缓冲）：server 从头重写缓冲区。因此记录的开始时间（见图表左上角）也相应增加了。 如要停止记录必须由Scope给出指令（例如按下停止按钮）。
  • Auto Stop（自动停止）: 当达到记录时间时自动停止记录。也可从Scope手动停止。

Common 普通

  • Comment（注释）：在此输入注释。

Scope工具条

Scope工具条包含了开始记录、停止记录及存储数据的指令。以下是按照如下所示图片从左到右的分类解释：

  • New-Buttons（新建）:在现行配置中添加新元素。
  • Delete（删除）: 删除当前元素。
  • Start Record（开始记录）: Scope 连接相关的Sever并且发送记录设置及通道属性。如果先前记录的数据仍然有效则会弹出一个对话框询问是否保存最新的数据。一旦开始记录则不能再更改Scope设置、改变捕获或通道数。
  • Stop Record（停止记录）: 停止正在运行的记录并且已接收的数据保持有效。这时又可以改变配置，但如果不保存已记录的数据，则它们将会丢失。
  • Save Data（保存数据）: 一旦记录停止，接收到的数据就可以被保存到本地 .svd 文件。该文件包括已接受的数据及配置设定。

Run 菜单

上述功能都能通过Run菜单中的选项实现。Run菜单上还设置了更多关键设置。

额外的两个输出功能被放置在Run菜单中：

  • Export to CSV（CSV输出）: 以一般可用的文件格式通过文本形式输出存储记录的数据。输出的文件包含一个表格。段落间由空行隔开，单元格有制表机生成。输出的第一段包含了Scope设置及记录的概述，例如：名称，记录开始时间和结束时间。
    Name | Scope01
    File
    StartRecord | 128783093223690000 | Donnerstag, 5. Februar 2009 | 13:08:42
    EndRecord | 128783093339880000 | Donnerstag, 5. Februar 2009 | 13:08:53

    第二段包含了每个连接获取数据的通道的标题：

    Name | DREIECK
    NetId | 172.16.8.205.1.1
    Port | 801
    SampleTime[ms] | 1
    SymbolBased | TRUE
    SymbolName | MAIN.DREIECK
    SymbolComment
    IndexGroup | 16448
    IndexOffset | 608
    Data-Type | ADST_REAL32
    VariableSize | 4

    最后一个表格带有时间戳 (起始时间的偏移量) 和相关的值：

    0 | -1,03799391
    1 | -1,03599393
    2 | -1,033994
    3 | -1,031994
    4 | -1,029994
    5 | -1,027994
    6 | -1,02599406
    7 | -1,02399409
    8 | -1,02199411
    9 | -1,01999414
    10 | -1,01799417
    11 | -1,01599419
    12 | -1,01399422
    13 | -1,01199424
    ... ...
  • Export to Binary（二进制输出）: 二进制输出适用于大量数据。它的形式与.csv相似，但二进制形式不含任何行或列的标记。
    Variable | Size (Bytes) | DataType
    MAIN-HEADER
    HeaderSize | 8 | Int64
    NameSize | 4 | Int32
    Name | NameSize | Array of Char (1Byte)
    StartTime | 8 | Int64
    EndTime | 8 | Int64
    ChannelCount | 4 | Int32
    Variable | Size (Bytes) | DataType
    Channel - Header #1
    ChannelHeaderSize | 8 | Int64
    NameSize | 4 | Int32
    Name | NameSize | Array of Char (1Byte)
    NetIdSize | 4 | Int32
    NetId | NetIdSize | Array of Char (1Byte)
    Port | 4 | Int32
    Sample Time | 8 | Int64
    SymbolBased | 1 | bool (as byte)
    SymoblNameSize | 4 | Int32
    Symbolname: SymbolNameSize Array of Char (1Byte)
    CommentSize | 4 | Int32
    Comment | CommentSize | Array of Char (1Byte)
    IndexGroup | 8 | Int64
    IndexOffset | 8 | Int64
    DataTypeSize | 4 | Int32
    DataType | DataTypeSize | Array of Char (1Byte)
    DataTypeId | 4 | Int32
    VariableSize | 4 | Int32
    Samples in File | 8 | Int64
    Data in File | 8 | Int64
    File-StartPosition | 8 | Int64
    Channel - Header #2
    ...
    Channel-Header #MainHeader.ChannelCount
    Variable | Size (Bytes) | DataType
    Data Channel #1
    DataPoint #1
    Timestamp | 4 | UInt32
    Value | ChannelHeader1.VariableSize | ChannelHeader.DataType
    DataPoint #2
    ...
    DataPoint ChannelHeader #1.Samples In File
    Data Channel #2
    ...
    Data Channel #MainHeader.ChannelCount

使用命令行来转换文件类型

Scope数据文件(.svd) 生成后可以通过命令行将其转换成支持的形式。使用参数 -c 调用 ScopeView2.exe 选择转换。添加源文件与目标文件的名称。

  • Example: "TwinCatScopeView2.exe -c C:\Scope2\DataFile.svd C:/Scope2/BiaryFile.svb"

在没有额外用户输入的情况下输出时，请确保ScopeServer运行并且源文件存在。

注意：已存在的目标文件会在没有请求的情况下直接被覆盖。


Tutorial_Overview

TwinCAT Supplement: Scope 2

教程 - TwinCAT Scope 2

TwinCAT Scope 2是一个图形化分析工具，它能根据时间从不同的软件任务中显示变量的状态。本教程将逐步地例证TwinCAT 附加产品TwinCAT Scope 2的优势所在。

1. 安装及版本号

2. TwinCAT PLC 案例程序

3. 启动 Scope View 2

4. 插入通道

5. 首次记录

6. 信号显示

7. 运行时间的信号分析

8. 保存及输出数据

9. 触发器控制记录

10. 术语表


Tutorial_Installation

教程 - 安装和版本号

安装:

运行TcScope2.exe并且按照指引安装。如果您购买了Scope 2的许可，在安装时输入产品密钥之后您将可以使用无限制的完全版。否则您可能要输入"DEMO"作为产品密钥。DEMO版可以在30天内使用全部功能。

版本号:

为了提供可能的支持，报告您使用的Scope 2的版本号非常重要。下面的截图将帮助您找到它。

- Scope View 2

在 Scope View 2 您可以找到菜单项 "Info"。子选项 "About"打开如下图片，包含两个版本号。一个是Scope本身的版本号，另一个是在提供支持时需要的产品版本号。

- Scope Server

在任务栏（任务栏通告区）中可以看到Scope Server。在右键出现的菜单中选择子选项'Info'（见下图）。


Tutorial_PlcProject

教程 - TwinCAT PLC 样例程序

本教程将对使用 TwinCAT Scope 2有所帮助，并且提供PLC程序。该程序提供了一系列的信号，例如 Peak- 或 Sinus- 函数。您可以使用示波器来显示并分析它们。

用以下链接打开PLC程序。打开程序后您需要登录目标设备。最后，在对Scope View进一步操作之前，您需要启动PLC。


Tutorial_FirstTime

教程 - Scope View 2

安装后您可以按以下方式启动 Scope View 2，Windows Start ð Programms ð TwinCAT System ð TwinCAT Scope 2。打开后，会显示如下图所示的默认界面。

在默认界面上标记成红色的标签中可以看到所有配置菜单。如下图所示，每个标签都可以被移动到Scope View中的其他地方。也可以将各个窗口关闭，关闭的窗口可以在View菜单中重新打开。

每次ScopeView 2重启后，设定都会被读取。这些设定称为 用户-默认-设定，并为每一个登录系统的用户保存，所以您可以创建自己的Scope View。此外还有其他属于用户-默认-设定的关于标准记录时间或信号显示的设定。可以在Options ð Default Settings 中设置(见下图)。这些设定也将为每个用户单独保存。


Tutorial_ObjectTarget

教程 - 插入通道

Target Browser 是Scope View 2的一个组成部分。在Target Browser 中，显示了您注册的 TwinCAT 系统管理器路径。颜色提示了每个设备的状态。红色意味着设备未连接或 TwinCAT在停止模式，蓝色代表 TwinCAT在配置模式，绿色表示系统运行。

如果设备在运行状态下，你可以在每个端口或任务的数据结构中浏览所有基本数据类型。如下图所示，对每个通道都可以进行复选，通过右键都可以执行指令"To Channel"。

现在您可能发现一个由Scope、chart、Axis和选定的通道组成的结构已经建立了。每个通道都自动分配了一个可编辑的颜色。

你也可以手动添加这些对象，通过工具栏上的按钮或是右键对象的标志，在 当前Scope上插入新的对象。


Tutorial_SaveExport

教程 - 保存及输出数据

在记录时间到或手动命令停止记录后，您可以对数据进行评估和存档。您可以在运行菜单-run下找到必要的Scope View 2菜单。

您可以选择保存数据-"Save Data"将数据保存为svd文件。通过这个数据文件您可以用TwinCAT Scope View 2再次查看您的记录。

在停止记录后，如果您要打开选项-输出至CSV "Export to CSV" 和 输出至二进制"Export to Binary" 对应的数据文件，两个选项都会出现一个定义存储位置的对话框。如果您选择"Export to CSV" ，您可以选择.CSV 或 .txt 文件类型。在下图中您将看到将如何在表格处理程序中输入一个.CSV文件的例子。


Tutorial_Glossar

教程 - 术语表

术语 | 描述
Scope2 | 整个产品，包含了 ScopeView2 和 ScopeServer。
Scope Server | Scope Server 是 scope2的登录部分。 每个Scope都试图连接到一个或多个Sever以记录数据和打开存储文件。TwinCATScopeServer_Intro.htm
Scope View 2 | Scope View 2 是Scope2 的用户界面。所有配置和可视化工作都在此完成。 TwinCATScopeView2_Architecture.htm
Scope | Scope是 ScopeView2中的最高配置项。连接设置，记录参数和动作在这里定义。 TwinCATScopeView2_Elements_Scope.htm
Chart - 图表 | 图表提供了一个带有时间轴的面板。上面为所有已连接的通道都划分了刻度。 TwinCATScopeView2_Elements_Chart.htm
Axis - 轴 | 所有通道都连接到一个带有值域刻度的Y轴。 TwinCATScopeView2_Elements_Axis.htm
Channel - 通道 | 通道连接至曲线(TwinCATScopeView2_Elements_Channel.htm) 及其特别获取的系统变量的设定 (TwinCATScopeView2_Elements_Acquisition.htm)。
Target Browser | 使用Target Browser检索所有连接的系统及设备。TwinCATScopeView2_TargetBrowser.htm
Object Browser | Object Browser显示ScopeView2的所有活动配置。 TwinCATScopeView2_Architecture.htm
Cursor - 游标 | 游标一种是读取、比较通道或轴的值以及他们的差值的简便方法 TwinCATScopeView2_Elements_Cursor.htm
Trigger - 触发器 | 多重的触发器配置及动作可以用来定制ScopeView2。 TwinCATScopeView2_Elements_Trigger.htm


ScopeViewControl Integration

TwinCAT Scope2 - ScopeViewControl Integration

将ScopeViewControl整合进用户应用程序

为了成为一款灵活且可重复使用的工具，Scope2是以组件式的方式建立的。例如ScopeView和ScopeServer就是Scope2分离出的两部分。此外ScopeServer是基于ScopeServerControl的，ScopeServerControl可以从随同Scope2安装的.NET组件'ScopeViewControlLib'找到。这个库是您可以简便地建立自己的C#，VB，.NET或WPF应用程序。

MS VisualStudio

使用MS VisualStudio设计器方便地添加ScopeViewControls到您的项目：

  • 打开一个form或control来添加一个新的ScopeViewControl。
  • 打开设计器中的工具盒使用快捷菜单'Choose Items..'
  • 使用浏览按钮'Browse'， 在Scope2 安装路径中找到'View'文件夹。
  • 选择 'TwinCAT.Scope2.View.ScopeViewControlLib.dll' 。
  • 在工具盒中显示一个标签为 'ScopeViewControl'的齿轮图标。
  • 拖动一个或多个ScopeViewControl到您的设计面板上。

如果程序被编译，连接器也许会要求一些额外的库 ('TcAdsScope2Communications', 'SimpleHelper' )

  • 打开Solution Explorer ，从你的项目的快捷菜单中选择 'Add Reference..'选项。
  • 浏览Scope2的安装路径，找到view文件夹。
  • 添加库文件 'TwinCAT.Ads.dll', 'SimpleHelper.dll' 和 'TwinCAT.Scope2.Communications.dll' 到项目中。

C# 样例程序

以下步骤将介绍如何建立一个简单的ScopeViewControl 应用程序。

打开一个新的Windows forms应用程序，添加一个ScopeViewControl和一个包含图形化按钮的工具条。双击给每个按钮插入event-handler。设置ScopeViewControl的定位属性填满窗口。

加载配置

可以用调用的方法或现成的配置文件(.sv2) 来配置空的 ScopeViewControl。

C#样例阐述了如何在 click-event-handler中装载配置。

private string filename = @"ScopeTest.sv2";

private void button_Load_Click(object sender, EventArgs e)
{
    FileInfo finfo = new FileInfo(filename);
    if (!finfo.Exists)
    {
        MessageBox.Show(this, "File not found! Please use the 'New' buttons to create a config.\r\n
            Once a config is created and saved it can be load using the 'Load' -Button!", "File not found!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else
    {
        // delete old configuration
        while (scopeViewControl1.Charts.Count > 0)
        {
            scopeViewControl1.DeleteChart(scopeViewControl1.Charts[0]);
        }
        // load configuration
        scopeViewControl1.LoadScopeConfig(filename);

        foreach (ScopeViewControlChannel channel in scopeViewControl1.ConnectedChannels)
        {
            channel.Acquisition.AmsNetId = AmsNetId.Local;
        }
    }
}

建立可编程的配置

ScopeViewControl也为所有ScopeView2的特征提供方案。使用详细的独立API文件： ScopeViewControlLib

添加元素

所有ScopeView2 元素可以通过向更高级的元素调用来添加。

  • Charts-图表:
    private void buttonChart_Click(object sender, EventArgs e)
{
    ScopeViewControlChart chart = scopeViewControl1.NewChart();
}
  • (Y-)Axes-Y轴:
    private void buttonAxis_Click(object sender, EventArgs e)
{
    if (scopeViewControl1.Charts.Count == 0)
    {
        MessageBox.Show(this, "Please create a chart first!", "No chart connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else
    {
        ScopeViewControlYAxis axis = scopeViewControl1.Charts[0].NewAxis();
    }
}
  • Channels-通道:
    private void buttonChannel_Click(object sender, EventArgs e)
{
    if (scopeViewControl1.Charts.Count == 0)
    {
        MessageBox.Show(this, "Please create a chart first!", "No chart connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else if (scopeViewControl1.Charts[0].Axes.Count == 0)
    {
        MessageBox.Show(this, "Please create an YAxis first!", "No axis connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else if (scopeViewControl1.Charts[0].Axes[0].Channels.Count > 0)
    {
        MessageBox.Show(this, "This sample contains only one channel!", "Channel still connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else
    {
        ScopeViewControlChannel channel = scopeViewControl1.Charts[0].Axes[0].NewChannel();
        ChangeChannelSettings(channel);
        SetAcquisition(channel);
    }
}

Settings (Appearance)-设置（外观）

每个元素包含一个属性'Style'以授权进行外观设置，例如颜色或线宽。使用ScopeView2中的设置窗口'Settings' 作为参考。

private void ChangeChannelSettings(ScopeViewControlChannel channel)
{
    if (scopeViewControl1.Charts.Count == 0)
    {
        MessageBox.Show(this, "Please create a chart first!", "No chart connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else if (scopeViewControl1.Charts[0].Axes.Count == 0)
    {
        MessageBox.Show(this, "Please create an YAxis first!", "No axis connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else if (scopeViewControl1.Charts[0].Axes[0].Channels.Count == 0)
    {
        MessageBox.Show(this, "Please create a Channel first!", "No channel connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else
    {
        channel.Style.LineColor = Color.Red;
        channel.Style.MarkColor = Color.DarkRed;
        channel.Style.LineWidth = 2;
    }
}

Acquisition-获取

通道还包含了获取属性 'Acquisiton' ，用于将通道连接至一个系统变量。

private void SetAcquisition(ScopeViewControlChannel channel)
{
    if (scopeViewControl1.Charts.Count == 0)
    {
        MessageBox.Show(this, "Please create a chart first!", "No chart connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else if (scopeViewControl1.Charts[0].Axes.Count == 0)
    {
        MessageBox.Show(this, "Please create an YAxis first!", "No axis connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else if (scopeViewControl1.Charts[0].Axes[0].Channels.Count == 0)
    {
        MessageBox.Show(this, "Please create a Channel first!", "No channel connected!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else
    {
        // AmsNetId and AmsPort are part of the TwinCAT.Ads.dll located in the ScopeView insallation folder.
        channel.Acquisition.AmsNetId = AmsNetId.Local;
        channel.Acquisition.TargetPort = (int)AmsPort.PlcRuntime1;
        channel.Acquisition.IsSymbolBased = true;
        channel.Acquisition.SymbolName = "SIGNALS.TREPPE";
        channel.Acquisition.DataType = DataTypeConverter.AdsToScope2Datatype(AdsDatatypeId.ADST_INT16);
        channel.Acquisition.SampleTime = (uint)(10 * TimeSpan.TicksPerMillisecond);
    }
}

Operate a Recording-操作记录

ScopeviewControl属性-操作'Operating'包含了所有操作记录的方法及属性。可以选择记录模式、长度及开始和结束选项。开始、结束或者处理所记录数据的有效方法。

private void button_StartRecord_Click(object sender, EventArgs e)
{
    try
    {
        // discard old record
        if (scopeViewControl1.State == ScopeViewControlStates.REPLY)
            scopeViewControl1.Operating.DisConnect(false);

        // start new record
        if (scopeViewControl1.State == ScopeViewControlStates.CONFIG)
            scopeViewControl1.Operating.StartRecord();

        // start charts in runmode
        if (scopeViewControl1.State == ScopeViewControlStates.CONNECTED)
            scopeViewControl1.Operating.StartAllDisplays();
    }
    catch (Exception err)
    {
        MessageBox.Show(this, err.Message, "Error on start record!",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

}

private void button_StopRecord_Click(object sender, EventArgs e)
{
    try
    {
        if (scopeViewControl1.State == ScopeViewControlStates.RECORD)
            scopeViewControl1.Operating.StopRecord();
     }
    catch (Exception err)
    {
        MessageBox.Show(this, err.Message, "Error on stop record!",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

private void button_Save_Click(object sender, EventArgs e)
{
    try
    {
        // save data if a record was finished
        if (scopeViewControl1.State == ScopeViewControlStates.REPLY)
        {
            File.Create("ExportData.svd").Close();
            scopeViewControl1.Operating.SaveData("ExportData.svd");
        }
        // or save only the configuration
        else
        {
            File.Create(filename).Close();
            scopeViewControl1.SaveScopeConfig(filename);
        }
    }
    catch (Exception err)
    {
        MessageBox.Show(this, err.Message, "Error on save!",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Operate Charts-操作图表

每个已连接的图表包含一个工具盒，向用户提供控制。然而也可以使用图表操作属性 'ChartOperating'及其组件。另外每个隐藏时间的属性和工具条都放置于此。

private void button_Run_Click(object sender, EventArgs e)
{
    if (scopeViewControl1.State != ScopeViewControlStates.RECORD)
    {
        MessageBox.Show(this, "Only possible if a record is running!", "Run not possible!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    if (scopeViewControl1.State == ScopeViewControlStates.RECORD)
        scopeViewControl1.Charts[0].ChartOperating.StartDisplay();
}

private void button_Pause_Click(object sender, EventArgs e)
{
    if (scopeViewControl1.State != ScopeViewControlStates.RECORD)
    {
        MessageBox.Show(this, "Only possible if a record is running!", "Pause not possible!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    if (scopeViewControl1.State == ScopeViewControlStates.RECORD)
        scopeViewControl1.Charts[0].ChartOperating.StopDisplay();
}

private void toolStripButtonDelChart_Click(object sender, EventArgs e)
{
    if (scopeViewControl1.Charts.Count == 0)
    {
        MessageBox.Show(this, "No chart is connected!", "Nothing to delete!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    else if (scopeViewControl1.State == ScopeViewControlStates.RECORD)
    {
        scopeViewControl1.Operating.StopRecord();
        scopeViewControl1.Operating.DisConnect(false);
    }
    else if (scopeViewControl1.State == ScopeViewControlStates.REPLY)
    {
        scopeViewControl1.Operating.DisConnect(false);
    }
    else
    {
        scopeViewControl1.DeleteChart(scopeViewControl1.Charts[scopeViewControl1.Charts.Count - 1]);
    }
}

VS2008项目的完整样例代码: ScopeViewControlIntegration.zip

这个样例使用的PLC项目变量: Scope2Signals.pro