- 在工业自动化控制里,精确的时间控制和定时功能那可是相当重要,缺了可不行。西门子 PLC 能通过好多办法来实现计时功能,其中用 CPU 时间存储器和组织块 OB35 弄出来的计时器,有精度高、稳定性强、占资源少这些好处。这种计时的办法在生产线节拍控制、设备运行时间统计、工艺参数采集等地方都用得挺多。
- 技术原理解析
2.1 CPU 时间存储器
CPU 时间存储器是 S7 - 300/400 系列 PLC 里的一块特殊存东西的地方,里面有好些跟时间有关的系统变量:
o 1)S_TIMESTR:是 BCD 码格式的实时时钟信息
o 2)S_SECOND:就是当前的秒数(0 到 59)
o 3)S_MINUTE:是当前的分数(0 到 59)
o 4)S_HOUR:是当前的时数(0 到 23)
2.2 OB35 周期中断
OB35 是个固定周期干活的组织块:
o 1)默认干活的周期是 100 毫秒
o 2)能通过硬件配置改周期(范围是 1 毫秒到 60 秒)
o 3)执行的优先级比较高
o 4)适合在需要精确计时的场合用
方法一、CPU时间存储器
1.1、等硬件组态弄完以后,您就双击 CPU 模板,选“CYCLE\CLOCK MEMORY”这个选项,换个视窗之后,再选底下的“CLOCK MEMORY”选项,这就是内部时钟脉冲的设置地方。系统默认的是 MB0,要是勾选了“CLOCK MEMORY”,您就能设置自己感兴趣的 MB 值。要是设置的字节是 MB100,从 M100.0 到 M100.7 就是周期性会变值的存储位(脉冲占空比 1:1)。比如说:m100.5 是循环接通 0.5 秒,断开 0.5 秒。时钟位对应的时钟周期:
1.2、仿真
写程序的时候,让 M150.5 由内部时钟来控制,接通和断开的周期是 1 秒。再利用整数加法指令,在每个脉冲的上升沿就加一次。Md50 里的数据就是每 1 秒累计一次的计时器。
方法二:通过等时中断组织块来达成等时中断。在 OB35 里调用存储程序块,做到等时存储,这个方法比较精确。
2.1、硬件组态弄好以后,您双击 CPU 模板,选“Cyclic Interrupts”,设置“OB35”循环中断时间“Execution”,把中断时间设成 1000 。
新建“OB35”块,然后双击把它打开,选累加指令“ADD DI”,按照下面图里的样子来编写程序
打开 PLCSIM ,把“OB35”块下载到仿真 PLC 里,再打开监视器,能看到数值 1 秒钟增加 1 。
方法三,利用SCL语言
代码如下:
//在DB块中定义计时器变量
DATA_BLOCK DB10
STRUCT
Timer_Enable: BOOL; //计时使能
Timer_Reset: BOOL; //计时复位
MS_Count: INT; //毫秒计数
Second_Count: INT; //秒计数
Minute_Count: INT; //分计数
Hour_Count: INT; //时计数
END_STRUCT
BEGIN
Timer_Enable := FALSE;
Timer_Reset := FALSE;
MS_Count :=0;
Second_Count :=0;
Minute_Count :=0;
Hour_Count :=0;
END_DATA_BLOCK
//OB35实现计时功能
ORGANIZATION_BLOCK OB35
VAR_TEMP
OB35_EV_CLASS: BYTE;
OB35_STRT_INF: BYTE;
OB35_PRIORITY: BYTE;
OB35_OB_NUMBR: BYTE;
OB35_RESERVED_1: BYTE;
OB35_RESERVED_2: BYTE;
OB35_PHASE_OFFSET: WORD;
OB35_RESERVED_3: INT;
OB35_EXC_FREQ: INT;
OB35_DATE_TIME: DATE_AND_TIME;
END_VAR
BEGIN
//检查计时使能状态
IFDB10.Timer_EnableTHEN
//复位检查
IFDB10.Timer_ResetTHEN
DB10.MS_Count :=0;
DB10.Second_Count :=0;
DB10.Minute_Count :=0;
DB10.Hour_Count :=0;
DB10.Timer_Reset := FALSE;
RETURN;
END_IF;
//毫秒计数(假设OB35周期为100ms)
DB10.MS_Count := DB10.MS_Count +100;
//秒进位处理
IFDB10.MS_Count >=1000THEN
DB10.MS_Count := DB10.MS_Count -1000;
DB10.Second_Count := DB10.Second_Count +1;
//分进位处理
IFDB10.Second_Count >=60THEN
DB10.Second_Count :=0;
DB10.Minute_Count := DB10.Minute_Count +1;
//时进位处理
IFDB10.Minute_Count >=60THEN
DB10.Minute_Count :=0;
DB10.Hour_Count := DB10.Hour_Count +1;
END_IF;
END_IF;
END_IF;
END_IF;
END_ORGANIZATION_BLOCK
西门子 PLC 利用CPU时间存储器和OB35做计时器 PLC论坛-全力打造可编程控制器专业技术论坛 -
西门子 PLC 利用CPU时间存储器和OB35做计时器
http://bbs.plcjs.com/forum.php?mod=viewthread&tid=493141&fromuid=42656
(出处: PLC论坛-全力打造可编程控制器专业技术论坛)