Simulator [ˈsɪmjəˌletɚ] 模拟器
KepServerEx是一款在工业控制中比较常见的数据采集服务软件之一,提供了多种类型的驱动,具有比较广泛的适用性。很多厂商和个人都会选择用它来做OPCServer。在项目的实施或测试过程中,我们有时会遇到身边没有传感器、PLC之类设备的情况,就无法通过实时数据来测试工作成果的有效性。幸运的是KepServerEx提供了数据模拟功能,可以提供多种类型、格式的模拟数据。下面就是具体的配置过程,重点在于模拟数据的函数( 斜坡函数、随机函数、正弦函数、User 函数)
1. 配置过程:
创建Channel
Channel即通道,可以将它理解为OPC中的Server。
设备驱动选择“Simulator”,即模拟器驱动。然后一直点击下一步完成...
通道名字随便取。
剩余几项设置也可以调整,如果需要可以自行调整
创建Device
Device即设备,可以理解为OPC中的Group。
Device 随便起个名。
设备类型可以根据需要选择16位或8位。
设备ID,可以自行修改。
选择‘扫描模式’
下一步,完成。
创建Tag
Tag即标签,可理解为OPC中的Item。现在才来到整篇文章的重点。
添加标签的界面包含两部分:
一部分是对标签的定义(Identification),包括名称(Name)、地址(Address)、描述(Description)
另一部分是数据的属性(Data Properties),包括数据类型(DataType )、读写类型(Client)、扫描频率(Scan Rate)
对我们而言,用处最大的就是Address,我们可以编写不同的函数放在Address中用来模拟不同类型的数据。官方文档提供了多种模拟函数供我们使用(可在帮助文档中找到)。
=====================================================
2. 模拟寄存器(可读/写)
(B寄存器、K寄存器、R寄存器、S寄存器)
B寄存器为布尔型, R 和 K 寄存器为数字数据, S 寄存器是可变长度字符串数据位置。
当 R 寄存器作为字符、字节、字、短整型、BCD、长整型、双字型、双长整型、四字型或 LBCD 引用时,它将通过每次读取时递增 1 的方式来模拟不断更改的数据。这些类型的数组在每次读取时递增 1。当 R 寄存器作为浮点型或双精度型引用时,值在每次读取时递增 1.25。浮点型或双精度型的数组在每次读取时递增 1.25。每种类型均有增量范围。对于浮点型,范围为 0 至 32767。对于双精度型,范围为 0 至 65535。
8 位设备地址
16 位设备地址
注意:
- 除位级布尔值之外,所有数据类型均支持数组 (将 [r] 或 [r][c] 附加到地址后面)。
- 为数据类型指定的地址必须满足数据类型的完整大小。这意味着用户的写操作不能超出数据范围。
在标签创建界面可以设置标签的属性
标签创建完成之后 点击KepServer自带的QC 客户端,对数据进行读取和写入
=====================================================
3. 模拟函数(只读)
(斜坡函数、随机函数、正弦函数、User 函数)
模拟函数可用于创建模拟许多真实数据源的 OPC 项。每一个模拟函数均提供了不同的输出,这些输出具有多个常见属性,例如速率、下限和上限。“速率”(也称为更改率) 可用于指定模拟值更改状态的频率。速率值以毫秒计数的形式输入,其范围介于 10 至 3600000 之间。此更改率完全独立于客户端应用程序读取数据的频率。与 PLC 类似,模拟函数始终在后台运行。
“下限”和“上限”
“下限”和“上限”属性可用于指定由模拟函数生成的数据的范围。通过使用“下限”和“上限”属性,用户可以生成模拟值,只需调整数据范围即可对这些模拟值进行偏移。对于支持限制的模拟函数,范围的输入格式可用于确定模拟值的数据类型。例如,输入斜坡标记时,如果下限为 75,上限为 3000,则生成的 OPC 项会被视为长整型数据类型。输入相同的斜坡标记时,如果下限为 75.123,上限为 3000.567,则生成的 OPC 项会被视为浮点型数据类型。在这两个示例中,默认的数据格式为浮点型或长整型,但可选择任何可用的数据类型作为任何模拟函数的输出格式。但是,由下限和上限指定的范围必须与所需的数据类型选项相匹配。
与上述基于寄存器的地址不同,可输入的模拟函数数目并没有限制。每个具有唯一属性的模拟函数将被视为新的模拟值。因此,为了在客户端应用程序中读取多个位置的相同值,我们需要创建寻址模拟函数,这时,在每种情况下采用相同方式输入模拟函数至关重要。
模拟函数为只读对象
模拟函数为只读对象。一旦客户端应用程序开始从模拟函数中读取数据,该函数即会继续生成数据,直到客户端应用程序将项删除为止。输入浮点属性时,模拟函数不接受指数形式的数字值条目。
A. 斜坡函数
RAMP(速率,下限,上限,增量)
斜坡函数用于创建指定数字范围内递增或递减的值。应使用下限和上限设置所需的范围。可调整下限或上限,以对生成的数据应用偏移。增量值可为正数或负数。如果增量值为正,则值将以所需速率生成由下限到上限的斜坡。如果增量值为负,则值将以所需速率生成由上限到下限的斜坡。输入的下限、上限和增量值可为整数或浮点格式。
支持的数据类型
字节、字符、字、短整型、双字型、长整型、浮点型、双精度
RAMP(Rate, Low Limit, High Limit, Increment)
Rate:变化率,单位毫秒
Low Limit:下限值
High Limit:上限值
Increment:变化量
举例:
RAMP(120, 35, 100, 4)
从35 增长到100,每120毫秒增长4。
RAMP(300, 150.75, 200.50, -0.25)
从200.50降低到150.75,每300毫秒减少0.25。
B. 随机函数
RANDOM(速率, 下限, 上限)
斜坡函数用于创建指定数字范围内可随意更改的项。应使用下限和上限设置所需的范围。可调整下限或上限,以对生成的数据应用偏移。
支持的数据类型
字节、字符、字、短整型、双字型、长整型、浮点型、双精度
RANDOM(Rate, Low Limit, High Limit)
Rate:变化率,单位毫秒
Low Limit:下限值
High Limit:上限值
示例
RANDOM(30, -20, 75)
将创建速率为 30 毫秒的从 -20 到 75 随机变化的值。
C. 正弦函数(三角函数型)
正弦 SINE (“速率”、“下限”、“上限”、“频率”、“相位”)
正弦函数可用于创建遵循正弦值更改的项。应使用下限和上限设置所需的范围。可调整下限或上限,以对生成的数据应用偏移。
“频率”属性可用于指定所需的波形 (以赫兹为单位)。最大的有效频率大约为 5 赫兹。“频率”属性的有效范围为 0.001 至 5 赫兹。
“相位”属性可用于偏移由特定角度生成的正弦波。输入“相位”的范围应在 0.0 到 360.0 之间。在这种情况下,对于模拟函数的运行方式,“速率”属性起到了关键作用。为了获得此函数的良好正弦输出,“速率”必须至少比所需“频率”快两倍。
例如,对于在 200 毫秒的速率下发生变化的正弦波,如果用户想要得到 5 赫兹的正弦波,则“速率”属性的最大值应设置为 100 毫秒。为了获得最佳的正弦波结果,建议将“速率”设置为 10 或 20 毫秒。正弦函数“速率”的有效范围为 10-1000 毫秒。
支持的数据类型
浮点型、双精度
SINE(Rate, Low Limit, High Limit, Frequency, Phase)
Rate:变化率/变化周期,单位毫秒
Low Limit:下限值
High Limit:上限值
Frequency:三角函数频率
Phase:三角函数偏移量
示例
正弦 (10、-40、40、2、0)
这将创建频率为 2 赫兹的正弦值,其范围介于 -40 至 40 之间,并且不具有相位偏移。
D. User 函数(用户自定义型)
USER(速率, 用户值 1, 用户值 2, 用户值 3, ...用户值 N)
USER 函数为定义模拟函数返回的数据类型提供了最大的灵活性。与其他函数在指定范围内进行操作有所不同,USER 函数可用于指定一组数字或字符串值以指定速率进行循环。输入的值用于确定项目的数据类型。例如,如果输入 100.45 作为用户值之一,模拟对象的输出将被视为浮点数据。如果其中一个输入的用户值是 "Hello World",则模拟对象的输出将被视为字符串数据。定义项目后,可通过指定所需的数据类型来覆盖这些默认选择。
注意:当输入用户值为字符串时,可以通过在字符串前添加反斜杠 "\," 来在字符串中输入逗号。
支持的数据类型
布尔型、字节、字符、字、短整型、双字型、长整型、浮点型、双精度
注意:USER 模拟函数中输入的值用于确定默认数据类型。
USER(Rate, User Value1, User Value2, User Value3,…User ValueN)
Rate:变化率,单位毫秒
User Value1….ValueN:用户自定义的值,可以有多个
示例
USER(250, Hello, World, this, is, a, test)
这会创建以 250 毫秒速率从序列中的一个文本自动更改为下一个的字符串数据类型值。
USER(20, 1.25, 100.56, 200.11,75.1)
这会创建以 20 毫秒速率从序列中的一个浮点值更改为下一个的浮点数据类型值。
USER(50, 1,1,0,1,0,1,0,0,1,1,1,0,0,0)
这会生成以 50 毫秒速率从序列中的一个布尔状态更改为下一个的布尔型值。这可用于创建非常复杂的位阵列。
USER(1000, In this case\, , I needed to use a \, in , my text)
需要在这些文本片段中添加 "\," 以便在文本值中插入一个逗号。此外,如有需要,每个值的文本可以是句子或句子片段。
--------------------------
5. 创建自己需要的标签
有了上面的函数我们可以根据自己的需要创建不同类型的标签。
RANDOM(200, 10.0, 40.0)模拟室内温度
RANDOM(200, 30.0, 90.0)模拟室内湿度
USER(1000, 1,1,0,1,0,1,0,0)模拟开关比变化量
RAMP(5000, 0, 1000, 1)模拟人员进入数量
将标签添加完之后保存,用OPC Client连接就 可以看到数据在愉快的跳动了。
---------------------------------------------------------------------------------------------------------