主题
数采实施手册
术语
测点:指PLC、DCS等自动化系统中I/O数字量或A/D模拟量。一个自动化系统由几千到几万个测点组成,为了方便施工配置,这些测点通过excel点表来整理汇总。
点位:测点在OT地址空间中的地址。
点表:泛指记录点位配置信息的excel表格,包含模型表、设备表、通道表、点位表。
模型表:设备模型excel表的简称,又称设备模型表,记录一批设备共用的配置信息,如测点标识、测点名称、测点类型、读写模式等。
设备表:设备配置excel表的简称,记录设备相关的配置,如设备标识、设备名称、设备关联的模型标识。
通道表:通道配置excel表的简称,记录通道相关的配置,如通道名称、通讯规则、通讯参数、点位信息。
点位表:点位表记录了每个IT侧的测点信息与OT侧的点位信息、以及两者之间的映射关系。IT属性包括【设备标识】和【测点标识】,OT属性包括【设备地址】和【点位地址】。
IT:Information Technology,本文中特指信息化软件系统相关的技术。
OT:Operational technology,本文中特指自动化系统相关的技术。
Excel 导入介绍
借助 Excel 导入功能可以帮助用户快速实施项目。用户需要准备三个 Excel 文件依次进行导入:模型表、设备表、通道表。
- 模型表:实现设备模型分组、设备模型、设备模型测点的批量导入。
- 设备表:实现设备的批量导入。
- 通道表:实现通道、点位的批量导入。
采集
TopStack 支持以下几种方式实现设备接入:
- 网关接入:可应用于适用于物联网场景,平台部署在云服务器无法直接与设备进行通讯,需要通过物联网网关实现平台与设备的互联互通。
- 直连接入:可在本地部署时使用,可不依赖物联网网关直接与 PLC、仪表等设备直接进行通讯。
- 自主接入:在不依赖网关的情况下,实现设备直接跟平台进行通讯,支持 MQTT、CoAP、HTTP 三种协议。
本文档只介绍网关下的通道和直连接入通道相关的设置。 通道是上位机软件与下位机设备建立数据连接的方式。不同的设备采用不同的通讯规约与上位机进行通道。支持的通讯规约如下:
- Modbus RTU:串口/以太网/透传
- Modbus TCP:以太网通讯
- 西门子 PLC:以太网通讯,S7-200-Smart,S7-200, S7-300, S7-400, S7-1200, S7-1500
- 三菱 PLC、基恩士 PLC:MC 协议
- 欧姆龙 PLC:以太网通讯 FINS/TCP 协议
- 欧姆龙 HostLink 协议:C-mode,支持串口和网口透传
- AB PLC:以太网通讯 CIP 协议
- 松下 Mewtocol-COM 协议
- 倍福 ADS 协议
- OPC DA
- OPC UA
- IEC-60870-104:电气规约
- DLT-645-1997:电气规约
- DLT-645-2007:电气规约
- 第三方数据库
- MQTT
通道配置
在通道管理界面,单击【导入通道】按钮:

下载Excel模板,根据模板内容录入通道信息,编辑完成Excel文件后,再点击上传完成导入:

NOTE
导入【通道 Excel 文件】可以实现通道和点表的同时导入。
点表参数
选中通道后,点击“点表”选项卡,进入该通道下的点位管理界面。
点表参数说明:
| 参数名称 | 必填 | 说明 |
|---|---|---|
| 设备标识 | 是 | 点位关联的设备 |
| 测点标识 | 是 | 点位关联的测点 |
| 仿真表达式 | 否 | 仿真模式下用于生成仿真数据 |
| 设备地址 | 否 | 设备通讯地址 |
| 点位地址 | 是 | 虚拟点表达式或点位寄存器地址 |
| 数值类型 | 是 | 点位的数值类型 |
| 存储周期 | 否 | 点位数据存储周期 |
| 扫描周期 | 否 | 采集频率 |
| 死区值 | 否 | 当测点值变化量未超过死区值,则认为数据未变化,不触发更新。 |
| 死区时间 | 否 | 当测点值保持不变时,默认情况下不触发更新,如果设置了死区时间,则超过死区时间后强制触发更新。 |
| 计算公式 | 否 | 用于浮点型或整数型测点,通过设置基值和系数,对采集值进行计算输出测点值。 |
| 取反 | 否 | 用于布尔型测点,表示是否对采集值进行取反处理。 |
| 虚拟点位 | 否 | 是否是虚拟点位。 |
| 数据范围 | 否 | 可以设置最大值、最小值。超出数据范围的值,会被认为是无效值。 |
更新机制
系统判断数据是否有更新,主要受死区值和死区时间影响:
- 如果死区值为非 0 值,当数据变化量小于死区值会被忽略,数据变化量大于死区值就认为数据需要更新。
- 如果死区时间为非 0 值,当扫描到的数据长时间不变化时,如果持续不变化时间超过了死区时间,系统会强制触发数据更新。
存储策略
数据的存储策略,除了跟存储间隔有关外,还跟测点数据的更新机制有关。系统在检测到数据有更新后,才会进一步判断是否需要存储。 当系统检测到数据有更新后,会检查点位的存储间隔,进而判断是否需要将该数据写入历史库:
- 如果存储间隔为 -1,表示不存储。
- 如果存储间隔为 0,表示实时存储,也就是说只要系统认为数据有更新,就会触发存储。
- 如果存储间隔大于 0,表示按时间间隔存储,但不是严格固定的时间间隔,当系统检测到数据有更新且当前时间与上次存储的时间间隔大于设定的存储间隔才会触发存储。
仿真模式
选中通道后,可修改仿真模式选项,如果启用了“仿真模式”,通道将停止与设备进行通讯,不再采集设备数据,改为模拟生成仿真数据。
我们可以通过配置点表的【仿真表达式】来定义仿真数据的生成规则。
仿真表达式格式支持以下几种:
- 斜坡函数:RAMP(速率, 下限, 上限, 增量)
- 随机函数:RANDOM(速率, 下限, 上限)
- 正弦函数:SINE(速率, 下限, 上限, 频率, 相位)
- 用户函数:USER(速率, 用户值 1, 用户值 2, 用户值 3, …用户值 N)
斜坡函数:RAMP(速率, 下限, 上限, 增量) 斜坡函数用于创建指定数字范围内递增或递减的值。应使用下限和上限设置所需的范围。可调整下限或上限,以对生成的数据应用偏移。增量值可为正数或负数。如果增量值为正,则值将以所需速率生成由下限到上限的斜坡。如果增量值为负,则值将以所需速率生成由上限到下限的斜坡。输入的下限、上限和增量值可为整数或浮点格式。 示例:
kotlin
RAMP(120, 35, 100, 4)
将创建增量为每 120 毫秒递增 4 的 35 到 100 的值。
RAMP(301, 150.75, 200.50, -0.25)
将创建增量为每 300 毫秒递减 0.25 的 200.50 到 150.75 的值。随机函数:RANDOM(速率, 下限, 上限) 斜坡函数用于创建指定数字范围内可随意更改的项。应使用下限和上限设置所需的范围。可调整下限或上限,以对生成的数据应用偏移。 示例:
kotlin
RANDOM(30, -20, 75)
将创建速率为 30 毫秒的从 -20 到 75 随机变化的值。正弦函数:SINE(速率, 下限, 上限, 频率, 相位) 正弦函数可用于创建遵循正弦值更改的项。应使用下限和上限设置所需的范围。可调整下限或上限,以对生成的数据应用偏移。“频率”属性可用于指定每秒产生的波形数量 (以赫兹为单位)。最大的有效频率大约为 5 赫兹。“频率”属性的有效范围为 0.001 至 5 赫兹。“相位”属性可用于偏移由特定角度生成的正弦波。输入“相位”的范围应在 0.0 到 360.0 之间。在这种情况下,对于模拟函数的运行方式,“速率”属性起到了关键作用。为了获得此函数的良好正弦输出,“速率”必须至少比所需“频率”快两倍。例如,对于在 200 毫秒的速率下发生变化的正弦波,如果用户想要得到 5 赫兹的正弦波,则“速率”属性的最大值应设置为 100 毫秒。为了获得最佳的正弦波结果,建议将“速率”设置为 10 或 20 毫秒。正弦函数“速率”的有效范围为 10-1000 毫秒。 示例:
kotlin
SINE(10、-40、40、2、0)
这将创建频率为 2 赫兹的正弦值,其范围介于 -40 至 40 之间,并且不具有相位偏移。用户函数:USER(速率, 用户值 1, 用户值 2, 用户值 3, …用户值 N) USER 函数为定义模拟函数返回的数据类型。此参数用于指定在物理设备中找到此标记时,该标记的数据格式。与其他函数在指定范围内进行操作有所不同,USER 函数可用于指定一组数字或字符串值以指定速率进行循环。输入的值用于确定项目的数据类型。 示例:
kotlin
USER(200, Hello, World, this, is, a, test)
这会创建以 200 毫秒速率从序列中的一个文本自动更改为下一个的字符串数据类型值。
USER(100, 1.25, 100.56, 200.11,75.1)
这会创建以 100 毫秒速率从序列中的一个浮点值更改为下一个的浮点数据类型值。
USER(100, 1,1,0,1,0,1,0,0,1,1,1,0,0,0)
这会生成以 100 毫秒速率从序列中的一个布尔状态更改为下一个的布尔状态。这可用于创建非常复杂的位阵列。速率单位为毫秒,最快速率支持 100ms。
虚拟点
在工控应用场景下,大部分数据点都是物理点位,包括开关量、模拟量等。软件提供了虚拟点位的支持,允许用户通过编写计算表达式,生成虚拟变量。 使用虚拟点位需要配置点位通讯参数中的两个字段:
- 将“虚拟点位”设置为“启用”状态。
- 在点位地址中输入计算表达式。
计算表达式中,所有的物理点位值都可以作为变量进行引用,变量名称为“点位标识”,所以点位标识的命名请确保使用英文字母、数字、下划线的组合。 示例:
- 基本表达式:
10 > 0 - 带变量参数:
foo > 0 - 带算术运算符:
(v1 * v2 / 100) >= 90 - 字符串判断:
http_response_body == "service is ok" - 数值运算表达式:
(mem_used / total_mem) * 100
常量
| 名称 | 说明 |
|---|---|
| 数值型 | 类型为 64位浮点型:12345.678 |
| 字符串 | 用双引号表示: "foobar" |
| 布尔型 | true 或 false |
| 日期 | Date(x) 支持 RFC3339, ISO8601, unix |
算数运算符
假定 A 值为 10,B 值为 20。
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 相加 | A + B 输出结果 30 |
| - | 相减 | A - B 输出结果 -10 |
| * | 相乘 | A * B 输出结果 200 |
| / | 相除 | B / A 输出结果 2 |
| % | 求余 | B % A 输出结果 0 |
关系运算符
表达式成立返回 true 否则返回 false。假定 A 值为 10,B 值为 20。
| 运算符 | 描述 | 实例 |
|---|---|---|
== | 检查两个值是否相等 | (A == B) 为 false |
!= | 检查两个值是否不相等 | (A != B) 为 true |
> | 检查左边值是否大于右边值 | (A > B) 为 false |
< | 检查左边值是否小于右边值 | (A < B) 为 true |
>= | 检查左边值是否大于等于右边值 | (A >= B) 为 false |
<= | 检查左边值是否小于等于右边值。 | (A <= B) 为 true |
逻辑运算符
假定 A 值为 true,B 值为 false。
| 运算符 | 描述 | 实例 |
|---|---|---|
&& | 逻辑与。 如果两边的操作数都是 true,则输出 true,否则为 false。 | (A && B) 为 false |
| `||` | 逻辑或。 如果两边的操作数有一个 true,则输出 true,否则为 false。 | (A || B) 为 true |
! | 逻辑非(对原值进行取反)。 | !(A && B) 为 true |
位运算符
位运算符对整数在内存中的二进制位进行操作。
假定 A 为60,B 为13:
| 运算符 | 描述 | 实例 |
|---|---|---|
& | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 |
| | 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (A | B) 结果为 61, 二进制为 0011 1101 |
^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 |
<< | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 |
>> | 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 | A >> 2 结果为 15 ,二进制为 0000 1111 |
三元操作符
格式为:? :,如 (v1 > 100) ? 1 : 0
优先级顺序
有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
| 优先级 | 运算符 |
|---|---|
| 5 | * / % << >> & &^ |
| 4 | + - | ^ |
| 3 | == != < <= > >= |
| 2 | && |
| 1 | ` |
可以通过使用括号来临时提升某个表达式的整体运算优先级。
内置函数
| 名称 | 说明 |
|---|---|
Math.ABS(number) | 取绝对值 |
Math.MAX(number, number) | 取两个值中的最大值 |
Math.MIN(number, number) | 取两个值中的最小值 |
GetValue(string) | 获取测点当前值,入参为测点全局标识: 设备标识.测点标识 或 测点标识(同设备下的测点) |
Integration(string) | 对指定测点按时间区间计算积分,时间区间取决于虚拟点的扫描周期,时间单位为秒。计算公式:(v2-v1)/t。 |
Derivative(string) | 对指定测点按时间区间计算导数,时间区间取决于虚拟点的扫描周期,时间单位为秒。计算公式:t*(v2+v1)/2。 |
示例:
- 某温度点的标识为 T,如果希望每分钟计算 1 次该测点的导数。可以新建一个虚拟点,扫描周期设置为 60 秒,表达式为 Derivative("T") * 60。
- 某瞬时流量的测点标识为 L,如果希望每分钟计算 10 次该测点的导数。可以新建一个虚拟点,扫描周期设置为 6 秒,表达式为 Derivative("T") * 6。
告警
告警规则
当需要批量配置告警规则时,可以使用 excel 方式进行配置,批量导入告警规则。 点击【导入】按钮,弹出导入对话框,如下图所示:
在【导入对话框】中,点击【下载模板文件】,将 Excel 模板文件下载到本地。
在 Excel 文件中,我们按不同的触发方式分成了多个 Sheet 页,每个触发方式需要配置的字段有所区别。大部分字段根据名称进行填写即可。
本文档只对几个特殊的字段进行说明:
- 指定告警设备
如果设置为空,该规则应用到所属模型下的所有设备。如果需要指定设备,可以输入设备标识并用英文逗号(“,”)进行分隔。
- 设备联动:点位
输入需要进行联动输出的点位标识,只支持同模型下的点位标识 ,空表示不进行联动输出 。