SamSoarII帮助文档

SAMSOARII第二代编辑软件是在第一代编辑软件SAMSOAR Developer的基础上，针对显控推出的新一代编译型可编程控制器（PLC）的组态程序的图形界面编辑工具。与之前的版本相比，在保留了其原有功能的基础上，对运行性能和用户体验等方面上做了大幅度的改进。

本公司推出的PLC产品简单易学，应用范围广泛，其帮助系统能够帮助您掌握SAMSOAR II软件的基本操作与用法。

帮助文档包括：

1、 快速入门

2、 编辑界面

3、 指令系统

4、 寄存器

5、 仿真界面

6、 通信协议

7、 硬件手册

8、 系统设置

9、 联系方式


快速入门

内容如下：

1、 了解什么是SamSoarII

2、 SamSoarII对系统的最低要求

3、 SamSoarII的安装和卸载

4、 SamSoarII的运行

5、 SamSoarII快速开始

6、 SamSoarII的基本操作


了解什么是SamSoarII

SAMSOARII是针对深圳市显控科技股份有限公司推出的可编程逻辑控制器（PLC）的梯形图编辑软件。该软件可以帮你快速准确的编辑一个PLC的梯形图工程。在梯形图中支持主程序、子程序、C语言函数功能块的编写，每个程序中包含了若干个网络，每个函数块中也包含了若干个函数。用户可以根据需要自己添加网络和函数。

在编辑梯形图的时候支持使用鼠标点击工具栏输入，也支持直接键盘键入命令或者通过双击树形目录处的命令，将选中的命令添加到图标指定的位置。在编写C语言的函数块时也支持自动缩进，代码补全等功能。

SAMSOARII支持三种编辑模式分别是：写入模式、注释编辑模式、监视模式。其中，写入模式支持正常的编辑、修改、转换梯形图等操作；注释编辑模式支持修改元件的注释，要注意的是此时只能修改梯形图的注释，不能插入或修改梯形图元件；监视模式支持监视梯形图元件在PLC中的值，另外除了支持梯形图监视以外还支持软元件登陆监视，可以批量监视软元件的值。在执行监视模式的时候可以选择串口或者USB口进行监视。

SAMSOARII支持USB和串口的上下载，在上下载和执行监控之前可以通过点击通信测试按钮来检测PLC是否连接到计算机。在通过串口进行通信的时候支持自动检测波特率的功能。

SAMSOARII还支持设置自动定时保存功能，通过在系统设置对话框中可以设置自动保存的时间，使您的工程更加安全无忧。

SAMSOARII对上下载工程做了严格的保密措施，可以在PLC设置对话中配置上下载密码，若不输入正确的密码无法进行上载操作。


SamSoarII对系统的最低要求

1. SAMSOARII最低硬件要求
2. SAMSOARII支持的操作系统

本软件最低支持Microsoft Windows XP系统或微软在之后发布的新系统包括但不限于（WIN7，WIN8，WIN10等）。

3. SAMSOARII安装操作须知

需特别注意的是，安装此软件的电脑中必须含有.NET Framework 4.0或以上的版本，否则软件将拒绝安装（若安装后卸载.NET Framework 4.0，本软件将无法正常运行）。因此.NET Framework 4.0会随着安装包一起发布。安装过程中若检测到您电脑上没有.NET Framework 4.0 或以上的版本，则会自动帮您安装，耐心等待安装过程结束即可继续运行本软件的安装程序，若随安装包一起发布的软件必备（如图1.1所示）丢失或与安装软件不在同一目录则无法顺利安装。您也可以访问微软官网，搜索.NET Framework 4.0并下载对应的安装包进行安装。

图1.1

对于XP系统，可能会因为缺少安装.NET Framework 4.0所必须的图像处理程序wic_x86_chs.exe而安装失败，因此我们也将其一起与安装程序发布，同样，安装过程中会自动检测是否需要安装该程序。


SamSoarII的安装和卸载

1. 软件的安装

SamSoarII是专为标准Microsoft Windows系统设计的32位应用软件。安装软件前，请确认该计算机的软件和硬件是否符合安装的最低需求。

使用随产品配送的安装盘来安装SamSoarII。具体安装步骤如下：

1. 启动Windows并运行安装包程序SamSoarII Setup。并出现如图1.1所示的界面：

图1.1

选择语言后点击确定按钮。

2. 在弹出的“欢迎使用”对话框中点击“下一步”，如图1-2所示：

图1.2

3. 在弹出的“选择目标位置”对话框中可以选择程序的安装目录， 在安装之前请确定磁盘是否有有足够的剩余空间，否则的话会导致安装失败。程序默认路径为“C:\Program Files\SamSoarII”，用户可以根据自己实际情况选择安装，如图1.3所示，然后点击下一步：

图1.3

4. 在弹出的“选择开始菜单”对话框中点击“下一步”，如图1.4:

图1.4

5. 然后在弹出的对话框中选择下一步，如图1.5:

图1.5

6. 此时会弹出提示选择安装的对话框，在确认选择无误的情况下请点击“安装”按钮，如图1.6所示:

图1.6

7. 此时会弹出正在安装的界面，如图1.7所示:

图1.7

8. 安装程序正在将SamSoarII安装到指定目录下，请等待直到程序安装完毕，此时会弹出安装完成对话框，如图1-8所示：

图1.8

9. 点击完成按钮，至此SamSoarII已经成功安装到您的计算机当中。

2. 软件的卸载

1. 想要卸载SamSoarII的话可以点击开始->程序->SamSoarII下的卸载SamSoarII选项；如图1-9所示：

图1.9

2. 此时会弹出是否确定卸载对话框，如图1.10所示：

图1.10

3. 点击确定的话会弹出卸载进度对话框 如图1-11所示：

图1.11

4. 至此软件将从本地计算机移除。


SamSoarII的运行

SamSoarII.exe在安装完成后，会在桌面上放置运行快捷方式，如图1.1所示：

图1.1

同时Windows开始菜单中也添加了相应的SamSoarII程序，双击桌面上的快捷方式或已经保存的工程文件，或者单击开始菜单中SamSoarII程序组的SamSoarII.exe运行组态软件，运行界面如下图1.2：

图1.2 软件运行画面


SamSoarII快速开始

1. 简介

如果您首次接触FGs产品，我们建议采用一个简便的方法：从简单实用的应用开始。即使没有任何有关FGs产品的经验，仍然可以很简单的实现操作。一切都从快速开始章节开始。

这个例子用于展示如何使用FGs-16MR-A，使用SAMSOAR Developer编程工具进行编程和测试。

随后的各章节将进行更详尽的描述，为您提供更多的信息。

2. 准备硬件

范例：楼梯照明

通过楼梯照明控制的案例说明使用FGs实现一个应用。此建筑具有地面一层和地上三层，每层都有按钮控制电灯开关。快速按下这些按钮中的一个，楼梯内所有四盏灯都会开启并持续照明5分钟。

这些按钮分别与FGs的4个输入点X0, X1, X2 和 X3连接。4盏灯通过FGs上的一个继电器输出点Y0进行控制。

图1.1

3. FGs-32MT-A安装

DIN导轨安装

1. 保持导轨固定点的间隔为75 mm。

2. 打开模块底部的DIN夹子，将FGs背部卡在DIN导轨上。

3. 将FGs贴近DIN导轨，合上DIN夹子。检查模块上DIN夹子与DIN导轨是否紧密固定好。

   为避免FGs损坏，不要直接按压FGs正面，而要按压安装孔的部分。

参照图1-1接线：

将FGs的端子L和端子N分别与AC220V电源的火线和零线连接。

将FGs的端子S/S与FGs的端子24V直接相连。

将4个按钮开关一端连接到FGs的端子X0到X3，另一端统一接到FGs的端子0V。

将4个灯的一端统一接到FGs的端子Y0，另一端统一和AC220V电源零线连接。AC220V电源火线与FGs的端子COM1连接。

将电脑的USB接口连接到FGs。

    注意：更详细的硬件安装以及接线信息，请查阅FGs硬件手册。

4. 编辑程序

4.1 启动 SAMSOARII编程工具

双击桌面上的快捷方式，或者单击开始菜单中SAMSOARII程序组的SAMSOARII.exe运行组态软件。

进入SAMSOARII编程工具的运行界面如图。

图1.2 SamSoarII运行界面

开始写新程序之前，必须新建一个新的或打开已存在的项目，这个项目包含必要的定义、少量配置参数。

如果项目尚未存在，选择菜单栏中的“工程”-->“新建工程”，如图1.3。

图1.3

弹出新建工程定义画面如图1.4。

图1.4

点击下拉按钮选择PLC的型号，本项目选择FGs_32MT_A。可以选择设置工程名以定义本工程的文件名称和存储位置，并点击“确定”按钮。

4.2打开一个已存在的项目

打开一个已存在的项目，选择菜单栏中的“工程”-->“打开工程”，弹出打开缺省目录下的所有项目文件（*.ssr，*.ssp）如图1.5所示，

图1.5

所有项目文件以列表的形式显示。双击列表内的所选项目文件名称，或者选择项目然后点击“打开”按钮。你还可以点击“工程”菜单下所列的项目文件名称，直接打开所选的项目文件。

注意，新版软件的项目文件以ssr结尾，而旧版软件以ssp结尾，为了向前兼容，新版软件支持旧版工程文件的转换并打开，转换工具可在菜单栏点击“工具”->“文件转换”来打开，如图1.6所示：

图1.6

如果选择是“新建工程”，界面变成如下图1.7：

图1.7

如果选择是“打开工程”，界面变成如下图1.8：

图1.8

现在就可以编辑工程了，编写自己的工程梯形图。

5. 工程编辑

5.1 网络、行增加与删除

在编辑区可编辑位置右键菜单中可以选择网络插入、网络删除，行删除、行插入等选项，增加或者删除网络或行。

图1.9

5.2 图元的添加和删除

在任一网络的可编辑位置左键点击选中图元，在左侧工程管理窗口中展开指令及其子项，如下图2-2示。双击某指令即能添加指令在选中位置。单击选中位置上的指令标识可以输入指令相关的参数。每个指令具体用法请参阅相关的帮助文档。

图1.10

可以在选中位置，直接输入命令添加命令，比如”LD M0”，如下图所示。

图 1.11

点击选中添加好的图元，按F1即能打开这条命令的帮助文档。按Delete键即可删除已添加好的图元。

5.3 查找与替换

用户可以通过菜单栏中的查找/替换功能，选择菜单栏中的“编辑”-->“查找/替换”，查找或者替换某个或多个软元件和指令。查看详情。

5.4 软元件初始化

软元件赋初始值，选择菜单栏中的“视图”-->“软元件初始化”，或者点击工具栏中的软元件初始化按钮，进入软元件初始化界面进行设置，查看详情。

5.5 软元件管理器

选择菜单栏中的“视图”-->“软元件管理器”，，或者点击工具栏中的软元件管理器按钮，可以查看软元件的使用状况，并且修改软元件的名称和注释。查看详情。

5.6 查看指令表

点击工具栏中的指令表模式，可以查看梯形图对应的PLC指令表。这样就能在主界面的上方显示梯形图，下方显示对应的指令表了。要想关闭梯形图界面只查看指令表，需要再点击工具栏中的梯形图模式按钮。

一般情况下，用户在修改梯形图之后不会立即更新指令表，可以通过点击界面来更新，或者在“系统设置”-->“其它”-->“自动更新PLC指令表”中设置来自动更新。

5.7 注释模式

点击工具栏中的注释模式按钮，可以在每个梯形图元件的下方显示每个软元件的注释。要注意注释的长度不能太长，超过显示范围的部分将会被忽略。

5.8 子程序的添加和使用

工程管理窗口中选择子程序的文件夹，右键菜单可以选择添加子程序以及文件夹。双击添加的子程序，就能在主界面中显示并进行编辑。

5.9 中断程序的使用

符合条件的子程序可以当作中断程序来使用。中断程序的相关命令有4个：ATCH（中断绑定）/DTCH（中断释放）/EI（中断允许）/DI（中断禁止）。

ATCH（中断绑定）指令将中断事件与中断子程序相关联，当中断事件发生的时候，执行相关联的中断子程序。

DTCH（中断释放）指令可以断开中断事件与中断子程序之间的关联，从而禁止单个中断事件。

中断允许EI：指令全局性启用所有附加中断事件进程。要执行中断子程序，必须先开启全局中断。

中断禁止DI：指令全局性禁止所有中断事件进程。

5.10 函数功能块的使用

工程管理窗口中选择函数功能块的文件夹，右键菜单可以选择添加或者删除函数功能块、导入导出程序和文件夹等功能。新版本的单个C语言函数块中可以编写多个函数，软件会自动识别所有实现的函数，合法的可以被CALLM指令调用。

6. 程序实例

梯形图如图2.1：

图2.1

Network 000：启动定时器，线圈Y000置位。

点击展开左侧工程管理窗口中展开指令及其子项。

点击选中Network 000可编辑位置左侧第一个图元位置，选择并双击常开触点添加指令在选中位置，双击添加的图元，弹出梯形图输入对话框，输入X000并确认。

选择标准工具栏内“行插入”按钮，增加一行。点击选中第1行左侧第二个图元位置，在梯形图工具栏内选择“竖线”按钮添加一条竖线。

点击选中第2行左侧图元位置，选择并双击常开触点添加指令在选中位置，双击添加的图元，弹出梯形图输入对话框，输入X001并确认。

依次添加第3、4行，梯形图输入对话框分别输入X002、X003并确认。

点击选中第1行最右侧图元位置，选择并双击接通延时定时器 TON添加指令在选中位置，双击添加的图元，弹出定时器输入对话框。

输入参数T的数据为0，输入参数SV的数据为K3000并确认。

点击选中第2行最右侧图元位置，在梯形图工具栏内选择“竖线”按钮添加一条竖线。

选择并双击置位输出线圈添加指令在选中位置，双击添加的图元，弹出输出线圈输入对话框。

输入参数BIT的操作数为Y000，输入参数N的数据为K1并确认。

Network 001：线圈Y000复位。

点击展开左侧工程管理窗口中展开指令及其子项。

点击选中Network 001可编辑位置左侧第一个图元位置，选择并双击常开触点添加指令在选中位置，双击添加的图元，弹出梯形图输入对话框，输入T0并确认。

点击选中最右侧图元位置，选择并双击复位输出线圈添加指令在选中位置，双击添加的图元，弹出输出线圈输入对话框。

输入参数BIT的操作数为Y000，输入参数N的数据为K1并确认。

至此，梯形图工程文件编辑完成，选择标准工具栏内“保存工程”按钮，保存梯形图工程文件。项目存储之后，您可以下载程序到。

7. 工程下载及上载

7.1 工程下载

工程文件编辑完成后，就可以将工程文件下载到PLC中了。选择菜单栏中的“工具”-->“下载”，或者点击标准工具栏内的PLC下载图标，弹出对话框图2.2。

图2.2

FGs下载提供com口下载和usb下载两种方式。选择Com口下载需要设置通信参数，可以选择自动检测或者手动配置。

可以根据需要选择要下载的数据。必须勾选程序和配置信息的复选框，如果工程文件中选用了软元件初始化功能，必须勾选软元件表复选框。

开始下载前，可以点击“通信测试”进行通信测试，如果测试正常会提示通信成功。如图2.3所示。

图2.3

配置完成后，点击开始下载。按照提示操作就可以完成下载了。如果PLC参数设置不正确，点击“修改”按钮进入PLC参数设置对话框进行修改。

程序下载时FGs应置于STOP模式。程序下载后将FGs置于RUN状态，CPU将执行程序。此时，如果按一下连接在X0，X1，X2，X3四个按钮中的任何一个，与Y0连接在一起的四个灯将会同时亮起来，五分钟之后自动关闭。

用户编辑的程序下载运行就算完成了。

7.2 工程上载

选择菜单栏中的“在线”-->“PLC上载”，或者点击标准工具栏内的“PLC上载”，打开上载对话框，如图2.4。用户可以使用程序上载来上载已经下载到PLC中的程序。

图2.4

PLC上载与PLC下载相同。配置好通讯方式后，直接点击上载按钮，自动上载PLC中程序到PC并打开上载工程。


SamSoarII的基本操作

1. 鼠标的用法

在编辑梯形图的时候，用鼠标点击【图片】的元件工具栏之后，之后将弹出梯形图输入对话框，如图1.1所示：

图1.1 梯形图输入对话框

在该对话框中填入元件地址并点击下方的【确定】，即可将元件添加到梯形图光标所在处。

另外也可以通过双击树形目录处的命令或者直接键盘键入命令来编辑梯形图。

下面是对鼠标的几种常用的操作和意义

◎左键单击

按左侧的键，然后松开在本书中称为【单击】，在选择菜单，选择对象，选择工具按钮和确认设定时使用。

◎左键双击

连续快速的按左侧的健两次在本书中称为【双击】，在梯形图编辑模式、注释编辑模式、监控模式下鼠标在编辑区域双击已经存在的元件时是打开修改对话框，这时会对元件的信息进行修改、编辑注释或者修改监视的值。

◎右键单击

按右侧的键，然后松开在本书中称为【右击】，对某部件进行右击操作可以打开右键下拉菜单，或者在空白处右击操作显示右键菜单。还可以取消编辑状态，恢复鼠标形状。

2. 快捷键

下表2-1中罗列的是一些常用的快捷键，方便工程设计人员快速的进行工程画面的组态：

按键 | 功能
Enter | 指令输入或修改
Delete | 删除选定的元件
↑↓←→ | 梯形图光标移动
Ctrl+↑↓←→ | 梯形图光标移动并画线
Ctrl+鼠标滚轮向上 | 界面放大
Ctrl+鼠标滚轮向下 | 界面缩小
Ctrl+Enter | 末尾添加行
Ctrl+Delete | 删除当前行
Ctrl+X | 剪切
Ctrl+C | 复制
Ctrl+V | 粘贴
Ctrl+Z | 撤销
Ctrl+Y | 恢复
Shift+↑↓←→ | 选择范围移动
Shift+Ctrl+↑↓←→ | 梯形图光标处推动
Shift+Enter | 添加网络
Shift+Ctrl+Delete | 删除网络
Shift+鼠标左键 | 梯形图多选
Shift+Esc | 多选还原到单选光标
Ctrl+N | 新建一个工程
Ctrl+O | 打开一个工程
Ctrl+S | 保存当前工程
Ctrl+F | 查找
Ctrl+H | 替换

表1.1 快捷键组合

3. 三键系统（Three Hot Key）

除了常用的快捷键外，本软件针对所有的菜单栏项都添加了三键系统。如图1.2所示:

图1.2

例如上载，可用快捷键Ctrl+T,U快速触发，具体操作如下，首先按下快捷键Ctrl+T(手指按下后即可松开)，此时软件底部任务栏会出现如下提示，如图1.2:

图1.3

然后继续按下U键即可，若遗忘第二个键，可将鼠标移动到附近，此时会出现快捷键提示，如图1.3所示:

图1.4

一般来说，以Ctrl+T开头的快捷三键都是功能性质的，方便熟悉。

以下是本软件支持的所有快捷三键:

按键 | 功能
视图菜单
Ctrl+T,I | 梯形图放大
Ctrl+T,O | 梯形图缩小
Ctrl+E,C | 注释模式
Ctrl+F1,O | 打开工程资源管理器
Ctrl+F2,O | 打开软元件管理器
Ctrl+F3,O | 打开软元件初始化
Ctrl+F4,O | 打开监视列表
Ctrl+F5,O | 打开错误列表
Ctrl+F8,O | 打开断点列表
Ctrl+F9,O | 打开软元件断点列表
工程菜单
Ctrl+W,R | 添加子程序
Ctrl+W,F | 添加函数功能块
Ctrl+W,M | 添加Modbus表格
Ctrl+F7,O | 打开属性窗口
工具菜单
Ctrl+T,U | 打开上载窗口
Ctrl+T,D | 打开下载窗口
Ctrl+E,S | 梯形图仿真
Ctrl+E,M | 梯形图监视
Ctrl+T,E | 返回监视模式
Ctrl+T,N | 梯形图检测
Ctrl+T,F | 函数功能块检测
Ctrl+T,H | 打开文件转换窗口
Ctrl+T,C | 扩展模块检测
Ctrl+F6,O | 打开选项窗口
脉冲菜单
Ctrl+P,O | 打开脉冲平面配置窗口
Ctrl+P,I | 打开图形导入窗口
语言菜单
Ctrl+U,C | 切换为中文
Ctrl+U,E | 切换为英文
帮助菜单
Ctrl+F10,O | 打开帮助文档

表1.2 三键快捷键


编辑界面

SAMSOARII编辑接口简洁友好，易学易用。本节介绍SAMSOARII的组态画面以及软件的各个功能按钮。

1、 SamSoarII菜单栏的操作

2、 SamSoarII工具栏的操作

3、 查找梯形图软元件以及函数功能块文本

4、 对软元件或文本进行替换

5、 打开并操作软元件管理器

6、 对软元件的初始化进行设置

7、 查看编译错误的报告

8、 对PLC进行监视

9、 PLC参数的设置

10、SamSoarII上位软件的设置

11、与PLC的通信设置


SamSoarII菜单栏

SAMSOARII编辑软件的菜单栏为使用者提供了丰富的菜单选项菜单栏，如下图1.1所示。

图1.1 SamSoarII菜单栏

1. 文件（F）

图1.2 文件菜单

新建工程：用于新建一个新的SAMSOARII工程文件

打开工程：打开一个已经存在的SAMSOARII工程文件

保存工程：保存正在编辑的SAMSOARII工程文件

另存为：自己选择路径保存工程文件

最近工程：查看最近使用的工程文件的列表，选择其中一个打开

关闭当前工程：关闭当前正在编辑的SAMSOARII工程文件

退出：退出SAMSOARII编辑软件

2. 编辑（E）

图1.3 编辑菜单

撤销：   撤销刚才的操作步骤；注意,在执行以下操作之后，将不能进行撤销操作。

1. 进行梯形图检查，编译，仿真，监视都会进行一次检查。

2. 切换PLC型号。

3. 保存退出再打开。

恢复： 恢复刚才已经撤销的操作步骤

剪切： 对于选中的目标执行剪切操作

复制： 对于选中的目标执行复制操作

粘贴： 在光标的指定位置粘贴剪切板中的内容

全选：  全选当前的梯形图或者文本。

查找： 查找梯形图中的指令或者软元件，以及文本中的关键字。

替换： 替换梯形图中的指令或者软元件，以及文本中的关键字。

3. 视图（V）

图1.4 视图菜单

放大：将当前梯形图的尺寸变大。

缩小：将当前梯形图的尺寸变小。

注释模式：显示软元件的注释信息。

工程资源管理器：查看并管理当前工程各个部分的窗口

软元件管理器：查看或编辑软元件信息的窗口

软元件初始化：设置在PLC运行之前，各个软元件要预设的值。

错误列表：显示梯形图和函数块检查后，检查到的所有错误以及警告。

监视列表：通过该对话框进行软元件变量的监视以及对软元件的值进行修改，注意，只有切换到梯形图监视模式的情况下才允许执行软元件的变量监视。

断点列表：仅在仿真模式下使用。在梯形图指令或者函数块语句中设置断点，仿真程序运行到该位置会自动暂停，以便于查看运行的即时情况。

软元件断点：仅在仿真模式下使用。对软元件设置条件表达式，当符合这个条件时仿真程序会自动暂停，并标出当前运行到的位置。

4. 工程（P）

图1.5 工程菜单

添加子程序：单击这个按钮后，会在“工程资源管理器”-->“工程”-->“程序”-->“子程序”的文件夹中创建一个新的子程序，默认名称叫“新建子程序”，若存在重名则会在后面加入代号。添加的子程序的名称可以在编辑模式下修改。

添加函数功能块：在工程资源管理器中创建一个新的函数功能块。

添加MODBUS表格：将MODBUS编辑界面显示在当前主界面上，并且弹出创建MODBUS表格的对话框。

属性：弹出PLC设置的对话框，在此对话框内可以设置设备型号，通信参数，通信密码，模拟量，滤波参数，掉电保持以及扩展模块。

5. 工具（T）

图1.6 工具菜单

上载：弹出PLC读取对话框，在对话框中可以实现对plc内部数据的上载操作。

下载：弹出PLC下载对话框，在对话中实现将编辑的梯形图下载到PLC中。

仿真：单击这个按钮后，会进入仿真模式，在仿真模式下会模拟工程程序的运行。要注意，仿真不支持脉冲，通信以及高速计数。

监视：单击这个按钮后，会进入监视模式，此时可以进行软元件变量的监视以及对软元件的值进行修改。

返回编辑：在仿真模式和监视模式下使用，单击以返回到编辑模式。

编译：对整个工程进行合法性检查，确保各个部分的正确。编译时发现的错误信息会报告到错误列表中。

程序检测：对梯形图和函数块进行检测，确保其正确性。

文件转换：将一代SAMSOAR Developer的工程文件，转换为二代SAMSOARII的工程文件。

扩展模块检测：检测连接PLC的扩展模块数量及信息。

选项：在该对话框内对梯形图的编程界面以及风格等进行相应的设置，使得软件使用更符合用户自己编程习惯。

6. 脉冲（P）

图1.7 脉冲菜单

脉冲平面：弹出对平面系统进行设置的对话框进行操作。

图形导入：弹出对HMI图形的管理的对话框。可以进行导入，参数设置等操作。

7. 语言（L）

图1.8 语言菜单

中文：将当前语言切换为简体中文。

英文：将当前语言切换为English.

8. 帮助（H）

图1.9 帮助菜单

帮助：点击该按钮可以调处帮助文档查看。

关于：点击该按钮可以查看软件的版本号以及版权归属。


SamSoarII工具栏

2.1 标准工具栏

标准工具栏中包含了针对plc工程项目的一些基本操作的按钮，如新建、打开、保存以及对于梯形图编辑过程中用到的剪切、拷贝、黏贴等基本操作。

图1.1 标准工具栏

新建工程：用于新建一个SAMSOARII工程文件

打开工程：打开一个已经存在的SAMSOARII工程文件

保存工程：保存正在编辑的SAMSOARII工程文件

撤销：撤销刚才的操作步骤；

恢复：恢复刚才已经撤销的操作步骤

剪切：对于选中的目标执行剪切操作

复制：对于选中的目标执行复制操作

粘贴：在光标的指定位置粘贴剪切板中的内容

编译：检查当前工程是否合法，包括梯形图和函数功能块。

上载：弹出PLC读取对话框，在对话框中可以实现对plc内部数据的上载操作。

下载：弹出PLC下载对话框，在对话中实现将编辑的梯形图下载到PLC中。

仿真：单击这个按钮后，会进入仿真模式，在仿真模式下会模拟工程程序的运行。

监视：单击这个按钮后，会进入监视模式，此时可以进行软元件变量的监视以及对软元件的值进行修改。

放大：将当前梯形图的尺寸变大。

缩小：将当前梯形图的尺寸变小。

梯形图显示模式：此按钮处于选定状态（深色）下，在主界面显示梯形图。当指令表模式未被选定时，不能取消梯形图模式。

指令表显示模式：此按钮处于选定状态（深色）下，在主界面显示指令表。当梯形图模式未被选定时，不能取消指令表模式。当梯形图和指令表同时显示时，梯形图位于主界面的上方，指令表在下方，可以拖动边界来调整二者的高度比。

注释编辑模式：此按钮处于选定状态（深色）下，会在梯形图元件下方和指令表指令的右方显示每个软元件的注释。

软元件管理器：查看或编辑软元件信息的窗口。

软元件初始化：设置在PLC运行之前，各个软元件要预设的值。

COM设置：对通信参数进行设置。可以设置或者自动检测串口的波特率，校验位，停止位，超时时间，并进行对下位的通信测试。

SYS设置：对软件系统进行设置。包括界面风格的设置以及其他设置，以符合用户的编程习惯。

PLC设置：弹出PLC设置的对话框，在此对话框内可以设置设备型号，通信参数，通信密码，模拟量，滤波参数，掉电保持以及扩展模块。

2.2 编辑工具栏

该工具栏中包含编辑梯形图时经常用到的基本元件和操作，通过单击该工具栏上的按钮可以快速进行梯形图符号的输入。

图1.2 编辑工具栏

常开触点：点击这个按钮，会弹出梯形图命令输入对话框，可以快速插入一个常开触点，快捷键为（F2）

立即常开：快速插入立即常开触点，快捷键为（Shift+F2）

常闭：快速插入常闭触点，快捷键为（F3）

立即常闭：快速插入立即常闭触点，快捷键为（Shift+F3）

上升沿脉冲：快速插入上升沿触点，快捷键为（F5）

下降沿脉冲：快速插入下降沿触点，快捷键为（F6）

运算结果上升沿化：前面的运算结果取上升沿，快捷键为（Shift+F5）

运算结果下降沿化：前面的运算结果取下降沿，快捷键为（Shift+F6）

运算结果取反：前面的运算结果取反，快捷键为（F7）

输出线圈：快速插入输出线圈，快捷键为（F8）

立即输出线圈：快速插入立即输出线圈，快捷键为（Shift+F8）

横线：绘制一条横向连接线，快捷键为（F9）

竖线：绘制一条竖向连接线，快捷键为（F10）

横线删除：删除点中的横线，快捷键为（Shift+F9）

竖线删除：删除点中的竖线，快捷键为（Shift+F10）

行插入：在当前光标处插入一条新行。

行删除：删除当前选择范围内的所有行。

列插入：在当前光标处插入一条新列。

列删除：删除当前选择范围内的所有列。

网络插入：在当前光标处插入新的网络。

网络删除：删除与选择范围关联的所有网络。


查找操作

1. 对梯形图的查找

当前正在查看并编辑梯形图时，选择菜单栏中的“编辑”-->“查找”按钮，或者按下Ctrl+F，打开查找窗口，如图1.1。

图1.1

选择查找的程序范围，当前程序是指当前显示的并正在编辑的程序，所有程序是指工程文件内的主程序和所有子程序。

在下方的文本框内输入要查找的内容并按下 [image] 或者回车键，会在下方的表格中显示所有符合条件的指令项。输入非法时文本框背景会变红，输入合法待查找时显示绿色，查找后恢复白色。可以按照以下规则来输入：

1.查找单个指令名称：例如LD, OUT, ADD。

2.查找单个软元件名称：例如D0, M0V0, K1。

3.查找选定范围内的软元件：例如D[0..2]，将会找到所有使用了D0,D1,D2的指令。同样变址和常量也可以选择范围。例如M10V[1..3]代表M10V1,M10V2,M10V3，M[10..100]V1代表M10V0到M100V0，也可以同时选择二者的范围M[10..100]V[1..3]。K[1.5..4.5]会查找在K1.5到K4.5范围内的所有常量，包括整数和十六进制数。位合成字和字取位也符合以上规则。

4.查找子程序，C函数，MODBUS表格的名称。

5.以上元素的任意组合，以组成指令的架构。例如LD M0，ADD K[0..10] K[10..16]M[10..20] D[20..30]等。可以使用*符号来对任意项匹配，例如LD *同样可以匹配LD M0,LD C0, LD D0.0等指令，ADD * * D0可以只匹配符合out参数的指令。

在输入关键字并按下回车后，若匹配到符合条件的指令，会在下方表格中显示。

图1.2

在表格中双击其中一项，梯形图会自动导航到选定的位置。

2. 对文本的查找

查找功能同样可以对函数功能块文本进行查找。在上方可以选择查找的范围为当前文本或者全部文本。输入关键词并按下回车，即可在下方列表查看找到的所有项，双击以选中匹配的文本内容。

图1.3

点击右上角的设置按钮，来进入文本查找的设置。

图1.4 设置窗口

使用正则表达式：允许用户输入符合正则表达式规则的关键字格式。如何使用正则表达式？

忽视大小写：查找时无视大小写，输入a的话a和A都会被匹配到。


替换操作

1. 对梯形图的替换

当前正在查看并编辑梯形图时，选择菜单栏中的“编辑”-->“替换”按钮，或者按下Ctrl+R，打开替换窗口。

图1.1

选择查找的程序范围，当前程序是指当前显示的并正在编辑的程序，所有程序是指工程文件内的主程序和所有子程序。

在查找文本框内输入要查找的内容并按下 [image] （或者回车键），会在下方的表格中显示所有符合条件的指令项。输入非法时文本框背景会变红，输入合法待查找时显示绿色，查找后恢复白色。如何输入查找关键字？

在替换文本框内输入要将查找到的指令进行替换的关键字，然后进行后续替换。替换关键字的输入规则和查找一致，但查找和替换的关键字之间存在配对规则：

1. 一般情况下，替换关键字只替换明确的部分，例如ADD D0 * D[10..20]，如果将SUB K2 K1 D5进行替换，那么会替换为ADD D0 K1 D10，因为只有ADD，D0和D[10..20]是明确的，并且D[10..20]将视作D10，而中间的K1将会被保留。

2. 如果查找只输入了单个软元件，那么替换也可以只输入单个软元件，来仅对软元件进行替换。例如查找输入了D0，替换输入D1，若要替换LD D0.8, MUL K1 D0 D1，那么会被替换为LD D1.8和MUL K1 D1 D1，只进行了 D0 ---> D1 的替换而保留了其他部分。在替换输入的软元件名称前面添加$符号，表示强制替换为所选的软元件，不考虑原来的软元件的变址，字取位，位合成字的情况。例如查找输入了D0，替换输入$D1，那么MOV K10 D0V0会被替换为MOV K10 D1，变址部分会被省略。相比较而言，如果替换输入的是D1，那么还是会被替换为MOV K10 D1V0，变址部分会被保留。

3. 如果查找输入了软元件的范围，例如M[0..2]，那么替换也可以输入软元件的范围，例如C[10..12]，这样就会进行 M0-->C10，M1-->C11，M2-->C12 的替换。

4. 若查找输入了指令格式，替换也输入了指令格式，那么会对每个对应位置的参数进行一一匹配，若符合上述的范围匹配则按照上述规则执行。例如ADD D0 D[0..2] D10替换为SUB D0 CV[10..12] D20，那么中间的参数会进行 D0-->CV10，D1-->CV11，D2-->CV12 的替换。

对查找到的指令进行替换可以通过以下三种方式来进行：

1. 双击表格项，对单个指令进行替换。

图1.2

2. 通过鼠标拖动来范围选择，Shift+鼠标左键来调整选择范围，Ctrl+鼠标左键来添加或者移除项的选择。选择好范围后，按下回车键对范围内的所有指令进行替换。

图1.3

如果替换不成功，会将错误信息报告到对话框中。

图1.4

3. 未选中下方表格中的任意项，直接点击替换按钮，会将下表中所有项进行替换。

图1.5

替换报告对话框弹出时，替换的图元部分会在屏幕上暂时消失，这属于正常现象，关闭对话框后会替换成新的图元。

替换后可以在替换窗口点击 [image] 进行撤销，或者点击 [image] 进行恢复操作。要注意，之后对梯形图直接修改会清除掉替换窗口的撤销记录，请谨慎修改。

2. 对文本的替换

当前正在编辑文本时，选择菜单栏中的“编辑”-->“替换”按钮，或者按下Ctrl+R，打开替换窗口。在查找输入框内输入关键字来查找，在替换输入框内输入关键字来替换。

图1.5


软元件管理器

选择菜单栏中的“视图”-->“软元件管理器”，或者按下工具栏的软元件管理器按钮，打开软元件管理器窗口。

图1.1

选择软元件区间：可以将只符合某个基地址的软元件在表格中显示，点击以选中，再次点击选中的以取消。

搜索：输入软元件名称并按回车键来搜索符合的软元件。

显示所选项细节：这个按钮处于按下状态时，选中的表格项的下方会显示使用这个软元件的指令列表，单击其中的指令，梯形图的界面可以导航到此处。

图1.2

清空所选项：取消对表格项的选择，从单选或者多选转换到未选择的状态。

已使用软元件：这个按钮处于按下状态时，只会显示梯形图程序用到的软元件。

已注释软元件：这个按钮处于按下状态时，只会显示拥有非空白注释的软元件。

导入CSV：从CSV文件中的软元件信息导入到工程内。

导出CSV：将工程内的软元件信息导出到CSV文件。


软元件初始化

选择菜单栏中的“视图”-->“软元件初始化”，或者按下工具栏的软元件初始化按钮，打开软元件初始化窗口。

图1.1

输入要添加的软元件的地址。

选择要添加的数据类型。

输入要批量添加的软元件的数量，若输入10，会将D0~D9依次添加到表格中，若数据类型选择INT32,POS_INT32或者FLOAT，再输入10，会将D0,D2,D4一直到D18依次添加到表格中。但是CV200以上的双字计数器还会保持一个间隔，即CV200,CV201...CV209。

添加要初始化的软元件之后，可以在列表中对应的行项双击【ON/OFF/值】列项，会出现输入框来输入要初始化的值。

图1.2 双击之后的输入框

应遵守以下规则来输入：

1.对于类型为BOOL的软元件，可以输入ON,on或者1来代表置位，输入OFF,off或者0来代表复位。

2.对于其他类型的软元件，输入的值应符合当前类型的范围。

类型 | 范围
INT16 | [-32768~32767]之间的整数
POS_INT16 | [0~65535]之间的整数
INT32 | [-2147483648~2147483647]之间的整数
POS_INT32 | [0~4294967295]之间的整数
BCD | [0~9999]之间的整数
FLOAT | [-3.4e38~3.4e38]之间的实数

表1.1 类型的范围


错误列表

工程编辑完毕后，可以通过编译来验证工程程序的正确性。通过F4键来进行编译，编译包括梯形图检查以及函数块检查这两个步骤。

在梯形图检查或者函数块检查中，发现的错误信息会报告到错误列表中，这时错误列表的窗口会自动弹出。也可以通过选择菜单栏中的“视图”-->“错误列表”来打开窗口。

图1.1

列表中的每个错误项都有相应的说明，双击该项以导航到梯形图对应的位置，将错误更改后这个项就会消失。

函数块的错误通过将编译器给的报错信息，经过整理显示在列表中。

图1.2

和梯形图错误一样，双击会导航到对应页面，但是更改的过程中错误信息不会消失，必须全部更改完毕后再一次进行函数块检查才可通过。


变量监视表

选择菜单栏中的“视图”-->“监视列表”，监视变量对话框将会打开。

注意：只有在监视模式或者仿真模式下才能在该对话框进行元件监视，“监视开始”按钮才会变为有效状态。

图1.1 变量监视表

1. 监视变量表的添加和删除

左侧列表为监视变量表的名称，左键列表名可切换监视变量表,右键列表框可对变量表进行增减(最大可增加13个表格)，每一个表下可添加不同监视变量,在同一时刻只可监视其中一个表格内的变量。

右键打开菜单，可以选择新建或者删除变量表。

图1.2 表格编辑

点击【新建表格】会在最下方新建一个新的变量表。默认名称为New，重名会在后面标序号。

此处显示选中的监视变量表名称,修改此处内容可修改对应表格的名称，点击别处修改的名称会立即生效。

点击【删除表格】会删除选中的变量表。点击【全部删除】后，之前的监视变量表以及里面的内容均会被删除，请谨慎操作。

2. 添加监视元件

单击“软元件添加”按钮可以弹出软元件添加对话框：

图1.3 添加软元件

在此处可以输入软元件的地址。

在此处可以选择软元件的数据类型。

要注意，位寄存器（X,Y,M,S,T,C）若选择字类型视为位组成字，同理字寄存器选择BOOL视为字取位。在输入软元件地址的下方会要求输入位组成字的长度或者字取位的位置。

图1.4 添加位合成字

图1.5 添加字取位

勾选 [image] 后，会在右侧显示 [image] ，这时输入的软元件带变址偏移。

勾选 [image] 后，会在右侧显示 [image] ，输入个数后会批量添加软元件。要注意，若单字寄存器(D,V,Z,AI,AO,TV,CV0~199)选择了双字的类型(DWORD,UDWORD, DHEX,FLOAT)，则会间隔为2批量添加。

3. 快速添加

单击【快速添加】按钮会弹出快速添加对话框。

图1.6 快速添加

这个添加模式下，会识别出所有用到的软元件，按照使用的信息（数据类型，变址，字取位，位合成字）自动添加到监视列表中。

图1.7

在 [image] 选择了【全部程序】后，点击确定按钮，每个程序都会分配给一个对应的监视变量表中，以程序的名称来命名（主程序设为Main）。

要注意，进行快速添加后，之前的监视变量表以及里面的内容均会被删除，请谨慎操作。

若选择【当前程序】，会要求在下方给定网络范围。这样只会创建一个监视变量表，表内只包含网络范围内的软元件。

图1.8

4. 删除监视元件

在监视表中选中项后，【软元件删除】按钮可以点击。这时会删除掉所选择的软元件。

点击【全部删除】后，当前的监视变量表里面的内容均会被删除，请谨慎操作。

5. 监视开始和停止

在监视模式和仿真模式下，可以打开或者关闭监视。在仿真模式下打开监视程序也会立即运行，关闭监视后程序会立即停止。开始监视后，就能在梯形图和监视表中查看软元件的当前值了。这时点击监视停止，会立即停止监视。

图2.1 正在监视

这时双击梯形图或者监视表时，会弹出软元件值修改的对话框。

图2.2 修改值

对于字软元件，输入要修改的值点击【写入】就会立即生效。对于一般的位软元件，只能进行置位和复位操作。对于X,Y，可以强制设为ON和OFF，也可以取消单个或者全部强制。

图2.3 修改位

图2.4 强制位


PLC参数设置

单击工具栏上的PLC设置图标，或者点击菜单栏“工程”-->“属性”，PLC设置画面将会打开。

1. 设备型号设置

这里选择当前使用的PLC设备的型号，目前分为FGs_16MR_A，FGs_16MT_A，FGs_32MR_A，FGs_32MT_A，FGs_64MR_A，FGs_64MT_A，FGm_64MT_A这七种。

图1.1

注意：

1、用户若无法分清当前所连PLC的实际型号，那么在创建新工程时也可任意选择其中一种，因为在下载时会有型号校验功能，帮助用户自动切换型号；

2、不同型号之间可能会有不同的功能，某些指令仅能在某种型号中使用；

2. 通信参数设置

图1.2

COM口参数设置：在该页面可以对PLC的通信参数进行相应的设置。PLC串口的默认通信参数为：波特率 9600，数据位8，停止位1，校验码NONE；

串口通信协议类型：包括Modbus主站、Modbus从站、以及自由口通信，默认协议为Modbus从站；

站号：设置PLC的站号，不同的COM口其站号可以不同；

超时时间：该参数仅在Modbus主站通信时生效，对于从站和自由口通信而言没有实际意义，表示PLC作为主站通信时每次接收从站一包数据的最大等待时间，默认值为20*10ms；

重传次数：该参数仅在Modbus主站通信时生效，对于从站和自由口通信而言没有实际意义，表示当接收从站数据超时后会再次进行重传的次数，默认值为3；

缓冲位：该参数仅在自由口通信时生效，对于Modbus主站和从站而言没有实际意义，表示通信时数据以8位还是16位格式进行缓冲；

注意：

1、若想使用MODBUS主站通信必须选择Modbus主站协议，且建立并编辑Modbus主站表格，在梯形图中使用Modbus指令；

2、当该COM口的通讯协议设置为MODBUS主站或自由口通讯用后,无法再用来下载工程,也无法进行监视，仅当选择Modbus从站协议并下载至PLC中才具有下载和监视功能；

3、除了可通过配置信息下载更新串口信息，对于串口的波特率、数据位、停止位、校验码、站号等设置还可通过特殊寄存器D8066~D8075、M8184设置；

3. 密码设置

图1.3

·上载加密：设置PLC程序的上载密码，在上载程序的时候回提示输入该密码，遗忘该密码的话会导致程序无法上载

·下载加密：设置PLC程序的下载密码，在下载程序的时候回提示输入该密码，遗忘该密码的话会导致无法更新PLC内部的程序

·监控加密：设置PLC监控的密码，在上位梯形图监控该模式的时候会用到，遗忘该密码将不能监控PLC程序

注意：密码必须以字母或数字开头，长度为4至12位。

4. 模拟量设置

图1.4

5. 滤波设置

图1.5

·在该页面可以进行滤波设置，滤波设置范围从0.20~51.20ms之间。

1、滤波设置共有三种模式：不启用、统一模式、其它模式

当选择不启用时，则不开启对输入信号X的软件滤波；

当选择统一模式时，则可配置滤波时间，该滤波参数适用于所有X输入通道；

当选择其它时，则可单独配置每一路X输入通道的滤波时间；

2、对于多脉冲型FGm系列PLC，除了以上的滤波设置外，另外还可选择是否启用硬件滤波，但硬件滤波只可配置前16路X通道；

分频系数是以50MHz的采样时钟为基准，另外PLC内部默认对分频过后的输入信号采样时钟进行连续8次采样才确定唯一高低电平；

如当分频系数选择为2时，表示先对50MHz的基准时钟进行二分频后，以25MHz的采样频率对输入信号进行采样，除此之外内部默认需连续采样8次的电平都是唯一的才确定该电平是有效的，若以25MHz连续采样的8次电平中有一次不相同的， 则该电平认为是因干扰引起的无效电平，因此该方法可有效地抑制干扰抖动等不确定因数；

需小心使用该硬件滤波，如若实际输入信号的频率较高时，请不要将该分频系数设置地过大，否则分频过后的采样时钟无法对高频率的输入信号进行有效采样；

如当使用高速计数功能时，实际计数最大频率若可达到500KHz，则最大可配置的分频系数应 <=50MHz/(500KHz*8*2)≈3，即分频系数最大可设置为2；

6. 保持区设置

图1.6

掉电保持区范围最大可设置为：M7488~M7999、D5952~D7999、S600~S999、CV100~CV199、CV220~CV234、CV235~CV255；

·在该页面中可以对掉电保持区的容量进行设置，点击默认设置的时候会清空当前设置并将掉电保持区的起始地址设置为最小值，将长度设置为最大值

·勾选下载时不清除掉电保持数据，在下载梯形图程序时将不清除下载之前掉电保持区的数据。

·掉电保持功能不受【下载时不清除】这个设置的影响，始终按照用户设置的表格来执行。

7. 扩展模块设置

图1.7

·勾选使用扩展模块，开始扩展模块设置

  ·具体使用请查看扩展模块使用说明

8. 实时时钟设置

1、可配置实时时钟读写格式为BCD码或10进制；

2、当启用实时时钟报错检测时，若实时时钟异常则PLC会进入ERROR、STOP状态，PLC将停止运行，可通过查看D8176是否等于9，或者通过上位软件监视查看状态栏信息；

3、当不启用实时时钟报错检测时，即便实时时钟异常也不会影响PLC的正常运行，仍可通过D8176或监视信息状态栏查看PLC是否异常；

9. 实时时钟设置

1、可由用户选择是否配置看门狗定时器，并且可设定看门狗定时器值，该功能一般用于检测用户编写梯形图或函数功能块时造成死循环的问题；

2、在PLC运行的每个扫描周期结束时内部会默认对看门狗进行复位，也可通过在梯形图程序中使用WDT指令手动复位看门狗；

3、若超过设定值时间后若没有复位则PLC会进入ERROR、STOP状态，PLC将停止运行，可通过查看D8176是否等于10，或者通过上位软件监视查看状态栏信息；

10. 掉电检测时间设置

1、该参数用来设置PLC判断PLC掉电软件滤波时间，如当设置为默认值50ms时，表明电网波动低于50ms时，将认为该PLC处于正常供电状态，若超过50ms后，则认为该PLC进入了掉电状态，此时PLC将停止运行并存储掉电保持数据；

2、当外部干扰比较严重时导致PLC运行时误进STOP掉电状态，则可适当增加该掉电检测时间；

3、当增大该值时，可能会影响掉电保持数据的正常存储，造成掉电数据不保持，因此该掉电检测时间仅在外部供电电压不稳定导致PLC可能误进掉电模式时才适当地略微增大，其它情况下请不要擅自修改该参数值；


系统设置

选择菜单栏中的“工具”-->“选项”，或者直接单击工具栏上的系统设置图标，系统设置对话框将会打开。

图1.1

1. 字体设置

选择“字体设置”选项卡可以对编程界面上的字体风格、字体颜色、字体大小等信息进行设置。

可以选择软元件，梯形图标题，注释以及函数功能块。软元件是指软元件上除了 [image] 这种作为图元符号以外的图元上的所有字体，梯形图标题是指 [image] 以及 [image] ，注释是指标题以及图元下方的注释。函数功能块是指编写功能块的C语言代码的字体。

可以设置字体的显示风格，常用的有微软雅黑和宋体。

设置字体的大小，一般来说，软元件注释的字体不要设的太大，否则会导致界面空间不足。

单击 [image] 会弹出画板框，可以对颜色进行编辑。

图1.2

2. 其他设置

选择“其他”选项卡可以设置更强大的功能。

图1.3

图1.4

勾选此选项可以设定任意分钟间隔内自动保存工程保存到所在路径中。

图1.5

勾选此选项可以设定任意秒间隔内自动更新修改过的梯形图的指令表。

图1.6

勾选【显示双寄存器】时，会将被占用为双字的单字寄存器的下一个字显示出来。例如双字的D0会显示为D0D1。由于会占显示空间并且破坏美观，建议不要勾选。

勾选【用别名代替】时，会将设置了别名(Alias)的软元件用别名来代替显示。例如1s时钟M8160的系统默认别名为CLK_1s，会在梯形图和监视表中显示。

图1.7

图1.8

勾选【检查多线圈输出】后，对同一个软元件的多个线圈输出将不会被允许，梯形图检查时会报错。

勾选【检查多定时器】，【检查多计数器】同理，不允许同一个计时器或者计数器使用在多个位置上。

图1.9


通信设置

单击标准工具栏上的通信设置按钮，可以打开通信设置对话框。

图1.1

选择USB口时可以直接进行通信测试，选择COM口时需要设置通信参数。可以自动检测，也可以手动设置。

图1.2

点击左下角通信测试，上位软件会尝试和下位进行一次通信，若是手动配置的参数，会根据配置的参数来进行通信，若选择的是自动检测，软件会自动切换识别通信参数。

当通信成功后，会显示对话框：

否则会显示：


PLC指令系统

内容如下：

1、 位逻辑

2、 比较

3、 转换

4、 逻辑运算

5、 传送

6、 浮点数计算

7、 整数计算

8、 定时器

9、 计数器

10、程序控制

11、移位指令

12、中断指令

13、实时时钟

14、通信指令

15、脉冲输出指令

16、高速计数指令

17、辅助指令

18、PID指令


位逻辑指令

内容如下：

1、 常开输入指令 -| |-

2、 立即常开输入指令 -|||-

3、 常闭输入指令 -|/|-

4、 立即常闭输入指令 -|/||-

5、 上升沿脉冲 -|↑|-

6、 下降沿脉冲 -|↓|-

7、 结果上升沿 -↑-

8、 结果下降沿 -↓-

9、 运算结果取反指令 -/-

10、普通输出线圈 -()

11、立即输出线圈 –(|)

12、置位输出线圈 –(S)

13、立即置位输出线圈 –(SI)

14、复位输出线圈 –(R)

15、立即复位输出线圈 –(RI)

16、连续交替输出 ALT

17、脉冲交替输出 ALTP


常开输入指令 -| |-

对应命令 | 注释/说明 | 操作数（线圈）
LD、AND、OR | 常开触点 | X/Y/M/T/C/S

1. 指令说明

当指定的位等于1（ON）时，常开触点闭合(接通)，当指定的位等于0（OFF）时，常闭触点闭合(断开)。

在指令表中，常开触点用LD（载入）、AND（与）和OR（或）指令表示，这些指令LD（载入）、AND（与）或OR（或）将地址位数值置于堆栈顶部。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | X/Y/M/T/C/S | 指定的操作数

3. 实例

指令表：

LD     X000 // 加载输入线圈X000，X000必须等于1时才能激活X000

OR     X002 // 与输入线圈X002进行‘或’操作

AND    X001 // 与输入线圈X001进行‘与’操作

OUT    Y000 // 输出线圈Y000

梯形图：


立即常开输入指令 -|||-

对应命令 | 注释/说明 | 操作数（线圈）
LDIM、ANDIM、ORIM | 立即常开触点 | X/Y/M/T/C/S

1. 指令说明

当指定的位等于1（ON）时，立即常开触点闭合(接通)，当指定的位等于0（OFF）时，立即常开触点闭合(断开)。指定的位不依靠FGs扫描周期进行更新，它会立即更新。

在指令表中，立即常开触点用LDIM（立即载入）、ANDIM（立即与）和ORIM（立即或）指令表示，这些指令LDIM（立即载入）、ANDIM（立即与）或ORIM（立即或）将地址位数值置于堆栈顶部，并立即执行。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | X/Y/M/T/C/S | 指定的操作数

3. 实例

指令表：

LDIM    X000  // 立即加载输入线圈X000，X000必须等于1时才能激活X000

ORIM    X002  // 与输入线圈X002进行‘立即或’操作

ANDIM   X001  // 与输入线圈X001进行‘立即与’操作

OUT     Y000  // 输出线圈Y000

梯形图：


常闭输入指令 -|/|-

对应命令 | 注释/说明 | 操作数（线圈）
LDI、ANDI、ORI | 常闭触点 | X/Y/M/T/C/S

1. 指令说明

当指定的位等于0（OFF）时，常开触点闭合(接通)，当指定的位等于1（ON）时，常闭触点闭合(断开)。

在指令表中，常闭触点用LD  NOT（载入非）、AND  NOT（与非）和OR  NOT（或非）指令表示，这些指令LD（载入）、AND（与）或OR（或）将地址位数值的逻辑NOT（非）置于堆栈顶部。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | X/Y/M/T/C/S | 指定的操作数

3. 实例

指令表：

LDI     X000 // 加载输入线圈X000的逻辑NOT，X000必须等于0时才能激活X000

ORI     X002 // 与输入线圈X002进行‘或非’操作

ANDI    X001 // 与输入线圈X001进行‘与非’操作

OUT     Y000 // 输出线圈Y000

梯形图：


立即常闭输入指令 -|/||-

对应命令 | 注释/说明 | 操作数（线圈）
LDIIM、ANDIIM、ORIIM | 立即常闭触点 | X/Y/M/T/C/S

1. 指令说明

当指定的位等于0（OFF）时，立即常闭触点闭合(接通)，当指定的位等于1（ON）时，立即常闭触点闭合(断开)。指定的位不依靠FGs扫描周期进行更新,它会立即更新。

在指令表中，立即常闭触点用LDIIM（立即载入非）、ANDIIM（立即与非）和ORIIM（立即或非）指令表示，这些指令LDIM（立即载入）、ANDIM（立即与）或ORIM（立即或非）将地址位数值的逻辑NOT（非）置于堆栈顶部，并立即执行。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | X/Y/M/T/C/S | 指定的操作数

3. 实例

指令表：

LDIIM   X000  // 立即加载输入线圈X000的逻辑NOT，X000必须等于0时才能激活X000

ORIIM   X002  // 与输入线圈X002进行‘立即或非’操作

ANDIIM  X001  // 与输入线圈X001进行‘立即与非’操作

OUT      Y000  // 输出线圈Y000

梯形图：


上升沿脉冲 -|↑|-

对应命令 | 注释/说明 | 操作数（寄存器）
LDP、ANDP、ORP | 上升沿脉冲 | X/Y/M/T/C/S

1. 指令说明

1） 当指定的位检测到正跳变（断到通）时，触点闭合一个扫描周期。

2） 对于上升沿指令，指定的位允许一次扫描中每次执行0到1（OFF → ON）转换时，将堆栈顶值设为1；否则，将其设为0；

3） 指令每次只执行一瞬间（PLC扫描周期）。常用于顺控中信号触发用，不能当作输出（外部线圈可能不吸，这点要注意）；

4） 在使用该指令时要格外注意，因为只有在系统检测到上升沿变化时触点才会接通，实际使用时处理不当可能会错过致使不能发生。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | X/Y/M/T/C/S | 指定的操作数

3. 实例

指令表：

LD      X000       // 加载输入线圈X000，X000必须等于1时才能激活X000

OR      X002       // 与输入线圈X002进行‘或’操作

ANDP    X001       // 与输入线圈X001进行‘与’操作

SET     Y000    K1   // 输出线圈Y000

梯形图：


下降沿脉冲 -|↓|-

对应命令 | 注释/说明 | 操作数（寄存器）
LDF、ANDF、ORF | 下降沿脉冲 | X/Y/M/T/C/S

1. 指令说明

1） 当指定的位检测到负跳变（通到断）时，触点闭合一个扫描周期；

2） 对于下降沿指令，指定的位触点允许一次扫描中每次执行1到0（ON → OFF）转换时，将堆栈顶值设为1；否则，将其设为0；

3） 指令每次只执行一瞬间（PLC扫描周期）。常用于顺控中信号触发用，不能当作输出（外部线圈可能不吸，这点要注意）；

4） 在使用该指令时要格外注意，因为只有在系统检测到下降沿变化时触点才会接通，实际使用时处理不当可能会错过致使不能发生。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | X/Y/M/T/C/S | 指定的操作数

3. 实例

指令表：

LD      X000         // 加载输入线圈X000，X000必须等于1时才能激活X000

OR      X002         // 与输入线圈X002进行‘或’操作

ANDF    X001         // 与输入线圈X001进行‘与’操作

SET     Y000    K1   // 输出线圈Y000

梯形图：


结果上升沿 -↑-

对应命令 | 注释/说明 | 操作数（寄存器）
MEP | 结果上升沿 | None

1. 指令说明

1） MEP指令前的运算结果为上升沿（OFF→ ON）时，该指令将变为ON（导通状态）；否则该指令将变为OFF（非导通状态）。即使得结果脉冲化。

2） 输出将会在边沿信号导通的瞬间执行一次，除非再次有相应的边沿信号产生时才会再执行一次。

2. 实例

指令表：

LD      X000

OR      X002

MEP                  // 如果前方触点结果有上升沿，则执行后方输出

SET     Y000    K1

梯形图：


结果下降沿 -↓-

对应命令 | 注释/说明 | 操作数（寄存器）
MEF | 结果下降沿 | None

1. 指令说明

1） MEP指令前的运算结果为下降沿（ON → OFF）时，该指令将变为ON（导通状态）；否则该指令将变为OFF( 非导通状态)。即使得结果脉冲化。

2） 输出将会在边沿信号导通的瞬间执行一次，除非再次有相应的边沿信号产生时才会再执行一次。

2. 实例

指令表：

LD      X000

OR      X002

MEF                   // 如果前方触点结果有下降沿，则执行后方输出

SET     Y000    K1

梯形图：


运算结果取反指令 -/-

对应命令 | 注释/说明 | 操作数（寄存器）
INV | 结果取反 | None

1. 指令说明

将至INV之前的运算结果取反后作为输出的使能。

2. 实例

指令表：

LD      M000

INV             // 将M000结果取反输出到Y001

OUT     Y001

梯形图：


普通输出线圈 -()

对应命令 | 注释/说明 | 操作数（寄存器）
OUT | 普通输出线圈 | Y/M/S

1. 指令说明

将新值写入指定的位寄存器。指令执行时，FGs将指定的位寄存器中的位接通或者断开；

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | Y/M/S | 指定的操作数

3. 实例

指令表：

LD      X000

OUT     Y000  // 输出Y000

梯形图：

4. 错误实例

注意：禁止线圈重复输出，如错误实例，X0导通而X1未导通，则梯形图顺序执行过程中，X0先导通Y0有输出，X1未导通Y0禁止输出，所以Y0始终无法输出，可采用辅助继电器M解决该问题。


立即输出线圈 –(|)

对应命令 | 注释/说明 | 操作数（寄存器）
OUTIM | 立即输出线圈 | Y/M/S

1. 指令说明

将新值立即写入指定的位寄存器并输出。指令执行时，指定的位不依靠FGs扫描周期进行更新。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
无 | BOOL | Y/M/S | 指定的操作数

3. 实例

指令表：

LD      X000

OUTIM   Y000  // 立即输出Y000

梯形图：


置位输出线圈 –(S)

对应命令 | 注释/说明 | 操作数（寄存器）
SET | 置位输出线圈 | Y/M/S/T/C, K/H

1. 指令说明

置位从指定地址位（BIT）开始的（N）个操作数，最大点数根据操作数类型设定。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | BOOL | Y/M/S/T/C | 指定的置位起始地址
（下） | BOOL | K/H | 置位的操作数个数

3. 实例

指令表：

LD      X000

SET     Y000    K16  // 置位Y000~Y017

梯形图：


立即置位输出线圈 –(SI)

对应命令 | 注释/说明 | 操作数（寄存器）
SETIM | 立即置位输出线圈 | Y/M/S/T/C, K/H

1. 指令说明

立即置位从指定地址位（BIT）开始的（N）个操作数，最大点数根据操作数类型设定。置位不依靠FGs扫描周期进行更新。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | BOOL | Y/M/S/T/C | 指定的置位起始地址
（下） | BOOL | K/H | 置位的操作数个数

3. 实例

指令表：

LD      X000

SETIM   Y000    K16  // 立即置位Y000~Y017

梯形图：


复位输出线圈 –(R)

对应命令 | 注释/说明 | 操作数（寄存器）
RST | 复位输出线圈 | Y/M/S/T/C, K/H

1. 指令说明

复位从指定地址位（BIT）开始的（N）个操作数，最大点数根据操作数类型设定。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | BOOL | Y/M/S/T/C | 指定的复位起始地址
（下） | BOOL | K/H | 复位的操作数个数

3. 实例

指令表：

LD      X000

RST     Y000    K16  // 复位Y000~Y017

梯形图：


立即复位输出线圈 –(RI)

对应命令 | 注释/说明 | 操作数（寄存器）
RSTIM | 立即复位输出线圈 | Y/M/S/T/C, K/H

1. 指令说明

立即复位从指定地址位（BIT）开始的（N）个操作数，最大点数根据操作数类型设定。置位不依靠FGs扫描周期进行更新。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | BOOL | Y/M/S/T/C | 指定的置位起始地址
（下） | BOOL | K/H | 置位的操作数个数

3. 实例

指令表：

LD      X000

RSTIM   Y000    K16  // 立即置位Y000~Y017

梯形图：


连续交替输出 ALT

对应命令 | 注释/说明 | 操作数（寄存器）
ALT | 连续交替输出 | Y/M/S

1. 指令说明

当指定的操作数由OFF变为ON时，指令让指定的操作数在1（ON）和0（OFF）之间连续交替改变。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN |  |  | 启用输入端接通时，指令执行；否则，不执行
控制位 | BOOL | Y/M/S | 指定的操作数

3. 实例

指令表：

LD      X000

ALT     Y000  //Y000在0和1交替变化，周期为当前扫描周期

梯形图：


脉冲交替输出 ALTP

对应命令 | 注释/说明 | 操作数（线圈）
ALTP | 脉冲交替输出 | Y/M/S

1. 指令说明

当指定的操作数由OFF变为ON时，指令让指定的操作数在1（ON）和0（OFF）之间交替改变一次。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN |  |  | 启用输入端接通时，指令执行；否则，不执行
控制位 | BOOL | Y/M/S | 指定的操作数

3. 实例

指令表：

LD      X000

ALTP    Y000  // 当X000从0变为1时，Y000在0和1交替变化

梯形图：


比较指令

内容如下：

1、 比较指令==

2、 比较指令<>

3、 比较指令>=

4、 比较指令<=

5、 比较指令>

6、 比较指令<


比较指令==

对应命令 | 注释/说明 | 操作数（寄存器）
W= D= F= | LDW=、AW=、ORW= LDD=、AD=、ORD= LDF=、AF=、ORF= | K/H/D/CV/TV/AI/AO/V/Z,K/H/D/CT/TV/AI/AO/V/Z K/H/D/CV32,K/H/D/CV32 K/D/CV32,K/D/CV32

1. 指令说明

等于指令用于比较两个数值是否相等，如果上方的数据等于下方的数据，比较结果为真，触点接通。

比较的两个数是带符号的

W= 比较双字节整数

D= 比较四字节整数

F= 比较实数

在指令表中，当1位于堆栈顶端时，指令执行载入（LD）、与（AND）和或（OR）操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | 字/双字/实数 | K/H/D/CV/TV/AI/AO/V/Z | 要参加比较的操作数
（下） | 字/双字/实数 | 同上 | 同上

3. 实例

指令表：

LDW=    D0      D1  // 加载D0和D1，并比较D0是否等于D1

ORW=    D4      H0123 // 比较D4和H0123是否相等，并将比较结果和栈顶值进行或操作

AW=     D2      D3 // 比较D2和D3是否相等，并将比较结果和栈顶值进行与操作

LDD=    D6      D8 // 加载D6D7和D8D9，并比较 D6D7是否等于D8D9

ORD=    D14     K888 // 比较D14D15和K888是否相等，并将比较结果和栈顶值进行或操作

AD=     D10V0   D12Z0 // 比较（D10D11+地址偏移V0）和（D12D13+地址偏移Z0）是否相等，并将比较结果和栈顶值进行‘与’操作

LDF=    D18     D20 // 加载浮点数D18D19和浮点数D20D21，并比较 浮点数D18D19是否等于浮点数D20D21

ORF=    D26     K1.234567 // 比较浮点数D26D27和K1.234567是否相等，并将比较结果和栈顶值进行‘或’操作

AF=     D22     D24 // 比较浮点数D22D23和浮点数D24D25是否相等，并将比较结果和栈顶值进行‘与’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

OUT     Y000         // 输出Y000

梯形图：


比较指令<>

对应命令 | 注释/说明 | 操作数（寄存器）
W<> D<> F<> | LDW<>、AW<>、ORW<> LDD<>、AD<>、ORD<> LDF<>、AF<>、ORF<> | K/H/D/CV/TV/AI/AO/V/Z,K/H/D/CV/TV/AI/AO/V/Z K/H/D/CV32,K/H/D/CV32 K/D/CV32,K/D/CV32

1. 指令说明

不等于指令用于比较两个数值是否不相等，如果上方的数据不等于下方的数据，比较结果为真，触点接通。

比较的两个数是带符号的

W<> 比较双字节整数

D<> 比较四字节整数

F<> 比较实数

在指令表中，当1位于堆栈顶端时，指令执行载入（LD）、与（AND）和或（OR）操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | 字/双字/实数 | K/H/D/CV/TV/AI/AO/V/Z | 要参加比较的操作数
（下） | 字/双字/实数 | 同上 | 同上

3. 实例

指令表：

LDW<>   D0      D1  // 加载D0和D1，并比较D0是否‘不等于’D1

ORW<>   D4      D5  // 比较D4是否‘不等于’D5，并将比较结果和栈顶值进行‘或’操作

AW<>    D2      D3  // 比较D2是否‘不等于’D3，并将比较结果和栈顶值进行‘与’操作

LDD<>   D6      D8  // 加载D6D7和D8D9，并比较 D6D7是否‘不等于’D8D9

ORD<>   D14     D16 // 比较D14D15是否‘不等于’D16D17，并将比较结果和栈顶值进行‘或’操作

AD<>    D10     D12 // 比较D10D11是否‘不等于’D12D13，并将比较结果和栈顶值进行‘与’操作

LDF<>   D18     D20 // 加载浮点数D18D19和D20D21，并比较 浮点数D18D19是否‘不等于’浮点数D20D21

ORF<>   D26     D28 // 比较浮点数D26D27是否‘不等于’浮点数D28D29，并将比较结果和栈顶值进行‘或’操作

AF<>    D22     D24 // 比较浮点数D22D23是否‘不等于’浮点数D24D25，并将比较结果和栈顶值进行‘与’操作

ORB                   // 将栈顶值与当前能流值进行‘或’操作

ORB                   // 将栈顶值与当前能流值进行‘或’操作

OUT     Y000         // 输出Y000

梯形图：


比较指令>=

对应命令 | 注释/说明 | 操作数（寄存器）
W>= D>= F>= | LDW>=、AW>=、ORW>= LDD>=、AD>=、ORD>= LDF>=、AF>=、ORF>= | K/H/D/CV/TV/AI/AO/V/Z,K/H/D/CT/TV/AI/AO/V/Z K/H/D/CV32,K/H/D/CV32 K/D/CV32,K/D/CV32

1. 指令说明

大于等于指令用于比较两个数值的大小，如果上方的数据大于或者等于下方的数据，比较结果为真，触点接通。

比较的两个数是带符号的

W >= 比较双字节整数

D >= 比较四字节整数

F >= 比较实数

在指令表中， 当1位于堆栈顶端时，指令执行载入（LD）、与（AND）和或（OR）操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | 字/双字/实数 | K/H/D/CV/TV/AI/AO/V/Z | 要参加比较的操作数
（下） | 字/双字/实数 | 同上 | 同上

3. 实例

指令表：

LDW>=   D0      D1  // 加载D0和D1，并比较D0是否‘大于等于’D1

ORW>=   D4      D5  // 比较D4是否‘大于等于’D5，并将比较结果和栈顶值进行‘或’操作

AW>=    D2      D3  // 比较D2是否‘大于等于’D3，并将比较结果和栈顶值进行‘与’操作

LDD>=   D6      D8  // 加载D6D7和D8D9，并比较 D6D7是否‘大于等于’D8D9

ORD>=   D14     D16 // 比较D14D15是否‘大于等于’D16D17，并将比较结果和栈顶值进行‘或’操作

AD>=    D10     D12 // 比较D10D11是否‘大于等于’D12D13，并将比较结果和栈顶值进行‘与’操作

LDF>=   D18     D20 // 加载浮点数D18D19和D20D21，并比较 浮点数D18D19是否‘大于等于’浮点数D20D21

ORF>=   D26     D28 // 比较浮点数D26D27是否‘大于等于’浮点数D28D29，并将比较结果和栈顶值进行‘或’操作

AF>=    D22     D24 // 比较浮点数D22D23是否‘大于等于’浮点数D24D25，并将比较结果和栈顶值进行‘与’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

OUT     Y000        // 输出Y000

梯形图：


比较指令<=

对应命令 | 注释/说明 | 操作数（寄存器）
W<= D<= F<= | LDW<=、AW<=、ORW<= LDD<=、AD<=、ORD<= LDF<=、AF<=、ORF<= | K/H/D/CV/TV/AI/AO/V/Z,K/H/D/CT/TV/AI/AO/V/Z K/H/D/CV32,K/H/D/CV32 K/D/CV32,K/D/CV32

1. 指令说明

小于等于指令用于比较两个数值的大小，如果上方的数据小于或者等于下方的数据，比较结果为真，触点接通。

比较的两个数是带符号的

W<= 比较双字节整数

D <= 比较四字节整数

F <= 比较实数

在指令表中， 当1位于堆栈顶端时，指令执行载入（LD）、与（AND）和或（OR）操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | 字/双字/实数 | K/H/D/CV/TV/AI/AO/V/Z | 要参加比较的操作数
（下） | 字/双字/实数 | 同上 | 同上

3. 实例

指令表：

LDW<=   D0      D1  // 加载D0和D1，并比较D0是否‘小于等于’D1

ORW<=   D4      D5  // 比较D4是否‘小于等于’D5，并将比较结果和栈顶值进行‘或’操作

AW<=    D2      D3  // 比较D2是否‘小于等于’D3，并将比较结果和栈顶值进行‘与’操作

LDD<=   D6      D8  // 加载D6D7和D8D9，并比较 D6D7是否‘小于等于’D8D9

ORD<=   D14     D16 // 比较D14D15是否‘小于等于’D16D17，并将比较结果和栈顶值进行‘或’操作

AD<=    D10     D12 // 比较D10D11是否‘小于等于’D12D13，并将比较结果和栈顶值进行‘与’操作

LDF<=   D18     D20 // 加载浮点数D18D19和D20D21，并比较 浮点数D18D19是否‘小于等于’浮点数D20D21

ORF<=   D26     D28 // 比较浮点数D26D27是否‘小于等于’浮点数D28D29，并将比较结果和栈顶值进行‘或’操作

AF<=    D22     D24 // 比较浮点数D22D23是否‘小于等于’浮点数D24D25，并将比较结果和栈顶值进行‘与’操作

ORB                   // 将栈顶值与当前能流值进行‘或’操作

ORB                   // 将栈顶值与当前能流值进行‘或’操作

OUT     Y000         // 输出Y000

梯形图：


比较指令>

对应命令 | 注释/说明 | 操作数（寄存器）
W> D> F> | LDW>、AW>、ORW> LDD>、AD>、ORD> LDF>、AF>、ORF> | K/H/D/CV/TV/AI/AO/V/Z,K/H/D/CT/TV/AI/AO/V/Z K/H/D/CV32,K/H/D/CV32 K/D/CV32,K/D/CV32

1. 指令说明

大于指令用于比较两个数值的大小，如果上方的数据大于下方的数据，比较结果为真，触点接通。

比较的两个数是带符号的

W > 比较双字节整数

D > 比较四字节整数

F > 比较实数

在指令表中， 当1位于堆栈顶端时，指令执行载入（LD）、与（AND）和或（OR）操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | 字/双字/实数 | K/H/D/CV/TV/AI/AO/V/Z | 要参加比较的操作数
（下） | 字/双字/实数 | 同上 | 同上

3. 实例

指令表：

LDW>    D0      D1  // 加载D0和D1，并比较D0是否‘大于’D1

ORW>    D4      D5  // 比较D4是否‘大于’D5，并将比较结果和栈顶值进行‘或’操作

AW>     D2      D3  // 比较D2是否‘大于’D3，并将比较结果和栈顶值进行‘与’操作

LDD>    D6      D8  // 加载D6D7和D8D9，并比较 D6D7是否‘大于’D8D9

ORD>    D14     D16 // 比较D14D15是否‘大于’D16D17，并将比较结果和栈顶值进行‘或’操作

AD>     D10     D12 // 比较D10D11是否‘大于’D12D13，并将比较结果和栈顶值进行‘与’操作

LDF>    D18     D20 // 加载浮点数D18D19和D20D21，并比较 浮点数D18D19是否‘大于’浮点数D20D21

ORF>    D26     D28 // 比较浮点数D26D27是否‘大于’浮点数D28D29，并将比较结果和栈顶值进行‘或’操作

AF>     D22     D24 // 比较浮点数D22D23是否‘大于’浮点数D24D25，并将比较结果和栈顶值进行‘与’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

OUT     Y000        // 输出Y000

梯形图：


比较指令<

对应命令 | 注释/说明 | 操作数（寄存器）
W< D< F< | LDW<、AW<、ORW< LDD<、AD<、ORD< LDF<、AF<、ORF< | K/H/D/CV/TV/AI/AO/V/Z,K/H/D/CT/TV/AI/AO/V/Z K/H/D/CV32,K/H/D/CV32 K/D/CV32,K/D/CV32

1. 指令说明

小于指令用于比较两个数值的大小，如果上方的数据小于下方的数据，比较结果为真，触点接通。

比较的两个数是带符号的

W < 比较双字节整数

D < 比较四字节整数

F < 比较实数

在指令表中， 当1位于堆栈顶端时，指令执行载入（LD）、与（AND）和或（OR）操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
（上） | 字/双字/实数 | K/H/D/CV/TV/AI/AO/V/Z | 要参加比较的操作数
（下） | 字/双字/实数 | 同上 | 同上

3. 实例

指令表：

LDW<    D0      D1  // 加载D0和D1，并比较D0是否‘小于’D1

ORW<    D4      D5  // 比较D4是否‘小于’D5，并将比较结果和栈顶值进行‘或’操作

AW<     D2      D3  // 比较D2是否‘小于’D3，并将比较结果和栈顶值进行‘与’操作

LDD<    D6      D8  // 加载D6D7和D8D9，并比较 D6D7是否‘小于’D8D9

ORD<    D14     D16 // 比较D14D15是否‘小于’D16D17，并将比较结果和栈顶值进行‘或’操作

AD<     D10     D12 // 比较D10D11是否‘小于’D12D13，并将比较结果和栈顶值进行‘与’操作

LDF<    D18     D20 // 加载浮点数D18D19和D20D21，并比较 浮点数D18D19是否‘小于’浮点数D20D21

ORF<    D26     D28 // 比较浮点数D26D27是否‘小于’浮点数D28D29，并将比较结果和栈顶值进行‘或’操作

AF<     D22     D24 // 比较浮点数D22D23是否‘小于’浮点数D24D25，并将比较结果和栈顶值进行‘与’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

ORB                  // 将栈顶值与当前能流值进行‘或’操作

OUT     Y000        // 输出Y000

梯形图：


比较 CMP/CMPD/CMPF

对应命令 | 注释/说明 | 操作数（寄存器）
CMP | 单字比较 | D/H/K/CV/TV/AI/AO/V/Z, D/H/K/CV/TV/AI/AO/V/Z, Y/M/S(占用连续3个位)
CMPD | 双字比较 | D/H/K, D/H/K, Y/M/S(占用连续3个位)
CMPF | 浮点比较 | D /K, D /K, Y/M/S(占用连续3个位)

1. 指令说明

比较(I1)和(I2)的大小，比较结果送到(O)：

若OUT为Y000

当IN1 > IN2: Y000为‘1’

当IN1 == IN2: Y001为‘1’

当IN1 < IN2: Y002为‘1’

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
I1，I2 | 单字 双字 浮点 | D/H/K/TV/CV/AO/AI/V/Z D/H/K, D/K | 要参加运算的操作数1，操作数2
O | BOOL | Y/M/S | 计算结果寄存器

3. 实例

指令表：

LD M0

CMP D0 D1 M100 // 比较D0和D1的大小

POP

LD M100

OUT M1000 // 如果D0 > D1, M100= ON

POP

LD M101

OUT M1001 // 如果D0 == D1, M101= ON

POP

LD M102

OUT M1002 // 如果D0 < D1, M102= ON

POP

梯形图：


区间比较 ZCP/ZCPD/ZCPF

对应命令 | 注释/说明 | 操作数（寄存器）
ZCP | 单字区间比较 | D/H/K/TV/CV/AI/AO/V/Z, D/H/K/TV/CV/AI/AO/V/Z, D/H/K/TV/CV/AI/AO/V/Z, Y/M/S(占用连续3个位)
ZCPD | 双字区间比较 | D/H/K,D/H/K,D/H/K, Y/M/S(占用连续3个位)
ZCPF | 浮点区间比较 | D/K,D/K,D/K, Y/M/S(占用连续3个位)

1. 指令说明

比较值 (S3) 与下限(S1) 及上限(S2) 作比较，其比较结果在 (O)作表示。

下限(S1) 不可以大于上限(S2)。

大小比较是以代数来进行，全部的数据是以有符号数二进制数值来作比较。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S1,S2,S3 | 单字 双字 浮点 | D/H/K/TV/CV/AI/AO/V/Z, D/H/K, D/K | 下限设定值，上限设定值，比较值
D | BOOL | Y/M/S | 结果寄存器

3. 实例

指令表：

LD M0

ZCP K100 K200 D0 Y000 //当D0 < K100时 Y000 = ON ；当K100 <= D0 <= K200时 Y001 = ON ；当D0 > K200时 Y002 = ON。

梯形图：


转换指令

内容如下：

1、 整数转换为双整数 WTOD

2、 双整数转换为整数 DTOW

3、 双整数转换为浮点数 DTOF

4、 BCD码转换为整数 BIN

5、 整数转换为BCD BCD

6、 取整 ROUND

7、 截位 TRUNC


整数转换为双整数 WTOD

对应命令 | 注释/说明 | 操作数（寄存器）
WTOD | 16位整数转换为32位整数 | D/K/H/TV/CV/AI/AO/V/Z,D

1. 指令说明

整数至双整数（WTOD）指令将整数值（IN）转换成双整数值，并将结果置入（OUT）指定的寄存器中。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 整数 | D/K/H/TV/CV/AI/AO/V/Z | 要转换的操作数
OUT | 双整数 | D | 转换结果寄存器

3. 实例

指令表：

LD      X000

WTOD    D0      D1 // 将整数D0转换为双整数并存储在寄存器D1D2

梯形图：


双整数转换为整数 DTOW

对应命令 | 注释/说明 | 操作数（寄存器）
DTOW | 32位整数转换为16位整数 | D/K/H,D/TV/CV/AO/V/Z

1. 指令说明

双整数至整数（DTOW）指令将双整数值（IN）转换成整数值，并将结果置入（OUT）指定的寄存器中。

如果转换的数值过大，数值溢出标志位被置位，且无法在输出中表示。

M8169    被置位时表示数值溢出。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 双整数 | D/K/H | 要转换的操作数
OUT | 整数 | D/TV/CV/AO/V/Z | 转换结果寄存器

3. 实例

指令表：

LD      X000

DTOW    D0      D2  // 将双整数D0D1转换为整数并存储在寄存器D2

梯形图：


双整数转换为浮点数 DTOF

对应命令 | 注释/说明 | 操作数（寄存器）
DTOF | 32位整数转换为浮点数 | D/K/H,D

1. 指令说明

双整数至浮点数（DTOF）指令将双整数值（IN）转换成浮点数，并将结果置入（OUT）指定的寄存器中。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 双整数 | D/K/H | 要转换的操作数
OUT | 浮点数 | D | 转换结果寄存器

3. 实例

指令表：

LD      X000

DTOF    D0      D2  // 将双整数D0D1转换为整数并存储在寄存器D2

梯形图：


BCD码转换为整数 BIN

对应命令 | 注释/说明 | 操作数（寄存器）
BIN | BCD码转换为16位整数 | D/K/H/TV/CV/AI/AO/V/Z,D/TV/CV/AO/V/Z

1. 指令说明

BCD至整数指令（BIN）将二进制编码的十进制数值（IN）转换成整数，并将结果载入（OUT）指定的寄存器中。IN的有效范围是0至9999 BCD。

M8168    被置位时表示无效的BCD码转换。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | BCD码 | D/K/H/TV/CV/AI/AO/V/Z | 要转换的操作数
OUT | 整数 | D/TV/CV/AO/V/Z | 转换结果寄存器

3. 实例

指令表：

LD      X000

BIN     H0234   D0 // 将BCD码234转换为整数并存储在寄存器D0

梯形图：


整数转换为BCD BCD

对应命令 | 注释/说明 | 操作数（寄存器）
BCD | 16位整数转换为BCD码 | D/K/H/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z

1. 指令说明

整数至BCD指令（BCD）将整数（IN）转换成二进制编码的十进制数值，并将结果载入（OUT）指定的寄存器中。OUT的有效范围是0至9999 BCD。

M8168    被置位时表示无效的BCD码转换

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 整数 | D/K/H/TV/CV/AI/AO/V/Z | 要转换的操作数
OUT | BCD码 | D/TV/CV/AO/V/Z | 转换结果寄存器

3. 实例

指令表：

LD      X000

BCD     D0      D1 // 将整数D0转换为BCD码并存储在寄存器D1

梯形图：


取整 ROUND

对应命令 | 注释/说明 | 操作数（寄存器）
ROUND | 实数转换成双整数值 | D/K,D

1. 指令说明

指令将实值（IN）转换成双整数值，并将结果置入（OUT）指定的寄存器中。如果小数部分等于或大于0.5，则进位为整数。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | D/K | 要转换的操作数
OUT | 双整数 | D | 转换结果寄存器

3. 实例

指令表：

LD      X000

ROUND   K4.56   D0 // 将实数4.56转换为双整数并存储在寄存器D0D1 0.56 > 0.5 进位为1 所以转换结果为5

梯形图：


截位 TRUNC

对应命令 | 注释/说明 | 操作数（寄存器）
TRUNC | 截位将32位实数转换为32位双整数 | D/K,D

1. 指令说明

指令将32位实数（IN）转换成32位双整数，并将结果的整数部分置入（OUT）指定的寄存器中。只有实数的整数部分被转换，小数部分被丢弃。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | D/K | 要转换的操作数
OUT | 双整数 | D | 转换结果寄存器

3. 实例

指令表：

LD      X000

TRUNC   K4.56   D0 // 将实数4.56转换为双整数并存储在寄存器D0D1 转换结果为4

梯形图：


逻辑运算指令

内容如下：

1、 反转字 INVW

2、 反转双字 INVD

3、 字相与 ANDW

4、 双字相与 ANDD

5、 字相或 ORW

6、 双字相或 ORD

7、 字异或 XORW

8、 双字异或 XORD


取反运算

应命令 | 注释/说明 | 操作数（寄存器）
INVW | 单字取反 | K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z
INVD | 双字取反 | K/H/D,D

1. 指令说明

指令对输入（IN）执行取反操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 字 | K/H/D/TV/CV/AI/AO/V/Z | 要参加运算的操作数1和操作数2
 | 双字 | K/H/D
OUT | 字 | D/TV/CV/AO/V/Z | 计算结果寄存器
 | 双字 | D

3. 实例

指令表：

LD      X000

INVW    D0      D1 // 将D0取反输出到D1

梯形图：


相与运算

对应命令 | 注释/说明 | 操作数（寄存器）
ANDW | 单字相与 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z
ANDD | 双字相与 | K/H/D,K/H/D,D

1. 指令说明

指令对输入（IN1）和（IN2）执行与操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1,IN2 | 字 | K/H/D/TV/CV/AI/AO/V/Z | 要参加运算的操作数1和操作数2
 | 双字 | K/H/D
OUT | 字 | D/TV/CV/AO/V/Z | 计算结果寄存器
 | 双字 | D

3. 实例

指令表：

LD      X000

ANDW    D0      D1      D2  // 将D0与D1进行与操作，并将结果输出到D2

梯形图：


相或运算

对应命令 | 注释/说明 | 操作数（寄存器）
ORW | 单字相或 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z
ORD | 双字相或 | K/H/D,K/H/D,D

1. 指令说明

指令对输入（IN1）和（IN2）执行或操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1,IN2 | 字 | K/H/D/TV/CV/AI/AO/V/Z | 要参加运算的操作数1和操作数2
 | 双字 | K/H/D
OUT | 字 | D/TV/CV/AO/V/Z | 计算结果寄存器
 | 双字 | D

3. 实例

指令表：

LD      X000

ORW     D0      D1      D2   // 将D0与D1进行与操作，并将结果输出到D2

梯形图：


异或运算

对应命令 | 注释/说明 | 操作数（寄存器）
XORW | 单字异或 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z
XORD | 双字异或 | K/H/D,K/H/D,D

1. 指令说明

指令对输入（IN1）和（IN2）执行异或操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1,IN2 | 字 | K/H/D/TV/CV/AI/AO/V/Z | 要参加运算的操作数1和操作数2
 | 双字 | K/H/D
OUT | 字 | D/TV/CV/AO/V/Z | 计算结果寄存器
 | 双字 | D

3. 实例

指令表：

LD      X000

XORW    D0      D1      D2  // 将D0与D1进行异或操作，并将结果输出到D2

梯形图：


求补运算

对应命令 | 注释/说明 | 操作数（寄存器）
NEGW | 单字求补 | D/K/H/AI/AO/CV/TV/V/Z, D/CV/TV/AO/V/Z
NEGD | 双字求补 | D/K/H, D

1. 指令说明

指令对输入（IN）求出补码，并将结果载入输出（OUT）寄存器。通常情况下，整数的补码即为其相反数。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 字 | K/H/D/TV/CV/AI/AO/V/Z | 要参加运算的操作数1和操作数2
 | 双字 | K/H/D
OUT | 字 | D/TV/CV/AO/V/Z | 计算结果寄存器
 | 双字 | D

3. 实例

指令表：

LD      X000

NEGW    D0      D1 // 将D0求补输出到D1

梯形图：


传送指令

内容如下：

1、 移动字 MOV

2、 传送双字 MOVD

3、 传送实数 MOVF

4、 成块移动字 MVBLK

5、 成块移动双字 MVDBLK


移动操作

对应命令 | 注释/说明 | 操作数（寄存器）
MOV | 移动字 | D/TV/CV/K/H/AI/AO/V/Z,D/TV/CV/AO/V/Z
MOVD | 传送双字 | D/K/H/CV32,D/CV32
MOVF | 传送实数 | D/K/AI/AO,D

1. 指令说明

指令将输入值（S）复制至输出寄存器（D），不改变原来的数值。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 浮点 | D/TV/CV/K/H/AI/AO/V/Z D/K/H/CV D/K/AI/AO | 要复制传送的值
D | 字 双字 浮点 | D/TV/CV/AO/V/Z D/CV D | 输出的目标寄存器

3. 实例

指令表：

LD      X000

MOV     D0      D1  // D0复制到D1

梯形图：


成块移动

对应命令 | 注释/说明 | 操作数（寄存器）
MVBLK | 成块移动字 | D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z, D/K/H
MVDBLK | 成块移动双字 | D, D, D/K/H

1. 指令说明

指令将寄存器数目（N）从输入地址（S）复制至输出地址（D）。N的范围是1至1024。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 | D/TV/CV/AI/AO/V/Z D/TV/CV/AI/AO/V/Z | 要复制传送的字的起始地址
D | 字 双字 | D/TV/CV/AO/V/Z D/TV/CV/AO/V/Z | 输出的目标寄存器的起始地址
N | 整数 | D/K/H | 复制传送的字的个数

3. 实例

指令表：

LD      X000

MVBLK   D0      D5       K10  // 将D0~D9这10个字复制到D5~D14的10个字

梯形图：


多点传送

对应命令 | 注释/说明 | 操作数（寄存器）
FMOV | 单字多点传送 | D/H/K/AI/AO/TV/CV/V/Z, D/AO/CV/TV/V/Z, D/K/H
FMOVD | 双字多点传送 | D/H/K, D, D/K/H

1. 指令说明

将源元件（S）中的数据传送到指定目标（D）开始的（N）个目标元件中，这 N个元件中的数据完全相同。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 | D/H/K/AO/AI/CV/TV/V/Z D/H/K | 要参加计算的操作数
D | 字 双字 | D/AO/CV/TV/V/Z D | 传送目标寄存器起始地址
N | 字 双字 | D/H/K D/H/K | 移位传送的目标寄存器的数量

3. 实例

指令表：

LD      M1

FMOV    K100    D5      K5    // 执行结果D5—D9的值均为100

梯形图：


BCD移位传送SMOV

对应命令 | 注释/说明 | 操作数（寄存器）
SMOV | 移位传送 | D/AI/AO/TV/CV/V/Z, H/K, H/K, D/AO/TV/CV/V/Z, H/K

1. 指令说明

指令将首先将二进制的数据（S）转换成BCD码，然后将BCD码移位传送，实现数据的分配、组合。源数据（S）的BCD码右起从第（N1）位开始的（N2）位移送到数据（D）的第（N3）位开始的（N2）位，而 目数据（D）的其他位BCD  码不变。然后，数据（D）中的BCD码自动转换成二进制数，即为 数据（D）的内容。BCD码值超过9999 时出错。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 | D/H/K/AO/AI/CV/TV/V/Z | 要参加计算的操作数
D | 字 | D/AO/CV/TV/V/Z | 计算结果寄存器
N1 | 字 | H/K | 源数据S的 BCD码移位传送的起始位数
N2 | 字 | H/K | 源数据S的 BCD码移位传送的位数
N3 | 字 | H/K | 目标数据D的BCD码接收的起始位数

3. 实例

指令表：

LDP     M1

MOV     K4321   D1

MOV     K8888   D2

POP

LD      M1

SMOV    D1      K4      K2      D2      K3 //当M1为‘1’时，执行结果D2 = 8438

梯形图：


交换 XCH/XCHD/XCHF

对应命令 | 注释/说明 | 操作数（寄存器）
XCH | 单字交换 | OUT1：D/AO/CV/TV/V/Z, OUT2：D/AO/CV/TV/V/Z
XCHD | 双字交换 | OUT1：D OUT2：D
XCHF | 浮点交换 | OUT1：D OUT2：D

1. 指令说明

交换寄存器（O1），寄存器（O2）的值。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
O1，O2 | 单字 双字 浮点 | D/AO/CV/TV/V/Z D D | 要参加计算的寄存器1，寄存器2

3. 实例

指令表：

LDP M7

XCH D5 D6 // 若该指令执行之前D5 = 100， D6 = 50， 则执行该指令后D5 = 50, D6 = 100;

梯形图：


浮点数运算指令

内容如下：

1、 浮点加运算 ADDF

2、 浮点减运算 SUBF

3、 浮点乘运算 MULF

4、 浮点除运算 DIVF

5、 平方根 SQRT

6、 正弦 SIN

7、 余弦 COS

8、 正切 TAN

9、 自然对数 LN

10、自然指数 EXP


浮点加运算 ADDF

对应命令 | 注释/说明 | 操作数（寄存器）
ADDF | 浮点数加 | K/D,K/D,D

1. 指令说明

指令将两个32位实数相加，并产生一个32位实数结果（OUT）。

IN1 + IN2 = OUT

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 实数 | K/D | 要参加运算的操作数1
IN2 | 实数 | K/D | 要参加运算的操作数2
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

ADDF    D0      D2      D4  // D0D1 + D2D3 = D4D5

梯形图：


浮点减运算 SUBF

对应命令 | 注释/说明 | 操作数（寄存器）
SUBF | 浮点数减 | K/D,K/D,D

1. 指令说明

指令将两个32位实数相减，并产生一个32位实数结果（OUT）。

IN1 - IN2 = OUT

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 实数 | K/D | 要参加运算的操作数1
IN2 | 实数 | K/D | 要参加运算的操作数2
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

SUBF    D0      D2      D4  // D0D1 - D2D3 = D4D5

梯形图：


浮点乘运算 MULF

对应命令 | 注释/说明 | 操作数（寄存器）
MULF | 浮点数乘 | K/D,K/D,D

1. 指令说明

指令将两个32位实数相乘，并产生一个32位实数结果（OUT）。

IN1 × IN2 = OUT

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 实数 | K/D | 要参加运算的操作数1
IN2 | 实数 | K/D | 要参加运算的操作数2
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

MULF    D0      D2      D4  // D0D1 × D2D3 = D4D5

梯形图：


浮点除运算 DIVF

对应命令 | 注释/说明 | 操作数（寄存器）
DIVF | 浮点数除 | K/D,K/D,D

1. 指令说明

指令将两个32位实数相除，并产生一个32位实数结果（OUT）。

IN1 ÷ IN2 = OUT

M8170   负结果

M8171   零结果

M8172   除数为零

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 实数 | K/D | 要参加运算的操作数1
IN2 | 实数 | K/D | 要参加运算的操作数2
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

DIVF    D0      D2      D4  // D0D1 ÷ D2D3 = D4D5

梯形图：


平方根 SQRT

对应命令 | 注释/说明 | 操作数（寄存器）
SQRT | 平方根 | D/K,D

1. 指令说明

指令对32位实数（IN）取平方根，并产生一个32位实数结果（OUT）

SQRT（IN）= OUT

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | K/D/AI/AO | 要参加运算的操作数
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

SQRT    K256    D0  // SQRT(256) = D0D1 = 16

梯形图：


正弦 SIN

对应命令 | 注释/说明 | 操作数（寄存器）
SIN | 正弦函数 | D/K,D

1. 指令说明

指令对角度值（IN）进行三角运算，并将结果放置在（OUT）中。输入角以角度为单位。欲将输入角从弧度转换成角度，用弧度除以1.745329E-2（约等于PI/180，PI = 3.1415926）。

SIN（IN）= OUT

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | K/D/AI/AO | 要参加运算的操作数
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

SIN     K30      D0   // SIN(30°) = D0D1 = 0.5

梯形图：


余弦 COS

对应命令 | 注释/说明 | 操作数（寄存器）
COS | 余弦函数 | D/K,D

1. 指令说明

指令对角度值（IN）进行三角运算，并将结果放置在（OUT）中。输入角以角度为单位。欲将输入角从弧度转换成角度，用弧度除以1.745329E-2（约等于PI/180，PI = 3.1415926）。

COS（IN）= OUT

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | K/D/AI/AO | 要参加运算的操作数
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

COS     K60      D0   // COS(60°) = D0D1 = 0.5

梯形图：


正切 TAN

对应命令 | 注释/说明 | 操作数（寄存器）
TAN | 正切函数 | D/K,D

1. 指令说明

指令对角度值（IN）进行三角运算，并将结果放置在（OUT）中。输入角以角度为单位。欲将输入角从弧度转换成角度，用弧度除以1.745329E-2（约等于PI/180，PI = 3.1415926）。

TAN（IN）= OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | K/D/AI/AO | 要参加运算的操作数
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

TAN     K45     D2   // TAN(45°) = D2D3 = 1

梯形图：


自然对数 LN

对应命令 | 注释/说明 | 操作数（寄存器）
LN | 自然对数函数 | D/K,D

1. 指令说明

指令对（IN）中的数值进行自然对数计算，并将结果置于（OUT）中。

LN(IN) = OUT

欲从自然对数获得以10为底数的对数，用自然对数除以2.302585（约等于10的自然对数）。

欲将任何实数提升为另一个实数的乘幂，包括分数指数：将"自然指数"指令与"自然对数"指令相结合。例如，欲将X提升为Y乘幂，输入以下指令：EXP (Y * LN (X))。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | K/D/AI/AO | 要参加运算的操作数
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

LN      D0      D2  // LN（D0D1） = D2D3

梯形图：


自然指数 EXP

对应命令 | 注释/说明 | 操作数（寄存器）
EXP | 自然指数函数 | D/K,D

1. 指令说明

指令进行e的IN次方指数计算，并将结果置于OUT中。

EXP(IN) = OUT

欲将任何实数提升为另一个实数的乘幂，包括分数指数：将"自然指数"指令与"自然对数"指令相结合。例如欲将X提升为Y乘幂，输入以下指令：

EXP (Y * LN (X))。

例：5的立方 = 5^3=EXP(3*LN(5))=125

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 实数 | K/D/AI/AO | 要参加运算的操作数
OUT | 实数 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

EXP     K3      D2  // EXP（3） = D2D3 = e^3

梯形图：


以10为底的对数运算 LOG

对应命令 | 注释/说明 | 操作数（寄存器）
LOG | 以10为底的对数运算 | D/K, D

1. 指令说明

对寄存器（I）的浮点数值进行以10为底的对数运算，将浮点数结果传送到寄存器（O）。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
I | 浮点 | D/K/AI/AO | 要参加运算的操作数
O | 浮点 | D | 计算结果寄存器

3. 实例

指令表：

LD      M1

LOG     K1000   D4 // 执行结果D4（D5） = 3.0

梯形图：


计算x的y次幂 POW

对应命令 | 注释/说明 | 操作数（寄存器）
POW | 计算X的Y次幂 | D/K, D/K, D

1. 指令说明

以寄存器（B）的浮点数值为底，寄存器（E）的浮点数值为指数进行幂运算，将结果传送到寄存器（P）。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
B | 浮点 | D/K | 要参加运算的操作数(底数）
E | 浮点 | D/K | 要参加运算的操作数(指数）
P | 浮点 | D | 计算结果（幂）寄存器

3. 实例

指令表：

LD      M3

POW     K10     K3      D0    // 执行结果D0(D1) = 1000.0

梯形图：


整数运算指令

内容如下：

1、 16位整数加 ADD

2、 双整数加 ADDD

3、 16位整数减 SUB

4、 双整数减 SUBD

5、 乘 MUL

6、 16位乘 MULW

7、 32位乘 MULD

8、 除 DIV

9、 16位除 DIVW

10、32位除 DIVD

11、字加一 INC

12、双字加一 INCD

13、字减一 DEC

14、双字减一 DECD


加法运算

对应命令 | 注释/说明 | 操作数（寄存器）
ADD | 16位整数加得到16位整数 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z
ADDD | 32位整数加 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（ADD）将两个16位的整数相加，并产生一个16位的整数结果（OUT）。指令（ADDD）的操作数为32位。

IN1 ＋ IN2  =  OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1,IN2 | 字 双字 | K/H/D/TV/CV/AI/AO/V/Z K/H/D/CV | 要参加运算的操作数1和操作数2
OUT | 字 双字 | D/TV/CV/AO/V/Z D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

ADD     D0      D1      D2   // D0 + D1 = D2

梯形图：


减法运算

对应命令 | 注释/说明 | 操作数（寄存器）
SUB | 16位整数减得到16位整数 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z
SUBD | 32位整数减 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（SUB）将两个16位的整数相减，并产生一个16位的整数结果（OUT）。指令（SUBD）的操作数为32位。

IN1 - IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1,IN2 | 字 双字 | K/H/D/TV/CV/AI/AO/V/Z K/H/D/CV | 要参加运算的操作数1和操作数2
OUT | 字 双字 | D/TV/CV/AO/V/Z D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

SUB     D0      D1      D2   // D0 - D1 = D2

梯形图：


乘法运算

对应命令 | 注释/说明 | 操作数（寄存器）
MUL | 乘 | K/H/D/TV/CV/AI/AO/V/Z,K/H/D/TV/CV/AI/AO/V/Z,D
MULW | 16位乘 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z
MULD | 32位乘 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（MUL）将两个16位整数相乘，并产生一个32位的结果（OUT）。

指令（MULW）将两个16位整数相乘，并产生一个16位的结果。

指令（MULD）将两个32位整数相乘，并产生一个32位的结果。

IN1 × IN2 = OUT

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1,IN2 | 字 双字 | K/H/D/TV/CV/AI/AO/V/Z K/H/D/CV | 要参加运算的操作数1和操作数2
OUT | 字 双字 | D/TV/CV/AO/V/Z D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

MUL     D0      D1      D2   // D0 × D1 = D2D3

梯形图：


除法运算

对应命令 | 注释/说明 | 操作数（寄存器）
DIV | 除 | K/H/D/TV/CV/AI/AO/V/Z,K/H/D/TV/CV/AI/AO/V/Z,D
DIVW | 16位除 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV32/AO/V/Z
DIVD | 32位除 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（DIV）将两个16位整数相除，并产生一个32位的结果（OUT），其中低16位存商，高16位存余数。

指令（DIVW）将两个16位整数相除，并产生一个16位的商，余数被省略。

指令（DIVD）将两个32位整数相除，并产生一个32位的商。

IN1 ÷ IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

M8172    除数为零

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1,IN2 | 字 双字 | K/H/D/TV/CV/AI/AO/V/Z K/H/D/CV | 要参加运算的操作数1和操作数2
OUT | 字 双字 | D/TV/CV/AO/V/Z D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

DIV     D0      D1      D2  // D0 ÷ D1 = D2D3 D2存商 D3存余数

梯形图：


整数加一

对应命令 | 注释/说明 | 操作数（寄存器）
INC | 字加1 | K/H/D/TV/CV/AO/V/Z, D/TV/CV/AO/V/Z
INCD | 双字加1 | K/H/D/CV32,D/CV32

1. 指令说明

指令（INC）16位整数加一，并产生一个16位的结果（OUT）。指令（INCD）操作32位整数。

IN + 1 = OUT

M8169 溢出

M8170 负结果

M8171 零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 | D/TV/CV/K/H/AI/AO/V/Z D/K/H/CV | 要参加运算的操作数
D | 字 双字 | D/TV/CV/AO/V/Z D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

INC     D0      D0  // D0 + 1 = D0

梯形图：


整数减一

对应命令 | 注释/说明 | 操作数（寄存器）
DEC | 字减1 | K/H/D/TV/CV/AO/V/Z, D/TV/CV/AO/V/Z
DECD | 双字减1 | K/H/D/CV32,D/CV32

1. 指令说明

指令（DEC）16位整数减一，并产生一个16位的结果（OUT）。指令（INCD）操作32位整数。

IN - 1 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 | D/TV/CV/K/H/AI/AO/V/Z D/K/H/CV | 要参加运算的操作数
D | 字 双字 | D/TV/CV/AO/V/Z D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

DEC      D0      D0   // D0 - 1 = D0

梯形图：


计算n的阶乘 FACT

对应命令 | 注释/说明 | 操作数（寄存器）
FACT | 计算N的阶乘 | D/H/K/TV/CV/AO/AI/V/Z, D(32位)

1. 指令说明

计算寄存器（I）值的阶乘，N的最大值为12，将结果传送到寄存器（O）。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
I | 整数 | D/H/K/TV/CV/AO/AI/V/Z | 要参加运算的操作数
O | 双整数 | D | 计算结果寄存器

3. 实例

指令表：

LD M3

FACT K4 D0 //执行结果D0（D1） = 24

梯形图：


定时器指令

内容如下：

1、 接通延时定时器 TON

2、 接通延时记忆定时器 TONR

3、 断开延时定时器 TOF


接通延时定时器 TON

对应命令 | 注释/说明 | 操作数（寄存器）
TON | 接通延时定时器 | TV,K/H/D

1. 指令说明

启用输入端为“接通”时，定时器位（Tx）为“断开”，当前值（TVx）从0开始计时。当前值（TVx）大于或等于预设时间（SV）时，定时器位（Tx）为"接通"，且定时器停止计时；启用输入端为"断开"时，接通延时定时器自动复位，即定时器位（Tx）为OFF，当前值（TVx）为0。Tx = T0至T255，TVx = TV0至TV255。

  TON、TONR和TOF定时器有三种分辨率。分辨率由下图所示的定时器编号决定。每一个当前值都是时间基数的倍数。例如，10毫秒定时器中的计数50表示500毫秒

定时器类型 | 分辨率 | 最大值 | 定时器编号
TON、TONR、TOF | 100ms | 3276.7秒 | T0 – T199
 | 10ms | 327.67秒 | T200 – T249
 | 1ms | 32.767秒 | T250 – T255

注意：

TOF，TONR及TON不能共享相同的定时器号码。例如，不能有TON TV32 D0和TOF TV32 D0。

您可以将TON用于单间隔计时。

执行复位操作可以复位定时器，即定时器位置0，定时器当前值置0。

定时器的刷新方式：

FGs系列PLC对于不同分辨率的定时器，其刷新方式是不同的，从而在使用方法上也有很大的不同，使用时请一定要注意根据使用场合和要求来选择不同分辨率的定时器

（1）1ms定时器：1ms定时器由系统每隔1ms刷新一次，与扫描周期及程序处理无关，它采用的是中断刷新方式，因此当扫描周期大于1ms时，在一个周期中可能被多次刷新，其当前值（TVx）及（Tx）在一个扫描周期内不一定保持一致；

（2）10ms定时器：10ms定时器由系统在每个扫描周期开始时自动刷新，由于在每隔扫描周期只刷新一次，因此在一个扫描周期内定时器位（Tx）和当前值（TVx）始终保持一致；

（3）100ms定时器：100ms定时器是在定时器指令执行时才被刷新，因此，若100ms定时器被激活后，如果不是每个扫描周期都执行定时器指令或在一个扫描周期内多次执行定时器指令，则都会造成计时失准。100ms定时器仅用在定时器指令在每个扫描周期执行一次的程序中；

定时器的正确使用举例：

（1）1ms定时器：在使用错误方法时，只有当定时器的刷新发生在T250的常闭触点执行以后到T250的常开触点执行以前的区间时，才能产生宽度为一个扫描周期的Y0输出，而这种可能性是极小的；

图1.1 1ms定时器错误用法

图1.2 1ms定时器正确用法

（2）10ms定时器：在使用错误方法时，则永远也产生不了Y0输出，因为当10ms的定时器计时到时，定时器是在每次扫描周期的开始时才刷新，例中当T200被置位，但执行到定时器指令时，定时器将被复位（当前值和定时器位都被置0）；当常开触点T200被执行时，T200永远为OFF，Y0也将为OFF，即永远不会被置位ON；

图1.3 10ms定时器错误用法

图1.4 10ms定时器正确用法

（3）100ms定时器：由于100ms定时器是在执行指令时刷新，因此，当定时器T0到达设定值时，必定会产生一个Y0输出；

图1.5 100ms定时器错误用法

图1.6 100ms定时器正确用法

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
T | 双整数 | TV | 选定的定时寄存器
SV | 双整数 | K/H/D | 预设定时时间

3. 实例

指令表：

Network 000

LD      X000

TON     TV10    D0  // 定时器定时到D0时，T10 = 1 （D0为变量,也可以用常量代替，如K1）

Network 001

LD      T10

OUT     Y000

梯形图：


接通延时记忆定时器 TONR

对应命令 | 注释/说明 | 操作数（寄存器）
TONR | 接通延时记忆定时器 | TV,K/H/D

1. 指令说明

启用输入端为“接通”时，定时器位（Tx）为“断开”，当前值（TVx）从0开始计时。启用输入端为"断开"时，定时器状态位和当前值保持最后状态。启用输入端再次为“接通”时，当前值（TVx）从上次的保持值继续计数，当累计当前值（TVx）大于或等于预设时间（SV）时，定时器状态位为“接通”，当前值连续计数到32 767。Txxx = T0至T255，TVxxx = TV0至TV255。

TON、TONR和TOF定时器有三种分辨率。分辨率由下图所示的定时器编号决定。每一个当前值都是时间基准的倍数。例如，10毫秒定时器中的计数50表示500毫秒。

定时器类型 | 分辨率 | 最大值 | 定时器编号
TON、TONR、TOF | 100ms | 3276.7秒 | T0 – T199
 | 10ms | 327.67秒 | T200 – T249
 | 1ms | 32.767秒 | T250 – T255

注意：

（1）TOF，TONR及TON不能共享相同的定时器号码。例如，不能有TONR TV32 D0和TON TV32 D0。

（2）您可以将TONR用于累积多个计时间隔。

（3）执行复位操作可以复位定时器，即定时器位置 0，定时器当前值置0。

（4）只能用复原操作复位TONR定时器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
T | 双整数 | TV | 选定的定时寄存器
SV | 双整数 | K/H/D | 预设定时时间

3. 实例

指令表：

Network 000

LD      X000

TONR    TV251   K100  // 定时器定时到K100时，T251 = 1 （如K100表示定时到达100*1ms,也可以用变量代替）

Network 001

LD      T251

OUT     Y000

梯形图：


断开延时定时器 TOF

对应命令 | 注释/说明 | 操作数（寄存器）
TOF | 断开延时定时器 | TV,K/H/D

1. 指令说明

启用输入端为“接通”时，定时器位（Tx）为“接通”，当前值（TVx）被设为0。启用输入端从“接通”至“断开”跳变时，当前值（TVx）从0开始计时。当前值（TVx）大于或等于预设时间（SV）时，定时器位（Tx）为“断开”，且定时器停止计时，当前值（TVx）保持。如果启用输入端“断开”的时间短于预设数值，则定时器位仍保持在“接通”状态。如果启用输入端再“接通”时，定时器当前值仍设为0。Tx = T0至T255，TVx = TV0至TV255。

TON、TONR和TOF定时器有三种分辨率。分辨率由下图所示的定时器编号决定。每一个当前值都是时间基准的倍数。例如，10毫秒定时器中的计数50表示500毫秒。

定时器类型 | 分辨率 | 最大值 | 定时器编号
TON、TONR、TOF | 100ms | 3276.7秒 | T0 – T199
 | 10ms | 327.67秒 | T200 – T249
 | 1ms | 32.767秒 | T250 – T255

注意：

（1）TOF，TONR及TON不能共享相同的定时器号码。例如，不能有TONR TV32 D0和TOF TV32 D0。

（2）您可以将TOF用于延长时间以超过关闭（或假）条件，例如在电机关闭后使电机冷却。

（3）执行复位操作可以复位定时器，即定时器位置0，定时器当前值置0。

（4）复位后，TOF定时器要求启用输入端从“接通”转换为“断开”，以便重新启动。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
T | 双整数 | TV | 选定的定时寄存器
SV | 双整数 | K/H/D | 预设定时时间

3. 实例

指令表：

Network 000

LD      X000

TOF     TV200   K1  // 定时器定时到K1时，T200 = 1 （如K1表示定时到达1*10ms，K2表示2*10ms等,也可以用变量代替）

Network 001

LD      T200

OUT     Y000

梯形图：


计数器指令

内容如下：

1、 向上计数器 CTU

2、 向上向下计数器 CTUD

3、 向下计数器 CTD


向上计数器 CTU

对应命令 | 注释/说明 | 操作数（寄存器）
CTU | 向上计数器 | CV/CV32,K/H/D

1. 指令说明

每次向上计数输入能流从关闭向打开转换时，向上计数（CTU）指令从当前值向上计数。当前值（CVxxx）大于或等于预设值（SV）时，计数器位（Cxxx）打开。达到最大值（32,767或2147483647）时，计数器停止计数。执行复位操作可以复位计数器，即计数器位（Cxxx）置0，计数器当前值（CVxxx）置0。

  计数器范围：  CVxxx=CV0 至 CV255；  Cxxx= C0 至 C255。

计数器类型 | 计数器位数 | 最大值 | 计数器编号
CTU | 16位 | 32767 | C0 – C199
 | 32位 | 2147483647 | C200 – C234
 | 32位（高速） | 2147483647 | C235 – C255

注意：因为每个计数器有一个当前值，请勿将相同的计数器号码设置给一个以上计数器（号码相同的向上计数器和向下计数器存取相同的当前值）。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
C | 整数/双整数 | CV | 选定的计数寄存器
SV | 整数/双整数 | K/H/D | 预设计数值

3. 实例

指令表：

Network 000

LD      X000

CTU     CV0     D0   // 计数器从当前值CV0开始向上计数，设定值（SV）为D0

Network 001

LD      C0

OUT     Y000

梯形图：


向下计数器 CTD

对应命令 | 注释/说明 | 操作数（寄存器）
CTD | 向下计数器 | CV/CV32,K/H/D

1. 指令说明

每次向下计数输入能流从关闭向打开转换时，向下计数（CTD）指令从当前值向下计数。当前值CVxxx等于0时，计数器位（Cxxx）打开。向下计数器继续向下计数到最小值（16位-32768，,32位-2147483648），停止计数。执行复位操作可以复位计数器，即计数器位（Cxxx）置0，计数器当前值（CVxxx）复位为预设值（SV）。

  计数器范围： CVxxx=CV0 至 CV255；Cxxx= C0 至 C255。

计数器类型 | 计数器位数 | 最大值 | 计数器编号
CTD | 16位 | 32767 | C0 – C199
 | 32位 | 2147483647 | C200 – C234
 | 32位（高速） | 2147483647 | C235 – C255

注意：因为每个计数器有一个当前值，请勿将相同的计数器号码设置给一个以上计数器（号码相同的向上计数器和向下计数器存取相同的当前值）。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
C | 整数/双整数 | CV | 选定的计数寄存器
SV | 整数/双整数 | K/H/D | 预设计数值

3. 实例

指令表：

Network 000

LD      X000

CTD     CV0     D0   // 计数器从当前值CV0开始向下计数，设定值（SV）为D0

Network 001

LD      C0

OUT     Y000

梯形图：


向上向下计数器 CTUD

对应命令 | 注释/说明 | 操作数（寄存器）
CTUD | 向上向下计数器 | CV/CV32,K/H/D

1. 指令说明

每次计数输入能流从关闭向打开转换时，计数器（CTUD）指令判断当前值与设定值的大小。当前值（CVxxx）大于（小于）预设值（SV）时，计数器做向下（向上）计数，当前值（CVxxx）等于预设值（SV）时，计数器（Cxxx）置为1，当前值（CVxxx）不动作。执行复位操作可以复位计数器，即计数器位（Cxxx）置0，预设值（SV）复位。

计数器范围： CVxxx=CV0 至 CV255；Cxxx= C0 至 C255。

计数器类型 | 计数器位数 | 最大值 | 计数器编号
CTUD | 16位 | 32767 | C0 – C199
 | 32位 | 2147483647 | C200 – C234
 | 32位（高速） | 2147483647 | C235 – C255

注意：因为每个计数器有一个当前值，请勿将相同的计数器号码设置给一个以上计数器（编号相同的计数器存取相同的当前值）。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
C | 整数/双整数 | CV | 选定的计数寄存器
SV | 整数/双整数 | K/H/D | 预设计数值

3. 实例

指令表：

Network 000

LD      X000

CTUD    CV0     D0   // 计数器判断CV0与D0的大小关系，并从当前值CV0开始向上向下计数，设定值（SV）为D0

Network 001

LD      C0

OUT     Y000

梯形图：


程序控制指令

内容如下：

1、 FOR--NEXT循环指令

2、 程序内部跳转 JMP/LBL

3、 调用子程序 CALL

4、 顺控指令STL\STLE\ST\SET\RST

5、 C函数功能块调用 CALLM


FOR-NEXT循环指令

对应命令 | 注释/说明 | 操作数（寄存器）
FOR-NEXT | For循环 | D/K/H

1. 指令说明

启用输入端为“接通”时，执行此指令。每条FOR指令必须和NEXT指令配对使用，FOR和NEXT指令中间的所有指令程序段将被重复执行（CNT）次，指令必须指定循环次数CNT值。NEXT指令标志着FOR循环的结束。

FOR/NEXT循环执行的过程中可以修改CNT值。当循环再次允许时，循环次数按照新的CNT值循环执行。当下一次允许时，FOR/NEXT指令复位它自己。

启用输入端为“断开”时，则程序将跳过FOR—NEXT中间的所有指令程序段，直接执行NEXT指令后面的指令。

注意：FOR--NEXT循环嵌套层数最大为8层。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
CNT | 整数/双整数 | K/H/D | 预设循环次数

3. 实例

指令表：

Network 000

LDP     X000

FOR     K10  // 循环10次

Network 001

LD      X001

INC     D0      D0  // 每循环一次D0累加1

Network 002

NEXT

梯形图：


程序内部跳转 CJ/LBL

对应命令 | 注释/说明 | 操作数（寄存器）
CJ | 程序内部跳转 | K/H

1. 指令说明

跳转（CJ）指令指程序跳转到标签（LBL）指定的程序分支的操作。标签LBL指令与CJ指令配合使用，标识跳转的位置。

可以在主程序、子程序或者中断程序中，使用跳转指令。跳转和与之相应的标号指令必须位于同一段程序代码(无论是主程序、子程序还是中断程序)。不能从主程序跳到子程序或中断程序， 同样不能从子程序或中断程序跳出。

跳接接受时，堆栈顶值始终为逻辑1。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
LBL | 整数 | K/H | JMP指令指定的程序跳转目的地位置标号
L | 整数 | K/H | LBL指令对应的JMP指令程序跳转目的地的位置标号

3. 实例

指令表：

Network 000

LD      X000

CJ      K0  // 假如栈顶值为1，跳转到K0标签处

Network 001

LD      X001

ADD     D0      D1      D2  // 如果上面没有跳转，则栈顶为1时会执行D2=D0+D1

Network 002

LBL     K0  // K0标签

梯形图：


调用子程序 CALL

对应命令 | 注释/说明 | 操作数（寄存器）
CALL | 调用子程序 | 子程序名称

1. 指令说明

当CALL指令有效时，CALL指令将程序控制权交给子程序。子程序执行完成后，控制权返回到调用子程序的指令的下一条指令。

当CALL指令无效时，程序会自动跳过此条CALL指令，执行下一条指令。

要添加一个子程序可以在左侧工程管理器通过路径“工程”-->“程序”-->“子程序”：右键点击子程序文件夹，点击选择“添加子程序”。

要调用一个子程序除了输入CALL指令以外，还可以通过从工程管理器中将子程序项拖动到梯形图中来插入CALL指令。

注意：CALL子程序调用最大嵌套8层。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
 |  |  | 子程序名称

3. 实例

指令表：

LD      X000

CALL    新建子程序  // 调用子程序“新建子程序”

梯形图：


C函数功能块调用 CALLM

对应命令 | 注释/说明 | 操作数（寄存器）
CALLM | 函数功能块调用 | 函数功能块名称， （参数数量不定，但最多为4）

1. 指令说明

当CALLM指令有效时，CALLM指令将调用函数功能块，启动一个函数功能块子程序。

当CALLM指令无效时，程序会自动跳过此条CALLM指令，执行下一条指令。

注意：（1）.采用CALLM指令调用函数功能块时，要妥善处理好调用的入口和出口判断，防止造成时序或者逻辑的错误，导致程序执行出现错误。

      （2）.函数功能块的设计详见“函数功能块的设计”部分。

2. 实例(排序)

函数块：

// 数据初始化
[Array(data, size)]

void Data_Init(WORD data, WORD size)
{
    short i = 0 ;
    for ( i = 0 ; i < *size ; i++)
        data[i] = (i ^ 0x4321);        // 每个数都异或0x4321
}

// 数据从小到大排序
[Array(data, size)]

void Data_Sort(WORD data, WORD size)
{
    short i = 0;
    short j = 0;
    short temp = 0;
    for ( i = 0 ; i < *size ; i++)
    {
        temp = data[i];
        for (j = i ; j > 0 && data[j-1] > temp ; j--)
            data[j] = data[j-1];    // 不断向前冒泡
        data[j] = temp;
    }
}

指令表：

LDP     M0  // M0上升沿来临时，执行函数功能块Data_Init，使D[0]=0x4321，D[1]=0x4320，D[2]=0x4323，D[3]=0x4322，D[4]=0x4325，D[5]=0x4324，D[6]=0x4327

MOV     K7      D100  // 将长度设置到D100

CALLM   Data_Init   D0      D100  // 调用Data_Init，参数为data=D0, size=D100

POP  // 弹出上一个栈值

LDP     M1  // M1上升沿来临时，执行函数功能块Data_Sort, 对D[0]到D[6]进行从小到大的排序，结果为D[0]=0x4320，D[1]=0x4321，D[2]=0x4322，D[3]=0x4323，D[4]=0x4324，D[5]=0x4325，D[6]=0x4327

CALLM   Data_Sort   D0      D100  // 调用Data_Sort，参数为data=D0, size=D100

POP  // 弹出上一个栈值

LDW<    D1      D2

AW<     D2      D3

AW<     D3      D4

AW<     D4      D5

AW<     D5      D6

OUT     Y000  // 如果D1<D2<D3<D4<D5<D6，Y000置1

POP  // 弹出上一个栈值

梯形图：

 3. 实例（求一组浮点的标准差）

函数块：

// 求平均值
[Array(in, size)]

void Averange(FLOAT in, WORD size, FLOAT out)
{
    *out = 0.0;
    short i = 0;
    for ( ; i < *size ; i++)
        *out += in[i];
    *out /= *size;
}

// 求标准差
[Array(in, size)]

void StandardDeviation(FLOAT in, WORD size, FLOAT out)
{
    float ave = 0.0;
    Averange(in, size, &ave);
    short i = 0;
    *out = 0.0;
    for ( ; i < *size ; i++)
        *out += (in[i] - ave) * (in[i] - ave);
    *out /= *size;
    *out = sqrt(*out);
}

指令表：

LDP     M0

MOV     K10     D100  // 将长度设置到D100

CALLM   StandardDeviation    D0      D100     D200  // 调用StandardDeviation，参数为in=D0, size=D100,out=D200

梯形图：


顺控指令STL\STLE\ST\SET\RST

对应命令 | 注释/说明 | 操作数（寄存器）
STL | 状态开始 | S
STLE | 状态结束 | 无
SET | 状态转移（并复位当前状态） | S，K/H
ST | 状态转移（但不复位当前状态） | S
RST | 状态复位 | S，K/H

1. 指令说明

1、STL与STLE必须一一配对使用，STL表示一个状态的开始，STLE表示一个状态的结束；

2、各个状态之间都是独立的，不能互相嵌套使用，且在一个扫描周期的执行过程中，不要重复使用相同编号的STL段；

3、初始状态可以按需求任意指定，不一定非要按照S0、S1、S2等顺序执行；

4、执行SET Sx K1 指令后，该Sx状态被打开，相应STL Sx 梯形图段将被执行；

5、执行RST Sx K1 指令后，该Sx状态被关闭，相应STL Sx 梯形图段将被复位；

6、状态从ON变为OFF时，会将状态内的OUT、定时器、脉冲等输出类指令复位，对于SET、接通延时记忆定时器等指令保持原有状态；

7、SET与ST均为状态转移指令，但需注意SET与ST两个状态转移指令的区别：

（1）当使用SET指令当状态转移条件成立时，下一个待转移状态被置为ON，在状态转移的过程中，仅在1个扫描周期内该两个状态会同时接通，当前STL段中的状态在转移后的下一个扫描周期被复位OFF；

（2）当使用ST指令当状态转移条件成立时，下一个待转移状态被置为ON，但当前STL段中的状态不会被复位OFF， ST指令一般在程序需要同时运行多个状态程序时使用；

8、由于不同型号的PLC内部储存区大小不同，因此该状态寄存器S范围有不同的使用限制：

（1）对于GC043系列一体机，该状态S范围为0~63；

（2） 对于GC070系列一体机、FGs_16M与FGs_32M系列PLC，该状态S范围为0~999；

（3）对于FGs_64M与FGm_64M系列PLC，该状态S范围为0~999；

2. 实例1：SET与ST的区别

指令表：

梯形图：

3. 可选择的分支和连接

在生产实际中，对具有多流程的工作要进行流程选择或者分支选择，即一个控制流可能转入多个可能的控制流中的某一个，但不允许多路分支同时执行；到底进入哪一个分支，取决于控制流前面的转移条件哪一个为真。

指令表：

梯形图：

4. 并行分支和连接

在许多实例中，一个顺序控制状态流必须分成两个或多个不同分支控制状态流，这就是并行分支或并发分支。当一个控制状态流分成多个分支时，所有的分支控制状态流必须同时激活。当多个控制流产生的结果相同时，可以把这些控制流合并成一个控制流，即并行分支的连接。在合并控制流时，所有的分支控制流必须都是完成了的。这样，在转移条件满足时才能转移到下一个状态。

以下这个示例需特别说明的是：当并行分支连接时，要同时使所有含状态转移到新的状态，完成新状态的启动。另外在状态S2和S4的STL程序段中，由于没有使用SET指令，所以S2和S4的复位不能自动进行，最后要用复位指令对其进行复位。这种处理方法在并行分支的连接合并时会经常用到，而且在并行分支连接合并前的最后一个状态往往是“等待”过度状态，它们要等待所有并行分支都为“活动状态”后一起转移到新的状态。这些“等待”状态不能自动复位，它们的复位就要使用复位指令来完成。

指令表：

梯形图：


移位指令

内容如下：

1、 字左移 SHL

2、 双字左移 SHLD

3、 字右移 SHR

4、 双字右移 SHRD

5、 位左移 SHLB

6、 位右移 SHRB

7、 循环字左移 ROL

8、 循环双字左移 ROLD

9、 循环字右移 ROR

10、循环双字右移 RORD


左移操作

对应命令 | 注释/说明 | 操作数（寄存器）
SHL | 字左移 | D/K/H/TV/CV/AI/AO/V/Z,D/K/H,D/TV/CV/AO/V/Z
SHLD | 双字左移 | D/K/H,D/K/H,D

1. 指令说明

指令将输入寄存器（S）数值向左移动（N）位，并将结果载入输出寄存器（D）。移位指令对每个移出位补0。如果移位数目（N）大于或等于16（SHLD指令是32），则数值最多被移位16次（SHLD指令是32）。如果移位次数大于0，最后一个移位的值会复制到移位指令溢出标志位（M8166）。如果移位操作结果为0，移位指令零标志（M8167）置0。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 | D/K/H/TV/CV/AI/AO/V/Z D/K/H | 要移位的操作数
N | 字 双字 | D/K/H D/K/H | 移动的位数
D | 字 双字 | D/TV/CV/AO/V/Z D | 结果寄存器

3. 实例

指令表：

LD      X000

SHL     D0      K1      D1  // 将D0左移1位输出到D1

梯形图：


右移操作

对应命令 | 注释/说明 | 操作数（寄存器）
SHR | 字右移 | D/K/H/TV/CV/AI/AO/V/Z,D/K/H,D/TV/CV/AO/V/Z
SHRD | 双字右移 | D/K/H,D/K/H,D

1. 指令说明

指令将输入字（S）数值向右移动（N）位，并将结果载入输出字（D）。移位指令对每个移出位补0。如果移位数目（N）大于或等于16（SHRD指令是32），则数值最多被移位16次（SHRD指令是32）。如果移位次数大于0，最后一个移位的值会复制到移位指令溢出标志位（M8166）。如果移位操作结果为0，移位指令零标志（M8167）置0。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 | D/K/H/TV/CV/AI/AO/V/Z D/K/H | 要移位的操作数
N | 字 双字 | D/K/H D/K/H | 移动的位数
D | 字 双字 | D/TV/CV/AO/V/Z D | 结果寄存器

3. 实例

指令表：

LD      X000

SHR     D0      K1      D1  // 将D0左移1位输出到D1

梯形图：


位左移 SHLB

对应命令 | 注释/说明 | 操作数（线圈）
SHLB | 位左移 | X/Y/M/S/T/C, Y/M/S/T/C, D/K/H, D/K/H

1. 指令说明

指令将操作数（S）左移（N2）位进入长度（N1）的操作数（D）。N2≤N1≤操作数（D）长度最大值，其中，操作数（S）指定的是其（N2）位的最低位，从操作数（S）指定的（N2）位的最高位开始移入操作数（D）。

如下：

 | [SRC.] | [DST.] | n1 | n2
SHLB | Y0 | M0 | K8 | K2

指令执行过程：

(1) M7,M6 → 移出

(2) M5,M4 → M7,M6

(3) M3,M2 → M5,M4

(4) M1,M0 → M3,M2

(5) Y1,Y0 → M1,M0

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | BOOL | X/Y/M/S/T/C | 要移位的操作数
D | BOOL | Y/M/S/T/C | 结果寄存器
N1 | 字 | D/K/H | 结果寄存器中操作数的长度
N2 | 字 | D/K/H | 移动的位数

3. 实例

指令表：

LD      X000

SHLB    M0      Y0      K16     K1  // 将Y017移出，再将Y016移入Y017，… ，再将M0移入Y0

梯形图：


位右移 SHRB

对应命令 | 注释/说明 | 操作数（线圈）
SHRB | 位右移 | X/Y/M/S/T/C, Y/M/S/T/C, D/K/H, D/K/H

1. 指令说明

指令将操作数（S）右移（N2）位进入长度（N1）的操作数（D）。N2≤N1≤操作数（D）长度最大值，其中，操作数（S）指定的是其（N2）位的最低位，从操作数（S）指定的（N2）位的最低位开始移入操作数（D）。

如下：

 | [SRC.] | [DST.] | n1 | n2
SHRB | Y0 | M0 | K8 | K2

指令执行过程：

（1）M1,M0 → 移出

（2）M3,M2 → M1,M0

（3）M5,M4 → M3,M2

（4）M7,M6 → M5,M4

（5）Y1,Y0 → M7,M6

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | BOOL | X/Y/M/S/T/C | 要移位的操作数
D | BOOL | Y/M/S/T/C | 结果寄存器
N1 | 字 | D/K/H | 结果寄存器中操作数的长度
N2 | 字 | D/K/H | 移动的位数

3. 实例

指令表：

LD      X000

SHRB    M0      Y0      K16     K1  // 将Y017移出，再将Y016移入Y017，… ，再将M0移入Y0

梯形图：


循环左移

对应命令 | 注释/说明 | 操作数（寄存器）
ROL | 循环字左移 | D/K/H/TV/CV/AI/AO/V/Z,D/K/H,D/TV/CV/AO/V/Z
ROLD | 循环双字左移 | D/K/H,D/K/H,D

1. 指令说明

指令将输入字（S）数值向左循环移动（N）位，并将结果载入输出字（D）。如果移位数目（N）大于或等于16（ROLD是32），则在执行循环移位之前会执行模数16的取模操作（ROLD是32），得到一个有效的移位次数（N），从而使移动位数在0至15之间（ROLD是0至31之间）。如果移位次数大于0，循环移位指令执行，最后一个移位的值会复制到移位指令溢出标志位（M8166）。如果移位次数为0，循环移位指令不执行，移位指令零标志（M8167）置0。

当使用有符号数据类型时，符号位也被移位。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 双字 | D/K/H/TV/CV/AI/AO/V/Z D/K/H | 要移位的操作数
N | 字 双字 | D/K/H D/K/H | 移动的位数
D | 字 双字 | D/TV/CV/AO/V/Z D | 结果寄存器

3. 实例

指令表：

LD      X000

ROL     D0      K1      D1  // 将D0循环左移1位输出到D1

梯形图：


循环字右移 ROR

对应命令 | 注释/说明 | 操作数（寄存器）
ROR | 循环字右移 | D/K/H/TV/CV/AI/AO/V/Z,D/K/H,D/TV/CV/AO/V/Z
RORD | 循环双字右移 | D/K/H,D/K/H,D

1. 指令说明

指令将输入字（S）数值向右循环移动（N）位，并将结果载入输出字（D）。如果移位数目（N）大于或等于16（RORD是32），则在执行循环移位之前会执行模数16的取模操作（RORD是32），得到一个有效的移位次数（N），从而使移动位数在0至15之间（RORD是0至31之间）。如果移位次数大于0，循环移位指令执行，最后一个移位的值会复制到移位指令溢出标志位（M8166）。如果移位次数为0，循环移位指令不执行，移位指令零标志（M8167）置0。

当使用有符号数据类型时，符号位也被移位。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 字 | D/K/H/TV/CV/AI/AO/V/Z | 要移位的操作数
N | 字 | D/K/H | 移动的位数
D | 字 | D/TV/CV/AO/V/Z | 结果寄存器

3. 实例

指令表：

LD      X000

ROR     D0      K1      D1   // 将D0循环右移1位输出到D1

梯形图：


中断指令

内容如下：

1、 中断绑定 ATCH

2、 中断释放 DTCH

3、 中断允许 EI

4、 中断禁止 DI


中断绑定 ATCH

对应命令 | 注释/说明 | 操作数（寄存器）
ATCH | 中断绑定 | 中断子程序ID，K

1. 指令说明

指令将中断事件号（EVNT）与中断子程序号码（INT）相关联，并启用中断事件。中断事件号（EVNT）见下表：

中断向量表：

中断号 | 中断事件
K0 | X000上升沿触发
K1 | X000下降沿触发
K2 | X000边沿变化触发
K3 | X001上升沿触发
K4 | X001下降沿触发
K5 | X001边沿变化触发
K6 | 中断定时器0 注：设定值为D8173，定时范围（1~32767ms）（分辨率1ms）
K7 | 中断定时器1 注：设定值为D8174，定时范围（1~32767ms）（分辨率1ms）
仅多脉冲型PLC FGm_32MT_A, FGm_64MT_A具有以下中断事件
K8 | Y0脉冲发送完成中断
K9 | Y1脉冲发送完成中断
K10 | Y2脉冲发送完成中断
K11 | Y3脉冲发送完成中断
K12 | Y4脉冲发送完成中断
K13 | Y5脉冲发送完成中断
K14 | Y6脉冲发送完成中断
K15 | Y7脉冲发送完成中断
K16 | Y10脉冲发送完成中断
K17 | Y11脉冲发送完成中断
K18 | C235计数完成中断
K19 | C236计数完成中断
K20 | C237计数完成中断
K21 | C238计数完成中断
K22 | C239计数完成中断
K23 | C240计数完成中断
K24 | C241计数完成中断
K25 | C242计数完成中断
K26 | C243计数完成中断
K27 | C244计数完成中断
K28 | C245计数完成中断
K29 | C246计数完成中断
K30 | X2上升沿中断
K31 | X2下降沿中断
K32 | X2边沿中断
K33 | X3上升沿中断
K34 | X3下降沿中断
K35 | X3边沿中断
K36 | X4上升沿中断
K37 | X4下降沿中断
K38 | X4边沿中断
K39 | X5上升沿中断
K40 | X5下降沿中断
K41 | X5边沿中断

注意：

（1）输入端口边沿变化中断优先级和定时中断优先级小于其他中断优先级；

（2）当有高速计数或脉冲中断与外部中断同时输入时，外部中断不处理。

（3）当几个外部中断同时输入时，仅处理检测到的第一个外部中断。

（4）所有外部中断的输入总频率不要太高。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
INT |  |  | 中断子程序ID
EVNT | 字 | K | 中断事件号

3. 实例

指令表：

Network 000

LDP     M0

ATCH    INTR_0  K0  // 将中断事件K0与中断子程序INTR_0关联

EI                    // 中断开启

Network 001

LDP     M1

DTCH    K0           // 中断释放

Network 002

LDP     M2

DI                    // 中断禁止

梯形图：


中断释放 DTCH

对应命令 | 注释/说明 | 操作数（寄存器）
DTCH | 中断释放 | K

1. 指令说明

指令将解除中断事件号（EVNT）的关联，并禁用该中断事件。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
EVNT | 字 | K | 中断事件号

3. 实例

请参见中断绑定ATCH的实例。


中断允许 EI

对应命令 | 注释/说明 | 操作数（无）
EI | 中断允许 | NONE

1. 指令说明

指令将全局性启用所有被关联的中断事件。要执行中断子程序，必须先开启全局中断。

当进入RUN模式时，初始状态为禁止中断。在RUN模式下，可以执行中断允许指令(EI)允许所有中断。执行禁用中断指令(DI)可禁止中断过程；但是，激活的中断事件仍继续排队。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行

3. 实例

请参见中断绑定ATCH的实例。


中断禁止 DI

对应命令 | 注释/说明 | 操作数（无）
DI | 禁止中断 | NONE

1. 指令说明

指令将全局性禁止所有中断事件进程。

当进入RUN模式时，初始状态为禁止中断。在RUN模式下，可以执行中断允许指令(EI)允许所有中断。执行禁用中断指令(DI)可禁止中断过程；但是，激活的中断事件仍继续排队。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行

3. 实例

请参见中断绑定ATCH的实例。


实时时钟

内容如下：

1、 读实时时钟 TRD

2、 写实时时钟 TWR


读实时时钟 TRD

对应命令 | 注释/说明 | 操作数（寄存器）
TRD | 读实时时钟 | D

1. 指令说明

指令从硬件时钟读取当前时间和日期，并将其载入以地址T起始的8个连续D的时间缓冲区。其中，年份用2字节表示。

所有日期和时间值必须采用BCD格式编码（例如，8211代表2013年）。请参阅下表。

T（Dn – Dn+7） | 说明 | 数据
0 | 年（2000 -- 2099） | 当前年份（BCD值）
1 | 月（1 -- 12） | 当前月份（BCD值）
2 | 日期（1 -- 31） | 当前日期（BCD值）
3 | 小时（0 -- 23） | 当前小时（BCD值）
4 | 分钟（0 -- 59） | 当前分钟（BCD值）
5 | 秒（0 -- 59） | 当前秒（BCD值）
6 | 00 | 保留
7 | 星期几（0 -- 6） | 当前是星期几，0=星期日（BCD值）

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
T | 字 | D | 读入时间存储的寄存器起始地址

3. 实例

指令表：

LD      X000

TRD     D0  // 时间读入D0~D7

梯形图：


写实时时钟 TWR

对应命令 | 注释/说明 | 操作数（寄存器）
TWR | 写实时时钟 | D

1. 指令说明

指令将当前时间和日期写入硬件时钟，当前时钟存储在以地址T开始的8字节时间缓冲区中。其中，年份用2字节表示。

该指令请采用边沿信号触发。

所有日期和时间值必须采用BCD格式编码（例如，8211代表2013年）。请参阅下表。

T（Dn – Dn+7） | 说明 | 数据
0 | 年（2000 -- 2099） | 当前年份（BCD值）
1 | 月（1 -- 12） | 当前月份（BCD值）
2 | 日期（1 -- 31） | 当前日期（BCD值）
3 | 小时（0 -- 23） | 当前小时（BCD值）
4 | 分钟（0 -- 59） | 当前分钟（BCD值）
5 | 秒（0 -- 59） | 当前秒（BCD值）
6 | 00 | 保留
7 | 星期几（0 -- 6） | 星期由年月日决定不可独立修改

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时(边沿信号)，指令执行；否则，不执行
T | 字 | D | 存储当前时间和日期的寄存器起始地址

3. 实例

指令表：

LDP     X000

TWR     D0  // 存储在D0~D7的当前时间和日期写入硬件时钟

梯形图：


通信指令

内容如下：

1、 Modbus主站通信 MBUS

2、 自由口通信 SEND

3、 自由口通信 REV


Modbus主站通信 MBUS

对应命令 | 注释/说明 | 操作数（寄存器）
MBUS | 调用Modbus主站通信指令 | K/H, 表格名称, D, D

1. 指令说明

1、COM_ID：通信口选择，可选择COM0（232）或COM1（485）；

2、Table：Modbus主站表格ID，可在工程管理窗口中添加所需的Modbus主站表格；

3、WR：用来存储通信信息代码(见下表)；

4、WR_ID：用来存储当前主站表格的Modbus命令序列编号，表示当前所运行至该表格的哪一条命令序列，编号为0~n-1，其中n为该表格内的命令序列总数；

5、修改配置信息：选择COM口通信参数设置，如主站站号、波特率、校验位、超时时间、重传次数等，然后选择Modbus主站模式；

注意：

1、要使用该指令的话必须将所设置的COM口（232/485）设置为主站模式并勾选配置信息下载到PLC中，否则不会执行通信命令，具体设置方式请参照PLC参数设置页面内容；

2、该指令的第三个操作数WR虽然只需输入Dn来表示通信信息代码，但Dn+1也是有实际意义的，可用来返回当前主站表格的Modbus命令编号，而且Dn+1不可在其它地方修改数值；

3、对于Modbus主站可设置串口通信的超时时间，默认为200ms，此外还可设置重传次数，默认为3。比如：当设置超时时间为200ms、重传次数为3时，表示若200ms内从站不返回，PLC将重新发送一次数据包，若累计超过所设定的3次重传次数后从站仍不回应（此时PLC共发送了4次数据包），则返回通讯超时错误代码16即0x10；

4、超时时间在某些时候可能需要用户根据实际情况而略作调整，比如当波特率较低时，由于数据传输速度较慢，因此需要将超时时间适当增大；另外若每次传输数据包字节数较多（比如每次读写从站长度较大，造成发送或接收该包数据耗时较长）时，也需要将超时时间增大，否则可能会报通讯超时错误；

5、PLC运行中返回的通信信息代码存放在所设置的Dn寄存器中，该数值是一个十进制数，而下面表格中的均是十六进制数，如：通信返回Dn值=16，转换成十六进制=0x10，即表示通讯超时；

6、对于同一个COM口，在同一时刻不可能同时与多个从站进行数据通信，PLC内部访问外部从站设备均是一个一个顺序执行的，用户在编程时应考虑到这点，若其中一个从站设备断开，会导致整个系统在该从站处因多次重传而卡顿一段时间，该卡顿时间即为：（重传次数+1）*超时时间，因此如若需要提高整个系统的快速响应可以考虑减少重传次数；

通信信息代码：

代码 | 信息
0x01 | 非法功能码
0x02 | 非法地址
0x03 | 非法数据
0x04 | 从站操作失败
0x05 | 命令有效，正在处理中
0x06 | 从机忙
0x07 | 非法数据类型
0x08 | 非法命令编号
0x09 | 非法密码
0x10 | 通讯超时
0x11 | 数值错误：数据小于0或者大于255
0x12 | 主从站设置错误
0x13 | 实际所接收数据中的站号与所期望的站号不一致
0x14 | 元件地址溢出：发送的数据量超出元件存储空间
0x15 | 命令执行失败
0x18 | 接收信息帧错误，包括接收长度校验错误、接收CRC校检错误
0x20 | 参数不可修改
0x21 | 参数运行时不可修改
0x22 | 参数受密码保护

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
COM_ID |  |  | 选择的通讯口
Table |  |  | Modbus主站表标识
WR | 字 | D | 用来存储通信信息代码
WR_ID | 字 | D | 当前主站表格的Modbus命令序列编号

3. 基本使用方法

右键点击工程管理窗口“工程”-->“Modbus表格”文件夹，点击“新建Modbus表格”，然后弹出新建对话框。

图1.1 新建表格

输入表格名称（这里是“Modbus主站表”），然后单击确定按钮。就可以添加并编辑这个表格了。界面的右侧菜单栏提供了对Modbus表格的编辑功能。

图1.2 右侧菜单

图1.3 Modbus表格编辑

小提示：创建Modbus表格后，将其从工程管理窗口拖入梯形图，就能创建这个表格的MBUS指令了。

图1.4 鼠标拖动

指令表：

LD      X000

MBUS    K0      Modbus主站表    D0  D1  // K0表示COM口232，使用“Modbus主站表”，D0存储通信信息，D1存储当前正在执行的Modbus命令编号

梯形图：

PLC梯形图运行流程：

1、先执行从站站号为1的表格命令，PLC向从站站号为1的设备发送数据包，并等待该从站返回信息，此时D1=0；

2、在这段时间内，即便PLC扫描到该指令也不会执行相应命令，直到第一个表格命令中的从站设备正确返回或大于超时时间，才会执行该Modbus表格中之后的命令；

3、第一个表格命令执行完后，当梯形图再次扫描到该指令，将顺序执行该表格的第二条命令，即PLC会向从站站号为5的设备发送数据包，并等待该从站返回信息，此时D1=1；

4、第三个表格命令与前面两条类似，依次循环执行，此时D1=2；

5、需注意的是，对于同一个COM口，不可能同时与多台从站设备进行通信，它们之间必然是有着先后顺序的，只是这个顺序执行的速度很快，甚至可看做是同步执行；

4. 扩展应用

PLC的Modbus主站通信指令在使用上非常灵活，适用于多种不同的额场合及要求，

（1）主站须同时和所有从站一直进行通信

这种情况对于编写梯形图程序来说是最简单的，只需将所有待读写的从站地址信息建立在同一个Modbus主站表格中即可，在整个梯形图程序中对于该COM口有且只需一条Modbus主站通信指令，用户可以用某个使能端来进行控制，用户无需处理多 个从站之间的转换，也无需理解其如何实现，因为PLC内部会自动对其进行切换处理，且是按照该Modbus表格内的从站序列号WR_ID顺序自动进行切换；

该方法的好处是梯形图处理简单，只需一条Modbus指令，以及建立一个Modbus表格，用户编写梯形图程序较容易；

该方法的坏处是当所挂载的从站较多或待读写的从站信息序列较多时，由于每次以轮询的方式进行切换每一个从站信息，导致耗时较长；

因此该方法适用于主站必须一直保持与所有从站进行通信的使用场合，或者从站以及读写从站命令较少的场合；

（2）主站根据用户选择和其中某些从站进行通信，而不与其它未选择的从站进行通信

在某些大型使用场合下，更多的情况是由用户选择来选择性地与某些从站进行通信，而未选择到的从站则无需对其进行读写通信操作；

并且该方法可以实现任意形式的通信，当然也包括了（1），下面会给出一个简单示例说明，

该方法的好处是选择性地与所挂载的某些从站进行通信，因此通信速度相比（1）的轮询所有从站要快；

该方法的坏处是梯形图编写较为复杂，需要利用某些串口通讯标志如M8182/M8183等由用户手动进行控制不同Modbus表格以及Modbus指令的切换；

示例1.

如下图所示，建立一个名为“所有从站”的的Modbus表，主站挂载了三个从站，其从站站号分别为1、2、3，其中每个从站均有3条不同的读写序列，

表格建好后选择Modbus主站通信协议配置，核对好从站串口信息以及站号设置，主站梯形图如下图所示，下载至PLC中，通过监视观察是否正常运行，且WR_ID一直在从站序列0~8之间快速自动切换

示例2.

接下来给出一种同样可以实现示例1的方法，该方法稍显复杂，但理解其原理后会对Modbus主站通信指令有更深的了解；

首先将示例1中的三个从站分别拆开作为不同的Modbus表格，如下图所示分别建立3个从站表格；

编写如下所示的梯形图，其中D1234用于切换控制不同的Modbus表，使能不同的Modbus指令，比如当（D1234 == 1）时代表控制1号从站，当（D1234 == 3）时代表控制3号从站；

M8183是485串口通信接收完成标志，该标志由PLC内部在接收到数据后自动置位，需要由用户在梯形图中手动复位，该特殊寄存器是用于手动切换的关键标志；

梯形图第二个网络中的D5001、D5003、D5005与K2进行比较判断的含义：K2代表每个Modbus表格的从站信息序列，该示例由于三个表格内总共均有3个序列，每个表格内序列号依次为：0、1、2，因此这里用D5001、D5003、D5005与K2进行比较是表示与其相对应的Modbus指令运行到该表格的序列末端，实际工程中不同表格内的序列号总数可以不同，但每个表格内的末端序列号一定是该表格的序列总数n-1，即WR_ID分别为：0、1、2 ... n-2、n-1；

将该程序下载至PLC中，可以监视调试将M6000置位，并将D1234置1，之后可以观察到PLC会自动在三个Modbus指令之间进行快速切换，且与多个从站之间的读写通信也是正常的。

如果能理解示例2中的程序，那么若想实现选择性地手动切换控制与不同的从站进行通信也就非常简单明了了；

试想像一个场景，当HMI进入画面1时用户需与1号从站通信且不与其它从站通信，进入画面2时需与2号从站通信且不与其它从站通信，... 进入画面n时需与n号从站通信且不与其它从站通信；该使用场景中的不同画面相当于上面示例2中的D1234，多个不同从站有多个不同的Modbus表格以及相对应的Modbus指令，示例2中实现了自动循环切换，而该使用场景则是由用户给D1234寄存器赋不同的值来进行手动切换，其基本思路是一致的，只要灵活使用M8182/M8183串口接收完成标志并配合Modbus指令中的WR_ID即可实现任意方式的通信；注意还有一个关键点在于：梯形图中对于同一个COM口允许可以包含多个Modbus指令，但是，同一个扫描周期内对于同一个COM口有且只能同时导通一个Modbus指令，若同时导通了多个Modbus指令则会发生数据通信异常。


自由口通信 SEND

对应命令 | 注释/说明 | 操作数（寄存器）
SEND | 调用自由口通讯发送指令 | K, D,K/H/D

1. 指令说明

1、COM_ID（通信口选择）:可选择COM0（232）或COM1（485）；

2、Addr（起始地址）：该参数地址是以Dn为起始地址的一片区域，该操作数仅能选择D数据寄存器；

3、Len（数据长度）：设置待发送数据的长度，该操作数可选择K/H/D，对于不同型号PLC均有其相应的发送最大限制；

4、修改配置信息：选择COM口通信参数设置，如波特率、校验位等，然后选择自由口通信模式，以及数据缓冲位数；

通讯数据缓冲位说明：

8位：通讯时D寄存器的高8位字节是无效的，PLC只利用D寄存器的低8位字节进行发送和接收数据；

16位：通讯时在发送过程中，PLC先发送D寄存器中的低8位字节数据，然后再发送高8位字节数据；

需注意的是，无论选择8位还是16位数据缓冲位，其发送长度Len均为字节长度，当选择8位时，一个D寄存器就是一个字节长度，而当选择16位时，一个D寄存器则是2个字节长度；

COMn正在发送标志位(Only Read)：

寄存器 | 串口COMn
M_8176 | COM0（232）
M_8177 | COM1（485）

COMn发送完成标志位(Read or Write)：

寄存器 | 串口COMn
M_8180 | COM0（232）
M_8181 | COM1（485）

注意：

1、使用该指令的前提是必须将相应的COM口（232/485）设置为自由口通讯模式，具体设置方式请参照PLC参数设置页面内容；

2、当设置某COM口模式为自由口通讯后，该COM口则不能再用来进行程序下载和数据监视，也不能用作Modbus主、从站间进行通讯；

3、在没有USB的情况下，建议只使用COM1（485）口用作通讯，COM0（232）仅留作编程以及执行数据监视功能；

4、在修改了PLC参数设置后，需勾选配置信息，然后下载到PLC中，否则参数修改无效；

5、由于受PLC数据缓存大小的限制，因此发送数据长度Len不能超过其最大限制，对于16或32点PLC最大为256Byte，而64点PLC最大为512Byte；

6、自由口通讯传输属于半双工模式，即发送指令SEND和接收指令REV不能同时进行；

2. 指令的有效操作数：

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
COM_ID |  |  | 选择的通讯口
Addr | 字 | D | 要发送的数据的存储起始地址
Len | 字 | K/H/D | 要发送的数据长度

3. 实例1

指令表：

梯形图：

4. 实例2

指令表：

梯形图：


自由口通信 REV

对应命令 | 注释/说明 | 操作数（寄存器）
REV | 调用自由口通讯接收指令 | K, D,D

1. 指令说明

1、COM_ID（通信口选择）:可选择COM0（232）或COM1（485）；

2、Addr（起始地址）：将接收到的数据存放在以Dn为起始地址的一段区域，该操作数仅能选择D数据寄存器；

3、Len（接收长度）：该参数无需设置，在数据接收过程中会自动返回实际接收到的数据长度，并存放在所设的D寄存器中，对于不同型号PLC均有其相应的接收最大限制；

4、修改配置信息：选择COM口通信参数设置，如波特率、校验位等，并选择自由口通信模式，以及数据缓冲位数；

通讯数据缓冲位说明：

8位：通讯时D寄存器的高8位字节是无效的，PLC只利用D寄存器的低8位字节进行发送和接收；

16位：通讯时在接收过程中，PLC将接收到的数据先存放在D寄存器中的低8位字节，然后再存放在D寄存器中的高8位字节；

需注意的是，无论选择8位还是16位数据缓冲位，通讯时其返回的接收长度Len均为字节长度，当选择8位时，一个D寄存器就是一个字节长度，而当选择16位时，一个D寄存器是2个字节长度；

另外，每次在接收数据前以及重新使能接收REV指令后，都会自动清除上一次存放在D寄存器中的缓冲数据，因此REV指令常和MVWBLK指令结合使用；

COMn正在接收标志位(Only Read)：

寄存器 | 串口COMn
M_8178 | COM0（232）
M_8179 | COM1（485）

COMn接收完成标志位(Read or Write)：

寄存器 | 串口COMn
M_8182 | COM0（232）
M_8183 | COM1（485）

注意：

1、要使用该指令的话必须将所设置的COM口（232/485）设置为自由口通讯模式，具体设置方式请参照PLC参数设置页面内容；

2、当设置某COM口模式为自由口通讯后，则该COM口不能用来进行程序下载和监视，也不能用作Modbus主站、从站；

3、在修改了PLC参数设置后，需勾选配置信息，然后下载到PLC中，否则参数修改无效；

4、由于受PLC数据缓存大小的限制，因此接收数据长度Len不能超过其最大限制，对于16或32点PLC最大为256Byte，而64点PLC最大为512Byte；

5、自由口通讯传输属于半双工模式，即发送指令SEND和接收指令REV不能同时进行；

 2. 指令的有效操作数：

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
COM_ID |  |  | 选择的通讯口
Addr | 字 | D | 要接收的数据的存储起始地址
Len | 字 | D | 要接收的数据长度

3. 实例1

指令表：

梯形图：

4. 实例2

指令表：

梯形图：


脉冲输出指令

内容如下：

1、 可变频率脉冲输出PLSF/DPLSF

2、 脉宽调制PWM/DPWM

3、 单段不带加减速脉冲输出PLSY/DPLSY

4、 多段脉冲输出PLSR/DPLSR/PLSRD/DPLSRD/PLSA/DPLSA

5、 脉冲段切换PLSNEXT

6、 脉冲停止PLSSTOP

7、 回归原点ZRN/DZRN/DZRND

8、 相对位置多段脉冲控制PTO（32位）

9、 单段脉冲输出DRVI/DDRVI/DRVA/DDRVA


可变频率脉冲输出PLSF

对应命令 | 注释/说明 | 操作数（寄存器）
PLSF(32位) | 可变频率脉冲输出 | 输出频率(K/H/D) 输出脉冲Y

1. 指令说明

1）可变频率脉冲输出PLSF指令可用于可变脉冲频率的连续输出，频率跳变时无加减速时间。

2）启用输入端为“接通”时，立即以设定的脉冲频率开始连续的输出脉冲，过程脉冲频率可调，直至脉冲指令的启用输入端断开。PLSF指令可输出频率范围为0Hz~200KHz，FGM系列PLC最高频率可达500KHz；

3）FGs提供了高速脉冲输出口，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口，64点晶体管型的PLC，Y000~Y003为高速脉冲输出口；继电器型的PLC不具有高速脉冲功能，输出端口的最大输出频率由继电器的吸合时间决定。FGM系列PLC Y0~Y7 Y10~Y11为高速脉冲输出口。

4）指令不含方向输出口，用户需要时方向信号输出端口号和信号控制可由用户自定义和设置，如实例中接线图，方向信号输出口Y2，Y3和Z相输入可由用户定义。

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

32位脉冲累积计数溢出标记，溢出为1(只读)：

寄存器 | 脉冲输出Yn
M_8118 | Y000
M_8119 | Y001
M_8120 | Y002
M_8121 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8122 | Y004
M_8123 | Y005
M_8124 | Y006
M_8125 | Y007
M_8126 | Y010
M_8127 | Y011

注意：

1. PLSF输出频率为32位正整数，占用两个连续的D寄存器；

2. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数。

3. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

4. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

5. 脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

6. 由于本指令脉冲输出不带方向，所以脉冲累积计数寄存器（D8140~D8158）只能正方向计数；

7. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断。

8. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
输出频率（Hz） | 双整数 | K/H/D | 设定的脉冲频率
输出脉冲Y | 双整数 | Y | 指定的脉冲输出口

3. 实例

接线图：

指令表：

Network 000

LDP     M8151             // M8151上升沿赋值，一定是上升沿，防止PLC扫描重复赋值

MOVD    K400    D0        // 初始频率

Network 001

LDP     M1

MOVD    K900    D0        // 改变值D0D1

Network 002

LDP     M2

MOVD    K650    D0        // 改变值D0D1

Network 003

LDP     M3

MOVD    K500    D0        // 改变值D0D1

Network 004

LD      M0

PLSF   D0      Y000  // 当M0为‘1’时，在Y000输出频率为D0D1的脉冲，否则脉冲输出停止，脉冲频率会随着D0D1的数值变化而变化。

梯形图：


脉宽调制PWM

对应命令 | 注释/说明 | 操作数（寄存器）
PWM(32位) | 脉宽调制 | 输出频率(K/H/D) 输出占空比(K/H/D) 输出脉冲Y

1. 指令说明

1）脉宽调制PWM指令产生一个可变脉冲频率和可变占空比的脉冲输出，频率跳变时无加减速时间。

2）启用输入端为“接通”时，立即以设定的脉冲频率和占空比开始连续的输出脉冲，过程脉冲频率可调，占空比可调，直至脉冲指令的前提条件断开。32位PWM指令可输出频率范围为0Hz~200KHz，占空比范围0~100%。对于FGM系列PLC 最大脉冲频率为500KHz，占空比调节范围为0~100%。由于高频脉冲存在频率失真情况，所以进行脉宽的精准控制时，频率不要过高。

3）FGs提供了高速脉冲输出口，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口，64点晶体管型的PLC，Y000~Y003为高速脉冲输出口；继电器型的PLC，不具有高速脉冲功能，输出端口的最大输出频率由继电器的吸合时间决定。FGM系列PLC高速输出口为Y000~Y007，Y10~Y11。

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

32位脉冲累积计数溢出标记，溢出为1(只读)：

寄存器 | 脉冲输出Yn
M_8118 | Y000
M_8119 | Y001
M_8120 | Y002
M_8121 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8122 | Y004
M_8123 | Y005
M_8124 | Y006
M_8125 | Y007
M_8126 | Y010
M_8127 | Y011

注意：

1. PWM输出频率与占空比为32位正整数，占用两个连续的D寄存器；

2. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数；

3. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

4. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

5. 脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

6. 由于本指令脉冲输出不带方向，所以脉冲累积计数寄存器（D8140~D8158）只能正方向计数；

7. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

8. 频率过高时存在波形失真情况，若要进行脉宽精确控制，脉冲频率不要过高。

9. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
输出频率（Hz） | 整数/双整数 | K/H/D | 设定的脉冲频率
占空比(%) | 整数/双整数 | K/H/D | 设定的占空比
输出脉冲Y | BOOL | Y | 指定的脉冲输出口

3. 实例

指令表：

Network 000

LD      M0

PWM    D0      D2      Y000  // 当M0为‘1’时，在Y000输出频率为D0D1，占空比为百分之D2D3的脉冲

梯形图：


单段不带加减速脉冲输出PLSY

对应命令 | 注释/说明 | 操作数（寄存器）
PLSY(32位) | 单段不带加减速脉冲输出 | 输出频率(K/H/D) 输出脉冲数(K/H/D) 输出脉冲Y

1. 指令说明

1）单段不带加减速脉冲输出PLSY，指令可用于输出一定频率的指定脉冲数的脉冲。当脉冲正在输出时，相应的脉冲正在输出标志被置位；当输出脉冲数达到设定值时，脉冲输出停止，相应的脉冲正在输出标志被复位。在脉冲输出过程中，脉冲和频率可调，频率跳变时无加减速时间。

2）启用输入端为“接通”时，立即以设定的频率开始连续的输出脉冲，当输出脉冲个数达到设定的输出脉冲数时，脉冲输出停止，过程脉冲数和频率可调。32位PLSY指令可输出频率范围为0Hz~200KHz。对于FGM系列PLC最大脉冲输出频率为500KHz。

3）FGs提供了高速脉冲输出口，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口，64点晶体管型的PLC，Y000~Y003为高速脉冲输出口；继电器型的PLC，不具有高速脉冲功能，输出端口的最大输出频率由继电器的吸合时间决定。多脉冲型PLC的高速输出口为Y000~Y007，Y10~Y11。

4）指令不含方向输出口，方向信号输出端口号和信号控制可由用户自定义和设置。

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

32位脉冲累积计数溢出标记，溢出为1(只读)：

寄存器 | 脉冲输出Yn
M_8118 | Y000
M_8119 | Y001
M_8120 | Y002
M_8121 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8122 | Y004
M_8123 | Y005
M_8124 | Y006
M_8125 | Y007
M_8126 | Y010
M_8127 | Y011

注意：

1. PLSY输出频率与输出脉冲数为32位正整数，占用两个连续的D寄存器；

2. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数；

3. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

4. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

5. 脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

6. 由于本指令脉冲输出不带方向，所以脉冲累积计数寄存器（D8140~D8158）只能正方向计数；

7. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断。

8. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
输出频率（Hz） | 双整数 | K/H/D | 设定的脉冲频率
输出脉冲数 | 双整数 | K/H/D | 设定的输出脉冲数
输出脉冲Y | BOOL | Y | 指定的脉冲输出口

3. 实例

指令表：

Network 000

LDP     M8151        // M8151上升沿赋值，一定是上升沿，防止PLC扫描重复赋值

MOVD    K400    D0  // 初始频率

Network 001

LDP     M1

MOVD    K900    D0  // 改变值D0

Network 002

LDP     M2

MOVD    K650    D0  // 改变值D0

Network 003

LDP     M3

MOVD    K500    D0  // 改变值D0

Network 004

LD      M0

    PLSY   D0     D2      Y000  // 当M0为‘1’时，在Y000端口输出频率为D0D1的脉冲，当脉冲数达到D2D3个时，输出脉冲停止，并将脉冲正在输出标志M_8134复位

Network 005

LDF     M8134

RST     M0      K1

梯形图：

时序图：


多段脉冲输出PLSR/PLSA

对应命令 | 注释/说明 | 操作数（寄存器）
PLSR(32位) | 单向相对位置多段脉冲输出 | 指定分段脉冲参数起始软元件地址编号(D) 指定加减速的数值(K/H)或者软元件的地址编号(D) 指定脉冲输出端口编号(Y) 指定脉冲输出方向端口编号(Y)
PLSA(32位) | 绝对位置多段脉冲输出 | 指定分段脉冲参数起始软元件地址编号(D) 指定加减速的数值(K/H)或者软元件的地址编号(D) 指定脉冲输出端口编号(Y) 指定脉冲输出方向端口编号(Y)

1. 指令说明

1）多段脉冲输出PLSR/PLSA指令可用于实现多段按预设的频率和脉冲数的脉冲输出，不同段间的输出转换要在预设的加减速时间内完成。启用输入端为“接通”时，立即从第一段的起始频率开始输出脉冲，在预定的加减速时间内加速到第一段预设的频率，当输出脉冲个数达到第一段预设的输出脉冲数时；在预定的加减速时间内加减速到第二段预设的频率，当输出脉冲个数达到第二段预设的输出脉冲数时，按第三段预设值执行，直到段脉冲的个数设定为0或频率设置为0表示结束分段，脉冲输出停止。

2）多段频率和脉冲数的设定值在脉冲参数地址中设定。以Dn为起始地址的一段区域。

32位指令PLSR：以D0（双字）为起始地址为例，D0（双字）设定第1段脉冲的最高频率、D2（双字）设定第1段脉冲的个数，D4（双字）设定第2段脉冲的最高频率、D6（双字）设定第2段脉冲的个数，……，以Dn设定第(n+4)/4段脉冲的最高频率、Dn+2设定第(n+4)/4段脉冲的个数的设定值为0表示分段结束。当某段的脉冲个数设置为-1时，则表示该段脉冲将一直发送，直到遇到PLSNEXT指令进行段落切换。

3）32位PLSR指令可输出频率范围为0Hz~200KHz，脉冲量范围K0~K2147483647，对于FGM系列PLC最大脉冲频率为500KHz。加减速时间是指从起始频率到稳定频率的加减速时间，同一指令内，各段加减速时间相同，加减速时间范围：0~65536ms。

  每段设定脉冲频率，脉冲个数和加减速时间满足关系式：（起始频率Hz + 结束频率Hz）×（ 加减速时间ms÷1000） <=  脉冲个数 × 2。

对于用户设置不合法或者不合理的参数，当是否忽略错误标志M8070-M8073被置位时，不忽略错误，程序将会报错，ERR红灯变亮，出错脉冲指令不执行，其它程序会继续执行。 用户可以读取D8176中的错误编号查看错误原因，错误码如下表，出错脉冲段位置可由D8108-D8111查看。修改完善后再次下载运行程序，错误状态会取消，并正确执行程序。当M8070-M8073被复位时，忽略错误，ERR灯不会亮，但错误依然会检测到，对应寄存器会显示错误状态，但脉冲会以默认方式调整脉冲后强制发送，此时脉冲频率可能存在跳变情况，但脉冲数量依然准确。

错误码（D8176） | 错误码解释 | 错误原因及修改方式
23 | 多段脉冲指令的段落数超出最大范围（可能无分段完成标志） | PLSR指令的频率和脉冲数量参数同时为零代表指令结束，如果报此错可能是未设置结束标志，或设置段数超过默认最大段数。
24 | 多段脉冲指令第一段最大脉冲频率小于默认起始频率 | 第一段的默认起始频率是1000HZ，所以第一段最大频率请不要低于此值。
25 | 频率小于下限 | 频率设置得不要太低，如果要使用低频，请选择非加减速脉冲指令。
26 | 单段脉冲数小于下限 | 各段落的脉冲数不要设置得太低，否则无法完成加减速。
27 | 加减速时间小于下限 | 加减速时间设置太小，频率分段跳变跨度很大，不易起步。
28 | 参数不满足加减速合法要求 | 各参数不满足合法关系式，请重新调整参数使其满足上式。
29 | 最后一段不满足加减速合法要求，请兼顾加速和减速停的脉冲数量 | 指令最后一段会默认从结束频率减速为零，无需用户设置(除PTO指令)，请考虑减速的脉冲数量， 满足：（起始频率Hz + 结束频率Hz）×（ 加减速时间ms÷1000） <= 脉冲个数

4）双向相对位置多段脉冲输出PLSR脉冲方向Y只由第一段设定的脉冲个数或者脉冲频率的正负决定，当第一段设定的脉冲个数或者频率为正数时，为正方向，Y输出为ON；当设定的脉冲个数或者频率为负数时，为负方向，Y输出为OFF。对于绝对定位指令，脉冲个数代表其绝对位置，各段的正负可不相同，会自动变换方向。

5）特殊功能寄存器M8068为方向极性控制，默认脉冲方向输出口为ON时表示正方向，OFF时表示负方向。若设置M8068为ON则所有脉冲指令的方向输出极性发生反转，脉冲方向输出为OFF表示正方向，为ON表示负方向。在脉冲正在发送过程中不能切换M8068的ON、OFF状态。

6）FGs提供了高速脉冲输出口，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口，64点晶体管型的PLC，Y000~Y003为高速脉冲输出口；继电器型的PLC不具有高速脉冲功能，输出端口的最大输出频率由继电器的吸合时间决定。对于FGM系列PLC其高速脉冲输出口为Y0~Y7，Y10~Y11。

7）当特殊功能寄存器M8069为ON时所有的脉冲指令的加减速为S形，为OFF时则为梯形。

8）在多段脉冲发送过程中，当脉冲还未发送到该段时，可以任意更改该段的参数，当运行到此段时会以新参数运行。但当脉冲发送到该段脉冲的上一段时，不要将该段的参数改为0，否则会造成末段的频率突变。同理，可将原本为结束标志的D寄存器修改为有参数的脉冲段实现追加脉冲段功能；

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲方向，正方向为1(只读)：

寄存器 | 脉冲输出Yn
M_8102 | Y000
M_8103 | Y001
M_8104 | Y002
M_8105 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8106 | Y004
M_8107 | Y005
M_8108 | Y006
M_8109 | Y007
M_8110 | Y010
M_8111 | Y011

32位脉冲累积计数溢出标记，溢出为1(只读)：

寄存器 | 脉冲输出Yn
M_8118 | Y000
M_8119 | Y001
M_8120 | Y002
M_8121 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8122 | Y004
M_8123 | Y005
M_8124 | Y006
M_8125 | Y007
M_8126 | Y010
M_8127 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下M软元件
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

是否忽略错误，继续发送脉冲，默认忽略为0，若设为1，出错时停止脉冲输出(读写)：

寄存器 | 脉冲输出Yn
M_8070 | Y000
M_8071 | Y001
M_8072 | Y002
M_8073 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8074 | Y004
M_8075 | Y005
M_8076 | Y006
M_8077 | Y007
M_8078 | Y010
M_8079 | Y011

检查每段用户设置脉冲个数和频率是否正确 1--发现错误（用于多段脉冲）(只读)：

寄存器 | 脉冲输出Yn
M_8086 | Y000
M_8087 | Y001
M_8088 | Y002
M_8089 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8090 | Y004
M_8091 | Y005
M_8092 | Y006
M_8093 | Y007
M_8094 | Y010
M_8095 | Y011

当前脉冲段(只读)：

寄存器 | 脉冲输出Yn
D_8124 | Y000
D_8125 | Y001
D_8126 | Y002
D_8127 | Y003
对于FGM系列PLC 还具备以下M软元件
D_8128 | Y004
D_8129 | Y005
D_8130 | Y006
D_8131 | Y007
D_8132 | Y010
D_8133 | Y011

出错脉冲段位置，0表示无错误(只读)：

寄存器 | 脉冲输出Yn
D_8108 | Y000
D_8109 | Y001
D_8110 | Y002
D_8111 | Y003
对于FGM系列PLC 还具备以下M软元件
D_8112 | Y004
D_8113 | Y005
D_8114 | Y006
D_8115 | Y007
D_8116 | Y010
D_8117 | Y011

注意：

1. PLSR每个输出频率为32位正整数，占用两个连续的D寄存器；

2. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数；

3. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

4. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

5.  脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

6.  由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

7.  高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

8. 当为n段脉冲时，第1段、第2段、第3段……第n段每段的脉冲频率和脉冲数的地址必须是依次连续的，且第n+1段的脉冲频率与脉冲数的地址必须为0，用来判断脉冲段是否结束；加减速时间的地址不能够紧跟在第n段后面；

9. 当脉冲个数为K-1或者HFFFFFFFF(32位)时，表示该段脉冲会一直输出，直到等到PLSNEXT指令才会切换分段；

10. 第一段的起始频率系统默认为1000HZ，做高速脉冲输出时，第一段的稳定频率不要低于该值；

11. 当前脉冲段（D8124-D8133）只在脉冲发送过程中记录当前脉冲段，指令失能时自动归零。

12. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

3. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
脉冲参数地址 | 整数/双整数 | D | 多段频率设定值的起始地址
加减速时间（ms） | 整数/双整数 | K/D | 多段脉冲设定值的起始地址
输出脉冲Y | BOOL | Y | 指定的脉冲输出口
方向Y | BOOL | Y | PLSRD/DPLSRD指令的脉冲方向

4. 实例

1）使用MOVD赋值实现相对位置多段脉冲输

指令表：

Network 000

LDP      M8151

MOVD    K100000    D0         //第一段频率100KHz 存入D0D1

MOVD    K200000    D2         //第一段脉冲数2000000 存入D2D3

MOVD    K200000    D4         //第二段频率200KHz 存入D4D5

MOVD    K300000    D6         //第二段脉冲数300000 存入D6D7

FMOVD   K0   D8    K2         //结束标志 频率0存入D8D9，脉冲数0存入D10D11

Network 001

LD      M0

PLSR   D0      K100    Y000   Y004// 当M0被置位，PLSR指令开始工作

梯形图：

2）使用函数功能块实现相对位置多段脉冲输出

参数设置：

在工程管理窗口“工程”-->“指令”-->“脉冲输出”-->“PLSR”中单击右键，单击“创建参数函数”，会弹出对话框。

图1.1

输入要新建的函数名称，选择要添加到的函数功能块（也可以选择新建一个函数功能块并输入新的名称，建议统一放到名叫“脉冲参数设置”的函数功能块中）。点击确定，就会在梯形图光标处插入了一条新的CALLM指令。

双击该指令的图元，弹出的参数设置对话窗口和普通的不一样。

图1.2

这里可以设置分段脉冲的参数，最后一段脉冲设为(0,0)表示结尾。请注意，右侧的频率图仅供参考，不代表实际运行时的具体情况。

点击确定后，除了加减速时间以外，分段脉冲的参数设置就完毕了。可以在对应的函数功能块中看到刚刚添加的函数，函数头部方括号括起来的部分代表函数的属性。请注意，这个语法为SAMSOARII定制，请勿将该语法用在别的C语言程序中。

图1.3

指令表：

Network 004

LD      M8151

CALLM   SetDPLSRParams D0 // 设置分段脉冲的参数

MOVD    K100   D100           // 加减速时间100Ms

Network 005

LD      M0

PLSR   D0      D100    Y000   Y004// 当M0被置位，PLSR指令开始工作

Network 006

LDF     M8134                 // 脉冲发送完成

RST     M0      K1            // 复位M0

梯形图：

3）检测到信号后运行指定步长

 实现检测到X0信号后，再运行50000个脉冲停止脉冲发送，程序如下所示。首先以50KHz频率发送脉冲，脉冲个数为-1表示一直发送脉冲。当X0检测到上升沿信号时，则执行PLSNEXT段落切换，进入下一段，而下一段的脉冲频率为20KHz，脉冲个数为50000个。在第一段运行过程中可以修改第二段脉冲个数50000的值，若在第一段启动前不知道第二段的脉冲量，则可随意设置一个参数（不能为0），在切换段落前修改即可。


脉冲段切换PLSNEXT

对应命令 | 注释/说明 | 操作数（寄存器）
PLSNEXT | 脉冲段切换 | 输出脉冲端口编号Y

1. 指令说明

在PLSR/EPLSR指令脉冲输出到达当前段最高频率并稳定输出时，脉冲段切换PLSNEXT指令可以指向下一段频率，如果M0由OFF—>ON，则立即以加减速时间进入下一段的脉冲输出。

注意：

1. 在脉冲输出的加减速过程中，执行此指令无效；当在最后一段脉冲达到最高频率并稳定输出时，执行PLSNEXT指令，则立即以减速时间结束脉冲输出；

2. 该指令只能对PLSR/EPLSR指令进行脉冲段切换；

3. PLSNEXT指令只能使用边沿触发，否则会造成脉冲发送紊乱。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
输出脉冲Y | BOOL | Y | 指定的脉冲输出口

3. 实例

指令表：

Network 000

LD      M8151

MOVD    K100000        D0          // 第1段脉冲最高频率100KHz

MOVD    HFFFFFFFF      D2          // 第1段脉冲数为最大值，脉冲在频率稳定时一直输出，等待PLSNEXT指令

MOVD    K200000         D4         // 第2段脉冲最高频率200KHz

MOVD    K9999999        D6         // 第2段脉冲数9999999PLS

FMOVD   K0      D8      K2         // 脉冲分段完成标志

MOVD    K100   D100                // 加减速时间100ms

Network 001

LD      M0

PLSR   D0      D100    Y000  // 当M0被置位，PLSR指令开始工作

Network 002

LDF     M8134                // 脉冲发送完成

RST     M0      K1           // 复位M0

Network 003

LDP     X000                 // X000上升沿触发

PLSNEXT Y000                // Y000脉冲段切换

梯形图：


脉冲停止PLSSTOP

对应命令 | 注释/说明 | 操作数（寄存器）
PLSSTOP | 脉冲停止输出 | 输出脉冲端口编号Y； 停止模式； 停止时间

1. 指令说明

1）当启用输入端由OFF变为ON时，Yn脉冲口根据设置的停止模式执行相应停止动作。当停止模式设置为K0时为立即停止脉冲输出，停止时间参数无效。当停止模式设置为K1时，则为减速停止，减速时间为停止时间的设置参数。

2）脉冲停止PLSSTOP指令为上升沿触发。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
输出脉冲Y | BOOL | Y | 指定的脉冲输出口
停止模式 | K | K0/K1 | K0为立即停止，K1为减速停止
停止时间 | D/K/H | 整数 | 减速停止时，设置减速时间参数

3. 实例

指令表：

Network 003

LDP     M11      // M11上升沿触发

PLSSTOP Y000   // Y000脉冲减速停止，减速时间为100ms

梯形图：


回归原点ZRN

对应命令 | 注释/说明 | 操作数（寄存器）
ZRN（32位） | 回归原点 | 爬行速度（K/H/D） 回归速度（K/H/D） 近点信号（X/M） 输出脉冲（Y） 方向输出口（Y）

1. 指令说明

启用输入端为“接通”时，回归原点ZRN 指令先以爬行速度设定输出脉冲，当近点信号置位的时候，立即从爬行速度在一定时间内减速到回归速度设定输出脉冲，当近点信号复位时，停止脉冲发送。启用输入端为“断开”时，脉冲发送立即停止。

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

原点回归加减速时间（读写）：

寄存器 | 脉冲输出Yn
D_8076 | Y000
D_8077 | Y001
D_8078 | Y002
D_8079 | Y003
对于FGM系列PLC 还具备以下寄存器
D_8080 | Y004
D_8081 | Y005
D_8082 | Y006
D_8083 | Y007
D_8084 | Y010
D_8085 | Y011

注意：

1. 使用该指令完成回原点动作后，对应输出口的脉冲累积寄存器（D8140~D8158）会自动清零，作为原点；

2. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作；

3. 对于ZRN带方向回原点指令，若需负方向回原点，需将回归速度与爬行速度均设为负值；

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
回归速度 | 双整数 | K/H/D | 回归速度设定
爬行速度 | 双整数 | K/H/D | 爬行速度设定
近点信号 | 双整数 | X/M | 指定的近点位置信号
输出脉冲Y | BOOL | Y | 指定的脉冲输出口
输出方向Y | BOOL | Y | 指定的脉冲方向输出口

3. 实例

指令表：

Network 000

LDP     M8151

MOVD    K100000   D0      // 爬行速度，脉冲频率100KHz

MOVD    K5000     D2      // 回归速度，脉冲频率5KHz

MOV     K100    D8076     // 减速时间100ms

Network 001

LD      M0

ZRN     D0      D2      X0      Y0    Y4// 当M0为‘1’时，在Y0先输出D0频率的脉冲当X0处接收到上升沿时，Y0输出频率在D8076时间内将速度由D0转变至D2，X0处接收到下降沿则会直接停止脉冲发送

梯形图：

时序图：


相对位置多段脉冲控制PTO（32位）

对应命令 | 注释/说明 | 操作数（寄存器）
PTO(32位) | 相对位置多段脉冲控制 | 指定分段脉冲参数起始软元件地址编号(D) 指定脉冲输出端口编号(Y) 指定脉冲输出方向（Y）

1. 指令说明

1）相对位置多段脉冲控制PTO（32位）指令可用于实现多段按预设的频率和脉冲数的脉冲输出。启用输入端为“接通”时，立即从第一段的预设起始频率开始输出脉冲，匀加减速达到第一段的预设结束频率，同时，输出脉冲个数达到第一段预设输出脉冲个数；从第二段的预设起始频率开始输出脉冲，匀加减速达到第二段的预设结束频率，同时，输出脉冲个数达到第二段预设输出脉冲个数；依次类推，直到段脉冲的个数设定为0值表示结束分段，脉冲输出停止，或者脉冲指令启用输入端断开。

2）多段频率和脉冲数的设定值在脉冲参数地址起始中设定。以Dn为起始地址的一段区域。

以D0（双字）为起始地址为例：D0(D1)设定总的脉冲段数，D2(D3)设定脉冲的方向标志，D4(D5)设定第1段脉冲的起始频率、D6(D7)设定第1段结束频率，D8(D9)设定第1段脉冲的脉冲个数、D10(D11)设定第2段脉冲起始频率，……，Dn+4(Dn+5)设定第(n+6)/6段脉冲的最高频率、Dn+6（Dn+7）设定第(n+6)/6段脉冲的结束频率、Dn+8（Dn+9）设定第（n+6/6）段脉冲数；

3）可输出频率范围为0Hz~200KHz，脉冲量范围K0~K2147483647，对于FGM系列PLC其最大脉冲频率为500KHz。加减速时间是指从起始频率到稳定频率的加减速时间，当频率为0时停止输出。在各段脉冲输出过程中，无加速度时间设置，频率从起始频率一直加速到结束频率，整个加速过程所走的步长为该段脉冲个数，如时序图所示。

4）FGs提供了高速脉冲输出口，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口，64点晶体管型的PLC，Y000~Y003为高速脉冲输出口；继电器型的PLC不具有高速脉冲功能，输出端口的最大输出频率由继电器的吸合时间决定。对于FGM系列PLC其高速脉冲输出口为Y000~Y007，Y10~Y11。

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲方向，正方向为1(只读)：

寄存器 | 脉冲输出Yn
M_8102 | Y000
M_8103 | Y001
M_8104 | Y002
M_8105 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8106 | Y004
M_8107 | Y005
M_8108 | Y006
M_8109 | Y007
M_8110 | Y010
M_8111 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

当前脉冲段(只读)：

寄存器 | 脉冲输出Yn
D_8124 | Y000
D_8125 | Y001
D_8126 | Y002
D_8127 | Y003
对于FGM系列PLC 还具备以下寄存器
D_8128 | Y004
D_8129 | Y005
D_8130 | Y006
D_8131 | Y007
D_8132 | Y010
D_8133 | Y011

出错脉冲段位置，0表示无错误(只读)：

寄存器 | 脉冲输出Yn
D_8108 | Y000
D_8109 | Y001
D_8110 | Y002
D_8111 | Y003
对于FGM系列PLC 还具备以下寄存器
D_8112 | Y004
D_8113 | Y005
D_8114 | Y006
D_8115 | Y007
D_8116 | Y010
D_8117 | Y011

注意：

1. 当为n段脉冲时，第1段、第2段、第3段……第n段每段的脉冲频率和脉冲数的地址必须是依次连续的；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

4. 脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

5. 由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

6. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

7. 第一段的起始频率系统默认为100HZ，做高速脉冲输出时，第一段的稳定频率不要低于该值；

8. 当前脉冲段（D8124-D8133）只在脉冲发送过程中记录当前脉冲段，指令失能时自动归零；

9. PTO指令不能使用PLSNEXT指令切换至下个脉冲段落。

10. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
起始地址 | 整数/双整数 | D | 多段参数设定值的起始地址
输出脉冲Y | BOOL | Y | 指定的脉冲输出口
方向Y | BOOL | Y | 指定脉冲输出方向

3. 实例

参数设置：

PTO指令可以通过与PLSR类指令同样的方法来设置参数函数。如何创建PLSR指令的参数设置函数？

指令表：

Network 000

LD      M8151

CALLM   SetPTOParams D0  // 设置多段脉冲参数

Network 001

LD      M0

PTO     D0      Y0      Y3  // 数据起始D0，脉冲输出Y0，方向Y3

梯形图：

时序图：


单段脉冲输出DRVI/DRVA

对应命令 | 注释/说明 | 操作数（寄存器）
DRVI(32位)/ DRVA(32位) | 相对位置单段脉冲输出 | 输出频率(K/H/D) 输出脉冲数(K/H/D) 加速时间(K/H/D) 减速时间(K/H/D) 输出脉冲Y 输出方向Y

1. 指令说明

1）单段脉冲输出DRVI/DRVA是带加减速的可用于实现指定脉冲频率和脉冲数的脉冲输出指令。启用输入端为“接通”时，脉冲从1000HZ匀加速到设置频率匀速输出，减速时从设置频率减速到0，过程中发送完成指定的脉冲个数。当脉冲指令启用输入端断开时，脉冲输出立即停止。

2）DRVI指令可输出频率范围为0Hz~200KHz，脉冲量范围K0~K2147483647。对于FGM系列PLC其最大脉冲频率为500KHz。

3）FGs提供了高速脉冲输出口，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口；64点晶体管型的PLC，Y000~Y003为高速脉冲输出口；继电器型的PLC不具有高速脉冲功能，输出端口的最大输出频率由继电器的吸合时间决定。对于FGM系列PLC其高速脉冲输出口为Y0~Y7，Y10~Y11。

4）指令可用于非对称（加减速时间单独设置）单段梯形、S形位置控制，当特殊功能寄存器M8069为ON时所有的脉冲指令的加减速为S形，为OFF时则为梯形。

5）特殊功能寄存器M8068为方向极性控制，默认脉冲方向输出口为ON时表示正方向，OFF时表示负方向。若设置M8068为ON则所有脉冲指令的方向输出极性发生反转，脉冲方向输出为OFF表示正方向，为ON表示负方向。在脉冲正在发送过程中不能切换M8068的ON、OFF状态。

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM型PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM型PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

是否忽略错误，继续发送脉冲，默认忽略为0，若设为1，出错时停止脉冲输出(读写)：

寄存器 | 脉冲输出Yn
M_8070 | Y000
M_8071 | Y001
M_8072 | Y002
M_8073 | Y003
对于FGM型PLC 还具备以下寄存器
M_8074 | Y004
M_8075 | Y005
M_8076 | Y006
M_8077 | Y007
M_8078 | Y010
M_8079 | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

4.  脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

5.  由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

6.  高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

7. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
输出频率 | 双整数 | K/H/D | 输出频率的设定值
输出脉冲数 | 双整数 | K/H/D | 输出脉冲数的设定值
加速时间 | 整数 | K/H/D | 加速时间设定值
减速时间 | 整数 | K/H/D | 减速时间设定值
输出脉冲Y | BOOL | Y | 指定的脉冲输出口
输出方向Y | BOOL | Y | 指定的脉冲方向输出口

3. 实例

指令表：

Network 000

LDP     M8151

MOVD    K100000  D0     // 脉冲输出数D0D1

MOVD    K50000   D2     // 脉冲输出频率D2D3

MOV     K100      D4     // 加速时间100ms D4

MOV     K200      D5     // 减速时间200ms D5

Network 001

LD      M0

DRVI    D0   D2   D4   D5   Y1   Y6  // 当M0被置位DRVI开始工作

梯形图：


多段脉冲定位输出TBL

对应命令 | 注释/说明 | 操作数（寄存器）
TBL | 多段脉冲定位输出 | 参数存放首地址 D 脉冲输出口Y 方向输出口 Y 表格参数

1.指令说明：

1）对于FGs系列PLC，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口，对于64点晶体管型的PLC，Y000~Y003为高速脉冲输出口，对于FGM系列PLC，64点Y0~Y7，Y10~Y11为高速脉冲输出口；

2）对于FGs系列PLC，单路脉冲：指令可输出频率范围0Hz~200KHz，脉冲量范围K0~K2147483647，当频率为0时停止输出，对FGM系列PLC，最高脉冲频率高达500KHz；

3）对于继电器型的PLC，不具有高速脉冲功能，所有输出端口的最大输出频率有继电器的吸合时间决定；

4）该指令作用是输出一定频率的指定脉冲数的脉冲，启动的时候从1000HZ均加速到固定速度均速输出，结束的时候从固定速度减速到0，完成一段脉冲输出；

5）脉冲个数和加减速时间满足如下关系式的才是合法的：

（起始频率Hz + 结束频率Hz）×（ 加减速时间ms÷1000） <= 脉冲个数 × 2

6）功能：条件位置控制。

7）使用简述：如下图，数据起始地址用于存放各段频率以及脉冲数值，M200接通后指令使能，数据将传送至D寄存器中，“当前脉冲段”为1，但不会立刻发送脉冲，需要第一段起始条件M500接通才开始发送第一段脉冲。D寄存器中的数据可以在程序中修改，运行到该段时会自动从D寄存器中取值。每段脉冲发送前都有一个等待事件和执行条件，等待事件由wait信号、ATC时间、脉冲发送完成组成。图中第一段，wait信号为M500，只有当前要执行的段落为第一段时，M500接通开始发送第一段，结束后接通结束标识位M501，并断开执行条件M500，“当前脉冲段”为“跳转至”的段落号。第一段执行完成后跳转至下一段，“跳转至”可填入任何已设置段落，图中为2。第二段的等待事件为ATC时间，等待事件为执行条件中设置的K2000单位毫秒，也可设置为D寄存器，从第一段运行结束开始计时，2000ms后开始运行第二段，第二段开始运行就会断开第一段M501的结束标志。第二段结束后接通M503。第三段等待事件为脉冲发送完成，即第二段脉冲发送完成就立即进入第三段脉冲发送，并立刻断开M503。第三段运行结束后跳转至第四段，第四段与第一段类似。第四段运行结束后跳转至第一段，构成一个循环。

梯形图：

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下M软元件
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

相对位置的加减速时间（读写）：

寄存器 | 脉冲输出Yn
D_8092 | Y000
D_8093 | Y001
D_8094 | Y002
D_8095 | Y003
对于FGM系列PLC 还具备以下M软元件
D_8096 | Y004
D_8097 | Y005
D_8098 | Y006
D_8099 | Y007
D_8100 | Y008
D_8101 | Y009

当前脉冲段(只读)：

寄存器 | 脉冲输出Yn
D_8124 | Y000
D_8125 | Y001
D_8126 | Y002
D_8127 | Y003
对于FGM系列PLC 还具备以下M软元件
D_8128 | Y004
D_8129 | Y005
D_8130 | Y006
D_8131 | Y007
D_8132 | Y010
D_8133 | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

3. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

4. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

5. 脉冲累积计数寄存器（D8140~D8146）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

6. 由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8146）根据方向计数；

7. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8146）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

8． 当等待事件为脉冲发送完成时，执行条件无需填写，默认为K0；

9. “模式”中的“相对”与“绝对”指填入的脉冲数为相对坐标还是绝对坐标；

10. “跳转至”可设置为任意已设置段落，最终都会构成一个循环；

11. 脉冲数和频率不可输入零，如果输入参数不满足加速合法性要求，系统将重新调整速度曲线。

实例：

如图，分别设置Y0，Y1脉冲输出参数。M0接通后运动到第一点坐标（2000，200000），Y0第一段发送结束M1导通，Y1第一段结束M1导通，M0被自动置OFF。因为是相对坐标，M0导通后运动到点（6000，500000），之后依次类推。最后一段M3导通后回到原点，运动到点（0,0）。


多段线插补POLYLINEI/POLYLINEF

对应命令 | 注释/说明 | 操作数（寄存器）
POLYLINEI/POLYLINEF | 多段线插补指令 | 平面编号； 单位； 直线圆弧参数设置； 参数是否映射到D寄存器； D寄存器首地址。

1.指令说明：

1）该指令仅FGM系列PLC有效，其它型PLC该指令无效；

2）其高速脉冲输出口为Y0 ~ Y7，Y10~Y11，脉冲频率范围0~500KHz，频率非连续可调；

3）POLYLINEI/POLYLINEF分别为整数参数指令、浮点数参数指令，对应的是以脉冲pls为单位和毫米mm为单位；

4）该指令作用是完成直线、圆弧组合运动，按照左侧的线段序列框中的线段顺序依次绘制，若相邻的两线段为共线、相切的过渡方式，则在交点处无加减速停顿，平滑过渡，反之，有加减速停顿。其直线圆弧参数设置，请参考LINEI/LINEF、ARCI/ARCF指令说明；

5）POLYLINE参数映射到D寄存器中的主要目的是为了动态控制参数，可在D寄存器中修改原本参数或者在后面添加参数达到修改位置添加线段的目的。另外，在运动过程中修改速度的D寄存器值，可实现实时速度控制。若选择仅D控制，则用户无需再POLYLINE指令中输入任何位置、速度参数，直接由赋值的D寄存器参数序列决定运动。具体参数存放规则参考下段说明。

2.指令使用说明：

POLYLINEF指令图

1） 首先选择平面编号，平面设置请参考“平面系统设置”，若平面系统未启用，则无法正常运行；

2） 该指令参数的单位，可以为毫米mm或者脉冲pls，分别对应POLYLINEF和POLYLINEI指令。建议用户使用mm作为单位，参数贴合实际，无需换算，不易出错；

3） 在左侧线段序列框中右击鼠标，可选择增加、插入、删除、移动图元；

4） 直线圆弧的参数设置请参考LINEI/LINEF、ARCI/ARCF指令；

5） 位置和速度参数均可输入K/D型数据，分别为不可调和可调。其中，速度参数输入为D时，D寄存器中的值发生改变，速度也相应实时调整，在加减速过程中，调整速度参数，调速不会立即响应，速度的变化会在加减速结束后立刻调速。强调，使用MOV类指令赋值位置、速度参数时，使用MOVD还是MOVF要根据选择指令的POLYLINEI和POLYLINEF类型决定。POLYLINEI为整型指令，对应脉冲单位pls，其参数需使用MOVD赋值，POLYLINEF为浮点型指令，对应毫米mm单位，其参数需要使用MOVF赋值。而加减速时间参数单位为ms，是一个16位整数，需使用MOV指令，与插补指令类型无关；

6） 将数据映射到D寄存器，如图“将数据映射到D寄存器”，是在指令使能时，会将已设置的位置参数、速度参数以特定顺序存放在D寄存器中，并且改变了位置、速度参数的映射路径，若要修改位置或实时调速，必须调整新映射到D寄存器中的地址参数才可，映射的参数存放规则如图“将参数映射到D寄存器的参数存放规则”，按照线段的顺序依次循环。选择映射后，参数下方会显示映射到的D寄存器地址，用户可在线段未执行前对参数进行更改，调整图形形状。但需要注意的是，线段的执行具有前瞻性，当前正在执行的线段的后一段已被处理，若需改变图元形状，必须从当前正在执行线段的后两段开始改变，否则会出现前瞻性错误，导致报错或运行混乱。该功能仅适用于需要对形状进行小修改时使用。

将数据映射到D寄存器

将参数映射到D寄存器的参数存放规则

7） 仅D寄存器控制，选择此模式时，直线圆弧参数均仅由D寄存器控制，指令中无法填入数据，已填入的数据也无效，其数据存储规则如图“仅D寄存器控制参数存放规则”，其线段参数依照设置依次循环，需要注意的是，仅D控制具有一个全局速度，如果其它线段中的速度与全局速度相同，则可省略，若不相同，则可单独添加在线段数据尾部加入该线段的速度参数，并且将控制位“单独速度”设为1。实时调速时，调整全局速度不影响具有单独速度的线段，若需要对具有单独速度的线段进行调速，需调整其单独速度地址中的值。该功能适用于需要对图形形状进行批量修改时使用。

仅D寄存器控制参数存放规则

8） 选择仅D寄存器控制时，若不采用其他方式，需要使用MOV类指令不停的赋值D寄存器，易出错且麻烦，为设计方便，开发了针对仅D控制的函数功能块模板“OnlyDMappingI”和“OnlyDMappingF”，该函数的功能块主要功能是通过函数将线段参数赋值到D寄存器中。其添加如下图，导入函数功能块，并根据插补指令类型选择文件“OnlyDMappingI.ssc”和“OnlyDMappingF.ssc”，若需要添加多个该函数，需要修改函数功能块名称以及内部子函数名称，避免函数重命名。在函数功能块中有详细的注释，在此仅简述其用法框图如下。

添加OnlyDMapping函数功能块

OnlyDMapping函数功能块使用框图

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150 (D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156 (D_8157) | Y010
D_8158 (D_8159) | Y011

当前脉冲段(只读)：

寄存器 | 脉冲输出Yn
D_8124 | Y000
D_8125 | Y001
D_8126 | Y002
D_8127 | Y003
对于FGM系列PLC 还具备以下寄存器
D_8128 | Y004
D_8129 | Y005
D_8130 | Y006
D_8131 | Y007
D_8132 | Y010
D_8133 | Y011

出错脉冲段位置，0表示无错误(只读)：

寄存器 | 脉冲输出Yn
D_8108 | Y000
D_8109 | Y001
D_8110 | Y002
D_8111 | Y003
对于FGM系列PLC 还具备以下寄存器
D_8112 | Y004
D_8113 | Y005
D_8114 | Y006
D_8115 | Y007
D_8116 | Y010
D_8117 | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

4. 由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

5. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

6. 加减速时间不要设置太小，否则无加减速效果；

7. 当单位设置为脉冲pls时，速度单位为pls/s，如果平面系统设置的X轴Y轴脉冲当量不相等，则默认以X轴脉冲当量计算其真实速度；

8. 脉冲正在发送标志位，如M8134仅代表Y0是否正在输出脉冲，如果需要检测直线是否运行，则需并联两轴的发送标志位，参考示例；

9. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

实例：

绘制如图所示导圆矩形，其直线部分速度为100mm/s且直线部分速度可调，圆弧部分速度为50mm/s，且速度独立不受直线部分影响。开始绘图时置位M500，完成后复位M500。

梯形图：

不将数据映射到D寄存器：

依次设置添加直线圆弧，并设置其位置参数，相对绝对均可，在调速方面，直线的速度框中需输入D寄存器，如D2000，根据插补指令类型不同，选择MOVD和MOVF对速度进行赋值。而圆弧速度框中需输入固定的速度K50。

将数据映射到D寄存器：

依次设置添加直线圆弧，并设置其位置参数，可直接在所有速度参数框中输入K值，因为即使使用D寄存器值，映射到D后也会重新建立新D寄存器的速度映射关系，调整原来的D寄存器值无法调速。根据指令框中提示的速度参数D地址，可调整D地址实现调速。注意此时每条线段都具有单独的速度参数地址，根据需要逐个修改。

仅D寄存器控制：

导入函数功能块模板OnlyDMappingF，设置如下。另外，使用函数功能块，如下图，需要在使能POLYLINEF前，接通函数功能块一次，完成D寄存器赋值。

//设置全局速度和加减速时间

ParaAddr = GlobalSpeedF(ParaAddr, 100, 200, 200);

ParaAddr = AddLineF(ParaAddr, 100, 0, 0);

ParaAddr = Add2ArcF_S(ParaAddr, 50, 50, 50, 0, 0, 0, 50, 200, 200);

ParaAddr = AddLineF(ParaAddr, 0, 100, 0);

ParaAddr = Add2ArcF_S(ParaAddr, -50, 50, 50, 0, 0, 0, 50, 200, 200);

ParaAddr = AddLineF(ParaAddr, -100, 0, 0);

ParaAddr = Add2ArcF_S(ParaAddr, -50, -50, 50, 0, 0, 0, 50, 200, 200);

ParaAddr = AddLineF(ParaAddr, 0, -100, 0);

ParaAddr = Add2ArcF_S(ParaAddr, 50, -50, 50, 0, 0, 0, 50, 200, 200);

ParaAddr = AddEndF(ParaAddr); //结束

//用户添加其它程序


直线插补LINEI/LINEF

对应命令 | 注释/说明 | 操作数（寄存器）
LINEI/LINEF | 直线插补指令 | 平面编号； 单位； X轴终点坐标（K/D）； Y轴终点坐标（K/D）； 相对/绝对坐标； 加速时间（K/D）； 减速时间（K/D）； 速度（K/D）

1.指令说明：

1）该指令仅FGM系列PLC有效，其它型PLC该指令无效；

2）FGm_64MT_A高速脉冲输出口为Y0 ~ Y7，Y10~Y11，脉冲频率范围0~500KHz，频率非连续可调；

3）LINEI/LINEF分别为整数参数指令、浮点数参数指令，对应的是以脉冲pls为单位和毫米mm为单位；

4）该指令作用是在指定的平面系统中，完成从当前所在位置直线运行到终点位置；

5）运行长度和加减速时间满足如下关系式的才是合法的（实际应用时尽量满足该关系式，若不满足程序会自动调整）：

0.5 * （加速时间 +减速时间） * 速度 <= 直线长度

当用户设置的参数非常不合理，插补指令会在检测到错误时停止脉冲输出，并在D8176寄存器中提供错误码，用户可根据错误码Debug。当用户设置的参数是可调整不合理时，程序会自动修正参数。

2.指令使用说明：

1） 首先选择平面编号，平面设置请参考“平面系统设置”，若平面系统未启用，则无法正常运行；

2） 选择该指令参数的单位，可以为毫米mm或者脉冲pls，分别对应指令LINEF和LINEI，建议用户使用mm作为单位，参数贴合实际，无需换算，不易出错；

3） X轴终点坐标，Y轴终点坐标是直线运行的终点位置，可输入K/D型参数，使用D寄存器输入参数时，使用MOVD指令还是MOVF指令赋值D寄存器，取决于插补指令是LINEI型还是LINEF型；

4） 相对/绝对坐标。若选择为相对坐标，则设置的终点坐标为以当前点为基础的偏移量。若为绝对坐标，则终点坐标表示相对原点的绝对位置，如相对/绝对示意图；

5） 加速时间，减速时间，可直接设置为常数K，也可设置为D寄存器，初始化时，读取D寄存器中的值作为加减速时间，加减速时间只能使用MOV赋值，其为16位整型，单位为ms。插补指令的插补周期为4ms，所以如果加减速时间太短，脉冲频率跳变大，无法起到加减速效果。插补加减速为非对称S形加减速，加减速段由加减速时长控制，如非对称S形加减速图。

6） 速度代表的是XY轴合成速度，速度参数可设置为K或D，若设置为常数K，则直线速度不可调，如果设置为D寄存器，当D寄存器值变化时，速度也会相应变化，可实现实时调速，在加减速过程中，调整速度参数，速度的变化会在加减速结束后立刻调速。但需要特别注意，使用MOVD还是MOVF赋值速度的D寄存器取决于插补指令的类型是LINEI还是LINEF。当单位设置为脉冲pls时，速度单位为pls/s，使用MOVD赋值速度，反之，使用MOVF。如果平面系统设置的X轴Y轴脉冲当量不相等，则默认以X轴脉冲当量计算其真实速度。当加减速、速度参数不满足上述合法关系式，系统将自动降低速度参数，使其合法，如不合法S形调整图。

LINE指令图

相对/绝对示意图

非对称S形加减速图

不合法S形调整图

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150 (D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156 (D_8157) | Y010
D_8158 (D_8159) | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

4. 由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

5. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

6. 加减速时间不要设置太小，否则无加减速效果；

7. 当单位设置为脉冲pls时，速度单位为pls/s，如果平面系统设置的X轴Y轴脉冲当量不相等，则默认以X轴脉冲当量计算其真实速度；

8. 脉冲正在发送标志位，如M8134仅代表Y0是否正在输出脉冲，如果需要检测直线是否运行，则需并联两轴的发送标志位，参考示例；

9. 目标点坐标不要与当前点坐标重合；

11. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

实例：

从当前位置，运动到X、Y轴各向正方向偏移100mm的终点，“直线运动”开始时置位M500，结束后复位M500。平面系统设置X轴为Y0 ，Y轴为Y1。直线参数设置如“LINE指令图”，梯形图如下。

梯形图：

此处强调：对于运动状态的检测，一定要是对应X轴、Y轴正在发送标志位并联结果的检测。


圆弧插补ARCI/ARCF

对应命令 | 注释/说明 | 操作数（寄存器）
ARCI/ARCF | 圆弧插补指令 | 平面编号； 单位； X轴终点坐标（K/D）； Y轴终点坐标（K/D）； 相对/绝对坐标； 加速时间（K/D）； 减速时间（K/D）； 速度（K/D）； 圆弧类型（两点，三点）； 两点：半径（K/D）， 顺逆时针， 优劣弧； 三点：中间点X坐标（K/D）， 中间点Y坐标（K/D）；

1.指令说明：

1）该指令仅FGM系列PLC有效，其它型PLC该指令无效；

2）FGm_64MT_A高速脉冲输出口为Y0 ~ Y7，Y10~Y11，脉冲频率范围0~500KHz，频率非连续可调；

3）ARCI/ARCF分别为整数参数指令、浮点数参数指令，对应的是以脉冲pls为单位和毫米mm为单位；

3）该指令作用是在指定的平面系统中，完成从当前所在位置按设置参数圆弧运行到终点位置；

4）运行长度和加减速时间满足如下关系式的才是合法的（实际应用时尽量满足该关系式，若不满足程序会自动调整）：

0.5 * （加速时间 +减速时间） * 速度 <= 圆弧弧长

当用户设置的参数非常不合理，插补指令会在检测到错误时停止脉冲输出，并在D8176寄存器中提供错误码，用户可根据错误码Debug。当用户设置的参数是可调整不合理时，程序会自动修正参数。

5）两点圆弧模式时，参数设置时应注意，当前点距离目标点直线长度应小于直径，若不满足该条件，则以该直线距离为直径，重新规划圆弧路径；

6）三点圆弧模式时，参数设置时应注意，当前点、中间点、目标点不能在一条直线上；

7）当圆弧半径较小，速度较大时，如果其满足加减速合法性要求，还需考虑是否会造成过大的弓高误差，速度、半径、弓高误差的关系如图，若弓高误差过大，则系统会降速处理（小圆调速特性），实际使用时，不要出现半径过小的圆弧。

弓高误差

速度、半径、弓高误差关系图

2.指令使用说明：

1） 首先选择平面编号，平面设置请参考“平面系统设置”，若平面系统未启用，则无法正常运行；

2） 指令单位可以为毫米mm或者脉冲pls，分别对应指令ARCF和ARCI，建议用户使用mm作为单位，参数贴合实际，无需换算，不易出错；

3） X轴终点坐标，Y轴终点坐标是圆弧运行的终点位置，可输入数据类型K/D，使用D寄存器输入参数时，使用MOVD指令还是MOVF指令赋值D寄存器，取决于插补指令是ARCI型还是ARCF型；

4） 相对/绝对坐标。若选择为相对坐标，则设置的终点坐标为以当前点为基础的偏移量。若为绝对坐标，则终点坐标表示相对原点的绝对位置，参考直线指令的相对/绝对示意图；

5） 加速时间，减速时间，可直接设置为常数K，也可设置为D寄存器，初始化时，读取D寄存器中的值作为加减速时间，加减速时间只能使用MOV赋值，其为16位整型，单位为ms。插补指令的插补周期为4ms，所以如果加减速时间太短，脉冲频率跳变大，无法起到加减速效果。插补加减速为非对称S形加减速，加减速段分别由加减速时间控制，参考直线指令的非对称S形加减速图。

6） 速度代表的是XY轴合成速度，速度参数可设置为K或D，若设置为常数K，则直线速度不可调，如果设置为D寄存器，当D寄存器值变化时，速度也会相应变化，可实现实时调速，在加减速过程中，调整速度参数，速度的变化会在加减速结束后立刻调速。但需要特别注意，使用MOVD还是MOVF赋值速度的D寄存器取决于插补指令的类型是ARCI还是ARCF。当单位设置为脉冲pls时，速度单位为pls/s，使用MOVD赋值速度，反之，使用MOVF。如果平面系统设置的X轴Y轴脉冲当量不相等，则默认以X轴脉冲当量计算其真实速度。当加减速、速度参数不满足上述合法关系式，系统将自动降低速度参数，使其合法，参考直线指令的不合法S形调整图。

7） 圆弧类型分为两点画圆与三点画圆，两者需要设置的参数不同，选择两点画圆时如两点画圆示意图，以确定半径从当前点运动到目标点的圆弧路径有4条，根据时针顺序，优劣弧，可唯一确定一条圆弧路径。当选择三点画弧时，只需添加中间点坐标即可，三点确定唯一圆弧，但三点不要在一条直线上。

ARCF指令图

两点画圆示意图

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150 (D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156 (D_8157) | Y010
D_8158 (D_8159) | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

4. 由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

5. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

6. 加减速时间不要设置太小，否则无加减速效果；

7. 当单位设置为脉冲pls时，速度单位为pls/s，如果平面系统设置的X轴Y轴脉冲当量不相等，则默认以X轴脉冲当量计算其真实速度；

8. 脉冲正在发送标志位，如M8134仅代表Y0是否正在输出脉冲，如果需要检测直线是否运行，则需并联两轴的发送标志位，参考示例；

9. 两点画圆时，当前点与目标点间的直线距离应小于直径；

10. 三点画圆时，三点不要在一条直线上；

11. 当前点坐标不要与目标点坐标重合；

12. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

实例：

从当前位置，运动到X轴正方向偏移100mm的终点，半径为50mm，顺时针，劣弧。“圆弧运动”开始时置位M500，结束后复位M500。平面系统设置X轴为Y0 ，Y轴为Y1，梯形图如下。

梯形图：

此处强调：对于运动状态的检测，一定要是对应X轴、Y轴正在发送标志位并联结果的检测。


图形导入（批量导入）指令BLOCK

对应命令 | 注释/说明 | 操作数（寄存器）
BLOCK | 图形导入指令 | 图形名称； 实现/虚线控制位（Y/M）

1. 指令说明：

1）该指令仅FGM系列PLC有效，其它型PLC该指令无效；

2）FGm_64MT_A高速脉冲输出口为Y0 ~ Y7，Y10~Y11，脉冲频率范围0~500KHz；

3）该指令作用是在指定的平面系统中，完成导入的图形绘制；

4）目前导入图形仅支持AutoCAD中直线和圆弧指令构成的图形，且仅支持另存的dxf文件导入。

指令使用说明：

1） 首先在AutoCAD软件中，使用直线圆弧指令绘制设计图形，需要注意的是，需要确定平面系统的大小，绘制的图形不可超过平面系统边界。导入图形的绘制方式均为绝对坐标绘制，所以平面系统的原点需与AutoCAD中的世界坐标系原点重合，AutoCAD中的尺寸均为mm单位，绘制结束后确认图形中所有线段均为需要绘制的图形，另存为为2004dxf；

2） 构建平面系统；

3） 图形导入点击路径为：主菜单 –> 脉冲配置 –> 图形导入；

4） 完成导入后，选择图形所在的平面系统，并设置速度参数；

5） 梯形图中新建BLOCK指令，选择需要绘制的图形，并填入控制位，在绘制过程中，有些图形是不能够一笔完成的，所以图元间需要过渡直线，而这种过渡直线是不需要绘制的，称为虚线，需要绘制的称为实线，标志位用于区分实线和虚线，当为虚线时标志位为0，为实线时标志位为1；

图形导入

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下M软元件
D_8148(D_8149) | Y004
D_8150 (D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156 (D_8157) | Y010
D_8158 (D_8159) | Y011

当前脉冲段(只读)：

寄存器 | 脉冲输出Yn
D_8124 | Y000
D_8125 | Y001
D_8126 | Y002
D_8127 | Y003
对于FGM系列PLC 还具备以下M软元件
D_8128 | Y004
D_8129 | Y005
D_8130 | Y006
D_8131 | Y007
D_8132 | Y010
D_8133 | Y011

出错脉冲段位置，0表示无错误(只读)：

寄存器 | 脉冲输出Yn
D_8108 | Y000
D_8109 | Y001
D_8110 | Y002
D_8111 | Y003
对于FGM系列PLC 还具备以下M软元件
D_8112 | Y004
D_8113 | Y005
D_8114 | Y006
D_8115 | Y007
D_8116 | Y010
D_8117 | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 脉冲累积计数寄存器（D8140~D8146）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

4. 由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8146）根据方向计数；

5. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8146）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

6. 加减速时间不要设置太小，否则无加减速效果；

7. 脉冲正在发送标志位，如M8134仅代表Y0是否正在输出脉冲，如果需要检测直线是否运行，则需并联两轴的发送标志位，参考示例；

8. 速度的数据类型一定是浮点数，与单位设置无关，所以使用D寄存器赋值速度进行实时调速时，一定要使用MOVF指令赋值速度；

9. 绘制图形时若速度参数不合法，会自动调速，速度根据图形形状有所降低；

10. 导入图形数据大小不要过大，否则无法下载；

11. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

实例：

绘制如下图形，控制位为Y6。

梯形图：


HMI绘图导入 HMIBLOCK

对应命令 | 注释/说明 | 操作数
HMIBLCOK | HMI绘图导入指令 | 参数起始地址

1.指令说明：

1） 仅FGm系列PLC具有该功能，其它型PLC该指令无效；

2） 其高速脉冲输出口为Y0 ~ Y7，Y10~Y11，脉冲频率范围0~500KHz；

3） 该指令作用是在指定的平面系统中，完成导入的图形绘制；

4） 本指令必须联合Samkoon的SK6.0HMI一起使用；

5） 目前导入图形仅支持AutoCAD中直线和圆弧指令构成的图形，且仅支持另存的dxf文件导入。

2.使用说明：

1） 首先在AutoCAD软件中，使用直线圆弧指令绘制设计图形，需要注意的是，需要确定平面系统的大小，绘制的图形不可超过平面系统边界。导入图形的绘制方式均为绝对坐标绘制，所以平面系统的原点需与AutoCAD中的世界坐标系原点重合，AutoCAD中的尺寸均为mm单位，绘制结束后确认图形中所有线段均为需要绘制的图形，另存为为2004dxf；

2） 进行图形转换，点击路径为：主菜单 –> 脉冲配置 –> 图形转换，选择上一步中另存为的.dxf文件，生成新的.ssd文件格式，将.ssd文件考入U盘，文件最好在跟目录，在子目录中路径必须为英文路径。转换后的.ssd单个文件大小超过500KB；

3） 在SK6.0HMI中新增‘功能按钮’，选择功能为‘Slave devices IP config’；

4） 将U盘插入HMI的U盘插孔，按下上述功能按钮，进入图形预览界面，如下图。

1） 若没有检测到图形，可点击‘刷新列表’按钮，左侧列表中选择需要绘制的图形，点击‘下载至PLC’，等待进度条下载完成，此时图形已经完成了从HMI下载至PLC；

2） PLC中梯形图如下，其中D6000设置参数为平面系统编号，图形会在对应的平面系统中绘图，D6001（D6002）中为绘图速度单位mm/s，注意CAD图形中坐标数据均以mm为单位是浮点数，所以速度也为浮点数，必须使用MOVF对速度进行赋值，D6003为加速时间，D6004为减速时间，单位ms，D6005为控制位的类型Y或M，写0则为Y，写1则为M，D6006为控制位偏移，若D6005写入0，D6006写入10，则表示Y10代表控制位状态。控制位含义与BLOCK指令中的线条状态相同，代表实现或虚线，实现时控制位ON，虚线控制位OFF；

3） 完成上述步骤后，使能HMIBLOCK指令，指令便可开始绘图；

4） 若需实现轨迹的实时显示，需要在PLC的‘平面系统设置’中，勾选‘启动HMI实时显示’并输入数据地址，而HMI中需添加‘XY趋势图’控件，该控件的‘读取地址’必须与PLC‘平面系统设置’中数据地址设置相同，该控件的其他设置请参考HMI帮助文档，如下图是HMI实时显示PLC绘图轨迹过程；

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 脉冲累积计数寄存器（D8140~D8146）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

4. 由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8146）根据方向计数；

5. 高速脉冲输出时，脉冲累积计数寄存器（D8140~D8146）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

6. 加减速时间不要设置太小，否则无加减速效果；

7. 脉冲正在发送标志位，如M8134仅代表Y0是否正在输出脉冲，如果需要检测直线是否运行，则需并联两轴的发送标志位；

8. HMIBLOCK指令的速度必须使用MOVF指令赋值；

9. 单个.ssd文件大小不要超过500K；

10. HMIBLOCK指令不能多个指令同时使用，同一时刻只能使用一个HMIBLOCK指令；

11. 使用HMI下载一个图型时，会自动覆盖上一个下载的图形。


PAUSE平面暂停

1.功能说明：

1）该功能仅FGM系列PLC有效，其它型PLC该功能无效；

2）该指令仅针对POLYLINE和BLOCK指令使用；

3）该功能是在POLYLINE或BLOCK指令正在绘图过程中，使能PAUSE会暂停对应平面系统的POLYLINE和BLOCK指令，失能PAUSE后会继续绘图，暂停前后不影响绘图轨迹；

2.使用说明：

1） 首先设置POLYLINEI/POLYLINEF指令或BLOCK指令的相关参数；

2） 设置暂停指令中的平面系统与POLYLINE和BLOCK中的平面系统相同；

3） 使能POLYLINE和BLOCK指令，指令按照设置绘制图形，当需要暂停时，使能PAUSE指令，图形绘制会减速停止，减速时间与插补指令设置的减速时间相同。当需要继续绘制时，失能PAUSE指令即可，暂停的过程不会影响绘制的轨迹，依然按照原来的设置轨迹绘制；

PAUSE指令使用实例

注意：

1. 暂停有时并不是立刻响应的，POLYLINE和BLOCK绘图本身在加减速过程中，不进行暂停处理，但一达到稳定速度就会暂停（减速停）处理；

2. 在已经暂停后，不要失能POLYLINE或BLOCK指令，否则再次使能插补指令时，并非在暂停处开始绘制，而是按照插补指令设置重新绘制；

3. 暂停后插补指令仍然会占用脉冲和方向端口，暂停后的停止状态是无法移动的，也是不允许移动的；


任意点回归原点ZRNR

对应命令 | 注释/说明 | 操作数（寄存器）
ZRNR（32位） | 任意点回归原点 | 回归速度（K/H/D） 爬行速度（K/H/D） 输出脉冲（Y） 方向输出口（Y）

指令说明：

启用输入端接为“接通”时，任意点回零指令ZRNR会根据此时工作台所处的位置以及所选择的默认回零方向与回零模式，运行到指定的零点信号范围特定一侧后停止发送脉冲。启用输入端接为“断开”时，脉冲发送停止。

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于多脉冲型PLC FGm_32MT_A FGm_64MT_A 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于多脉冲型PLC FGm_32MT_A FGm_64MT_A 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150 (D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156 (D_8157) | Y010
D_8158 (D_8159) | Y011

原点回归加减速时间（读写）：

寄存器 | 脉冲输出Yn
D_8076 | Y000
D_8077 | Y001
D_8078 | Y002
D_8079 | Y003
对于多脉冲型PLC FGm_32MT_A FGm_64MT_A 还具备以下寄存器
D_8080 | Y004
D_8081 | Y005
D_8082 | Y006
D_8083 | Y007
D_8084 | Y010
D_8085 | Y011

指令使用说明：如下图所示。

1. 爬行速度与回归速度参数类型可为D/K/H，均为32位，两个速度同时输入负值，等同于改变默认回零方向，但注意这会改变零点信号位置；

2. 设定脉冲输出端口Y与脉冲方向输出端口Y；

3. 原点信号输入端与正负极限信号输入端接相应的原点传感器、正负极限传感器的信号输出（信号输入端口可选择X端口或M寄存器），其中正负极限以及z相信号是可选项；

4. 原点信号、正负极限信号的极性根据实际使用的传感器信号极性（常开或常闭）来选择；

5. 默认回零方向决定了大部分情况下（位于极限信号内时除外）工作台从初始位置开始回零时的运动方向；

6. 回零模式分为近点信号和原点上升沿两种模式，两种模式回到零点的路径和具体位置不同（具体见回零路径介绍）；

7. 回零模式和默认的回零方向共同决定了零点信号的位置（处于零点信号范围的哪一侧）；

8. 使用ZRNR指令之前需要依次确认以下几个方面（以下具体做法参考注意事项）：

1) 确认正负方向以及正负极限的位置；

2) 根据实际情况确认默认回零方向；

3) 选择合适的回零模式；

4) 根据所选的默认回零方向以及回零模式，确定零点信号的位置；

注意：

1. 使用该指令完成回原点动作后，对应输出口的脉冲累积寄存器（D8140~D8147）会自动清零，作为原点；

2. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作；

3. 各个传感器接入的X端口滤波模式应设为不启用，否则终点位置会引起较大的偏差；

4．正方向、正极限：脉冲方向口为高电平时工作台运动（电机旋转）方向为正方向，相应的极限位置为正极限；反之为负方向，负极限；

5. 回零过程中脉冲方向口输出由PLC根据工作台所处的位置自动控制，无需用户控制（确保脉冲方向口不被其他指令所影响）；

6. 若默认回零方向选择正方向，大部分情况下（初始位置位于极限信号内除外）开始回零时脉冲方向口输出高，工作台正向运动；若选择负方向，情况完全相反。用户可以根据实际情况选择合适的默认回零方向（例如考虑工作台回零开始时初始位置一般所处的区域）；

7. 如下图所示，用户在使用前需要明确零点的位置：

1）近点信号模式：若默认回零方向选择正方向，最终零点位置为原点传感器信号范围中靠近正极限的一侧边沿；若选择负方向，最终零点位置为原点传感器信号范围中靠近负极限的一侧边沿。

2）原点上升沿模式：若默认回零方向选择正方向，最终零点位置为原点传感器信号范围中靠近负极限的一侧边沿；若选择负方向，最终零点位置为原点传感器信号范围中靠近正极限的一侧边沿。

近点信号模式下的最终零点位置：

原点上升沿模式下的最终零点位置：

8. 正负极限信号与Z信号均为可选项，如果不选择正负极限信号或其中一个极限信号，则不能实现任意点回零（下述回零路径中涉及到未勾选极限信号的情况均不能实现，其余未涉及到该未勾选信号的路径依旧可以实现）。Z相信号用户可以根据需要选择（伺服上的z相脉冲可接入到PLC上，但注意一定要是24V的信号，如果不是要经过转换，否则PLC无法识别）。

9. 若工作台在回零过程中进入正负极限后停止运动且报错：原点信号丢失，请检查原点传感器信号是否失效。确认排除故障后，重新使能回零指令仍然可以回零。若工作台在回零过程中停止并报错：加减速距离过长，则表明原点上升沿模式减速到0的过程中触碰到了极限信号或者工作台完全超出了极限信号，此时请检查工作台位置并且降低加减速时间。

10. 若工作台在原点传感器内无法减速到爬行速度，请适当加宽原点传感器信号范围或者减小加减速时间，使得工作台能够减速到爬行速度。

11. 为确保安全，请保证正负极限有足够的宽度能够使工作台在其信号内部减速到0，否则超出工作台极限会引起上述加减速距离过长的报错。

12. 为确保安全，建议正负极限信号极性选择为常闭（防止因正负极限失效引起事故）。

指令的有效操作数：

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
回归速度 | 双整数 | K/H/D | 回归速度设定
爬行速度 | 双整数 | K/H/D | 爬行速度设定
输出脉冲Y | BOOL | Y | 指定的脉冲输出口
输出方向Y | BOOL | Y | 指定的脉冲方向输出口
原点信号输入端 | BOOL | X/M | 指定的原点输入信号
正极限信号输入端 | BOOL | X/M | 指定的正极限信号输入端
负极限信号输入端 | BOOL | X/M | 指定的负极限信号输入端
Z信号输入端 | BOOL | X/M | 指定的Z相信号输入端

实例：

指令表：

Network 000

LD M20

MOVD K10000 D0 //爬行速度，脉冲频率10000Hz

MOVD K5000 D2 //回归速度，脉冲频率5000Hz

MOV K200 D8076 //减速时间200ms

ZRNR D0 D2 Y0 Y2 //当M20为‘1’时，根据初始位置和默认回零方向，自动选择合适的回零模式进行回零。

梯形图：

脉冲参数表：

回零示意图：

以默认回零方向为负方向为例，说明工作台处于正负极限间的任意位置时的两种不同模式下的回零路径：

1) 初始位置位于正极限和原点信号之间

a) 近点信号模式

如上图所示：

①工作台负方向加速到爬行速度；

②进入原点信号后开始负方向减速达到回归速度；

③到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

b) 原点上升沿模式

如上图所示：

①工作台负方向加速到爬行速度；

②进入原点信号后开始负方向减速到0；

③反向加速到回归速度；

④到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

2) 初始位置位于负极限信号内

a) 近点信号模式

如上图所示：

①工作台负方向加速到爬行速度；

②进入原点信号后开始负方向减速达到回归速度；

③到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

b) 原点上升沿模式

如上图所示：

①工作台负方向加速到爬行速度；

②进入原点信号后开始负方向减速到0；

③反向加速到回归速度；

④到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

3) 初始位置位于原点信号内部

a) 近点信号模式

如上图所示：

①工作台负方向加速到回归速度；

②到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

b) 原点上升沿模式

如上图所示：

①工作台正方向加速到回归速度；

②到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

4) 初始位置位于原点信号与负极限之间

a) 近点信号模式

如上图所示：

①工作台负方向加速到爬行速度；

②当进入负极限信号时立即减速到0；

③减速到0后立即开始正方向加速到爬行速度；

④当离开原点信号范围时，立即开始正方向减速到0；

⑤减速到0后立即开始负方向加速到爬行速度；

⑥当进入原点信号范围时，立即开始负方向减速到回归速度；

⑦到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

b) 原点上升沿模式

如上图所示：

①工作台负方向加速到爬行速度；

②当进入负极限信号时立即减速到0；

③减速到0后立即开始正方向加速到爬行速度；

④当进入原点信号范围时，立即开始正方向减速到回归速度；

⑤到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

5) 初始位置位于负极限信号内

a) 近点信号模式

如上图所示：

①工作台正方向加速到爬行速度；

②当离开原点信号范围时，立即开始正方向减速到0；

③减速到0后立即开始负方向加速到爬行速度；

④当进入原点信号范围时，立即开始负方向减速到回归速度；

⑤到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；

b) 原点上升沿模式

如上图所示：

①工作台正方向加速到爬行速度；

②当进入原点信号范围时，立即开始正方向减速到爬行速度；

③到达零点信号侧时停止，如果选择了Z相信号，则在Z相信号处停止；；

回零误差分析：

1) 到达最终零点位置时的运行速度（速度越小，偏差越小）；

2) PLC扫描周期的长短（扫描周期越短，偏差越小）；

3) 运动部分的运动惯量大小（运动惯量越小，偏差越小）；


点动指令JOG

对应命令 | 注释/说明 | 操作数（寄存器）
JOG (32位) | 点动指令 | 输出频率(K/H/D) 加减速时间(K/H/D) 输出脉冲Y 输出方向Y

1. 指令说明

1）点动JOG指令是可以设置频率和加减速时间的带方向点动脉冲指令。启用输入端为“接通”时，脉冲从1000HZ匀加速到设置频率匀速输出，输入端“断开”时，减速从设置频率减速到0。当输入端断开时，脉冲输出并不是立即停止有一个减速过程。

2）JOG指令可输出频率范围为0Hz~200KHz。对于FGM系列PLC其最大脉冲频率为500KHz。

3）FGs提供了高速脉冲输出口，16/32点晶体管型的PLC，Y000~Y001为高速脉冲输出口；64点晶体管型的PLC，Y000~Y003为高速脉冲输出口；继电器型的PLC不具有高速脉冲功能，输出端口的最大输出频率由继电器的吸合时间决定。对于FGM系列PLC其高速脉冲输出口为Y0~Y7，Y10~Y11。

4）指令为对称（加减速时间单独设置）的梯形、S形位置控制，当特殊功能寄存器M8069为ON时所有的脉冲指令的加减速为S形，为OFF时则为梯形。

5）特殊功能寄存器M8068为方向极性控制，默认脉冲方向输出口为ON时表示正方向，OFF时表示负方向。若设置M8068为ON则所有脉冲指令的方向输出极性发生反转，脉冲方向输出为OFF表示正方向，为ON表示负方向。在脉冲正在发送过程中不能切换M8068的ON、OFF状态。

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM型PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM型PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3. 对于脉冲输出Y0，寄存器D8140（D8141）中累计其脉冲个数，D8141存储高16位，D8140存储低16位；

4.  脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

5.  由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

6.  高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

7. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
输出频率 | 双整数 | K/H/D | 输出频率的设定值
输出脉冲数 | 双整数 | K/H/D | 输出脉冲数的设定值
加速时间 | 整数 | K/H/D | 加速时间设定值
减速时间 | 整数 | K/H/D | 减速时间设定值
输出脉冲Y | BOOL | Y | 指定的脉冲输出口
输出方向Y | BOOL | Y | 指定的脉冲方向输出口

3. 实例

指令表：

Network 000

LD      M0

JOG    K100000   K100   Y0   Y4  // 当M0被置位JOG开始工作

梯形图：


跟随FOLLOW

对应命令 | 注释/说明 | 操作数（寄存器）
FOLLOW | 跟随指令 | 参数首地址 脉冲发送口 脉冲方向口

1. 指令说明

1） 该指令是脉冲发送指令，其脉冲发送频率根据跟随数值变化的快慢决定，脉冲发送个数根据数值变化的最终大小决定；

2）FGs系列晶体管型PLC高速脉冲输出口为Y0~Y1，脉冲频率范围为0~150KHz。FGm系列PLC高速脉冲口为Y0 ~ Y7，Y10~Y11，脉冲频率范围0~500KHz，频率非连续可调；

2. 使用说明

1） 举例如下图，分别设置FOLLOW指令的参数首地址为D0，脉冲口为Y0，方向口为Y12；

2） D0（D1）中为要跟随的目标值，此实例中要跟随的目标值为CV235的值，实际也可以为其他值。注意该值得变化速率对应脉冲发送频率，请注意频率不要超过最大频率允许范围。另外，当FOLLOW指令使能前，该目标值中有值，则在该值的基础上进行跟随。即跟随是相对的，使能前的初值不影响跟随。

3） D2参数为采样时间单位ms，也可认为是跟随刚度，当采样时间较短时，动作严格跟随目标值的变化而变化延时较短，跟随刚度大。当采样时间较长时，动作延时长，且在采样时间内的跟随值的正负变化会相互抵消，实际动作并非严格跟随。建议设置值为5ms~100ms之间。

4） D3参数为前馈补偿比例，设置值只能在0~100之间。由于采样时间的滞后，实际运动滞后越一个采样时间，若需要在运动过程中保持位置准确性可进行适当的前馈补偿，若对过程中的位置准确性要求不高，建议设置为0；

5） D4乘系数，跟随值的变化量乘上该系数，对变化值进行方大。D5除系数，跟随值的变化量除上该系数，对变化值进行缩小。乘、除后的最终结果将作为脉冲的发送量。

脉冲正在输出标志(只读)：

寄存器 | 脉冲输出Yn
M_8134 | Y000
M_8135 | Y001
M_8136 | Y002
M_8137 | Y003
对于FGM系列PLC 还具备以下M软元件
M_8138 | Y004
M_8139 | Y005
M_8140 | Y006
M_8141 | Y007
M_8142 | Y010
M_8143 | Y011

脉冲累积计数(读写)：

寄存器 | 脉冲输出Yn
D_8140(D_8141) | Y000
D_8142(D_8143) | Y001
D_8144(D_8145) | Y002
D_8146(D_8147) | Y003
对于FGM系列PLC 还具备以下寄存器
D_8148(D_8149) | Y004
D_8150(D_8151) | Y005
D_8152(D_8153) | Y006
D_8154(D_8155) | Y007
D_8156(D_8157) | Y010
D_8158(D_8159) | Y011

注意：

1. 对于高速脉冲输出，它是针对外部高速器件的，假如要对脉冲进行计数，只能使用高速脉冲输入计数器，不能使用内部计数器，也不能使用Y边沿变化进行计数，当作为高速输出时，不能作为普通输出口用；

2. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

3.  脉冲累积计数寄存器（D8140~D8158）是重要寄存器，可读写，当写入新值时，计数会在新值基础上进行加减；

4.  由于本指令脉冲输出带方向，所以脉冲累积计数寄存器（D8140~D8158）根据方向计数；

5.  高速脉冲输出时，脉冲累积计数寄存器（D8140~D8158）内的值是不连续的、时刻变化的，用于判断时，最好大小比较，不要使用等于判断；

6. 当脉冲指令使用到输出口Y时，该Y口不能用做它用，即普通指令无法再对该Y口进行ON、OFF操作；

7. 在跟随过程中跟随目标值不要发生剧烈跳变，否则会脉冲频率会超出最高频率限制。

3. 实例

注意SetFOLLOWParams这个函数，这是专门用来设置FOLLOW指令参数的函数功能块函数，通过以下方式来创建。

1）在梯形图程序中，单击左键选中要添加CALLM指令的位置。

2）在【工程资源管理器】窗口中，选中【指令】->【脉冲输出】->【FOLLOW 跟随指令】，单击右键显示右键菜单，选择【创建参数函数】。

3）在弹出的设置框内输入新建的函数名称和所在的函数功能块（可以添加新的函数功能块），并点击确定。这时会在梯形图程序选定位置处加入一个新的CALL指令。

4）双击CALLM指令处，弹出的参数设置窗口可以设置FOLLOW指令要带入的参数。这里把跟随目标设为CV235，采样时间设为20ms，前缀补偿比例为0，乘系数和除系数均为1。点击【确定】按钮，即可完成创建。


高速计数指令

内容如下：

1、 高速脉冲计数HCNT


高速脉冲计数HCNT

对应命令 | 注释/说明 | 操作数（寄存器）
HCNT | 高速脉冲输入计数 | CV，K/H/D

1. 指令说明

 | 高速计数器地址编号 | 高速计数器输入端接线
 |  | X000 | X001 | X002 | X003 | X004 | X005 | X006 | X007
无启动/复位的单相计数器 | C235 | U |  |  |  |  |  |  |
 | C236 |  | U |  |  |  |  |  |
 | C237 | 保留 |  |  |  |  |  |  |
 | C238 | 保留 |  |  |  |  |  |  |
 | C239 | 保留 |  |  |  |  |  |  |
 | C240 | 保留 |  |  |  |  |  |  |
指定启动/复位的单相计数器 | C241 | U | R |  |  |  |  |  |
 | C242 | 保留 |  |  |  |  |  |  |
 | C243 | 保留 |  |  |  |  |  |  |
 | C244 | U | R |  |  |  |  | S |
 | C245 | 保留 |  |  |  |  |  |  |
单相双计数器 | C246 | U | D |  |  |  |  |  |
 | C247 | U | D | R |  |  |  |  |
 | C248 | 保留 |  |  |  |  |  |  |
 | C249 | U | D | R |  |  |  | S |
 | C250 | 保留 |  |  |  |  |  |  |
A/B相计数器 | C251 | A | B |  |  |  |  |  |
 | C252 | A | B | R |  |  |  |  |
 | C253 | 保留 |  |  |  |  |  |  |
 | C254 | A | B | R |  |  |  | S |
 | C255 | 保留 |  |  |  |  |  |  |

如上表所示，高速计数器编号从C235到C255，脉冲输入口从X000到X0007；其中，U表示向上计数，D表示向下计数，R表示复位清零计数器（当R对应的X脚，出现上升沿时，计数器会被清零），S表示启动计数器（带有S端的计数器，需要在S对应的X脚，给予上升沿，才能启动相应的计数器），AB表示AB相。

当某一输入口（例如：X000）被某一高速计数器（例如：C235）使用，那么梯形图中不可以出现使用该输入口的其他高速计数器（例如：C241，C244，C246等），否则高速计数器将不能正常工作。

计数范围：-2,147,483,648 ~ +2,147,483,647；当计数值超出此范围时，会产生上溢或下溢现象。

注意：

1. 当使用高速计数输入或中断输入时，建议相应输入端口的线缆采用双绞屏蔽线，并将屏蔽层接地(同端子连接或连接信号地)，以提高抗干扰性；

2. 当使用了该类计数器后，这些端子不能再同时作为其他计数器的输入用，也不能作为普通输入方式使用；

3. 晶体管的OFF时间具有在轻负载时会延长的特性。所以请在需要响应性时设计成让负载在较轻时加负载电阻，增加负载电流；

4. A/B相计数的倍频设置要在指令初始化之前才有效。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
C | 整数/双整数 | CV | 选定的计数寄存器
SV | 整数/双整数 | K/H/D | 预设计数值

3. 实例1.无启动/复位的单相计数器

指令表：

Network 000

LD M8035

OUT Y000

Network 001

LD M0

HCNT CV235 K1000 //当M0为‘1’，M8035为‘0’时，CV235对X000的输入脉冲进行正向计数，当计数达到1000个时，将置位C235

Network 002

LD C235

OUT Y001

Network 003

LDP M1

RST C235 K1 //当M1上升沿来临时，清零C235和CV235

梯形图：

4. 实例2.指定启动/复位的单相计数器

指令表：

Network 000

LD M0

HCNT CV244 K1000 //当M0为‘1’时，当X006上升沿来临时启动CV244，之后CV244对X000的输入脉冲进行正向计数（M8044为0时），当计数达到1000个时，将置位C244

//若M0变为‘0’后，再变为‘1’时，需用X006的上升沿再次启动计数器

Network 001

LD C244

OUT Y001

Network 002

LDP M1

RST C244 K1 //当M1上升沿来临时，清零C244和CV244，也可以通过给X001上升沿，来完成此功能

梯形图：

5. 实例3.单相双计数器

指令表：

Network 000

LD M0

HCNT CV249 K1000 //当M0为‘1’时，当X006上升沿来临时启动CV249，之后CV249 对X000的输入脉冲进行正向计数，对X001的输入脉冲进行负向计数，当计数达到1000个时，将置位C249

//若M0变为‘0’后，再变为‘1’时，需用X006的上升沿再次启动计数器

Network 001

LD C249

OUT Y001

Network 002

LDP M1

RST C249 K1 //当M1上升沿来临时，清零C249和CV249，也可以通过给X002上升沿，来完成此功能

梯形图：

6. AB相计数器

AB相计数器分为两种计数模式，通过M8051~M8055来控制AB相计数器C251~C255倍频模式，当相应的M的为‘0’时，为一倍频模式。为‘1’时，为四倍频模式，倍频的设置要在计数器初始化之前，如下图：

一倍频模式：

四倍频模式：

指令表：

Network 000

LD M0

HCNT CV254 K1000 //当M0为‘1’时，当X006上升沿来临时启动CV254，之后CV254对输入X000和X001的AB相脉冲进行计数，当计数达到1000个时，将置位C254

//若M0变为‘0’后，再变为‘1’时，需用X006的上升沿再次启动计数器

Network 001

LD C254

OUT Y001

Network 002

LDP M1

RST C254 K1 //当M1上升沿来临时，清零C254和CV254，也可以通过给X002上升沿，来完成此功能

梯形图：


闭环控制系统PID

对应命令 | 注释/说明 | 操作数（寄存器）
PID | 闭环控制 | PID回路(K) 模式(K0-手动模式 K1-模糊PID) 过程变量（D） 输入（D/AI） 输出（Y/M/D/AO） 目标值（D/K/H/LW）

FGs能够进行PID控制，支持模糊PID和手动PID，同时支持 PID自整定。最多支持10路PID控制(其中温控路数为8路)

PID是闭环控制系统的比例－积分－微分控制算法。

PID控制器根据设定值（给定）与被控对象的实际值（反馈）的差值，按照PID算法计算出控制器的输出量，控制执行机构去影响被控对象的变化。

PID控制是负反馈闭环控制，能够抑制系统闭环内的各种因素所引起的扰动，使反馈跟随给定变化。

根据具体项目的控制要求，在实际应用中有可能用到其中的一部分，比如常用的是PI（比例－积分）控制，这时没有微分控制部分。

1. 指令说明

FGS的PID功能是通过PID指令函数功能块实现。通过定时（按照采样时间）执行PID功能块，按照PID运算规律，根据当时的给定、反馈、比例－积分－微分数据，计算出控制量。

PID功能块通过一个PID回路表交换数据，这个表是在D数据存储区中的开辟，长度为17字节。因此每个PID功能块在调用时需要指定5点：PID控制回路号，控制回路表的起始地址（以D表示），PID设定值,PID输出(此地址与回路表输出类型相关,类型为0代表输出为位元件，1代表字元件)，以及PID自整定采样点数设置。

图1.1

图1.2

2.PID各个参数解释

回路号:PID功能块总共支持10个PID回路(其中温控支持8路)

过程变量：

比例参数KP：控制器的输出与输入偏差值成比例关系。系统一旦出现偏差，比例调节立即产生调节作用以减少偏差。特点：过程简单快速、比例作用大，可以加快调节，减小误差；但是使系统稳定性下降，造成不稳定，有余差。数据类型为32位浮点数。

积分时间TI(ms)：积分环节主要是用来消除静差，所谓静差，就是系统稳定后输出值和设定值之间的差值，积分环节实际上就是偏差累计的过程，把累计的误差加到原有系统上以抵消系统造成的静差。数据类型为32位浮点数

微分时间TD(ms)：微分信号则反应了偏差信号的变化规律，或者说是变化趋势，根据偏差信号的变化趋势来进行超前调节，从而增加了系统的快速性。数据类型为32位浮点数

PID控制死区：在PID产生控制作用时,当误差小于死区值时,PID将停止计算,维持前一状态输出，数据类型为32位浮点数。

采样时间(ms)：此时间为数据输入和PID输出刷新时间,需要根据系统不同设置不同值,不能小于扫描周期，数据类型为32位浮点数。

给定值底限/给定值高限：PID输出限幅于此区间。

方向：方向为1表示PID正向输出(加热),为0则表示反向输出。

自整定状态：0表示整定完成,1表示正在整定,2表示整定失败。

整定采样点数：当采用PID自整定(即自整定状态为1),此值代表PID在设定点数内未完成整定则判失败(若设置为K30,则代表若在30个采样周期结束未完成PID自整定则失败,自整定状态位置2)

输出量：当输出类型为0时，此值表示位元件开启时间,输出类型为1此值无效。

PID输入：采样值存放地址

PID输出：当此地址为位元件时(确保输出类型为0)，PID控制量为此元件正脉冲脉宽，当此地址为字元件时，PID计算结果输出于此

PID设定值:设定PID最终目标值

3.PID模式

GC系列PID分为手动模式和模糊PID,用户可根据不同系统采用不同模式PID

（1）手动PID

根据用户输入参数执行PID运算输出，也可以先采用自整定完成PID参数设置

（2）PID自整定

先决条件

（1） 进行自整定的回路必须处于自动模式(自整定状态为1)

（2） PID控制量能使系统在设定值附近产生振荡

（3） 在进行自整定之前，系统需要确定以下几个参数(采样时间，给定值高低限，PID方向，整定状态置1，输出类型，设定值)

（4） 如果在自整定期间(整定状态为1)，系统在N(N=自整定采样点数)个采样周期内没有在设定值附近产生振荡，则整定状态置2，表示整定失败

自整定过程

自整定在整定状态位为1且PID指令使能时开始执行。系统首先会比较设定值和测量值大小，当测量值大于设定值时,PID将负向输出，产生第一个零相交事件，当测量值小于设定值,PID正向输出，再次产生一个零相交事件，在完成10次零相交事件后，整个PID整定序列采样完成，系统将会自动更新PID参数,从而系统开始PID控制，PID整定状态将会清0，表示整定完成。自整定过程变量的峰--峰值和零相交事件的产生速度都与控制过程的动态特性直接相关。

下图为PID自整定过程，系统首先会捕获10次零相交事件，10次零相交事件满足PID整定序列则输出PID参数从而转为PID控制

图1.3

下图为PID控制过程,GC系列PID指令加入了抗积分饱和，加快了系统反应速度

图1.4

PID自整定失败的原因

（1） 系统无法产生10次零相交事件,比如加热系统中加热器功率不足无法升温或者系统无法降温等

（2） 输入信号即测量值采样紊乱，系统无法获取整定序列

（3） 参数设置比如采样时间过长过短，高低限阈值不合理，方向，自整定状态设置错误以及整定采样次数过小从而失败


C语言程序类型

1. 整型量

整型量包括整型常量、整型变量。整型常量就是整常数。在Ｃ语言中，使用的整常数有八进制、十六进制和十进制三种。

2. 整型常量

  1.八进制整常数八进制整常数必须以0开头，即以0作为八进制数的前缀。数码取值为0～7。八进制数通常是无符号数。

以下各数是合法的八进制数：

015(十进制为13)　0101(十进制为65)　0177777(十进制为65535)

以下各数不是合法的八进制数：

256(无前缀0) 03A2(包含了非八进制数码)　-0127(出现了负号)

  2.十六进制整常数的前缀为0X或0x。其数码取值为0~9，A~F或a~f。

以下各数是合法的十六进制整常数：

0X2A(十进制为42)　　0XA0 (十进制为160)　　0XFFFF (十进制为65535)

以下各数不是合法的十六进制整常数：

5A (无前缀0X)　　0X3H (含有非十六进制数码)

3.十进制整常数没有前缀。其数码为0～9。

以下各数是合法的十进制整常数：

237 -568 65535 1627

以下各数不是合法的十进制整常数：

023 (不能有前导0)　23D (含有非十进制数码)。

在程序中是根据前缀来区分各种进制数的。因此在书写常数时不要把前缀弄错造成结果不正确。

4.整型常数的后缀在16位字长的机器上，基本整型的长度也为16位，因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0～65535，有符号数为-32768～+32767。八进制无符号数的表示范围为0～0177777。十六进制无符号数的表示范围为0X0～0XFFFF或0x0～0xFFFF。如果使用的数超过了上述范围，就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。例如：

十进制长整常数 158L (十进制为158) 358000L (十进制为-358000)

八进制长整常数 012L (十进制为10) 077L (十进制为63)　0200000L (十进制为65536)。

十六进制长整常数 0X15L (十进制为21) 0XA5L (十进制为165)　0X10000L (十进制为65536)。

   长整数158L和基本整常数158 在数值上并无区别。但对158L，因为是长整型量，Ｃ编译系统将为它分配4个字节存储空间。而对158，因为是基本整型，只分配2 个字节的存储空间。因此在运算和输出格式上要予以注意，避免出错。无符号数也可用后缀表示，整型常数的无符号数的后缀为“U”或“u”。例如： 358u,0x38Au,235Lu 均为无符号数。前缀，后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5，其十进制为165。

3. 整型变量

整型变量可分为以下几类：

1.基本型，类型说明符为int，在内存中占4个字节，其取值为基本整常数。

2.短整量，类型说明符为short。在内存中占2个字节，其取值为短整常数。

3.长整型，类型说明符为long ，在内存中占8个字节，其取值为长整常数。

4.无符号型，类型说明符为unsigned。

无符号型又可与上述三种类型匹配而构成：

(1) 无符号基本型类型说明符为unsigned int或unsigned。

(2) 无符号短整型类型说明符为unsigned short

(3) 无符号长整型类型说明符为unsigned long

各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位，故不能表示负数。 下表列出了ARM中各类整型量所分配的内存字节数及数的表示范围。

类型说明符 | 数的范围 | 分配字节数
int | -2147483648~2147483647 | ■■■■
unsigned int | 0~4294967295 | ■■■■
short | -32768~32767 | ■■
unsigned short | 0~65536 | ■■
long | -922337203685477808~922337203685477807 | ■■■■■■■■
unsigned long | 0~18446744073709551615 | ■■■■■■■■

4. 整型变量的说明

变量说明的一般形式为： 类型说明符 变量名标识符，变量名标识符，...；例如：

int a,b,c； (a,b,c为整型变量)

long x,y； (x,y为长整型变量)

unsigned p,q； (p,q为无符号整型变量)

在书写变量说明时，应注意以下几点：

1.  允许在一个类型说明符后，说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。

2.  最后一个变量名之后必须以“；”号结尾。

3.  变量说明必须放在变量使用之前。一般放在函数体的开头部分。

int a, b;
short c;
short d = 100;
a = d - 20;
b = a + d;
c = a + b + d;
d = d - a + c - b;

5. 实型常量

实型也称为浮点型。实型常量也称为实数或者浮点数。在Ｃ语言中，实数只采用十进制。它有二种形式：

1.十进制数形式，由数码0~ 9和小数点组成。例如：0.0，.25，5.789，0.13，5.0，300.，-267.8230等均为合法的实数。

2.指数形式，由十进制数，加阶码标志“e”或“E”以及阶码(只能为整数，可以带符号)组成。其一般形式为a E n (a为十进制数，n为十进制整数)其值为 a*10,n　如： 2.1E5 (等于2.1*10,5), 3.7E-2 (等于3.7*10,)-2*)　0.5E7 (等于0.5*10,7), -2.8E-2 (等于-2.8*10,)-2*)以下不是合法的实数 345 (无小数点)　E7 (阶码标志E之前无数字)　 -5 (无阶码标志)　53.-E3 (负号位置不对)　2.7E (无阶码)。

标准Ｃ允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如356f和356.是等价的。

6. 实型变量

实型变量分为两类：单精度型和双精度型，其类型说明符为float 单精度说明符，double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间，其数值范围为3.4E-38～3.4E+38，只能提供七位有效数字。双精度型占8 个字节(64位)内存空间，其数值范围为1.7E-308～1.7E+308，可提供16位有效数字。

实型变量说明的格式和书写规则与整型相同。

例如：  float x,y； (x,y为单精度实型量)

double a,b,c； (a,b,c为双精度实型量)

实型常数不分单、双精度，都按双精度double型处理。

float a = 32;
float b;
double d;
b = 12345678;
d = b * 100;
d = d + a;
d = d + 58.123456;

7. 字符型量

字符型量包括字符常量和字符变量。

字符常量是用单引号括起来的一个字符。例如'a','b','=','+','?'都是合法字符常量。在Ｃ语言中，字符常量有以下特点：

1. 字符常量只能用单引号括起来，不能用双引号或其它括号。

2. 字符常量只能是单个字符，不能是字符串。

3. 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如'5'和5 是不同的。'5'是字符常量，不能参与运算。

8. 字符变量

字符变量的取值是字符常量，即单个字符。字符变量的类型说明符是char。字符变量类型说明的格式和书写规则都与整型变量相同。

例如：

char a,b； 每个字符变量被分配一个字节的内存空间，因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。如x的

十进制ASCII码是120，y的十进制ASCII码是121。对字符变量a,b赋予'x'和'y'值： a='x'； b='y'；实际上是在a,b两个单元内存放120和121的二进制代码：

a　0 1 1 1 1 0 0 0

b　0 1 1 1 1 0 0 1

所以也可以把它们看成是整型量。 Ｃ语言允许对整型变量赋以字符值，也允许对字符变量赋以整型值。在输出时，允许把字符变量按整型量输出，也允许把整型量按字符量输出。整型量为二字节量，字符量为单字节量，当整型量按字符型量处理时，只有低八位字节参与处理。

char a = 49;
char b;
char d;
b = a + 10;
d = a + b;

char c1, c2;
c1 = 'a';
c2 = 'b';
c1 = c1 - 32;
c2 = c2 - 32;

9. 字符串常量

字符串常量是由一对双引号括起的字符序列。例如： "CHINA" ，"C program:" ， "$12.5" 等都是合法的字符串常量。字符串常量和字符常量是不同的量。它们之间主要有以下区别：

1. 字符常量由单引号括起来，字符串常量由双引号括起来。

2. 字符常量只能是单个字符，字符串常量则可以含一个或多个字符。

3. 可以把一个字符常量赋予一个字符变量，但不能把一个字符串常量赋予一个字符变量。在Ｃ语言中没有相应的字符串变量。

4. 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0"(ASCII码为0)。这是字符串结束的标志。例如，字符串 "C program"在内存中所占的字节为：C program\0。字符常量'a'和字符串常量"a"虽然都只有一个字符，但在内存中的情况是不同的。

'a'在内存中占一个字节，可表示为：a

"a"在内存中占二个字节，可表示为：a\0符号常量

10. 符号常量

在Ｃ语言中，可以用一个标识符来表示一个常量，称之为符号常量。符号常量在使用之前必须先定义，其一般形式为：

#define 标识符 常量

其中#define也是一条预处理命令，称为宏定义命令，其功能是把该标识符定义为其后的常量值。一经定义，以后在程序中所有出现该标识符的地方均代之以该常量值。习惯上符号常量的标识符用大写字母，变量标识符用小写字母，以示区别。

#define PI 3.14159
void main()
{
    float s, r;
    r = 5;
    s = PI * r * r;
    printf("s=%f\n", s);
}

由宏定义命令定义 PI 为3.14159  s,r定义为实数　 5->r　 PI*r*r->s

显示程序结果 float s,r；　r=5；　s=PI*r*r；本程序在主函数之前由宏定义命令定义PI 为3.14159，在程序中即以该值代替PI 。s=PI*r*r等效于s=3.14159*r*r。应该注意的是，符号常量不是变量，它所代表的值在整个作用域内不能再改变。也就是说，在程序中，不能再用赋值语句对它重新赋值。


变量初值和类型转换

1. 变量赋初值

在程序中常常需要对变量赋初值，以便使用变量。语言程序中可有多种方法，在定义时赋以初值的方法，这种方法称为初始化。在变量说明中赋初值的一般形式为：

类型说明符 变量1= 值1，变量2= 值2，……； 例如：

int a = b = c = 5;
float x = 32, y = 3f, z = 0.75;
char ch1 = 'K', ch2 = 'P';

应注意，在说明中不允许连续赋值，如a=b=c=5是不合法的。

2. 变量类型的转换

变量的数据类型是可以转换的。转换的方法有两种， 一种是自动转换，一种是强制转换。

自动转换发生在不同数据类型的量混合运算时，由编译系统自动完成。自动转换遵循以下规则：

1.若参与运算量的类型不同，则先转换成同一类型，然后进行运算。

2.转换按数据长度增加的方向进行，以保证精度不降低。如int型和long型运算时，先 把int量转成long型后再进行运算。

3.所有的浮点运算都是以双精度进行的，即使仅含float单精度量运算的表达式，也要先转换成double型，再作运算。

4.char型和short型参与运算时，必须先转换成int型。

5.在赋值运算中，赋值号两边量的数据类型不同时，赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时，将丢失一部分数据，这样会降低精度，丢失的部分按四舍五入向前舍入。

3. 强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为： (类型说明符) (表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。例如： (float) a 把a转换为实型(int)(x+y) 把x+y的结果转换为整型在使用强制转换时应注意以下问题：

1.类型说明符和表达式都必须加括号(单个变量可以不加括号)，如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。

2.无论是强制转换或是自动转换，都只是为了本次运算的需要而对变量的数据长度进行的临时性转换，而不改变数据说明时对该变量定义的类型。


基本运算符和表达式

Ｃ语言中运算符和表达式数量之多， 在高级语言中是少见的。正是丰富的运算符和表达式使Ｃ语言功能十分完善。 这也是Ｃ语言的主要特点之一。

Ｃ语言的运算符不仅具有不同的优先级， 而且还有一个特点，就是它的结合性。在表达式中， 各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定，还要受运算符结合性的制约，以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的，因此也增加了Ｃ语言的复杂性。

运算符的种类Ｃ语言的运算符可分为以下几类：

1.算术运算符，用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算，%)、自增(++)、自减(--)共七种。

2.关系运算符，用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。

3.逻辑运算符，用于逻辑运算。包括与(&&)、或(||)、非(!)三种。

4.位操作运算符，参与运算的量，按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。

5.赋值运算符，用于赋值运算，分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。

6.条件运算符，这是一个三目运算符，用于条件求值(?:)。

7.逗号运算符，用于把若干表达式组合成一个表达式(，)。

8.指针运算符，用于取内容(*)和取地址(&)二种运算。

9.求字节数运算符，用于计算数据类型所占的字节数(sizeof)。

10.特殊运算符，有括号()，下标[],等几种。


一维数值组

数组在程序设计中，为了处理方便， 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在Ｃ语言中，数组属于构造数据类型。一个数组可以分解为多个数组元素，这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同，数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

本章介绍数值数组和字符数组，其余的在以后各章陆续介绍。数组类型说明在Ｃ语言中使用数组必须先进行类型说明。数组说明的一般形式为： 类型说明符数组名 [常量表达式]，……； 其中，类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数，也称为数组的长度。例如：

int a[10]; // 说明整型数组a，有10个元素。
float b[10], c[20]; // 说明实型数组b，有10个元素，实型数组c，有20个元素。
char ch[20]; // 说明字符数组ch，有20个元素。

对于数组类型说明应注意以下几点：

1.数组的类型实际上是指数组元素的取值类型。对于同一个数组，其所有元素的数据类型都是相同的。

2.数组名的书写规则应符合标识符的书写规定。

3.数组名不能与其它变量名相同，例如：

void main()
{
    int a;
    float a[10];
    //……
}

是错误的。

4.方括号中常量表达式表示数组元素的个数，如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。

5.不能在方括号中用变量来表示元素的个数， 但是可以是符号常数或常量表达式。例如：

#define FD 5
void main()
{
    int a[3+2],b[7+FD];
    //……
}

是合法的。但是下述说明方式是错误的。

void main()
{
    int n=5;
    int a[n];
    //……
}

6.允许在同一个类型说明中，说明多个数组和多个变量。

例如： int a,b,c,d,k1[10],k2[20]；

1. 数组元素的表示方法

    数组元素是组成数组的基本单元。数组元素也是一种变量，其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为：数组名[下标] 其中的下标只能为整型常量或整型表达式。如为小数时，C编译将自动取整。例如，a[5],a[i+j],a[i++]都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组，才能使用下标变量。在Ｃ语言中只能逐个地使用下标变量，而不能一次引用整个数组。

初始化赋值的一般形式为： static 类型说明符数组名[常量表达式]={值，值……值}； 其中static表示是静态存储类型，Ｃ语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储，外部存储的概念在第五章中介绍)。在{ }中的各数据值即为各元素的初值， 各值之间用逗号间隔。例如： static int a[10]={ 0,1,2,3,4,5,6,7,8,9 }； 相当于a[0]=0；a[1]=1...a[9]=9；

2. Ｃ语言对数组的初始赋值

1.可以只给部分元素赋初值。当{ }中值的个数少于元素个数时，只给前面部分元素赋值。例如： static int a[10]={0,1,2,3,4}；表示只给a[0]～a[4]5个元素赋值，而后5个元素自动赋0值。

2.只能给元素逐个赋值，不能给数组整体赋值。 例如给十个元素全部赋1值，只能写为：static int a[10]={1,1,1,1,1,1,1,1,1,1}；而不能写为： static int a[10]=1；

3.如不给可初始化的数组赋初值，则全部元素均为0值。

4. 如给全部元素赋值，则在数组说明中， 可以不给出数组元素的个数。例如： static int a[5]={1,2,3,4,5}；可写为： static int a[]={1,2,3,4,5}；动态赋值可以在程序执行过程中，对数组作动态赋值。 这时可用循环语句配合scanf函数逐个对数组元素赋值。

3. 字符数组

用来存放字符量的数组称为字符数组。 字符数组类型说明的形式与前面介绍的数值数组相同。例如： char c[10]；由于字符型和整型通用，也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组，例如： char c[5][10]；即为二维字符数组。字符数组也允许在类型说明时作初始化赋值。例如： static char c[10]={`c`,` `,`p`,`r`,o`,g`,r`,`a`,`m`}；赋值后各元素的值为：数组C c[0]c[1]c[2]c[3]c[4]c [5]c[6]c[7]c[8]c[9]其中c[9]未赋值，由系统自动赋予0值。 当对全体元素赋初值时也可以省去长度说明。例如： static char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`}；这时C数组的长度自动定为9。

Ｃ语言允许用字符串的方式对数组作初始化赋值。例如：

static char c[]={'c', ' ','p','r','o','g','r','a','m'}；

可写为：

static char c[]={"C program"}；

或去掉{}写为：

static char c[]="C program"；

用字符串方式赋值比用字符逐个赋值要多占一个字节， 用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为：C program\0`\0'是由C编译系统自动加上的。由于采用了`\0'标志，所以在用字符串赋初值时一般无须指定数组的长度，而由系统自行处理。在采用字符串方式后，字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的办法外，还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串，而不必使用循环语句逐个地输入输出每个字符。


小结

1.Ｃ的数据类型

基本类型，构造类型，指针类型，空类型

2.基本类型的分类及特点

类型说明符 | 字节 | 数值范围
字符型char | 1 | 0~255
基本整型int | 4 | -214783648～214783647
短整型short | 2 | -32768～32767
长整型 long | 8 | -922337203685477808～922337203685477807
无符号型 unsigned | 4 | 0～4294967295
无符号长整型 unsigned long | 8 | 0～1844744073709551615
单精度实型 float | 4 | 3/4E-38～3/4E+38
双精度实型 double | 8 | 1/7E-308～1/7E+308

3. 常量后缀

L或l  长整型

U或u  无符号数

F或f  浮点数

4. 常量类型

整数，长整数，无符号数，浮点数，字符，字符串，符号常数，转义字符。

5. 数据类型转换

·自动转换

在不同类型数据的混合运算中，由系统自动实现转换， 由少字节类型向多字节类型转换。不同类型的量相互赋值时也由系统自动进行转换，把赋值号右边的类型转换为左边的类型。

·强制转换

由强制转换运算符完成转换。

6. 运算符优先级和结合性

一般而言，单目运算符优先级较高，赋值运算符优先级低。 算术运算符优先级较高，关系和逻辑运算符优先级较低。 多数运算符具有左结合性，单目运算符、三目运算符、赋值。

7. 表达式

表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。 表达式求值按运算符的优先级和结合性所规定的顺序进行。

8. 数组

1. 数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组，实数组)，字符数组以及后面将要介绍的指针数组，结构数组等。

2. 数组可以是一维的，二维的或多维的。

3. 数组类型说明由类型说明符、数组名、数组长度 (数组元素个数)三部分组成。数组元素又称为下标变量。 数组的类型是指下标变量取值的类型。

4. 对数组的赋值可以用数组初始化赋值，输入函数动态赋值和赋值语句赋值三种方法实现。对数值数组不能用赋值语句整体赋值、输入或输出，而必须用循环语句逐个对数组元素进行操作。


C程序的语句

Ｃ程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。C语句可分为以下五类：

1. 表达式语句

表达式语句由表达式加上分号“；”组成。其一般形式为： 表达式； 执行表达式语句就是计算表达式的值。例如： x=y+z；赋值语句y+z； 加法运算语句，但计算结果不能保留，无实际意义i++；自增1语句，i值增1

2. 控制语句

控制语句用于控制程序的流程， 以实现程序的各种结构方式。

它们由特定的语句定义符组成。Ｃ语言有九种控制语句。可分成以下三类：

(1) 条件判断语句，if语句，switch语句

(2) 循环执行语句，do while语句，while语句，for语句

(3) 转向语句，break语句，goto语句，continue语句，return语句

3. 空语句

只有分号“；”组成的语句称为空语句。 空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。例如 while(getchar()!='\n')； 本语句的功能是，只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。

4. 赋值语句

赋值语句是由赋值表达式再加上分号构成的表达式语句。 其一般形式为： 变量=表达式； 赋值语句的功能和特点都与赋值表达式相同。它是程序中使用最多的语句之一。在赋值语句的使用中需要注意以下几点：

1.由于在赋值符“=”右边的表达式也可以又是一个赋值表达式，因此，下述形式变量=(变量=表达式)；是成立的，从而形成嵌套的情形。其展开之后的一般形式为：变量=变量=…=表达式； 例如：

a=b=c=d=e=5；

按照赋值运算符的右接合性，因此实际上等效于：

e=5；d=e；c=d；b=c；a=b；

2.注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分，赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔，而赋值语句则必须用分号结尾。

3.在变量说明中，不允许连续给多个变量赋初值。 如下述说明是错误的： int a=b=c=5 必须写为 int a=5,b=5,c=5； 而赋值语句允许连续赋值

4.注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式，它可以出现在任何允许表达式出现的地方，而赋值语句则不能。

下述语句是合法的：

if((x=y+5)>0) z=x；

语句的功能是，若表达式x=y+5大于0则z=x。下述语句是非法的：

if((x=y+5;)>0) z=x；

因为x=y+5；是语句，不能出现在表达式中。


分支结构程序

1. 关系运算符和表达式

在程序中经常需要比较两个量的大小关系， 以决定程序下一步的工作。比较两个量的运算符称为关系运算符。在Ｃ语言中有以下关系运算符：

<  小于

<=  小于或等于

>  大于

>=  大于或等于

==  等于

!=  不等于

关系运算符都是双目运算符，其结合性均为左结合。关系运算符的优先级低于算术运算符，高于赋值运算符。在六个关系运算符中，<,<=,>,>=的优先级相同，高于==和!=，==和!=的优先级相同。

关系表达式的一般形式为：

表达式 关系运算符 表达式

例如：

a+b>c-d, x>3/2, 'a'+1<c, -i-5*j==k+1；

都是合法的关系表达式。由于表达式也可以又是关系表达式。因此也允许出现嵌套的情况，例如：a>(b>c),a!=(c==d)等。关系表达式的值是“真”和“假”，用“1”和“0”表示。

2. 逻辑运算符和表达

逻辑运算符Ｃ语言中提供了三种逻辑运算符 && 与运算　|| 或运算　! 非运算 与运算符&&和或运算符||均为双目运算符，具有左结合性。非运算符!为单目运算符，具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下：

按照运算符的优先顺序可以得出：

a>b && c>d等价于 (a>b) && (c>d)

!b==c||d<a等价于 ((!b)==c)||(d<a)

a+b>c && x+y<b等价于 ((a+b)>c) && ((x+y)<b)

逻辑运算的值也为“真”和“假”两种，用“1”和“0 ”来表示。其求值规则如下：

1.与运算&&参与运算的两个量都为真时，结果才为真，否则为假。例如，5>0 && 4>2,由于5>0为真，4>2也为真，相与的结果也为真。

2.或运算||参与运算的两个量只要有一个为真，结果就为真。两个量都为假时，结果为假。例如：5>0||5>8,由于5>0为真，相或的结果也就为真

3.非运算!参与运算量为真时，结果为假；参与运算量为假时，结果为真。例如：!(5>0)的结果为假。

虽然Ｃ编译在给出逻辑运算值时，以“1”代表“真”，“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时，以“0”代表“假”，以非“0”的数值作为“真”。例如：由于5和3均为非“0”因此5&&3的值为“真”，即为1。

又如：5||0的值为“真”，即为1。

逻辑表达式逻辑表达式的一般形式为：表达式 逻辑运算符 表达式 其中的表达式可以又是逻辑表达式，从而组成了嵌套的情形。例如：(a&&b)&&c根据逻辑运算符的左结合性，上式也可写为： a&&b&&c 逻辑表达式的值是式中各种逻辑运算的最后值，以“1”和“0”分别代表“真”和“假”。

3. if语句

用if语句可以构成分支结构。它根据给定的条件进行判断，以决定执行某个分支程序段。Ｃ语言的if语句有三种基本形式。

1.第一种形式为基本形式

if(表达式) 语句；

其语义是：如果表达式的值为真，则执行其后的语句，否则不执行该语句。

2.第二种形式为if-else形式

if(表达式)

语句1；

else

语句2；

其语义是：如果表达式的值为真，则执行语句1，否则执行语句2 。

输入两个整数，输出其中的大数。改用if-else语句判别a,b的大小，若a大，则输出a，否则输出b。

3.第三种形式为if-else-if形式

前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时，可采用if-else-if语句，其一般形式为：

if(表达式1)

语句1；

else if(表达式2)

语句2；

else if(表达式3)

语句3；

…

else if(表达式m)

语句m；

else

语句n；

其语义是：依次判断表达式的值，当出现某个值为真时，则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假，则执行语句n 。 然后继续执行后续程序。

在使用if语句中还应注意以下问题

(1) 在三种形式的if语句中，在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式， 但也可以是其它表达式，如赋值表达式等，甚至也可以是一个变量。例如： if(a=5) 语句；if(b) 语句； 都是允许的。只要表达式的值为非0，即为“真”。如在if(a=5)…；中表达式的值永远为非0，所以其后的语句总是要执行的，当然这种情况在程序中不一定会出现，但在语法上是合法的。

又如，有程序段：

if (a = b)
    printf("%d", a);
else
    printf("a=0");

本语句的语义是，把b值赋予a，如为非0则输出该值，否则输出“a=0”字符串。这种用法在程序中是经常出现的。

(2) 在if语句中，条件判断表达式必须用括号括起来，在语句之后必须加分号。

(3) 在if语句的三种形式中，所有的语句应为单个语句，如果要想在满足条件时执行一组(多个)语句，则必须把这一组语句用{} 括起来组成一个复合语句。但要注意的是在}之后不能再加分号。例如：

if(a>b)
{
    a++；
    b++；
}
else
{
    a=0；
    b=10；
}

4. 条件运算符和条件表达式

如果在条件语句中，只执行单个的赋值语句时， 常可使用条件表达式来实现。不但使程序简洁，也提高了运行效率。

条件运算符为?和：，它是一个三目运算符，即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为：

表达式1 ? 表达式2 : 表达式3

其求值规则为：如果表达式1的值为真，则以表达式2 的值作为条件表达式的值，否则以表达式2的值作为整个条件表达式的值。 条件表达式通常用于赋值语句之中。

例如条件语句：if(a>b) max=a；else max=b；可用条件表达式写为 max=(a>b)?a:b；执行该语句的语义是：如a>b为真，则把a赋予max，否则把b 赋予max。

使用条件表达式时，还应注意以下几点：

1. 条件运算符的运算优先级低于关系运算符和算术运算符，但高于赋值符。因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b

2. 条件运算符?和：是一对运算符，不能分开单独使用。

3. 条件运算符的结合方向是自右至左。


Switch语句

Ｃ语言还提供了另一种用于多分支选择的switch语句，其一般形式为：

switch (表达式) {

case 常量表达式1: 语句1；

case 常量表达式2: 语句2；

…

case 常量表达式n: 语句n；

default : 语句n+1；

}

其语义是：计算表达式的值。 并逐个与其后的常量表达式值相比较，当表达式的值与某个常量表达式的值相等时，即执行其后的语句，然后不再进行判断，继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时，则执行default后的语句。

在使用switch语句时还应注意以下几点：

1.在case后的各常量表达式的值不能相同，否则会出现错误。

2.在case后，允许有多个语句，可以不用{}括起来。

3.各case和default子句的先后顺序可以变动，而不会影响程序执行结果。

4.default子句可以省略不用。


循环结构顺序

循环结构是程序中一种很重要的结构。其特点是，在给定条件成立时，反复执行某程序段，直到条件不成立为止。给定的条件称为循环条件，反复执行的程序段称为循环体。Ｃ语言提供了多种循环语句，可以组成各种不同形式的循环结构。

1. while语句

while语句的一般形式为： while(表达式)语句； 其中表达式是循环条件，语句为循环体。

while语句的语义是：计算表达式的值，当值为真(非0)时， 执行循环体语句。

使用while语句应注意以下几点：

1.while语句中的表达式一般是关系表达或逻辑表达式，只要表达式的值为真(非0)即可继续循环。

2.循环体如包括有一个以上的语句，则必须用{}括起来，组成复合语句。

3.应注意循环条件的选择以避免死循环。

2. do-while语句

do-while语句的一般形式为：

do 语句；

while(表达式)；

其中语句是循环体，表达式是循环条件。

do-while语句的语义是：

先执行循环体语句一次， 再判别表达式的值，若为真(非0)则继续循环，否则终止循环。

do-while语句和while语句的区别在于do-while是先执行后判断，因此do-while至少要执行一次循环体。而while是先判断后执行，如果条件不满足，则一次循环体语句也不执行。

while语句和do-while语句一般都可以相互改写。

在本例中，循环条件改为--n，否则将多执行一次循环。这是由于先执行后判断而造成的。

对于do-while语句还应注意以下几点：

1.在if语句，while语句中，表达式后面都不能加分号， 而在 do-while语句的表达式后面则必须加分号。

2.do-while语句也可以组成多重循环，而且也可以和while语句相互嵌套。

3.在do和while之间的循环体由多个语句组成时，也必须用{}括起来组成一个复合语句。

4.do-while和while语句相互替换时，要注意修改循环控制条件。

3. For语句

for语句是Ｃ语言所提供的功能更强，使用更广泛的一种循环语句。其一般形式为：

for(表达式1；表达式2；表达3) 语句；

表达式1　 通常用来给循环变量赋初值，一般是赋值表达式。也允许在for语句外给循环变量赋初值，此时可以省略该表达式。

表达式2　 通常是循环条件，一般为关系表达式或逻辑表达式。

表达式3　 通常可用来修改循环变量的值，一般是赋值语句。

这三个表达式都可以是逗号表达式， 即每个表达式都可由多个表达式组成。三个表达式都是任选项，都可以省略。

一般形式中的“语句”即为循环体语句。for语句的语义是：

1.首先计算表达式1的值。

2.再计算表达式2的值，若值为真(非0)则执行循环体一次，否则跳出循环。

3.然后再计算表达式3的值，转回第2步重复执行。在整个for循环过程中，表达式1只计算一次，表达式2和表达式，3则可能计算多次。循环体可能多次执行，也可能一次都不执行。

在使用for语句中要注意以下几点：

1.for语句中的各表达式都可省略，但分号间隔符不能少。如：for(；表达式；表达式)省去了表达式

<1>for(表达式；；表达式)省去了表达式

<2>for(表达式；表达式；)省去了表达式

<3>for(；；)省去了全部表达式。

2.在循环变量已赋初值时，可省去表达式1，如例3.27即属于这种情形。如省去表达式2或表达式3则将造成无限循环， 这时应在循环体内设法结束循环。

3.循环体可以是空语句。

#include <stdio.h>
void main()
{
    int n = 0;
    printf("input a string:\n");
    for (; getchar() != '\n'; n++);
    printf("%d", n);
}

本例中，省去了for语句的表达式1，表达式3也不是用来修改循环变量，而是用作输入字符的计数。这样， 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是，空语句后的分号不可少，如缺少此分号，则把后面的printf 语句当成循环体来执行。反过来说，如循环体不为空语句时， 决不能在表达式的括号后加分号， 这样又会认为循环体是空语句而不能反复执行。这些都是编程中常见的错误，要十分注意。


break语句

break语句只能用在switch 语句或循环语句中， 其作用是跳出switch语句或跳出本层循环，转去执行后面的程序。由于break语句的转移方向是明确的，所以不需要语句标号与之配合。break语句的一般形式为： break； 上面例题中分别在switch语句和for语句中使用了break 语句作为跳转。使用break语句可以使循环语句有多个出口，在一些场合下使编程更加灵活、方便。


continue语句

continue语句只能用在循环体中，其一般格式是：

continue；

其语义是：结束本次循环，即不再执行循环体中continue 语句之后的语句，转入下一次循环条件的判断与执行。应注意的是，本语句只结束本层本次的循环，并不跳出循环。


小结

1.从程序执行的流程来看， 程序可分为三种最基本的结构： 顺序结构，分支结构以及循环结构

2.程序中执行部分最基本的单位是语句。Ｃ语言的语句可分为五类：

(1)表达式语句　　  任何表达式末尾加上分号即可构成表达式语句，常用的表达式语句为赋值语句。

(2)函数调用语句　　由函数调用加上分号即组成函数调用语句。

(3)控制语句　　    用于控制程序流程，由专门的语句定义符及所需的表达式组成。主要有条件判断执行语句，循环执行语句，转向语句等。

(4)复合语句　　    由{}把多个语句括起来组成一个语句。复合语句被认为是单条语句，它可出现在所有允许出现语句的地方，如循环体等。

(5)空语句　　       仅由分号组成，无实际功能。

3.关系表达式和逻辑表达式是两种重要的表达式， 主要用于条件执行的判断和循环执行的判断。

4.Ｃ语言提供了多种形式的条件语句以构成分支结构。

(1)if语句主要用于单向选择。

(2)if-else语句主要用于双向选择。

(3)if-else-if语和switch语句用于多向选择。

这几种形式的条件语句一般来说是可以互相替代的。

5.Ｃ语言提供了三种循环语句。

(1)for语句主要用于给定循环变量初值， 步长增量以及循环次数的循环结构。

(2)循环次数及控制条件要在循环过程中才能确定的循环可用 while或do-while语句。

(3)三种循环语句可以相互嵌套组成多重循环。循环之间可以并列但不能交叉。

(4)可用转移语句把流程转出循环体外，但不能从外面转向循环体内。

(5)在循环程序中应避免出现死循环，即应保证循环变量的值在运行过程中可以得到修改，并使循环条件逐步变为假，从而结束循环。

6.Ｃ语言语句小结

名称　　　　　　　一般形式

简单语句　　　　　表达式语句表达式；

空语句              ；

条件语句　　　　　if(表达式)语句；

                  if(表达式)语句1； else语句2；

                  if(表达式1)语句1； else if(表达式2) 语句2…else语句 n；

开关语句 　　　　 switch(表达式){ case常量表达式: 语句…default: 语句； }

循环语句　　　　  while语句

                  while(表达式)语句；

                  for语句 for(表达式1；表达式2；表达式3)语句；

                  break语句 break；

                  continue语句 continue；

                  return 语句 return(表达式)；


创建一个新的函数功能块

1.右键点击工程管理器“工程”-->“程序”-->“函数功能块”文件夹（或者其中的子文件夹），弹出的菜单中点击“新建函数块”。对新建的项进行命名。

图1.1 新建函数功能块

2.双击新建的函数功能块的项，主界面会显示代码编程的文本界面。

图1.2

3.编写函数功能块的代码。在编程的过程中，SAMSOARII支持自动缩进，括号补全以及代码补全。代码补全包括C语言关键字，函数参数，局部变量以及全局常量（变量）。弹出的代码补全选择框中的词，都包含现在正在输入的词作为子词。例如输入单词ar，那么arg1,arg2,arg3,arg4,char都包含单词ar，所以都显示在表中。可以通过鼠标点击或者方向键控制光标，回车确定的键盘控制来选择要补全的词。

4.编写完毕后，可以在工程管理器中函数块的子项中查看实现的所有函数。

可以通过F4编译快捷键将梯形图和函数块一起编译，SAMSOARII会优先编译梯形图然后再编译函数块，所以需要确保之前梯形图完全正确。当然也可以通过顶部菜单栏“工具”-->“程序检测”-->“函数功能块检测”来跳过之前的步骤直接检查函数功能块。

5.刚完成的C语言程序，进行第一次编译会出现一些编译错误，这属于正常现象。

图1.3 错误信息

当SAMSOARII检查到所有的错误后，会报告给错误列表并弹出。双击错误列表中的一项，主界面会自动导航到相应位置。修改完毕后再编译，错误列表中的所有之前发生的错误项均会消失，并且不会再自动弹出，而会弹出提示成功的对话框。

图1.4 编译成功提示

注意，虽然错误信息不存在，但是警告信息可能依然存在，虽然也视为编译通过，但是这个时候谨慎起见还是要查看错误列表并确认（通过顶部菜单栏“视图”-->“错误列表”来打开窗口）。

图1.5 警告信息

注意，有时候编译通过，并且警告也不存在，但是还有可能出现其他常见的问题。所以设计使用函数功能块时需仔细慎重，以免造成不必要的麻烦和损失。

图1.6 变量名称错误


能被CALLM指令调用的函数的条件

函数块中的函数即使能通过编译，并不代表能被梯形图指令CALLM来调用。实际上，能被CALLM调用的函数需符合严格的约束条件。

1.  参数不能大于4个。例如func1(WORD i, WORD j, WORD k, WORD l, WORD m)参数为5个，不符合条件。

2.  参数必须为SAMSOARII所定制的全大写的类型。实际上，这些类型均为基本类型的指针。

名称 | 对应类型 | 含义
BIT | uint32_t* | 位寄存器(M/Y/S)的指针
WORD | int16_t* | 带符号整数(D/TV/CV/AO)的指针
UWORD | uint16_t* | 不带符号整数的指针
DWORD | int32_t* | 带符号双整数的指针
UDWORD | uint32_t* | 不带符号双整数的指针
FLOAT | float* | 浮点数的指针

表1.1 参数类型表

其中BIT对应的类型为32位，但是每个32位整数只映射了一个位寄存器的值，并不是通过位组合生成的，使用时要注意。


兼容一代SAMSOAR Developer的设计

1.之前的SAMSOAR Developer中每个函数功能块只包含一个可被CALLM调用的函数，并且必须符合void Func0(WORD W, BIT B)的格式。这里同样也可以写成如上格式。并且BIT B不需要时可以去掉，变为void Func0(WORD W)，同理WORD W也可以。

2.一代版本中，FW[1]代表W[2]和W[3]的合并并组成浮点数，DW[1]代表组合后的双整数，这一代也兼容这个模式，并且可以定义更多更自由的参数来代替，使用起来更方便。

3.一代版本_PI代表圆周率，二代改为PI，前面的下划线去掉。


创建构造块来编写指令表

1. 简介

在编写梯形图程序时，除了直接在梯形图上编辑以外，SamSoarII还提供了另外一种方式来编写指令表。指令表是梯形图经过初步编译后得到的代表程序逻辑的指令队列，可以通过“工具栏”-->“指令模式” [image] 来显示并查看。（默认情况下，梯形图和指令表会共同显示在界面上，可以通过点击“梯形图模式” [image] 使之弹开来单独显示指令表。）

图1.1 指令表和梯形图共存模式

点击指令表中的一条指令，梯形图会自动导航到对应位置。双击这个指令，会弹出参数的设置窗口。但是与梯形图不同的是，指令表是不能直接通过文本输入指令的方式来进行编辑的。如果要直接编辑指令表的话，可以用函数功能块以托管编辑的方式来实现编辑。

2. 操作步骤

1）在“工程资源管理器”窗口中，右键点击要编辑的梯形图程序，弹出右键菜单。点击“创建构造函数”。

图1.2

2）之后会弹出创建构造函数的窗口。这里的操作方式与PLSR/PTO参数函数的添加基本一致。

图1.3

3）点击“确定”后，界面会自动导航到新添加的构造函数。这样构造函数的创建过程就完成了。（也可以直接编写以下格式的代码，上位软件会自动识别并生成对应的梯形图程序）。

图1.4

构造函数与一般的C语言函数不同，有几点自带的特性：

1. 函数头部会声明函数特性[Routine("程序名称")]，代表该函数是构造这个梯形图程序的构造函数。

2. 函数内部由__asm__结构构成，字符串参数代表要编辑的网络，内部为直接输入的指令表。可以添加这个结构来新建新的网络。

3. 指令表之间用','符号来分割，在保证分割的前提下，多条指令可以放在同一行中。但是两个','之间不能为空，开头和结尾不允许多余的','。

编写完毕后，通过编译（快捷键F4）来生成梯形图，如果指令表有误，会以梯形图错误列表的形式显示出来。

图1.5 指令表错误

指令表合法并编译通过后，SamSoarII会自动绘制对应的梯形图。

图1.6 绘制的梯形图

注意以下几点：

1. 构造函数要严格遵守上面的程序结构，否则绘制出来的梯形图可能与之对应的指令表不符合。

2. 用CALLM调用或者函数功能块中调用构造函数，并不会执行任何操作，请不要用以上两种方式来调用。

3. 可以在函数内部和__asm__内部添加C语言注释，但是请注意不要注释到指令和','分割符。


软元件在函数功能块中的使用

在用户实现的函数功能块中，除了能调用函数参数和局部变量以外，还可以像梯形图一样直接使用软元件寄存器。

1.软元件的变量

每个软元件基地址在函数块中都有一个对应的全局变量名称。比如说，基地址为M的软元件的全局变量为MBit，基地址为D的软元件的全局变量为DWord，并且这些变量均视为指针。M0可以用MBit[0]表示，D0可以用DWord[0]表示，等等。

以下为所有软元件的基地址和对应的变量名称。

基地址 | 变量名 | 类型
X,Y,M,S,C,T | XBit,YBit,MBit,SBit,CBit,TBit | BIT（uint32_t*）
D,CV,TV,AI,AO,V,Z | DWord,CVWord,TVWord,AIWord,AOWord,VWord,ZWord | WORD(int16_t*)
CV32 | CVDoubleWord | DWORD(int32_t*)

表1.1 软元件变量

2.实例

对于以下梯形图程序：

图1.1 梯形图程序

同样也可以用函数块来实现：

图1.2 C语言程序

以上两个程序在逻辑上是等价的。

注意，这里只是一个示范用例，并不能代表所有的梯形图程序都能用函数功能块代替。

3.简化使用

可以在函数头部加入特性[Simplify("Register")]，来开启软元件输入简化的功能。

图1.3 简化后的效果

与图1.2所示程序是等价的。

这个特性可以按照一定的语法规则对代码进行大幅简化，包括变值寻址，类型转换等操作都可以用简洁的语法来实现。

1. 寄存器变值访问。例如D0V0，如果在C语言代码里写成DWord[0+VWord[0]]，若加入简化特性可以直接写作D0Z0。

2. 寄存器特殊类型的使用。C语言里要经过取地址->转换地址指针->取值的复杂步骤来实现，例如若将D0当做双字使用，本来需要写成*((DWORD)(DWord+0))，加入了简化特性后可以写成DD0，大大提高了编程效率。

下表为原代码和简化后的代码的对比。

简化前的代码 | 简化后的代码
DWord[0] | D0
DWord[0+VWord[0]] | D0V0
*((DWORD)(DWord+10)) | DD10
*((FLOAT)(DWord+20)) | FD20
*((UWORD)(CVWord+5)) | UCV5
*((UDWORD)(DWord+20+ZWord[2])) | UDD20Z2

图1.4 简化前后的对比


字软元件的位

1. 功能

指定16位字软元件的位，可以将其作为位软元件使用

2. 书写格式

Dm.n表示Dm字寄存器的第n位

m：字软元件编号

n：位编号（16进制0—F）

m，n不能使用变址修饰

D，V，Z类型寄存器支持此方式输入。

字地址位对应图，如下图所示：

3. 实例

指令表：

LD      D1.1

OUT     D2.5  // D1的第一位为1(0)时导通(断开)，D2的第五位被写入1(0)。

梯形图：


位软元件合成字

1. 功能

将如：X，Y，M，S等位软元件通过组合之后作为数值处理软元件使用

2. 书写格式

以位数Kn和位软元件的编号来组合，使用至16位指令时，n可以取（1—16），32位指令时，n可以取（1—32）。

Kn与位软元件不可用变址修饰

例如：K5M3 则是由M3—M7组合成的一个字软元件，该软元件可应用于16位指令或32位指令中。

K20M10 则是由M10—M29组合成的一个字软元件，由于该软元件位数大于16位所以只能应用于32位指令中。

3. 实例

1. 合成字作为读取地址

指令表：

LD      M0

MOV     K5Y0    D0  // 将合成字写入16位或32位数时,数据长度不足的高位都会被视为0

梯形图：

2. 合成字作为写入地址

指令表：

LD      M0

MOV     D0      K5Y0  // 合成字作为写地址时可能出现位数不足，无法写入所有值的情况(如D0为32767，则只能对Y0—Y4写入1，多余位则被舍弃不会自动填充到之后的Y5,6,7…)

梯形图：


局部变量

1. 功能

提供特定的程序内部使用的，程序外部无法访问修改的变量。

2. 格式

局部变量类型 | 局部变量书写格式 | 初始值
位 | LBxxx，xxx部分可以是任意长度的数字/字符/下划线 | OFF
字 | LWxxx，xxx部分可以是任意长度的数字/字符/下划线 | 0
双字 | LDxxx，xxx部分可以是任意长度的数字/字符/下划线 | 0
浮点 | LFxxx，xxx部分可以是任意长度的数字/字符/下划线 | 0.0

局部变量可以任意起名，但要保证相同的变量用的是相同的名称。局部变量区分大小写，例如LWa和LWA视为不同的变量，这点请格外注意。

3. 实例

指令表：

Network 1

LD M0

OUT LBaa // 以M0为输入，局部变量LBaa作为线圈输出，相当于将M0的值赋给LBaa

MOV K10 LWba // 当M0为ON时，对局部变量LWba赋值为10

MOV K20 LW12 // 当M0为ON时，对局部变量LW12赋值为20

POP

Network 2

LD LBaa

AWL LWba LW12

SET Y0 K1 // 当LBaa为ON，并且LWba<LW12时，将Y0置位。只有M0为ON时条件才会成立，否则LBaa的初始值为OFF，LWba和LW12的初始值均为0.

POP

梯形图：


SamSoarII仿真功能

与一代上位软件相比，SamSoarII新增了强大的仿真功能。仿真可以脱离PLC设备，直接在电脑上模拟运行PLC工程程序。

1. 开始SamSoarII仿真

2. 仿真控制

3. 断点的使用

4. 单步调试

5. 软元件条件断点


SamSoarII仿真开始

保证工程程序完整合法后，就可以点击工具栏的仿真按钮，或者点击菜单栏中“工具”-->“仿真”（快捷键为Shift+F12）来开启仿真。这时会进入仿真界面，编辑栏会消失，取而代之的是仿真控制栏。

图1.1 仿真按钮

和开始监视时一样，会弹出监视窗口。上位软件会模拟PLC的运行，用户可以当做监视PLC来进行操作。

 图1.2


SamSoarII仿真控制

仿真开始运行时和PLC的运行状态一样，是处于RUN状态。可以切换到STOP状态来停止运行，还可以切换到仿真特有的PAUSE状态。通过仿真控制栏最左侧的控制按钮来操控仿真的运行状态。

图1.1 仿真控制栏

仿真处于RUN状态时，仿真正在运行，可以查看寄存器的当前值，并且可以修改值。

 图1.2 仿真运行

仿真处于STOP状态时，所有的寄存器都无法查看当前值，并且无法进行修改操作。

 图1.3 仿真停止

仿真处于PAUSE状态时，此时会停在程序运行时的某一个位置，停靠的位置用黄色光标来指示。与STOP不同，用户依然可以查看和修改寄存器。

 图1.4 仿真暂停


SamSoarII单步调试

单步系统（Step System）是SamSoarII强大的仿真功能的一部分，可以一步一步跟踪程序执行的流程，将细节放大更容易找到程序的问题所在。

单步操作只有在PAUSE状态下才能使用，通过仿真控制栏来进行操作。

图1.1

（1） [image] 逐过程（快捷键F9）

在暂停状态下执行单步操作“逐过程”后，会跳到下一条指令并继续暂停，期间只运行了一条指令。要注意，“逐过程”会跳过子程序和函数功能块的调用。

（2） [image] 逐语句（快捷键F10）

在暂停状态下执行单步操作“逐过程”后，会跳到下一条指令并继续暂停，若要调用子程序和函数功能块时，会跳进调用的地方。

（3） [image] 跳出（快捷键F11）

在调用子程序或者函数功能块时，执行单步操作“跳出”后，程序会将该子程序或者函数功能块的剩余部分运行完毕后，跳到调用位置的下一条指令并继续暂停。若在主程序执行该操作，会脱离PAUSE状态继续执行。

（4） [image] 查看当前暂停位置

界面会导航到当前暂停的位置，以便于查看。


SamSoarII仿真断点

断点系统（Breakpoint System）是SamSoarII强大的仿真功能的一部分，可以让程序在需要的地方进行暂停（进入PAUSE状态），从而方便分析与调试。

1. 添加一个断点

断点包括梯形图断点和函数块断点。以梯形图断点为例，可以在要添加断点的位置点击右键弹出右键菜单，点击“添加断点”按钮来完成操作。

添加断点后，梯形图相应元件的周围会有一个红色矩形图元包围，表示这里存在一个断点。

当程序运行到这个位置时，会自动停留在这里并进入PAUSE状态。

2. 断点设置

在添加了一个断点后，在该断点处点击右键弹出右键菜单，点击“断点设置”按钮，会弹出断点列表的窗口。这里可以设置断点的属性或者进行其他操作。

在选定列表中的断点后，点击 [image] 程序会运行到断点处并暂停，点击 [image] 断点会在启用和禁用状态中切换，点击 [image] 会立即删除掉这个断点，点击 [image] 会删除掉所有的断点。

2.1 设置中断条件

断点设置中断条件后，这个断点在符合这个条件下才会触发中断。断点的中断条件分为五种，分别为ON，OFF，上升沿，下降沿和边沿。

（1）中断条件“ON”

中断条件设置ON后，当前断点只有在输出ON时才会触发。以下为设置中断条件ON的例子。

这里设置了中断条件后，断点图元的右上方会设置标记，代表这个中断条件的类型。这里ON用1来表示。设置了条件后，若条件不合法就不会触发断点中断，在这里需要两条指令都导通的情况下才会中断。

注意，触发了断点中断后，程序就会停留在这个位置等待用户的下一个操作，后面的指令并没有执行，所以Y0没有被导通。

（2）中断条件“OFF”

与ON相反，OFF只有在输入OFF时才会触发。

（3）中断条件“上升沿”

在当前断点的输出从0到1变化时才会触发。

（4）中断条件“下降沿”

在当前断点的输出从1到0变化时才会触发。

（5）中断条件“边沿”

在当前断点的输出从0到1变化或者从1到0变化时才会触发，是以上两个条件的或集。

2.2 设置执行次数

设置了执行次数后，断点本来要被触发的情况也可能不会被触发，要累积一定次数后才会触发，触发后累积次数清0。这里有一个例子。

断点在这里触发之后，当前D0的值为7，由于要累计执行5次之后再触发这个断点，所以在此期间D0也会被累积增加5次。

3. 断点删除

可以通过断点列表窗口中的解除按钮，或者右键菜单中的“删除断点”，来删除这个断点。


SamSoarII软元件断点

软元件系统（Register Breakpoint System）是SamSoarII强大的仿真功能的一部分，和一般断点设置中断条件类似，满足了一定的条件后才会触发，不过软元件断点可以在满足条件下任意位置触发。

1. 设置软元件断点

点击菜单栏“视图”-->“软元件断点”，打开软元件断点列表来进行编辑。

1.1 添加软元件断点

点击 [image] 按钮，可以新建一个软元件断点。

一开始表项为空，必然是非法的。可以在里面填写以实现各样功能。以下为软元件断点的具体用例。

1. 当M0为ON时断点暂停。

可以这样填写：

进行仿真时，满足条件会触发断点并进入暂停状态。

2. 当M0发生变化时断点暂停。

可以这样填写：

3. 当单字D0大于单字D1时断点暂停。

可以这样填写：

4. 当浮点D0小于浮点D1时断点暂停。

可以这样填写：

2.2 启用/禁用软元件断点

通过 [image] 按钮来对下表选中的断点进行启用/禁用的切换。

2.3 删除软元件断点

通过 [image] 按钮来删除选中的软元件断点，通过 [image] 按钮来对删除所有的软元件断点。


SFC编程

与一代上位软件相比，SamSoarII支持了SFC（步进梯形图）的编程。以下几个章节主要介绍SamSoarII的SFC编辑功能。

1. 介绍SamSoarII的SFC模块

2. 在编辑模式下对SFC进行编辑

3. SFC的检查和编译

4. 在查看模式下通过SFC元件来导航


SFC简介

循序功能图（Sequential Function Chart, SFC）是IEC 61131-3 所规范的PLC 编程语言之一，其最大的特色在于以类似流程图的观念来规划程序，适用于着重流程控制及状态转移的控制程序。

SamSoarII的SFC大幅度简化了传统的SFC结构，保留了基本的逻辑框架，使得更为清晰易懂和操作简洁。

1. SamSoarII的SFC程序结构

整个SFC程序主要由状态节点和转移元件交替构成，状态节点包括普通状态节点和跳转节点，而转移元件分为一对一的单次转移，一对多的分支转移以及多对一的合并转移。如下为一个SamSoarII的SFC程序案例，最顶端为状态S0的状态节点，下面依次为单次转移，S1状态节点，单次转移，S2跳转节点，保证状态和转移交替进行。默认情况下，所有最顶行的状态节点被设为起始点。

图1.1 一个简单的SFC程序

2. SamSoarII的SFC运行原理

SamSoarII的SFC并不直接参与程序的运行，而是先通过编译生成STL顺序控制梯形图，然后编辑STL中的状态内的动作和状态之间的转移条件，最后才能生成一个完整的程序。所以，SFC在这里的定位是辅助生成STL程序的一个功能模块。以上面提到的SFC程序为例，初步转换后会生成以下的STL程序。基本逻辑保持一致，状态转移的条件用位置参数的LD指令来替代，来代表待编辑。

图1.2 转化后的STL程序

上步操作完成后，可以在梯形图下编辑完成STL程序。一般情况下，在STL指令下方来实现状态内的动作，将LD ???指令替换为状态之间的转移条件。以下为“在状态S0下输出Y0，并等待一秒后转移到S1”的具体案例。

图1.3 状态S0的动作和转移

3. SamSoarII的SFC元件

上面提到。SFC元件主要分为状态节点元件和转移元件，而状态节点又分为以下几类。

（1）普通状态节点

代表一个状态，到达这个状态后可以继续转移，所以下面可以和转移元件相连。

（2）跳转节点

同样也代表一个状态，但与普通状态节点不同，是以跳转的概念到达这个状态的，所以下面不能连接转移元件。

转移元件的种类更多，分为以下几类。

（1）单次转移

只带一个转移条件的一对一转移，当在上一个状态下符合转移条件后，会转移到下一个状态，上一个状态会被关闭。

图1.4 单次转移

其对应的梯形图为：

图1.5

（2）并行分支

在 SFC 程序中可以有并行处理的程序，这样的结构我们便称之为分支，而分歧结构依执行的机制可分为并行分支与选择分支。

下图为并行分支的图例，其中分支的步进点会刻意用双线来进行连结；而并行分支的特征便是所有分支的步进点会共享同一个转换点，当该转换点的条件成立之后，下方的所有步进点就会同时被启动，亦即所有的平行路径都会执行。

如下图，当转换点成立后，S0 便会关闭，而S1 及S2 则会一起启动。

图1.6 并行分支

其对应的梯形图为：

图1.7

（3）选择分支

下图为选择分歧的图例，其特征为所有分歧的步进点都会有各自的转换点，当其中某一个转换点的条件成立之后，执行权就会移转至该转换点下方的步进点，而其他的转换点则不再继续判断，因此在选择分歧的平行路径中，同时间只有一条路径的步进点程序会被执行。此外，如果有多个转换点条件同时成立时，执行权会同时转向这多个转换点。

如下图，当转换点1成立后，S0 便会关闭，而S1则会启动。同理转换点2成立后，S0 便会关闭，而S2则会启动。当转换点1和转换点2同时成立，S0 便会关闭，而S1 及S2 则会一起启动。

图1.8 选择分支

其对应的梯形图为：

图1.9

（4）选择并行分支

下图为选择并行分支的图例，选择并行分支实际上是选择分支和并行分支的结合，选择分支的每个转换点后面都套了一个并行分支。当其中某一个转换点的条件成立之后，执行权就会移转至下方并行分支的所有步进点。

如下图，当转换点1成立后，S0 便会关闭，而S1,S2则会启动。同理转换点2成立后，S0 便会关闭，而S3,S5则会启动。当转换点1和转换点2同时成立，S0 便会关闭，下面的所有状态全部同时启动。

图1.10 选择并行分支

其对应的梯形图为：

图1.11

（5）并行合并

在SFC的分支结构中，最后仍须将所有分支的路径再重新汇整在一起，而这样的汇整程序便称之为合并；如同分支结构一般，合并依执行的机制亦可分为并行合并与选择合并。

在图示中，并行合并的步进点之间亦刻意用双线来连结，而其特征则为所有分歧的步进点都会联结至同一个转换点，因此必须等待连接至该转换点上方的所有步进点都被启动后，转换点才可进行判断。如下图的范例，须先等待S1及S2都被启动后，转换点才会开始判断，而当转换点的条件成立时，S1及S2便会一起被关闭，并启动S3。

图1.12 并行合并

其对应的梯形图为：

图1.13

（6）选择合并

下图为选择合并的图例，其特征为所有合流的步进点都会有各自的转换点，而只要其中某一个转换点的条件成立之后，执行权就会先行移转至下一个的步进点；但若平行路径中仍有其他被启动的步进点时，则所有被启动的步进点仍会继续执行，一直到其合流的转换点成立之后，便会再次启动合流下方的步进点，因此选择合流有可能造成合流点下方的循序流程同时有多个步进点被启动，使用上请务必确认是否会造成程序上的错乱。

如下图，当转换点1成立时，S1便会关闭并直接将S3启动，而后续当转换点2的条件也成立时，S2便一样会被关闭，且不论S3 的状态为何，系统仍会再次启动S3。转换点2先成立，转换点1后成立的情况也一样。

图1.14 选择合并

其对应的梯形图为：

图1.15

（7）选择并行合并

下图为选择并行合并的图例，其特征是合并后的步进点前面为多个转换点，每个转换点前面又有多个并行连接到上一行的步进点。当转换点前面连接的步进点均在启动状态，并且转换条件成立后，执行权就会先行移转至下一个的步进点，同时前面并行连接的多个步进点均被关闭。

如下图，当S1和S2均为启动状态，并且转换点1成立时，S1,S2便会关闭并直接将S5启动。同理，当S3和S4均为启动状态，并且转换点2成立时，S3,S4便会关闭并直接将S5启动。所以S5可能因为上面两个转换点而被启动两次，这两次启动只和对应的转换点有关，之间是不相关的。

图1.16 选择并行合并

其对应的梯形图为：


SFC编辑

1. 使用SFC编辑器创建SFC梯形图

双击“工程资源管理器”-->“SFC编辑器”，即可打开SFC编辑器。

图1.1 SFC编辑器

一开始未选中对应的梯形图程序，所以SFC编辑界面是空的。可以在“当前程序”里选择要编辑的梯形图程序，如果这个程序之前未编辑过SFC，会生成一个简单的SFC样例程序。

图1.2 SFC样例程序

2. SFC基本编辑操作

SamSoarII支持一系列对SFC程序的修改操作，包括对元件的修改替换，对行和列的添加删除等。

（1）元件添加

 通过双击SFC梯形图中要添加元件的位置，或者绿色光标移动到该位置并按下回车键，会出现元件编辑对话框。

图1.3 编辑SFC元件

对话框的顶部可以选择元件的类型，不同的行能够选择的元件类型也不相同。一般来说，状态类的元件（状态节点，跳转节点）只能在偶数行（0,2,4,...,2n）的位置添加，转移类的元件（单次转移，分支，合并）只能在奇数行（1,3,5,...,2n+1)的位置添加，竖线连线可以在任意位置添加，这样做确保状态和转移之间能够合理的交替放置。

添加状态类的元件，需要输入对应的S类寄存器的名称，来制定这个节点对应的状态。

添加竖线和单次转移时，不用输入其他额外的东西，直接点击“确定”按钮即可添加。

图1.4

添加并行分支，选择分支，并行合并和选择合并时，需要在属性区域出现的文本框内输入一定规则的参数。如果这些元件添加到SFC梯形图中，需要制定每个转移点的列坐标，坐标用绝对位置第几列来表示（第0列用0表示，第1列用1表示，...，第N列用N表示），坐标之间用逗号’,’来分割区分。比如说，要添加一个转移点分别在第0列，第1列和第3列的条件分支，需要在属性里输入“0,1,3”，然后点击“确定”，就可以将对应元件添加进去了。

图1.5

添加选择并行分支，选择并行合并时，默认规定每个选择转移点需要和对应的第一个并行转移点的坐标一致，只需要输入所有并行转移点的列坐标即可，每个并行转移点的坐标值用’,’分隔，不同的选择转移点之间用’;’来分隔。比方说,在选择并行合并元件的属性框内输入“1,2;3,4,6”并点击确定，会添加列的起始位置为1，并行转移点坐标和所设置的一致的选择并行合并元件。

图1.6 添加前

图1.7 添加后

（2）行添加

通过右键菜单中的行添加，或者工具栏中的 [image] 按钮，或者快捷键Ctrl+Down，来添加一个新行。默认的行添加是在当前选择范围的下一行添加新行，右键菜单中可以选择添加行的位置（向前添加，向后添加，末尾添加）。

执行了行添加操作后，会强制添加两行，保证添加的行前后的状态类元件和转移类元件的交替性。如果添加的行前面有连线相连，会在新添加的行中添加对应的竖线。

（3）行删除

通过右键菜单中的行删除，或者工具栏中的 [image] 按钮，或者快捷键Ctrl+Shift+R，来删除选择范围内的行。删除的行后面的部分会向上移动偶数步，以保证交替性。

（4）列添加

通过右键菜单中的行添加，或者工具栏中的 [image] 按钮，或者快捷键Ctrl+Right，来添加一个新列。默认的列添加是在当前选择范围的下一列添加新列，右键菜单中可以选择添加列的位置（向前添加，向后添加，末尾添加）。

执行了列添加之后，所有的分支和合并元件可能会包含添加的列，其每个转移点的位置也会做相应的调整。

（5）列删除

通过右键菜单中的列删除，或者工具栏中的 [image] 按钮，或者快捷键Ctrl+Shift+C，来删除选择范围内的列。删除的列后面的部分会向左移动。


SFC检查和编译

1. 对SFC程序进行检查

SFC程序完成之后，可以点击SFC编辑器顶部工具栏的 [image] 按钮，来对SFC进行检查操作。检查出来的错误会与梯形图错误相同的方式来显示出来。

图1.1

修改完所有错误后，再进行检查，会提示检查成功，并对SFC梯形图进行重新排版。

2. 编译SFC程序

可以点击SFC编辑器顶部工具栏的 [image] 按钮，来对SFC进行编辑并在梯形图程序中生成对应的STL结构。以下面的SFC程序为例。

图1.2

编译成功之后，会在对应的梯形图程序生成对应的STL程序。

图1.3

编译成功后，可以切换到查看模式，通过从SFC导航到梯形图的形式，来完成整个程序。

要注意，SFC编辑器只能在梯形图中添加STL结构，没有权限来删除梯形图的部分。所以若要连续编译，请手动删除之前编译生成的STL结构，确保生成的程序的正确性。


SFC查看模式

对SFC的编译成功后，工具栏中的 [image] 会被选中，表示可以进入查看模式了。点击这个按钮来进入查看模式。

在查看模式下，双击SFC元件，界面就会自动导航到对应的梯形图位置。以上面的SFC程序为例，双击行2的第一个条件。

 图1.1

双击过后，主界面会自动跳转到对应的梯形图的位置。

图1.2

在这个位置更改完毕后，可以返回SFC编辑器，通过这样的查看-导航模式来完成剩余的部分。如果对STL顺序控制较为熟悉，也可以停留在梯形图界面内，直接修改STL结构。


SamSoarII系统寄存器

系统寄存器
存器名称 | 范围 | 存储单位 | 掉电保持范围
输入触点X | [0,128) | BOOL | 无
输出线圈Y | [0,128) | BOOL | 无
模拟输入寄存器AI | [0,32) | WORD | 无
模拟输出寄存器AO | [0,32) | WORD | 无
位寄存器M | [0,8192) | BOOL | [7488,8000)
数据寄存器D | [0,8192) | WORD | [5952,8000)
变址寄存器V | [0,8) | WORD | 无
变址寄存器Z | [0,8) | WORD | 无
系统状态寄存器S | [0,1000) | BOOL | [600,1000)
计数器CV | [0, 235)低速，[235, 256)高速 | [0,200)WORD, [200, 256)DWORD | [100,200), [220,235)
定时器TV | [0,256) | WORD | 无
计数器开关量C | [0,256) | BOOL | 无
定时器开关量T | [0,256) | BOOL | 无

系统特殊功能寄存器
存器名称 | 功能 | 读写权限
数据寄存器D
D_8066 | COM0（232）站号，范围1~127 （附：D8066~D8075需掉电重启后才生效） | Read & Write
D_8067 | COM1（485）站号，范围1~127 | Read & Write
D_8068 | COM0（232）波特率，范围0~7，分别对应配置信息中的1200~115200波特率 | Read & Write
D_8069 | COM1（485）波特率，范围0~7，分别对应配置信息中的1200~115200波特率 | Read & Write
D_8070 | COM0（232）数据位,范围0，对应数据位为8 | Read & Write
D_8071 | COM1（485）数据位,范围0，对应数据位为8 | Read & Write
D_8072 | COM0（232）停止位,范围0~1，对应停止位为1、2 | Read & Write
D_8073 | COM1（485）停止位,范围0~1，对应停止位为1、2 | Read & Write
D_8074 | COM0（232）校验码，范围0~2，对应校验码为NONE、EVEN、ODD | Read & Write
D_8075 | COM1（485）校验码，范围0~2，对应校验码为NONE、EVEN、ODD | Read & Write
D_8076 | Y000原点回归加减速时间 | Read & Write
D_8077 | Y001原点回归加减速时间 | Read & Write
D_8078 | Y002原点回归加减速时间 | Read & Write
D_8079 | Y003原点回归加减速时间 | Read & Write
D_8092 | Y000绝对，相对定位指令的加减速时间 | Read & Write
D_8093 | Y001绝对，相对定位指令的加减速时间 | Read & Write
D_8094 | Y002绝对，相对定位指令的加减速时间 | Read & Write
D_8095 | Y003绝对，相对定位指令的加减速时间 | Read & Write
D_8108 | Y000出错脉冲段编号（用于多段脉冲） | Read
D_8109 | Y001出错脉冲段编号（用于多段脉冲） | Read
D_8110 | Y002出错脉冲段编号（用于多段脉冲） | Read
D_8111 | Y003出错脉冲段编号（用于多段脉冲） | Read
D_8124 | Y000当前脉冲段（用于多段脉冲） | Read
D_8125 | Y001当前脉冲段（用于多段脉冲） | Read
D_8126 | Y002当前脉冲段（用于多段脉冲） | Read
D_8127 | Y003当前脉冲段（用于多段脉冲） | Read
D_8140(D_8141) | Y000的32位脉冲累积计数 | Read & Write
D_8142(D_8143) | Y001的32位脉冲累积计数 | Read & Write
D_8144(D_8145) | Y002的32位脉冲累积计数 | Read & Write
D_8146(D_8147) | Y003的32位脉冲累积计数 | Read & Write
D_8173 | 中断定时器0设定值，设定值范围1~32767ms | Read & Write
D_8174 | 中断定时器1设定值，设定值范围1~32767ms | Read & Write
D_8175 | 当前扫描周期（0.1ms） | Read
D_8176 | ERROR状态错误编号 | Read & Write
D_8177 | 最大扫描周期（0.1ms） | Read & Write
D_8178 | PLC系统实时时钟--年 | Read
D_8179 | PLC系统实时时钟--月 | Read
D_8180 | PLC系统实时时钟--日 | Read
D_8181 | PLC系统实时时钟--时 | Read
D_8182 | PLC系统实时时钟--分 | Read
D_8183 | PLC系统实时时钟--秒 | Read
D_8184 | PLC系统实时时钟--保留 | Read
D_8185 | PLC系统实时时钟--星期 | Read
线圈寄存器M
M_8035~M_8045 | 预留 | Read & Write
M_8046 | 扩展模块初始化错误标志位 | Read
M_8051 | 高速计数器C251倍频设置（1—四倍频0—一倍频） | Read & Write
M_8052 | 高速计数器C252倍频设置（1—四倍频0—一倍频） | Read & Write
M_8053 | 预留 | Read & Write
M_8054 | 高速计数器C254倍频设置（1—四倍频0—一倍频） | Read & Write
M_8055 | 预留 | Read & Write
M_8070 | Y000是否忽略错误，继续发送脉冲，默认忽略为0；停止脉冲输出为1 | Read & Write
M_8071 | Y001是否忽略错误，继续发送脉冲，默认忽略为0；停止脉冲输出为1 | Read & Write
M_8072 | Y002是否忽略错误，继续发送脉冲，默认忽略为0；停止脉冲输出为1 | Read & Write
M_8073 | Y003是否忽略错误，继续发送脉冲，默认忽略为0；停止脉冲输出为1 | Read & Write
M_8086 | Y000检查每段用户设置脉冲个数和频率是否正确(用于多段脉冲) | Read
M_8087 | Y001检查每段用户设置脉冲个数和频率是否正确(用于多段脉冲) | Read
M_8088 | Y002检查每段用户设置脉冲个数和频率是否正确(用于多段脉冲) | Read
M_8089 | Y003检查每段用户设置脉冲个数和频率是否正确(用于多段脉冲) | Read
M_8102 | Y000脉冲方向，正方向为1 | Read
M_8103 | Y001脉冲方向，正方向为1 | Read
M_8104 | Y002脉冲方向，正方向为1 | Read
M_8105 | Y003脉冲方向，正方向为1 | Read
M_8118 | Y000脉冲累积计数溢出标记，溢出为1 | Read
M_8119 | Y001脉冲累积计数溢出标记，溢出为1 | Read
M_8120 | Y002脉冲累积计数溢出标记，溢出为1 | Read
M_8121 | Y003脉冲累积计数溢出标记，溢出为1 | Read
M_8134 | Y000脉冲正在输出 | Read
M_8135 | Y001脉冲正在输出 | Read
M_8136 | Y002脉冲正在输出 | Read
M_8137 | Y003脉冲正在输出 | Read
M_8150 | 第一个扫描周期接通，接通一个扫描周期 | Read
M_8151 | 程序运行时闭合 | Read
M_8152 | 程序运行时断开 | Read
M_8153 | RTC电池电压低（注:1-ERROR 0-OK ） | Read
M_8154 | DC24V故障（注:1-ERROR 0-OK ） | Read
M_8155 | IO配置错误（注:1-ERROR 0-OK ） | Read
M_8156 | PLC硬件错误（注:1-ERROR 0-OK ） | Read
M_8157 | 输出刷新错误（注:1-ERROR 0-OK ） | Read
M_8158 | 10ms时钟脉冲输出（注:1-HIGH 0-LOW ） | Read
M_8159 | 100ms时钟脉冲输出（注:1-HIGH 0-LOW ） | Read
M_8160 | 1sec时钟脉冲输出（注:1-HIGH 0-LOW ） | Read
M_8161 | 1min时钟脉冲输出（注:1-HIGH 0-LOW ） | Read
M_8162 | 非掉电保持区内存全部清除（ 注:1-CLEAR 0-NONE ） | Read & Write
M_8163 | 掉电保持区内存全部清除（ 注:1-CLEAR 0-NONE ） | Read & Write
M_8164 | 所有输出禁止（注:1-DISABLE 0-ENABLE ） | Read & Write
M_8165 | 位移动指令方向指示（注:1-LEFT 0-RIGHT ） | Read
M_8166 | 移位指令溢出位（注:1-ERROR 0-OK ） | Read
M_8167 | 移位指令零标志（注:1-ERROR 0-OK ） | Read
M_8168 | BCD转换错误标记（注:1-ERROR 0-OK ） | Read
M_8169 | 运算结果溢出（注:1-ERROR 0-OK ） | Read
M_8170 | 运算负结果（注:1-ERROR 0-OK ） | Read
M_8171 | 运算结果为零（注:1-ERROR 0-OK ） | Read
M_8172 | 除数为零（注:1-ERROR 0-OK ） | Read
M_8173 | 偏移地址越界（注:1-ERROR 0-OK ） | Read
M_8174 | 错误状态（注:1-ERROR 0-OK ） | Read
M_8175 | 运行状态（注:1-RUN 0-STOP ） | Read
M_8176 | COM0（232）正在发送标志 | Read
M_8177 | COM1（485）正在发送标志 | Read
M_8178 | COM0（232）正在接收标志 | Read
M_8179 | COM1（485）正在接收标志 | Read
M_8180 | COM0（232）发送完成标志 | Read & Write
M_8181 | COM1（485）发送完成标志 | Read & Write
M_8182 | COM0（232）接收完成标志 | Read & Write
M_8183 | COM1（485）接收完成标志 | Read & Write
M_8184 | 扩展模块1传输数据错误标志位 | Read
M_8185 | 扩展模块2传输数据错误标志位 | Read
M_8186 | 扩展模块3传输数据错误标志位 | Read
M_8187 | 扩展模块4传输数据错误标志位 | Read
M_8188 | 扩展模块5传输数据错误标志位 | Read
M_8189 | 扩展模块6传输数据错误标志位 | Read
M_8190 | 扩展模块7传输数据错误标志位 | Read
M_8191 | 扩展模块8传输数据错误标志位 | Read


通信协议

1.MODBUS简介

FGs系列PLC采用的是MODBUS通信协议。Modbus 协议是应用于控制器上的一种通用语言。通过此协议，控制器相互之间、控制器经由网络和其它设备之间可以通信。通讯采用应答方式，由主机发起请求，从机执行请求并且应答。PLC最大从站数为127个，设置的范围为1~127。

2.接口方式

目前PLC支持MODBUS通信的接口为RS232、RS485以及USB接口。

串口通信默认的数据格式为：9600bps、8位数据位、1位停止位，无校验。波特率的可设置范围是：1200bps、2400bps、4800bps、9600bps、19200bps、38400bps、57600bps、115200bps

3.协议格式

协议支持的是MODBUS的RTU模式

从机地址

功能码

数据

CRC高字节

CRC低字节

4.功能码描述

本系列PLC支持的功能码如下：

功能码 | 名称 | 作用 | 支持的寄存器
0x01 | 读取线圈状态 | 取得一组逻辑线圈的当前状态（ON/OFF） | Y、X、M、S、T、C
0x02 | 读取输入状态 | 取得一组开关输入的当前状态（ON/OFF） | X
0x03 | 读取保持寄存器 | 在一个或多个保持寄存器中取得当前的二进制值 | D、TV、CV、CV32、AI、AO
0x04 | 读取输入寄存器 | 在一个或多个输入寄存器中取得当前的二进制值 | 无
0x05 | 强置（写）单线圈 | 写一个逻辑线圈的通断状态 | Y、M、S、T、C
0x06 | 预置（写）单寄存器 | 把具体二进值装入一个数据寄存器 | D、TV、CV、CV32、AI、AO
0x08 | 回送诊断校验 | 把诊断校验报文送从机，以对通信处理进行评鉴 | 无
0x0f | 强置（写）多线圈 | 强置（写）一串连续逻辑线圈的通断 | Y、M、S、T、C
0x10 | 预置（写）多寄存器 | 把具体的二进制值装入一串连续的保持寄存器 | D、TV、CV、CV32、AI、AO

5.地址偏移表

寄存器 | 地址范围 | 数据类型 | 读功能码 | 写功能码 | 对应modbus 地址加上偏移量
X | 0~127 | bit | 0x01/0x02 | 0x05 | 0
EX | 0~511 | bit | 0x01/0x02 | 0x05 | 512
Y | 0~127 | bit | 0x01 | 0x05/0x0f | 10000
EY | 0~511 | bit | 0x01/0x02 | 0x05 | 10512
M | 0~8191 | bit | 0x01 | 0x05/0x0f | 30000
S | 0~999 | bit | 0x01 | 0x05/0x0f | 50000
T | 0~255 | bit | 0x01 | 0x05/0x0f | 60768
C | 0~255 | bit | 0x01 | 0x05/0x0f | 60512
D | 0~8191 | word | 0x03/0x04 | 0x06/0x10 | 40000
TV | 0~255 | word | 0x03 | 0x06/0x10 | 60256
CV | 0~199 | word | 0x03 | 0x06/0x10 | 60000
CV32 | 200~255 | dword | 0x03 | 0x06/0x10 | 60000
AI | 0~31 | word | 0x03 | 0x06/0x10 | 20000
EAI | 0~79 | word | 0x03 | 0x06/0x10 | 20100
AO | 0~31 | word | 0x03 | 0x06/0x10 | 20512
EAO | 0~79 | word | 0x03 | 0x06/0x10 | 20612

 1. CV32不能使用标准的MODBUS协议去访问。

 2. EX,EY,EAI,EAO分别为X,Y,AI,AO的扩展模块部分。


扩展模块

扩展模块是在PLC基本单元功能的扩展和延伸，直观上达到了输入输出点数的增加，更重要的是增加了用户项目开发的灵活性和便利性。

目前所支持的模块包括：数字量模块：FGs-E8X、FGs-E8T、FGs-E8R、FGs-E8X8T、FGs-E8X8R、FGs-E16X、FGs-E16T、FGs-E16R；

模拟量模块：FGs-E4AI、FGs-E2AO、FGs-E4AI2AO、FGs-E4TC。

FGs-E系列PLC扩展模块不仅具有强大的逻辑处理、数据运算、高速处理等功能，而且具有基本的输入输出、 A/D、 D/A转换等功能， 通过使用输入输出模块、模拟量模块、 温度控制模块等等，使FGs-E系列的PLC 在温度、流量、 液位、压力等过程控制系统中得到了广泛的应用。

1. 模块型号及功能

型号 | 功能
FGs-E8X | 8通道数字量输入模块
FGs-E8T | 8通道数字量晶体管输出模块
FGs-E8R | 8通道数字量继电器输出模块
FGs-E8X8T | 8通道数字量输入，8通道数字量晶体管输出模块
FGs-E8X8R | 8通道数字量输入，8通道数字量继电器输出模块
FGs-E16X | 16通道数字量输入模块
FGs-E16T | 16通道数字量晶体管输出模块
FGs-E16R | 16通道数字量继电器输出模块
FGs-E4AI | 4通道模拟量输入（12-bit）模块，输入电压电流均可选
FGs-E2AO | 2通道模拟量输出（16-bit）模块，输出电压电流均可选
FGs-E4AI2AO | 4通道模拟量输入（12-bit），2通道模拟量输出（16-bit）模块，输入输出电压电流均可选
FGs-E4TC | 4通道模拟量输入（16-bit）模块，输入PT100、K型热电偶均可选

FGs-E系列扩展模块可以安装在FGs系列PLC的主单元、扩展模块右边：

输入输出开关量序号为八进制

输入输出模拟量序号为十进制，每个模块固定占四个寄存器，如有缺失通道则不作使用

PLC本体最多可以外接8个扩展模块，种类不受限制，可以为输入输出开关量，也可以是模拟量、温度控制模块等。

2.SAMSOAII中的配置

模块在使用时，首先需要在 PLC 的上位机编程软件 SamSoII中进行相应的配置，方可正常使用模块。下面以模块 FGs-E4AI2AO 为例，说明如何在SAMSOARII中进行配置，步骤如下所示：
A、 打开编程软件，点击菜单栏：工程 > PLC参数设置；或直接点击图标 [image] ，将弹出系统参数设置对话框，如下图所示

C、 然后选择“扩展模块设置”，将切换到“扩展模块设置”页面，如下图所示：

D、 勾选“使用扩展功能”，启动扩展模块功能，如下图所示：

然后选择目标模块类型，并勾选“启用”来激活此模块，此时模块类型列表中会显示出对应序号的模块类型（FGs-E4AI2AO为例），

点击输入部分的“通道”右侧的下拉框进行通道切换，勾选“启用”后，相应的通道才可以使用，不同的通道有不同的通道参数，参数主要包括：模式、平均采样次数、数字量范围；输出部分与输入雷同。需要注意的是每个模拟量模块都会固定占用4个AI或4个AO寄存器，即使没有使用。另外系统根据模块的序列和相应模块的类型自动在对话框页面右下方提示模块寄存器的地址。

3. 模拟量输入输出模块FGs-E4AI2AO

本章主要介绍 FGs-E4AI2AO模块的规格、端子说明、输入定义号的分配、 工作模式设定、 外部连接以及模数转换图。

3.1 模块特点及规格

FGs-E4AI2AO模拟量输入输出模块将 4点模拟输入数值（电压输入， 电流输入）转换成数字值，并且把他们传输到 PLC 主单元，同时还可以将2点模拟量输出的数值（电压输出，电流输出）转换成模拟量的输出。

*  4通道模拟量输入：电压输入或电流输入自由选择，其中电压输入有0～5V、 0～10V 两种模式；电流输入有 4～20mA 模式。
 *  12 位的高精度模拟量输入和16位的高精度模拟量输出。
 *  作为FGs-E系列的特殊功能模块，最多可在 PLC 主单元右边连接6台 FGs-E4AI2AO 模块。
 *  FGs-E4AI2AO模拟、数字部分电源隔离处理。

模块规格:

项目 | 电压输入 | 电流输入 | 电压输出 | 电流输出
模拟量输入范围 | 0～5V、 0～10V | 4～20mA | 0～5V、 0～10V | 4～20mA
最大输入输出范围 | ±15V | 0～40mA | ±15V | 0～40mA
数字输入输出范围 | 12位二进制数 |  | 16位二进制数
分辨率 | 1/4095（ 12Bit） |  | 1/65535（16Bit）
综合精确度 | 1‰ |  | 1‰
转换速度 | 20ms/通道 |  | 20ms/通道
模拟量用电源 | DC24V±10%， 100mA
3.2 端子说明

端子信号

 | 通道 | 端子名 | 信号名
模拟量输入 | 输入CH0 | A+ | A模拟量+
 |  | RA | 如果是电流输入需与A+短接
 |  | A- | A模拟量-
 | 输入CH1 | B+ | B模拟量+
 |  | RB | 如果是电流输入需与B+短接
 |  | B- | B模拟量-
 | 输入CH2 | C+ | C模拟量+
 |  | RC | 如果是电流输入需与C+短接
 |  | C- | C模拟量-
 | 输入CH3 | D+ | D模拟量+
 |  | RD | 如果是电流输入需与D+短接
 |  | D- | D模拟量-
模拟量输出 | 输出CH0 | V0 | A输出+（电压）
 |  | I0 | A输出+（电流）
 |  | M0 | A输出-
 | 输出CH1 | V1 | B输出+（电压）
 |  | I1 | B输出+（电流）
 |  | M1 | B输出-
485 | - | 485A | 485通讯+
 | - | 485B | 485通讯-

注：485只作从机使用

3.3 输FGs-E4AI2AO 接线示意图

3.3.1模拟量电压输入

3.3.2模拟量电流输入

3.3.3 模拟量电压输出

3.3.4 模拟量电流输出

3.4 输入输出定义号分配

连续8个FGs-E4AI2AO扩展模块寄存器定义号：

 | 扩展模块1 | 扩展模块2 | 扩展模块3 | 扩展模块4 | 扩展模块5 | 扩展模块6 | 扩展模块7 | 扩展模块8
输入通道 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号
输入CH0 | AI100 | AI110 | AI120 | AI130 | AI140 | AI150 | AI160 | AI170
输入CH1 | AI101 | AI111 | AI121 | AI131 | AI141 | AI151 | AI161 | AI171
输入CH2 | AI102 | AI112 | AI122 | AI132 | AI142 | AI152 | AI162 | AI172
输入CH3 | AI103 | AI113 | AI123 | AI133 | AI143 | AI153 | AI163 | AI173
输出通道 | DA信号 | DA信号 | DA信号 | DA信号 | DA信号 | DA信号 | DA信号 | DA信号
输出CH0 | AO100 | AO110 | AO120 | AO130 | AO140 | AO150 | AO160 | AO170
输出CH1 | AO101 | AO111 | AO121 | AO131 | AO141 | AO151 | AO161 | AO171

3.5 模数转换图

0~5V模拟量输入数字量对应关系

0~10V模拟量输入数字量对应关系

4~20mA模拟量输入数字量对应关系

同样的道理也适用于模拟量输出，不过输出的精度是16bit，即1/65535。

4.模拟量温度模块FGs-E4TC

本章主要介绍 FGs-E4TC模块的规格、端子说明、输入定义号的分配、 工作模式设定、 外部连接以及模数转换图。

4.1 FGs-E4TC模块特点及规格

FGs-E4TC模拟量输入输出模块将 4点温度的模拟量转换成数字值，并且把他们传输到 PLC 主单元。

*  4通道温度模拟量输入：支持K型热电偶或PT100热电阻两种传感器。
 *  16 位的高精度模拟量输入。
 *  作为FGs-E系列的特殊功能模块，最多可在 PLC 主单元右边连接6台 FGs-E4TC模块。
 *  FGs-E4TC模拟、数字部分电源隔离处理。

模块规格

项目 | PT100 | K型热电偶
数字输入输出范围 | 16位二进制数
分辨率 | 1/65535（ 16 Bit）
综合精确度 | 1‰
转换速度 | 20ms/通道
模拟量用电源 | DC24V±10%， 100mA

4.2 FGs-E4TC端子说明

FGs-E4TC端子信号

 | 通道 | 端子名 | 信号名
温度输入 | 输入CH0 | A0 | CH0热电阻、热电偶输入端
 |  | A1 | CH0热电阻、热电偶输入公共端
 |  | A3 | CHO热电阻A0同色端（三线制）
 | 输入CH1 | B0 | CH1热电阻、热电偶输入端
 |  | B1 | CH1热电阻、热电偶输入公共端
 |  | B3 | CH1热电阻B0同色端（三线制）
 | 输入CH2 | C0 | CH2热电阻、热电偶输入端
 |  | C1 | CH2热电阻、热电偶输入公共端
 |  | C3 | CH2热电阻C0同色端（三线制）
 | 输入CH3 | D0 | CH3热电阻、热电偶输入端
 |  | D1 | CH3热电阻、热电偶输入公共端
 |  | D3 | CH3热电阻D0同色端（三线制）
485 | - | 485A | 485通讯+
 | - | 485B | 485通讯-

注：485只作从机使用

4.3 输FGs-E4TC 接线示意图

4.3.1  K型热电偶

4.3.2  PT100型热电阻

4.4 FGs-E4TC 输入输出定义号分配

连续8个FGs-E4TC模块寄存器定义号

 | 扩展模块1 | 扩展模块2 | 扩展模块3 | 扩展模块4 | 扩展模块5 | 扩展模块6 | 扩展模块7 | 扩展模块8
通道 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号 | AD信号
输入CH0 | AI100 | AI110 | AI120 | AI130 | AI140 | AI150 | AI160 | AI170
输入CH1 | AI101 | AI111 | AI121 | AI131 | AI141 | AI151 | AI161 | AI171
输入CH2 | AI102 | AI112 | AI122 | AI132 | AI142 | AI152 | AI162 | AI172
输入CH3 | AI103 | AI113 | AI123 | AI133 | AI143 | AI153 | AI163 | AI173

5.数字量模块

FGs-E8X\FGs-E8T\FGs-E8R\FGs-E8X8T\FGs-E8X8R\FGs-E16X\FGs-E16T\FGs-E16R

5.1 模块特点及规格

FGs-E8X\FGs-E8T\FGs-E8R\FGs-E8X8T\FGs-E8X8R\FGs-E16X\FGs-E16T\FGs-E16R数字量输入输出模块,每个基本单元可扩展 8 个模块，模块种
类丰富，外形小巧，为更多的输入和输出点提供了可能，满足了实际生产需要。

*  晶体管输出的频率最大为200Hz，继电器则建议不要超过10Hz

*  数字量输入采用兼容设计，可以根据SS的状态来选择NPN输入或是PNP输入，接收的动作间隔最快不能超过200Hz

5.2 数字量模块端子说明

FGs-E8X、FGs-E8T、FGs-E8R、FGs-E8X8T、FGs-E8X8R（FGs-E8T、FGs-E8X8T的COM0\COM1\COM2内部短接）

FGs-E16X

FGs-E16T、FGs-E16R（FGs-E16T的COM0\COM1\COM2内部短接，COM10\COM11\COM12内部短接）

5.3 数字量模块输入输出定义号分配

连续8个数字量扩展模块寄存器定义号

 | 扩展模块1 |  | 扩展模块2 |  | 扩展模块3 |  | 扩展模块4
类型 | X信号 | Y信号 | X信号 | Y信号 | X信号 | Y信号 | X信号 | Y信号
FGs-E8X | X1000-X1007 | - | X1100-X1107 | - | X1200-X1207 | - | X1300-X1307 | -
FGs-E8T\FGs-E8R | - | Y1000-Y1007 | - | Y1100-Y1107 | - | Y1200-Y1207 | - | Y1300-Y1307
FGs-E8X8T\FGs-E8X8R | X1000-X1007 | Y1000-Y1007 | X1100-X1107 | Y1100-Y1107 | X1200-X1207 | Y1200-Y1207 | X1300-X1307 | Y1300-Y1307
FGs-E16X | X1000-X1017 | - | X1100-X1117 | - | X1200-X1217 | - | X1300-X1317 | -
FGs-E16T\FGs-E16R | - | Y1000-Y1017 | - | Y1100-Y1117 | - | Y1200-Y1217 | - | Y1300-Y1317

 | 扩展模块5 |  | 扩展模块6 |  | 扩展模块7 |  | 扩展模块8
类型 | X信号 | Y信号 | X信号 | Y信号 | X信号 | Y信号 | X信号 | Y信号
FGs-E8X | X1400-X1407 | - | X1500-X1507 | - | X1600-X1607 | - | X1700-X1707 | -
FGs-E8T\FGs-E8R | - | Y1400-Y1407 | - | Y1500-Y1507 | - | Y1600-Y1607 | - | Y1700-Y1707
FGs-E8X8T\FGs-E8X8R | X1400-X1407 | Y1400-Y1407 | X1500-X1507 | Y1500-Y1507 | X1600-X1607 | Y1600-Y1607 | X1700-X1707 | Y1700-Y1707
FGs-E16X | X1400-X1417 | - | X1500-X1517 | - | X1600-X1617 | - | X1700-X1717 | -
FGs-E16T\FGs-E16R | - | Y1400-Y1417 | - | Y1500-Y1517 | - | Y1600-Y1617 | - | Y1700-Y1717

6.异常情况说明

6.1 异常时的指示灯情况

扩展模块正常状态下：ERR灯(红灯)常灭，PWR灯常亮，RUN灯闪烁。

异常情况 | 数字量模块 | FGs_E4AI2AO | FGs_E4TC
RUN灯不闪 | - | - | 温度采样芯片异常，请检查外部24V电源
ERR灯闪，RUN灯正常 |  | 模拟量输出异常，请检查外部24V电源 |
ERR灯闪，RUN灯变暗 | 模块与PLC通讯线上有干扰，会影响数据的实时性。但不会造成错误的输入输出
ERR灯亮 | 情况1：PLC未正确识别模块，请检查配置信息，并断电重试
 | 情况2：输入/输出数据一直处于异常状态

6.2 异常时的标志位寄存器

 | 特殊寄存器 | 功能
初始化过程 | M[8046] | 所有扩展模块中任一初始化失败时都会置1
数据传输过程 | M[8184] | 扩展模块1传输数据错误时置1
 | M[8185] | 扩展模块2传输数据错误时置1
 | M[8186] | 扩展模块3传输数据错误时置1
 | M[8187] | 扩展模块4传输数据错误时置1
 | M[8188] | 扩展模块5传输数据错误时置1
 | M[8189] | 扩展模块6传输数据错误时置1
 | M[8190] | 扩展模块7传输数据错误时置1
 | M[8191] | 扩展模块8传输数据错误时置1


硬件手册

一、硬件参数表

项目 | FGs-64MR-A | FGs-32MR-A | FGs-16MR-A | FGs-64MT-A | FGs-32MT-A | FGs-16MT-A
尺寸(mm) | 216*92*80 | 147.6*92*80 | 109.5*92*80 | 216*92*80 | 147.6*92*80 | 109.5*92*80
重量(g) | 831 | 590 | 465 | 769 | 563 | 464
功耗 | 6.8W | 5.2W | 3.2W | 3.6W | 3W | 2.6W
SINK/SRCE输入接线 | 借由内部共点端子S/S及外部共线的接线来变换
输入信号电压 | 24VDC±10%
输入滤波 | 0~50ms可调
数字量输入 | 32 | 16 | 8 | 32 | 16 | 8
输入信号逻辑0 限值 | X000~X003最大10.6VDC，X004~X037最大12.2VDC | X000~X001最大10.6VDC，X002~X017最大12.2VDC | X000~X001最大10.6VDC，X002~X007最大12.2VDC | X000~X003最大10.6VDC，X004~X037最大12.2VDC | X000~X001最大10.6VDC，X002~X017最大12.2VDC | X000~X001最大10.6VDC，X002~X007最大12.2VDC
输入信号逻辑1限值 | X000~X003最小11.5VDC，X004~X037最小15.6VDC | X000~X001最小11.5VDC，X002~X017最小15.6VDC | X000~X001最小11.5VDC，X002~X007最小15.6VDC | X000~X003最小11.5VDC，X004~X037最小15.6VDC | X000~X001最小11.5VDC，X002~X017最小15.6VDC | X000~X001最小11.5VDC，X002~X007最小15.6VDC
模拟输入 | 无
高速计数 | 2路分别最高150KHz
AB相计数 | 1路最高150KHz
输出类型 | 继电器 |  |  | 晶体管
输出电压 | < 250VAC，30VDC |  |  | 6~30VDC
最大感应负载 | 80VA |  |  | 12W
最大电阻负载 | 1.2A/1点 |  |  | 0.5A/高速分别最高150KHz（Y0/Y1/Y2/Y3）；0.2A/低速200Hz (Y4~Y37)，共点不能超过3A | 0.5A/高速分别最高150KHz（Y0/Y1）；0.2A/低速200Hz (Y2~Y17)，共点不能超过3A | 0.5A/高速分别最高150KHz（Y0/Y1）；0.2A/低速200Hz (Y2~Y7)，共点不能超过3A
数字输出 | 32 | 16 | 8 | 32 | 16 | 8
脉冲输出 | ON/OFF用，不适合作频繁交换用途 |  |  | 4路分别最高150KHz | 2路分别最高150KHz | 2路分别最高150KHz
模拟量输出 | 无
扩展模块 | 8
X寄存器数量 | 128
Y寄存器数量 | 128
电源功率 | 30W
扩展模块负载 | 24VDC，200mA
工作电压（外部供电电压） | AC 100V ~ 240V
隔离保护 | 隔离3600V
容许瞬间断电时间 | 50ms
24V输出 | 隔离
工作环境温度 | 密闭：5℃～40℃，开放：5℃～55℃
保存环境温度 | -25℃~70℃
工作环境湿度 | 5～95%RH
保存环境湿度 | 5～95%RH
使用环境 | 无腐蚀性、可燃性气体，导电性尘埃不严重的地点
抗电磁干扰 | 由电磁干扰电压1000Vp-p、电磁干扰幅度1μS、上升沿触发1ns、周期30-100Hz的电磁干扰模拟器
防震度 | 10-25HZ(XYZ方向 2G/30分钟）
输入软件防抖功能 | 有
输入设备连接错误检测功能 | 有
掉电保存软件防抖功能 | 有
RS232 | 1个 mini232接口 支持下载，监视，串口通信 波特率 4800Bps~115200 Bps
RS485 | 1个 支持串口通信 波特率4800 Bps ~115200 Bps
RJ45 | 无
USB设备口 | 支持下载，在线监视
通讯协议 | 支持FGs 通信协议，Modbus RTU 主站，Modbus RTU从站， 自由协议通信 Modbus主站支持连接128个从站
电磁相容性(EMC) EN61000-6-4:2007+A1：2011 EN61000-6-2:2005 EN61000-3-2:2006+A1：2009+A2：2009 EN61000-3-3:2008 | 辐射噪音测试 传导噪音测试 抗静电能力测试
FCC Part 15 Subpart B(FCC) FCC:ANSI C63.4:2003 | PASS
抗静电 | +/-8KV

二、PLC输出端信号接线示意图

晶体管输出（漏型）连接示例：

继电器输出连接示例：

三、电源及输入端连接方式

DC24V输入的连接示意图（DC电源供电）

DC24V输入的连接示意图（AC电源供电）


联系方式

创新 专业 引领 共赢

深圳市显控科技股份有限公司

Shenzhen Samkoon Technology Corporation Ltd。

地址：深圳市南山区高新中区深圳软件园一期1栋3楼

Address：ShenZhen Software Park 1st Building 3rd floor,the middle road of

High-tech zone，NanShan district,ShenZhen,China

电话(TEL)：0755—29419028 0755—29419038

0755—29419068 0755—29419098

传真（FAX）：0755-29455559

E-Mail：samkoon@samkoon.com.cn

公司网址：Http://www.samkoon.com.cn


双字相与 ANDD

对应命令 | 注释/说明 | 操作数（寄存器）
ANDD | 双字相与 | K/H/D,K/H/D,D

1. 指令说明

指令对输入双字（IN1）和（IN2）执行与操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 双字 | K/H/D | 要参加运算的操作数1
IN2 | 双字 | K/H/D | 要参加运算的操作数2
OUT | 双字 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

ANDD    D0      D2      D4 // 将D0D1与D2D3进行与操作，并将结果输出到D4D5

梯形图：


反转双字 INVD

对应命令 | 注释/说明 | 操作数（寄存器）
INVD | 双字取反 | K/H/D,D

1. 指令说明

指令对输入双字（IN）执行取反操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN | 双字 | K/H/D | 要参加运算的操作数
OUT | 双字 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

INVD    D0      D2 // 将D0D1取反输出到D2D3

梯形图：


双字相或 ORD

对应命令 | 注释/说明 | 操作数（寄存器）
ORD | 双字相或 | K/H/D,K/H/D,D

1. 指令说明

指令对输入双字（IN1）和（IN2）执行或操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 双字 | K/H/D | 要参加运算的操作数1
IN2 | 双字 | K/H/D | 要参加运算的操作数2
OUT | 双字 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

ORD     D0      D2      D4   // 将D0D1与D2D3进行或操作，并将结果输出到D4D5

梯形图：


双字异或 XORD

对应命令 | 注释/说明 | 操作数（寄存器）
XORD | 双字异或 | K/H/D,K/H/D,D

1. 指令说明

指令对输入双字（IN1）和（IN2）执行异或操作，并将结果载入输出（OUT）寄存器。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 双字 | K/H/D | 要参加运算的操作数1
IN2 | 双字 | K/H/D | 要参加运算的操作数2
OUT | 双字 | D | 计算结果寄存器

3. 实例

指令表：

LD      X000

XORD    D0      D2      D4  // 将D0D1与D2D3进行异或操作，并将结果输出到D4D5

梯形图：


传送双字 MOVD

对应命令 | 注释/说明 | 操作数（寄存器）
MOVD | 传送双字 | D/K/H/CV32,D/CV32

1. 指令说明

指令将输入双字（S）复制至输出双字（D），不改变原来的数值。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 双字 | D/K/H/CV | 要复制传送的双字
D | 双字 | D/CV | 输出的目标寄存器

3. 实例

指令表：

LD      X000

MOVD    D0      D2   // D0D1复制到D2D3

梯形图：


传送实数 MOVF

对应命令 | 注释/说明 | 操作数（寄存器）
MOVF | 传送实数 | D/K/AI/AO,D

1. 指令说明

指令将输入浮点（S）复制至输出浮点（D），不改变原来的数值。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 浮点 | D/K/AI/AO | 要复制传送的浮点
D | 浮点 | D | 输出的目标寄存器

3. 实例

指令表：

LD      X000

MOVF    D0      D2   // D0D1复制到D2D3

梯形图：


成块移动双字 MVDBLK

对应命令 | 注释/说明 | 操作数（寄存器）
MVDBLK | 成块移动双字 | D, D, D/K/H

1. 指令说明

指令将双字数目（N）从输入地址（S）复制至输出地址（D）。N的范围是1至512。

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 双字 | D/TV/CV/AI/AO/V/Z | 要复制传送的字的起始地址
D | 双字 | D/TV/CV/AO/V/Z | 输出的目标寄存器的起始地址
N | 整数 | D/K/H | 复制传送的字的个数

3. 实例

指令表：

LD      X000

MVDBLK  D0      D100    K10  // 将D0(D1) ~ D18(D19)的10个双字复制到D100(D101)~ D118(D119)

梯形图：


双整数加 ADDD

对应命令 | 注释/说明 | 操作数（寄存器）
ADDD | 32位整数加 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（ADDD）将两个32位整数相加，并产生一个32位的结果（OUT）

IN1 ＋ IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 双整数 | K/H/D/CV | 要参加运算的操作数1
IN2 | 双整数 | 同上 | 要参加运算的操作数2
OUT | 双整数 | D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

ADDD    D0      D2      D4  // D0D1 + D2D3 = D4D5

梯形图：


双字减一 DECD

对应命令 | 注释/说明 | 操作数（寄存器）
DECD | 双字减1 | K/H/D/CV32,D/CV32

1. 指令说明

指令（DECD）32位整数减一，并产生一个32位的结果（OUT）

IN - 1 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 双字 | D/K/H/CV | 要复制传送的双字
D | 双字 | D/CV | 输出的目标寄存器

3. 实例

指令表：

LD      X000

DECD    D0      D0   // D0D1 - 1 = D0D1

梯形图：


32位除 DIVD

对应命令 | 注释/说明 | 操作数（寄存器）
DIVD | 32位除 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（DIVD）将两个32位整数相除，并产生一个32位的结果（OUT）

IN1 ÷ IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

M8172    除数为零

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 双整数 | K/H/D/CV | 要参加运算的操作数1
IN2 | 双整数 | 同上 | 要参加运算的操作数2
OUT | 双整数 | D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

DIVD    D0      D2      D4  // D0D1 ÷ D2D3 = D4D5

梯形图：


16位除 DIVW

对应命令 | 注释/说明 | 操作数（寄存器）
DIVW | 16位除 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z

1. 指令说明

指令（DIVW）将两个16位整数相除，并产生一个16位的结果（OUT）

IN1 ÷ IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

M8172    除数为零

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 整数 | K/H/D/TV/CV/AI/AO/V/Z | 要参加运算的操作数1
IN2 | 整数 | 同上 | 要参加运算的操作数2
OUT | 整数 | D/TV/CV/AO/V/Z | 计算结果寄存器

3. 实例

指令表：

LD       X000

DIVW     D0       D1      D2  // D0 ÷ D1 = D2

梯形图：


双字加一 INCD

对应命令 | 注释/说明 | 操作数（寄存器）
INCD | 双字加1 | K/H/D/CV32,D/CV32

1. 指令说明

指令（INCD）32位整数加一，并产生一个32位的结果（OUT）

IN + 1 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
S | 双字 | D/K/H/CV | 要复制传送的双字
D | 双字 | D/CV | 输出的目标寄存器

3. 实例

指令表：

LD      X000

INCD    D0      D0   // D0D1 + 1 = D0D1

梯形图：


32位乘 MULD

对应命令 | 注释/说明 | 操作数（寄存器）
MULD | 32位乘 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（MULD）将两个32位整数相乘，并产生一个32位的结果（OUT）

IN1 × IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 双整数 | K/H/D/CV | 要参加运算的操作数1
IN2 | 双整数 | 同上 | 要参加运算的操作数2
OUT | 双整数 | D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

MULD    D0      D2      D4  // D0D1 × D2D3 = D4D5

梯形图：


16位乘 MULW

对应命令 | 注释/说明 | 操作数（寄存器）
MULW | 16位乘 | K/H/D/TV/CV/AI/AO/V/Z, K/H/D/TV/CV/AI/AO/V/Z, D/TV/CV/AO/V/Z

1. 指令说明

指令（MULW）将两个16位整数相乘，并产生一个16位的结果（OUT）

IN1 × IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 整数 | K/H/D/TV/CV/AI/AO/V/Z | 要参加运算的操作数1
IN2 | 整数 | 同上 | 要参加运算的操作数2
OUT | 整数 | D/TV/CV/AO/V/Z | 计算结果寄存器

3. 实例

指令表：

LD      X000

MULW    D0      D1      D2  // D0 × D1 = D2

梯形图：


双整数减 SUBD

对应命令 | 注释/说明 | 操作数（寄存器）
SUBD | 32位整数减 | K/H/D/CV32,K/H/D/CV32,D/CV32

1. 指令说明

指令（SUBD）将两个32位整数相减，并产生一个32位的结果（OUT）

IN1 - IN2 = OUT

M8169    溢出

M8170    负结果

M8171    零结果

2. 指令的有效操作数

输入输出 | 类型 | 操作数 | 描述
EN | BOOL |  | 启用输入端接通时，指令执行；否则，不执行
IN1 | 双整数 | K/H/D/CV | 要参加运算的操作数1
IN2 | 双整数 | 同上 | 要参加运算的操作数2
OUT | 双整数 | D/CV | 计算结果寄存器

3. 实例

指令表：

LD      X000

SUBD    D0      D2      D4  // D0D1 – D2D3 = D4D5

梯形图：


辅助指令

内容如下：

1、 以10为底的对数运算 LOG

2、 计算x的y次幂 POW

3、 计算n的阶乘 FACT

4、 比较 CMP/CMPD/CMPF

5、 区间比较 ZCP/ZCPD/ZCPF

6、 求补 NEG/NEGD

7、 取反传送 CML/CMLD

8、 交换 XCH/XCHD/XCHF

9、 单字多点传送指令 FMOV

10、双字多点传送指令 FMOVD

11、移位传送 SMOV