编程

CPU31XC工作在计数和测量两种不同模式下调用的SFB系统功能块也不相同,计数模式下调用SFB47,测量模式下调用SFB48。

1. 计数模式

在程序编辑窗口中,Library-->Standard Library-->System Function Blocks 中可以找到SFB47:

SFB47可以实现以下功能:

● 通过软件门 SW_GATE 启动/停止计数器
● 启用/控制输出 DO
● 读出状态位
● 读取当前计数值和锁存器值
● 用于读/写内部计数寄存器的作业
● 读出当前周期(不与块互连,但仅在背景数据块中可用)

输入 参数 数据类型 在背景数据块中的地址 说明 值的有效范围 缺省值
LADDR WORD 0 在“HW Config”中指定的子模块 I/O 地址。
如果输入和输出地址不相同,则必须指定两者
中较低的地址。
  16#300
CHANNEL INT 2 通道号: CPU 312C:0~1
CPU 313C CPU或313C-2 DP/PtP:0~2
CPU 314C-2 DP/PtP:0~3
0
SW_GATE BOOL 4.0 软件门, 用于计数器启动/停止 TRUE/FALSE FALSE
CTRL_DO BOOL 4.1 启用输出控制 TRUE/FALSE FALSE
SET_DO BOOL 4.2 输出置位 TRUE/FALSE FALSE
           
JOB_REQ BOOL 4.3 作业请求(正跳沿) TRUE/FALSE FALSE
JOB_ID WORD 6 作业号 不带有功能的作业: 16#00
写入计数值: 16#01
写装载值: 16#02
写入比较值: 16#04
写入滞后: 16#08
写入脉冲持续时间: 16#10
读装载值: 16#82
读比较值: 16#84
读取滞后: 16#88
读取脉冲持续时间: 16#90
0
JOB_VAL DINT 8 写作业的值 -2^31 到 +2^31-1 0
             
输出 STS_GATE BOOL 12.0 内部门状态 TRUE/FALSE FALSE
STS_STRT BOOL 12.1 硬件门状态(启动输入) TRUE/FALSE FALSE
STS_LTCH BOOL 12.2 锁存器输入状态 TRUE/FALSE FALSE
STS_DO BOOL 12.3 输出状态 TRUE/FALSE FALSE
STS_C_DN BOOL 12.4 向下计数的状态。
始终指示最后的计数方向。在第一次调用 SFB 之 后,STS_C_DN 的值为 FALSE。
TRUE/FALSE FALSE
STS_C_UP BOOL 12.5 向上计数的状态。
始终指示最后的计数方向。在第一次调用 SFB 之 后,STS_C_UP 的值为 TRUE。
TRUE/FALSE FALSE
COUNTVAL DINT 14 当前计数值 -2^31 到 2^31 - 1 0
LATCHVAL DINT 18 当前锁存器值 -2^31 到 2^31 - 1 0
           
JOB_DONE BOOL 22.0 作业已完成,可启动新作业 TRUE/FALSE TRUE
JOB_ERR BOOL 22.1 错误作业 TRUE/FALSE FALSE
JOB_STAT WORD 24 作业错误编号 0 到 FFFF (十六进制) 0

 

2. 测量模式

在程序编辑窗口中,Library-->Standard Library-->System Function Blocks 中可以找到SFB48:

SFB48可以实现如下功能:

● 通过软件门 SW_GATE 启动/停止
● 启用/控制输出 DO
● 读出状态位
● 读出当前测量值
● 用于读取和写入内部频率计数寄存器的作业

输入 参数 数据类型 在背景数据块中的地址 说明 值的有效范围 缺省值
LADDR WORD 0 在“HW Config”中指定的子模块 I/O 地址。
如果输入和输出地址不相同,则必须指定两者
中较低的地址。
  16#300
CHANNEL INT 2 通道号: CPU 312C:0~1
CPU 313C CPU或313C-2 DP/PtP:0~2
CPU 314C-2 DP/PtP:0~3
0
SW_GATE BOOL 4.0 软件门, 用于计数器启动/停止 TRUE/FALSE FALSE
MAN_DO BOOL 4.1 启用输出手动控制 TRUE/FALSE FALSE
SET_DO BOOL 4.2 输出置位 TRUE/FALSE FALSE
           
JOB_REQ BOOL 4.3 作业请求(正跳沿) TRUE/FALSE FALSE
JOB_ID WORD 6 作业号 不带有功能的作业: 16#00
写入下限: 16#01
写入上限: 16#02
写入积分时间: 16#04
读下限: 16#81
读上限: 16#82
读积分时间: 16#84
0
JOB_VAL DINT 8 写作业的值 -2^31 到 +2^31-1 0
             
输出 STS_GATE BOOL 12.0 内部门状态 TRUE/FALSE FALSE
STS_STRT BOOL 12.1 硬件门状态(启动输入) TRUE/FALSE FALSE
STS_LTCH BOOL 12.2 锁存器输入状态 TRUE/FALSE FALSE
STS_DO BOOL 12.3 输出状态 TRUE/FALSE FALSE
STS_C_DN BOOL 12.4 向下计数的状态。
始终指示最后的计数方向。在第一次调用 SFB 之 后,STS_C_DN 的值为 FALSE。
TRUE/FALSE FALSE
STS_C_UP BOOL 12.5 向上计数的状态。
始终指示最后的计数方向。在第一次调用 SFB 之 后,STS_C_UP 的值为 TRUE。
TRUE/FALSE FALSE
MEAS_VAL DINT 14 当前频率值 0 到 2^31 - 1 0
COUNTVAL DINT 18 当前锁存器值 -2^31 到 2^31 - 1 0
           
JOB_DONE BOOL 22.0 作业已完成,可启动新作业 TRUE/FALSE TRUE
JOB_ERR BOOL 22.1 错误作业 TRUE/FALSE FALSE
JOB_STAT WORD 24 作业错误编号 0 到 FFFF (十六进制) 0

 

3. 开始计数(频率测量)

当硬件门和软件门打开时(使用软件门控制则仅须软件门打开),计数功能开始进行。用户通过调用SFB47(48)开始计数(频率测量),例如:

CALL "COUNT" , DB47
LADDR :=W#16#300
CHANNEL :=0
SW_GATE :=M0.0
CTRL_DO :=
SET_DO :=
JOB_REQ :=
JOB_ID :=
JOB_VAL :=
STS_GATE:=
STS_STRT:=
STS_LTCH:=
STS_DO :=
STS_C_DN:=
STS_C_UP:=
COUNTVAL:=MD10
LATCHVAL:=
JOB_DONE:=
JOB_ERR :=
JOB_STAT:=

当M0.0 为“1” 时,通道0开始计数。

"LADDR "是通道的逻辑地址,见下图,选择输入、输出地址 中较小的值:

 

4. 置位计数通道的输出点:

只有当CTRL_DO(频率测量:MAN_DO)和SET_DO同时为‘1’时,对用通道的输出点才会被置位,例如:

L 16#07
T MB0     //将M0.0,M0.1,M0.2置1

CALL "COUNT" , DB47
LADDR :=W#16#300
CHANNEL :=0
SW_GATE :=M0.0
CTRL_DO :=M0.1
SET_DO :=M0.2
JOB_REQ :=
JOB_ID :=
JOB_VAL :=
STS_GATE:=
STS_STRT:=
STS_LTCH:=
STS_DO :=
STS_C_DN:=
STS_C_UP:=
COUNTVAL:=MD10
LATCHVAL:=
JOB_DONE:=
JOB_ERR :=
JOB_STAT:=

此时,通道0对应的输出点DO0会被置位。不同CPU输出点对应的接线端子请参考接线部分

 

5. 在计数模式下,锁存当前计数值

6. 执行作业操作

首先要年个作业号写入JOB_ID,作业值写入JOB_VAL中,再将一个上升沿信号送到JOB_REQ输入。作业操作完成后JOB_DONE会被置1。

下面是一个在计数模式下更新装载时额例子:

L 16#02
T MW2    //将写装载值的任务号16#02写入MW2

L 200
T MD4    //将写新的装载值200写入MD4

L 16#09
T MW2    //置位M0.0, M0.3

CALL "COUNT" , DB47
LADDR :=W#16#300
CHANNEL :=0
SW_GATE :=M0.0
CTRL_DO :=
SET_DO :=
JOB_REQ :=M0.3
JOB_ID :=MW2
JOB_VAL :=MD4
STS_GATE:=
STS_STRT:=
STS_LTCH:=
STS_DO :=
STS_C_DN:=
STS_C_UP:=
COUNTVAL:=MD10
LATCHVAL:=
JOB_DONE:=M20.0
JOB_ERR :=
JOB_STAT:=