本篇是《基于博途V15 西门子S7-1200 ...》系列的后续篇,看懂本篇文章之前请大家关注我,然后查找相关文章,学习之后再学习此篇。也请专业领域的大神批评指正。
感谢大家关注与支持!
这是第四篇功能指令,本篇介绍两个简单的定时器指令应用实例。上一篇是《基于博途V15 西门子S7-1200 定时器指令应用实例》,大家可以自行查阅学习。
1.打开已经创建项目
名称为计数器指令应用
2.添加PLC
3.计数器简单介绍
1)计数器指令
可使用计数器指令对内部程序事件和外部过程事件进行计数;
每个计数器都使用数据块中存储的结构来保存计数器数据;
用户在编辑器中放置计数器指令时分配相应的数据块。
CTU 是加计数器
CTD 是减计数器
CTUD 是加减计数器
2)参数的数据类型
参数 数据类型 说明
CU, CD Bool 加计数或减计数,按加或减一计数
R (CTU, CTUD) Bool 将计数值重置为零
LD (CTD, CTUD) Bool 预设值的装载控制
PV SInt, Int, DInt, USInt, UInt, UDInt 预设计数值
Q, QU Bool CV >= PV 时为真
QD Bool CV <= 0 时为真
CV SInt, Int, DInt, USInt, UInt, UDInt 当前计数值
注:a.计数值的数值范围取决于所选的数据类型。如果计数值是无符号整型数,则可以减计数到零或加计数到范围限值。如果计数值是有符号整数,则可以减计数到负整数限值或加计数到正整数限值。
b.用户程序中可以使用的计数器数仅受 CPU 存储器容量限制。计数器占用以下存储器空间:
对于 SInt 或 USInt 数据类型,计数器指令占用 3 个字节。
对于 Int 或 UInt 数据类型,计数器指令占用 6 个字节。
对于 DInt 或 UDInt 数据类型,计数器指令占用 12 个字节
3)RUN-STOP-RUN 切换或 CPU 循环上电后保留计数器数据
如果从运行模式阶段切换到停止模式或 CPU 循环上电并启动了新运行模式阶段,则存储在之前运行模式阶段中的计数器数据将丢失,除非将定时器数据结构指定为具有保持性(CTU、CTD 和 CTUD 计数器)。将计数器指令放到程序编辑器中后,如果接受调用选项对话框中的默认设置,则将自动分配一个无法实现具有保持性的背景数据块。要使计数器数据具有保持性,必须使用全局数据块或多重背景数据块。
4)指定全局数据块将计数器数据存储为保持性数据
无论将计数器放在什么位置(OB、FC 或 FB),该选项都有效。
a. 创建一个全局数据块:
– 在项目树中双击“添加新块”(Add new block)。
– 单击数据块 (DB) 图标
– 对于“类型”(Type),选择“全局数据块”(global DB)。
– 如果希望能够将该数据块中的各个项选择为具有保持性,则确保选中“仅符号访问”(
symbolic-access-only) 框。
– 单击“确定”(OK)
b. 向该数据块添加计数器结构:
– 在新的全局数据块中,添加使用以下计数器数据类型之一的新静态变量。务必要考虑到想要用于预设值和计数值的类型。
– 在“保持性”(Retain) 列中,选中相应框以使该结构具有保持性。
– 重复此过程为要存储在该数据块中的所有计数器创建结构。
可以将每个计数器结构放置在独立的全局数据块中,也可以将多个计数器结构放置在同一个全局数据块中。
除计数器外,还可以将其它静态变量放置在该全局数据块中。将多个计数器结构放置在同一个全局数据块中可减少总的块数。
– 可根据需要重命名计数器结构。
c. 打开程序块来选择保持性计数器的放置位置(OB、FC 或 FB)。
d. 将计数器指令放置在所需位置。
e. 在调用选项对话框出现后,单击“取消”按钮。
您现在应该看到新的计数器指令,在指令名称的上面和下面均显示“???”。
f. 在新的计数器指令上方,输入上面所创建全局数据块和计数器结构的名称(请勿使用
助手浏览)(例如: “Data_block_3.Static_1”)。这需要填入对应的预设值和计数值类型(例如: UInt 对应于 IEC_UCounter 结构)。
计数器数据类型 预设值和计数值的相应类型
IEC_Counter INT
IEC_SCounter SINT
IEC_DCounter DINT
IEC_UCounter UINT
IEC_USCounter USINT
IEC_UDCounter UDINT
5)指定多重背景数据块以将计数器数据存储为保持性数据
该选项仅对于将计数器放置在 FB 中有效。该选项取决于 FB 属性是否指定“优化块访问”(Optimized block access)(仅允许符号访问)。 要检查现有 FB 访问属性的组态情况,请在项目树中右键单击该FB,选择“属性”(Properties),然后选择“特性”(Attributes)。如果 FB 指定“优化块访问”(Optimized block access)(仅允许符号访问):
a. 打开 FB 进行编辑。
b. 将计数器指令放在 FB 中的所需位置。
c. “调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。
仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。
d. 如有需要,请在“调用选项”(Call options) 对话框中重命名计数器。
e. 单击“确定”(OK)。 计数器指令将出现在编辑器中并且预设值和计数值的类型为INT,而 IEC_COUNTER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。
f. 如有需要,请在计数器指令中将类型从 INT 更改为其它类型之一。计数器结构将相应更改。
g. 如有必要,打开 FB 接口编辑器(可能需要单击小箭头以展开视图)。
h. 在“静态”(Static) 下,找到刚刚创建的计数器结构。
i. 在此计数器结构的“保持性”(Retain) 列中,改为选择“保持性”(Retain)。此后只要从另一程序块调用此FB,都将利用此接口定义(包含标有保持性的计数器结构)创建背景数据块。
4. CTU 运算(加计数)
当参数 CU 的值从 0 变为 1 时,CTU 计数器会使计数值加1。CTU 时序图显示了计数值为无符号整数时的运行(其中,PV = 3)。
如果参数 CV(当前计数值)的值大于或等于参数PV(预设计数值)的值,则计数器输出参数 Q = 1。
如果复位参数 R 的值从 0 变为 1,则当前计数值重置为 0。
时序图
编写程序段1
I0.0接通 参数 CU 的值从 0 变为 1 时,CTU 计数器会使计数值加1。
参数 CV(当前计数值)的值大于或等于参数PV(预设计数值)的值,则计数器输出参数 Q = 1。Q0.0 接通,一直到置位,或者加计数一直加到正整数限值。
I0.1 接通 复位参数 R 的值从 0 变为 1,则当前计数值重置为 0。
5. CTD 运算(减计数)
当参数 CD 的值从 0 变为 1 时,CTD 计数器会使计数值减 1。CTD 时序图显示了计数值为无符号整数时的运行(其中,PV = 3)。
如果参数 CV(当前计数值)的值等于或小于0,则计数器输出参数 Q = 1。
如果参数 LOAD 的值从 0 变为 1,则参数PV(预设值)的值将作为新的CV(当前计数值)装载到计数器。
时序图
编写程序段2
参数 CV(当前计数值)的值等于或小于0,则计数器输出参数 Q = 1。Q0.1动作
I0.3接通 参数 LD 的值从 0 变为 1,则参数PV(预设值)的值3将作为新的CV(当前计数值)装载到计数器。
I0.3 断开 I0.2接通 参数 CD 的值从 0 变为 1 时,CTD 计数器会使计数值减 1。
直到 参数 CV(当前计数值)的值等于或小于0,则计数器输出参数 Q = 1。Q0.1动作
减计数Q接通直到 重新重载或者减计数减到负整数限值。
6. CTUD 运算(加计数和减计数)
当加计数 (CU) 输入或减计数 (CD) 输入从 0 转换为 1 时,CTUD计数器将加 1 或减 1。CTUD 时序图显示了计数值为无符号整数时的运行(其中 PV = 4)。
如果参数 CV 的值大于等于参数 PV 的值,则计数器输出参数QU = 1。
如果参数 CV 的值小于或等于零,则计数器输出参数 QD = 1。
如果参数 LOAD 的值从 0变为 1,则参数 PV 的值将作为新的 CV 装载到计数器。
如果复位参数 R 的值从 0 变为1,则当前计数值重置为0。
时序图
编写程序段3
参数 CV 的值小于或等于零,则计数器输出参数 QD = 1。Q0.3动作
I0.7接通 参数 LD 的值从 0变为 1,则参数 PV 的值4将作为新的 CV 装载到计数器。参数 CV 的值大于等于参数 PV 的值,则计数器输出参数QU = 1。Q0.2动作
I0.7 断开 I0.5接通 减计数 (CD) 输入从 0 转换为 1 时,CTUD计数器将减 1
直到 参数 CV 的值小于或等于零,则计数器输出参数 QD = 1。Q0.3动作
I0.6接通 参数 CV 的值小于或等于零,则计数器输出参数 QD = 1。Q0.3动作
I0.4 接通 加计数 (CU) 输入从 0 转换为 1 时,CTUD计数器将加 1
参数 LD 的值从 0变为 1,则参数 PV 的值4将作为新的 CV 装载到计数器。参数 CV 的值大于等于参数 PV 的值,则计数器输出参数QU = 1。Q0.2动作