菜单

第十章:基础编程

第10章 基础编程

本章主要知识点

新建项目、程序下载和调试

断点的设置

程序监控及程序仿真

10.1 基本编程操作

编程操作是编程软件最基本的功能,一般来说,前期工作都是离线完成的,当有了系统的整体控制方案后,要离线为控制器创建项目,建立相应的程序和数据,I/O 组态,控制工艺的逻辑代码,在线调试,最终将项目程序下载至控制器。编程软件不但能离线完成前期的大量工作,还能在线完成编程、调试、诊断和排除故障工作。

MetaFacture 离线和在线所做的编程工作大都是相似的,却在不同的环境下进行,离线编程在计算机的实时核中进行;在线编程在控制器内存中操作,所修改的内容在接收之前存放在控制器内存的缓冲区,接收过程与控制器的工作状态有关,控制器在程序状态接收较快,但仍需要一个个梯级的接收,运行状态的编辑是受限的,并且必须经过测试,才能最终确认。

10.1.1 启动MetaFacture

  1. 设置管理员权限

在系统下需要以管理员权限打开软件,在MetaFacture 的默认安装路径下找到 MetaFacture.EXE 文件,选中该文件后点击鼠标右键,选择属性,将“以管理员身份运行运行此程序”的选项勾选上,点击“确定”,如图 10.1 所示。 确认后每次运行MetaFacture系统则会默认以管理员权限自动进入。

5d56fa50-ce99-47c2-bf6e-5cce877baa50

图10.1 管理员权限

  1. 启动 MetaFacture

    从开始菜单选择 -> 程序 -> MetaFacture -> MetaFacture 或直接双击桌面上的图标启动MetaFacture。

  1. 创建工程项目

在文件菜单中选择新建工程命令,创建一个新的工程。

  1. 选择项目

用户可以新建一个库项目,空项目及标准程序项目。并为工程文件输入名称及路径,点击“确定”,其示图如10.2 所示。

图10.2 新建工程

  1. 新建程序及选择编程语言

确认完项目名及安装路径后,根据向导对话框,选择目标设备及主程序 PLC_PRG 的编程语言,如图10.3 所示。

图 10.3 目标设备及编程语言选择

10.1.2 PLC程序文件的建立

PLC 程序文件的建立,是运行结构的运行顺序的建立,也是编程模式的建立,甚至包括了数据区域的分割。在建立程序文件之前,应当对运行结构进行详细的划分,确定连续型、周期型和时间触发型任务,并对周期型和事件触发型任务安排优先级别。

新建一个 MetaFacture 项目后,系统会自动生成一个默认的连续性任务,任务中包含有一个默认的程序为 PLC_PRG。

  1. 创建任务

图10.4 任务配置

首先,在“任务配置”中管理任务,通常的项目应用中,可以分为主逻辑任务,通讯任务,通讯由于要更新数据源,会将它放在比较高的任务优先等级及较短的循环时间。

此外,如项目中涉及到运动控制,也会将其独立出一个任务,并将其放在最高的任务优先级,如图10.4 所示。

具体任务的配置及说明在本书 2.3.1 节中有详细介绍,在此不做重复说明。

  1. POU 的建立

选中“Application”-->右键选择“添加对象”,选择“程序组织单元”进行POU的添加。

1) 声明变量

在设备视窗中,默认POU为“PLC_PRG”,双击设备树中“PLC_PRG”,自动在用户界面的编程语言编辑器中打开。

语言编辑器包含声明部分(上部),实现部分(下部),由一个可调的分割线分开。

声明部分包括:显示在左侧边框中的行号、POU 类型和名称(如“PROGRAM PLC_PRG”) ,以及在关键字“VAR”和“END_VAR”之间的变量声明,如图10.5 所示。

在编辑器的声明部分,将光标移到 VAR 后,点击回车。插入新的空行,声明 INT 类型变量“ivar” ,INT 类型变量“erg”,FB1 类型变量“fbinst”。

图 10.5 变量声明

PROGRAM PLC_PRG

VAR

ivar: INT;

fbinst: FB1;

erg: INT;

END_VAR

另外,也可以使用自动声明功能,在编辑器执行部分直接输入指令。

  1. 输入程序

在声明区域下的程序编辑区域输入如下代码。

ivar := ivar+1; // 计数

fbinst (in:=11, out=>erg); // 调用功能块,类型为 FB1

  1. 自定义函数/功能块

在变量声明区可以看到,调用了功能块“FB1”,但“FB1”并不是标准功能块,故需要自定义功能块。

功能作用是在输入变量“in”的基础上上加“2”赋值给输出“out”。

从工程菜单中选择“添加对象”命令。在“添加对象”对话框左侧选择“程序组织单元”,输入名称:FB1,在类型选项中激活“功能块(B)”选项。实现语言选择“结构化文本(ST)”。点击“打开”按钮确认对象设置。

用于新功能块 FB1 的编辑窗口打开。与 PLC_PRG 的变量声明一样,在此对以下变量声明:

FUNCTION_BLOCK FB1

VAR_INPUT

in:INT;

END_VAR

VAR_OUTPUT

out:INT;

END_VAR

VAR

ivar:INT:=2;

END_VAR

在程序编辑器实现部分输入以下内容:

out:= in+ivar ;

完成上述步骤后,功能块即创建完成。

  1. 变量的自动声明

如果在”工具“的“选项“对话框的编辑器类别中选中自动声明选项,在没有定义的变量输入后在所有编辑器中出现一个对话框,在对话框帮助下,现在可以声明变量。

  1. 变量声明对话框

图 10.6 为变量的自动声明对话框。

图 10.6 自动声明功能

在“范围”组合框包含有局部变量(VAR)、输入变量(VAR_INPUT)、输出变量(VAR_OUTPUT)、输入/输出变量(VAR_INOUT)和全局变量(VAR_GLOBAL),用户可以根据需要选择对应的处理的类型。

通过“标志”选项可以设置 CONSTANT、RETAIN 及 PERSISTENT 类型变量。在编辑器中输入的变量名添加到了“名称”区域,RS已位于“类型”区域。 “”用来打开输入助手或数组向导对话框,如图 10.7 所示。

图 10.7 变量类型选择

  1. 数组的声明

如果需要声明的变量类型为数组,则需要在如图 10.7 的界面中选择“数组向导”,当输入后,系统会自动弹出对话框,如图 10.8 所示,当输入对应的参数后,系统会自动生成声明的结果。

图 10.8 数组输入向导

在数组初始化对话中,出现一列数组元素;在“初始值”列中可以编辑元素的初始化值,如图10.9 所示。

图 10.9 数组类型变量赋初值

在“地址”区域中可以绑定声明到 IEC 地址的变量。此外,可以针对变量输入一个注释,注释可以通过使用组合键 + 来形成换行格式。

10.2 通讯参数设置

10.2.1 启动Gateway、ControlServer 和PLC

Gateway、ControlServer 主要起到通讯网关的作用,再给 MetaFacture 下载程序之前,必须先使用 Gateway、ControlServer,此外,当 PLC 通过如 OPC 协议与其他设备连接时,也需要设置 Gateway、ControlServer。该服务程序由 MetaFacture 安装程序提供。

  1. 启动 Gateway、ControlServer

Gateway、ControlServer 作为服务程序在系统启动时自动启动,请确认 任务管理器->服务 中是否有指示。

  1. 启动 PLC

系统启动时,PLC(MetaFacture Control Win)作为服务程序在系统启动时自动加载。其请确认 任务管理器->服务 中是否有指示。若系统许可,PLC 服务程序将在系统启动时自动启动。否则需要手动点击图标右键菜单中的“开始”命令启动服务。

  1. 激活“Application”

点击 Standard project 设备视窗中的 MainTask,打开包含任务设置的编辑器视图,则如图 10.10 所示。

图 10.10 MainTask 设置

在设备视窗中,“Application”显示为黑色字体,表明该应用处于激活状态。这样,所有与 PLC 通讯相关的命令和动作都关联于该应用。在设备视窗中选择应用,从右键菜单中选择 “设置当前的应用” 命令将激活此应用。

  1. 网关组态

网关(Gateway)的作用:网关给了应用者使用计算机进入控制器网络的功能。通常接入的是本地主设备并且可以扫描接入主设备的所有其他设备,如图 10.11 所示。

图 10.11 网关组态界面

  1. 扫描网络

    可以选择“扫描网络”搜索在同一网段内的PLC,找到后点击确定,如图 10.12 中的PLC 的设备名为“sinsegye-sx5”。

图 10.12 选择找到的 PLC

  1. 添加网关:

网关组态的视图如图 10.13 所示。可以为网关输入名称,驱动选择“TCP/IP”,IP 地址设置为 “local host”(鼠标双击可以进行编辑),端口使用默认设置,点击“确定”关闭对话框。网关被添加到通讯对话框左侧,网关名称被添加到“给控制器选择网络路径”选项列表。

图 10.13 网关设置

  1. 添加设备

可以在此通过输入设备的名称,节点地址或 IP 地址来进行设备的添加。其配置界面如图 10.14 所示。

图 10.14 添加设备

10.3 程序下载/读取

10.3.1 编译

程序编写完成后,在下载之前需要对程序进行编译。编译命令对编写的程序进行语法检查,并且只编译添加到任务中的程序。如果创建的 POU 没有添加到任务中,编译命令不对该 POU 进行语法检查。

编译指令不生成任何代码,只针对 POU 的语法进行检查。直接执行设备登录命令,系统也将默认执行编译指令(等同于先手动执行编译命令),再编译检查没有语法错误

后执行连接登录指令。同样,在编译中不对没有添加到任务中的 POU 进行语法检查。执行登录命令同时会生成代码。MetaFacture 编译菜单如图6.15 所示。

图10.15 编译菜单

  1. 编译:对当前的应用进行编译。

  1. 重新编译:如果需要对已经编译过的应用再次编译,可以通过重新编译指令进行。

  1. 生成代码:执行此命令后生成当前应用的机器代码,执行登录命令时,生成代码默认执行。

  1. 清除:删除当前应用的编译信息,如果再次登录设备时需要重新生成编译信息。

  1. 清除全部:删除工程中所有的编译信息。

执行编译命令后可以看到,添加到任务里面的“PLC_PRG”显示为蓝色,没有添加到任务里面的则显示为灰色,如图 10.16 所示。编译指令不会对灰色的 POU 进行语法检查,因为该程序单元没有处于活动状态,编译指令只针对于处于活动状态的 POU 进行语法检查。

如果在编译的过程中发现需要运行的程序单元显示为灰色,可以检查该程序单元是否已经被成功的添加到了所需要运行的任务当中。

图 10.16 编译信息

编译命令执行完成之后可以在消息栏看到编译生成的信息,其中可以看到编译的程序是否有错误或者警告,以及错误和警告的数量。如果有错误和警告产生可以通过消息窗口进行查看和查找,根据提示信息对程序进行修改。

10.3.2 登入下载

  1. 登入

登陆使应用程序与目标设备建立起连接,并进入在线状态。能正确登陆的前提条件是要正确配置设备的通讯设置并且应用程序必须是无编译错误的。

对于以当前活动应用登录,生成的代码必须没有错误和设备通信设置必须配置正确。登入后,系统会自动选择程序下载。

  1. 下载

下载命令,在在线模式下有效。它包括对当前应用程序的编译和生成目标代码两部分。除了语法检查(编译处理)外,还生成应用目标代码并装载到 PLC。当执行下载命令后,系统会自动弹出对话框,如图 10.17 所示。

图 10.17 下载对话框

  1. 在线修改后登入

用户选择此选项后,项目的更改部分被装载到控制器中。使用“在线修改后登入”操作,可以防止控制器进入 STOP 状态。

注意:

用户之前至少执行过一次完整的下载。

指针数据会更新最近一个周期的数值,如果改变了原变量的数据类型,无法确保数据的准确性,此时,需要重新分配指针数据。

  1. 登入并下载

选择“登入并下载”后,将整个项目重新装载到控制器中。与“在线修改后登入”最大的区别是当完成下载后,控制器会停留在 STOP 模式,等待用户发送 RUN 指令,或重启控制器程序才会运行。

  1. 没有变化后的登入

登录时,不更改上次装载到控制器中的程序。

当完成下载后,需要将程序每次启动时运行,还需要点击“创建启动应用”。

已编译的项目在控制器上以这种方式创建引导,即控制器再启动后,可以自动装入项目程序运行。引导项目的存储方式不同,取决于目标系统。

注意:

下载命令使得除持续型变量之外的所有变量都将被重新初始化。

  1. 细节

通过消息窗口中的“细节”按键可以获得项目中中改变的变量数量以及具体清单,如图 10.18 所示。

图 10.18 在线改变细节视图

  1. 创建启动应用

创建启动应用命令是在在线或者离线状态下创建启动工程,也称为“创建启动应用”。启动工程为 PLC 中运行应用提供服务,当 PLC 启动时,自动装载程序。否则,重启控制器后,之前下载的程序会丢失。在 “在线”-->“创建启动应用”,系统则自动会将程序写入控制器的 FLASH ROM 区域,具体步骤如图 10.19 所示。

图 6.19 创建启动应用

此外,用户也可以设置自动下载启动应用,每一次更新过程序后,下载至控制器后都会自动完成启动应用的下载。具体步骤为主:点击应用右键选择“属性”,在“启动应用设置”选项中,在“下载创建默认应用” 前打上勾,点击确定,如图 10.20 所示。

图 10.20 设置默认创建启动应用

  1. 源代码下载

MetaFacture 出于对程序员源代码的保护,下载时默认不自动下载源代码,如需下载源代码则需要进行手动设置,点击“在线” --> “下载源代码到连接设备上”。

用户也可以在“工程” --> “工程设置 ”-->“下载源代码” --> “计时”选项中对该属性进行设置,如图10.21 所示。

图 10.21 下载源代码

计时:

  1. 使用选项 “隐含在程序下载中”能使所选择的文件范围, 通过命令“在线” --> “下载”,会自动地装载到控制系统内。

  1. 使用选项“程序下载时提示”提供一个对话框,当使用命令“在线” --> “下载”命令时,会提出问题“你是否需要将源代码装载到控制系统内?”按 “是”,则自动地将所选择的文件范围装载到控制系统内;按“否”,结束提问。

  1. 使用选项“隐含创建启动工程中”,通过命令“在线” --> “创建启动应用”能够允许选择的文件自动装载到控制系统内。

  1. 当使用选项 “只按要求”时, 所选择的文件范围必须通过命令“在线”--> “下载源代码到连接设备上”,确定装载到控制系统内。

  1. 读取程序

在“文件” > “源上传”命令打开一个设备选择对话框,用户选择连接 PLC 的网络路径,点击“确定”按钮。

此时出现工程存档文件对话框,如图 10.22 所示。用户可以选择文件的哪些内容需要解压并上载,并选择要复制文件的路径。此对话框是进行工程存档/解压存档文件的。点击“确定”按钮确认后,完成存档文件的复制。如果用户选择的路径下已经存在存档文件,给出是否覆盖提示。

这里需要注意的是,在读取程序之前需要确保在前一次的下载过程中已经做过“下载源代码到连接设备上”。否则不能读出控制器中的数据。

图 10.22 程序上载对象选择

10.3.3 在线监控

使用以下三种方法,可以在线监控应用程序中的变量:

  1. POU 的在线监控;

  2. 特殊变量的在线视图;

  3. 写入和强制变量。

  1. POU 的在线监控

POU 的示例视图提供了该示例的所有监控表达式,并在声明部分以表格显示,若激活“在线监控”功能,在程序实现部分也同样会显示。

双击在设备窗口里的执行程序“PLC_PRG”,或选择该项右键菜单点击 “编辑对象”命令,打开在线视图,出现如下图 10.23 中的对话框,这里,可以选择 POU 以在线模式或是离线模式进行查看。程序双击默认以在线模式登入。

图 10.23 编辑对象

如图 10.24 所示 PLC_PRG 在线视图被打开:上半部分显示对应于 PLC_PRG 中变量表达式的状态,以表格的形式来显示。下半部分显示 PLC_PRG 的监控表达式,也是程序的逻辑主体,由每一个变量后的内部监控窗口显示实际的值。

图 10.24 程序登入视图

此外,用户如想要同时监控多个 POU,可以自行配置观察表,把需要在同一情况要观察的变量集合起来,一并进行比较,如图 10.25 的 a)所示,在“视图”中找到“监视”栏,在其中可以配置 4 个监控列表,如点击“监视 1”则程序自动建立监控 1 列表。

a ) 视图监视窗口 b )输入助手

图 10.25 创建监视列表

打开监视1后,点击表达式下的空栏,会出现输入助手,如图10.25 的 b)所示。通过输入助手选择要监视的变量,组成列表。在线登入控制器后,就可对变量进行强制,如图 10.26 所示。

图 10.26 变量监视列表视图

  1. 特殊变量的在线视图

  1. 监视功能块实例

在监视 IN 和 OUT 变量时,输出为间接引用的值。点击“+”将其扩展可以看到功能块实例内所有变量的具体数值,如图 10.27 所示。

图 10.27 功能块在线监控视图

  1. 监视指针变量在监视指针变量时,将在声明部分输出指针和间接引用的值。在程序部分则只有指针输出:另外,还相应地显示间接引用值的指针。点击“+”将其扩展可以看到指针所指向地址里的具体数值,如图 10.28 所示。

图 10.28 指针变量在线监控视图

3) 监视数组变量

除了以常数索引数组部件外,还可显示由变量索引的部件,如图 10.29 所示:

图 10.29 数组变量在线监控视图

注意:

若索引表达式由变量加运算表达式,如 [i+j] 或 [i+1]组成,则不能显示部件。

  1. 写入/强制变量赋值

MetaFacture 中有 2 种强制赋值的方式供选择,如图 10.30 所示,一种为“写入值”,另一种是“强制值”。

  1. 写入值:只下一周期将变量改为准备值中的数据。如该变量未被其他程序赋值,则保持该数据,否则变量根据实际程序里的赋值语句进行执行。通过“写入值”赋值的数据显示正常的黑色或蓝色。

  1. 强制值:从下一周期开始,在每个循环后再次设定为某个强制值。如果系统中有程序给该变量赋值,该变量仍为强制的数据,“强制值”优先级较高。通过该方式写入的数值在变量列表中可以见到其左侧有红色的“ ”标识。强制值可以通过“调试”-->“释放值”命令将其释放还原。如图 10.30 所示。

图 10.30 强制变量

强制值写到“准备值”项中,然后通过以下快捷键完成写入。

写入值:[Ctrl]+[F7] ,

强制值:[F7] ,

释放值:[Alt] +[F7] 。

10.4 程序调试

10.4.1 复位功能

MetaFacture 程序复位有如下三种方式,在在线菜单中进行选择,详见图 10.31 所示。

图 10.31 MetaFacture 中的不同复位

  1. 热复位

热复位后,除了保持型变量(PERSISTENT 和 RETAIN 变量)外,其它当前的应用的变量都被重新初始化。如果设置了初始值的变量,热复位后这些变量值还原为设定的初始值,否则变量都会被置为标准初始值 0。

为了安全起见,当所有变量在初始化之前,MetaFacture 会给出提示,提示用户是否确认热复位操作,如图 10.32 的 a)所示。此情形只有在程序正在运行时断电,或者通过控制开关闭控制器,然后再打开(热复位)时出现。

  1. 冷复位

与“热复位'”不同的是,冷复位命令不但将普通变量的值设置为当前活动应用程序的初始值,而且将保持型变量(PERSISTENT 和 RETAIN 变量)的值也设置为初始值 0。冷复位发生在程序下载到 PLC 之后,运行之前(冷启动),同样,执行冷复位命令之前,为了安全考虑,系统也会弹出提示框,如图 10.32 的 b)所示。

a )热复位 b )冷复位

图 10.32 复位

  1. 初始化复位

当在设备树中选择一个可编程设备时,无论是在离线还是在在线状态下都可以使用此命令。使用此命令将使设备复位到初始状态,即设备中的任何应用、引导工程和剩余变量都将被清除。

由于所有工程信息被清除,重新登入后,需要重新“下载”程序,并“启动”运行,如图 10.33 所示。

图 10.33 初始化复位后重新启动

10.4.2 调试工具

在 MetaFacture 中“调试”菜单的视图如图10.34 所示。主要的操作涉及断点设置及单循环。

图10.34 程序调试菜单

  1. 断点

断点是程序内处理停止的功能,当程序停止后,程序研发人员可以借此观察程序到断点位置时其变量及 I/O等相关变量的内容,有助于深入了解程序运行的机制,发现及排除程序故障。

在 MetaFacture 中所有的编程语言都可以设置断点。在文本编辑器 ST 语言中中,断点设置在行上;在 FBD 和 LD 编辑器中设置在网络号上;而在 SFC 中,设置在步上。

  1. IL 中断点位置的几行代码在内部被组合成一个单行的 C 代码,断点不能在每个行都进行设置。断点位置可以包括在一个程序内的所有变量值可以改变的位置,或者在程序流程分支闭合处。(例外:功能调用。如有必要,必须在此设置功能的断点)。如果在中间位置安放一个断点,则该断点没有意义,这是因为从前面断点位置以来,数据不会有任何改变。可以在IL中以下位置设置断点。

  1. 结构化文本 ST 允许以下位置设置断点:

在每个赋值处;

在每个 RETURN 和 EXIT 指令处;

正在评估的条件处(WHILE,IF,REPEAT);

在 POU 结束处。

在一个项目中只能设置一个断点,针对任务进行设定,断点参数通过“调试”-- > “切换断点” 进行设置的,或是通过“新断点”指令进行设置,如图 10.35 所示。

图 10.35 新断点设置界面

  1. 设置断点

    为了设置一个断点,在你需要设置断点的行中点击行号字段。如果所选择的字段恰好是一个断点位置,点击菜单“调试” -->“ 切换断点”完成,也可以使用功能键 [F9],或使用工具条中的符号完成。则该行号字段的颜色就会从深灰色变成浅蓝色,并在 PLC 中被激活。

  1. 删除断点

相应地,要删除一个断点,可以在需要删除断点的行号字段上点击。设置和删除断点还可以通过菜单菜单“调试”-->“切换断点”完成,也可以使用功能键[F9]或使用工具条中的符号完成。

  1. 在断点处发生了什么?

如果 PLC 程序到达一个断点,则在屏幕上显示相应行的断点,PLC 会处于停止模式。并且 PLC 确定的行号字段将显示为红色,具体的状态如表 10-1 所示。

表10-1 ST中断点状态显示

PLC 中的用户程序被停止。如果该程序处于断点位置,可以通过先删除断点,再通过使用“调试” -->“ 切换断点”释放该过程。

  1. 连续功能图 CFC 允许以下位置设置断点

在 POU 中,变量值能发生变化的地方或者程序运行到其他的 POU 分支。如图 10.36 中可能的位置。

图 10.36 CFC 程序中的断点设置

注意:在函数/功能块中不能设置断点。

断点时,需要针对任务,断点只能针对一个任务进行设置。

  1. 单步执行

设置断点后,可以进行单步执行程序,该功能可以让程序一步一步的运行,方便编程人员进行调试,以便检查程序中的逻辑错误,单步指令如图 10.37 所示。

图 10.37 单步执行指令

  1. 跳过

该命令会执行程序中当前的一条指令,执行完停止。在不调用 POU 时,跳过和跳入命令效果是一样的。但如果是调用 POU,那么跳过不会进入这个 POU,而是把这个 POU 调用当作完整的一步,一次执行完;跳入则会进入该 POU。如果用的是 SFC 语言,那么跳过会把一个动作当作完整的一步,一次执行完。如果想要实现跳到被调用的 POU 中单步调试,就必须用跳入。

  1. 跳入

执行时,当前的指令位置由一个黄色箭头表示。如果当前指令没有调用 POU,那么使用该命令和使用跳过命令的效果一样。

  1. 跳出

当正在一个 POU 中单步调试时,用跳出会把这个 POU 剩下的指令一次执行完,然后返回到这个 POU 被调用处的下一条指令。所以,如果是一层一层向下调用 POU,那么跳出就会一层一层向上返回,每次返回一层。

如果程序中不包含任何 POU 调用,那么跳出无法向上层返回,就会返回到程序的开头处。

  1. 单循环

图 10.38 单循环启用菜单

在“调试”—>中选择“单循环”,这样程序进行单步运行。即按一次运行,程序执行一个周期即停止并等待下一次运行指令,如图 10.38 所示。也可使用快捷键[Ctrl]+[F5]进行程序运行。如果不点击“启动”,则程序 一直处于停止模式。 通过不断使用该功能,使之一步一步地执行以查看程序是否按照设计进行工作。

如图 10.39 所示,程序有一句表达式为 cnt:= cnt+1;每次执行单循环指令后,cnt 的数值则会逐渐累加。

图 10.39 单循环执行效果

10.5 仿真

MetaFacture 编程软件集成了 PLC 的仿真功能,可以实现使用 PC 仿真实际的 PLC 程序,应用在现场安装前,就可以进行完整的测试,可以及早发现程序中的逻辑错误,提高开发的效率,缩短程序的开发。仿真过程中,不需要提供 PLC 实际硬件,只需一台安装有 MetaFacture 的 PC 机即可。

10.5.1 离线仿真

  1. 打开离线仿真

    在菜单 “在线”中选择“ 仿真”,便进入了仿真模式下的程序运行过程。确认选项“仿真” 前已打上后,编译程序,没有错误后,即可进入仿真模式。如图 10.40 所示。

图 10.40 仿真模式开启

进入仿真界面,启动 PLC 程序运行仿真,确认图 10.41 中框出部分显示状态为“仿真”时,此时可以直接下载程序,点击菜单栏的“调试”-->“启动”即可。

图 10.41 仿真模式视图

  1. 示例

开始下载时,对话框提示仿真器中没有程序,点击“是”,继续,如图 10.42 所示。

图 10.42 提示没有程序对话框

程序体上方的变量声明部分在仿真在线时,作为程序准备、修改、强制变量的部分,是调试程序中使用最多的功能,常用的功能包括变量采用修改值“写入值”,快捷键[Ctrl]+[F7] ,对输入点变量采用“强制值”,快捷键[F7],强制变量后“取消强制”。程序编写部分在先后成为在线程序显示区,程序中的布尔变量会显示运行时的实际值,如 TRUE 或 FALSE,数值型变量或枚举型变量会显示当前值,如图 10.43 所示。

图 10.43 程序在线后各功能区

10.6 PLC 脚本功能

该 PLC 脚本是一个基于文本的控制监视(终端)。从控制器中得到的具有特定信息的命令以一个输入行进行输入并且作为一个字符串发送到控制器,返回相关的字符串在浏览窗口中的结果显示,这个功能用于诊断和调试目的,其使用界面如图 10.44 所示。

图 10.44 脚本画面

PLC 脚本具体的命令如表 10-2 所示,鼠标双击选中“Device”,在右边视图中找到“PLC shell”,在下方的命令输入框中输入相应指令即可。输入“?”,按回车键即可显示所有该控制器支持的命令。

表10-2 脚本命令

命令 描述
? 显示所有可使用的脚本命令
getcmdlist 内部使用显示所有可获得命令
mem
[]
显示十六进制特定内存范围
applist 显示当前加载的应用列表
pid [|] 一个特定的跳转或者所有加载的应用
pinf [|] 一个特定的跳转工程信息或者所有加载的应用
startprg [|] 启动一个特定的或者所有的应用程序
stopprg [|] 停止一个特定的或者所有的应用程序
resetprg [|] 复位一个特定的或者所有的应用程序
resetprgcold [|] 针对特定的或者加载的应用执行冷复位
reload[|] 重新加载一个特定的或者从启动工程中的加载的应用
getprgstat [|] 获得一个特定或者加载应用的状态
plcload 获得加载到 PLC 中的负载率
命令 描述
rtsinfo 显示实时核运行系统信息

注意:

如需使用脚本功能必须先登入 PLC 才能使用相应指令。

【例 10.1】使用 PLC 脚本指令查看 PLC 的运行负载量。

例如,使用 PLC 脚本指令“plcload”来实时的 PLC 负载率。

图 10.45 plcload 示例

如图 10.45 所示,得到的 5%则为当前实时的 PLC 负载率。通常,建议将 PLC 的负载率控制在80%以下。如果超出该百分比建议优化程序。

【例 10.2】启动/停止应用中的程序。

实现该功能需要使用 startprg 和 stopprg 功能,在命令行输入“?”,根据提示,按照指令格式输入命令+应用程序的名字,命令如下:

startprg [application]

stopprg [application]

0c96286e86dc84993a9baa006d133bb4

图 10.46 脚本命令执行启动/停止程序

执行上述两条命令后的结果如图 10.46 所示,分别对该应用程序执行了启动和停止程序的功能。

10.7 程序隐含检查功能

在程序的编写过程中,可能会发生如下的几种情况:

除法运算的被除数在某些情况下会为零;

指针在赋值的过程中可能不小心指向空地址;

调用数组时数组边界别溢出了;

针对上述情况,MetaFacture 有对应的解决方案,用户可以应用下添加隐式检查 POUs,隐式POUs检查能够检查函数的阵列和界限,以及除数为零和运行系统中的指针。 “POUs 的隐式检查”属性中提供了以下函数功能:

CheckBounds;

CheckDivInt /CheckDivLInt/CheckDivReal/CheckDivLreal

CheckRange/CheckRangeUnsigned;

CheckPointer.

在 POU 中添加一个检查之后,将会按照选定的编程语言方式打开,系统默认的编程环境是 ST 语言编辑器。

用户可以在应用下鼠标右键选择“添加对象”,选择“用于隐含检查的 POU”,随后系统则会弹出对话框,如图 10.47 所示。如下,会对这几种常用的函数做介绍。

图 10.47 隐含检查的 POU 添加选项

  1. CheckBounds 检查数组边界函数

此函数检查是否对数组的边界有超出。通常应用在可变的数组类型被分配应用中,使用该隐藏函数可以用有效的保证函数边界不被超出。

例如,在程序中,其数组类型变量“a” 超出上限,其程序如下:

PROGRAM PLC_PRG

VAR

a: ARRAY[0..7] OF BOOL;

b: INT:=10;

END_VAR

a[b]:=TRUE;

在程序之初,数组 a 只有 0~7 八个成员,而在实际的程序中,a 数组的第 b 个成员为 TRUE,而 b 在程序定义时却为 10,所以程序想表达的意思是 a[10]:=TRUE,但数组变量 a 在定义之处却只有 8 个元素,10 已经超出了其定义范围。

针对上述案例可能会产生的情况,可以使用 CheckBound 函数,使用了之后,程序将会自动限制该索引值从“10”至上限“7”。因此,同样的表达式 a[b]:=TRUE 最终会被闲置为 a[7] :=TRUE 而非 a[10]:=TRUE。

  1. CheckDivInt/CheckDivLint/CheckDivReal/CheckDivLreal 检查除零函数

为了检查除数的值,避免程序进行除零运算,MetaFacture 中可以使用检查函数 CheckDivInt/CheckDivLint/ CheckDivReal/ CheckDivLreal。在将它们包含在应用中之后每个相关代码发生的除法过程都将产生一个此函数调用的预处理。

例如,使用除法指令,具体程序如下,

PROGRAM PLC_PRG

VAR

erg:REAL;

v1:REAL:=799;

d:REAL;

END_VAR

erg:= v1 / d;

在上例中,erg 等于 v1 除以 d,而 d 在变量定义之初并没有赋予初值,故其初值为 0,在程序中如果直接将数除以 0,系统则会出错。但是,如果在指令中经过了指向除法运算检查的 CheckDivReal 函数之后除数“d”的值在初始化的时候变为“1”。因此除法最终结果为 799 ,能够有效的避免控制器异常出错。

  1. CheckRange/CheckRangeUnsigned 域边界的检查函数

为了在运行过程中检查域的限制,可以使用函数 CheckRangeSigned 或 CheckRangeUnsigned。此检查功能的目的是恰当的子集违规处理(如设置一个检测到的错误旗帜或改变值)。当一个变量的子集类型被确认后这个功能将被隐藏访问。当访问这个功能时得到以下输入参数:

值:域类型被分配的值

低:域的下限

高:域的上限

如果被分配的值是在有效的域内,他将作为功能中的返回值被使用。否则,对应超过范围的数值,要么上限或下边界的范围将被返回。

例如,分配 i:=10*y 将被隐性替代为,

i := CheckRangeSigned(10*y, -4095, 4095);

如果 y 的值为 1000,变量 i 将不会分配到原始执行提供的 10*1000=10000 , 取而代之的是4095,因为函数设定的上限值最大为 4095。

例如,死循环的例子,

VAR

ui : UINT (0..10000);

END_VAR

FOR ui:=0 TO 10000 DO

...

END_FOR

FOR 循环永远不会退出,因为检查功能制止了将 ui 的超过 10000。

注意:

使用 CheckRangeSigned 指令和 CheckRangeUnsigned 的功能,可能会导致在一个无限循环,

例如,如果一个子界类型被用作循环不匹配子范围的增量。

  1. CheckPointer 指针检查函数

函数 CheckPointer 检查地址的指针引用是否都在有效的内存范围内。在运行过程中,用户可以在每个指针操作都可以使用 CheckPointer 来进行指针访问的检查。 它可以用来检查地址指针引用是否均在有效的内存范围。此外,还可以用来检测对齐的内存区与引用的变量数据类型的指针指向。如果两个条件都满足,CheckPointer 返回不变输入指针。

当调用函数获得以下输入参数时:

ptToTest: 指标的目标地址;

iSize:引用变量的型号;型号的数据类型必须是整数兼容的并且必须涵盖最大潜在储存在指标地址中的数据型号;

iGran:访问的间隔,这是最大的无结构数据类型, iGran 的数据类型必须是整数兼容的;

bWrite:访问的类型(TRUE=写入访问,FALSE=读入访问);

最近修改: 2025-11-20