Step7中有关时间和定时器的使用和例程2

接上篇《Step7中有关时间和定时器的使用和例程1》

4、循环中断(OB35)、延时中断(OB20)、时间中断(OB10)

4.1 循环中断(OB35)

具体步骤如下:

1)创建一个项目并插入一个300站

2)打开Hardware

3)配制300站并双击300CPU打开Properties窗口

4)选择Cycle interrupts

5)将OB35对应的时间修改为需要的时间(例如200ms)并点击OK确认

6)编译保存

7)通过Blocks ->Insert New Object ->Organization Block插入OB35

8)双击打开OB35进行编程即可。

这样OB35每隔200ms执行一次,MW120值加1。

4.2 延时中断(OB20)

1)通过Blocks ->Insert New Object ->Organization Block插入OB20,双击打开OB20并进行编程。


2)打开OB1,调用SFC32 “SRT_DINT”(启动延时中断)


通过SFC 32 "SRT_DINT" (启动延时中断),可以在延迟时间过去(参数DTIME)后立即启动调用延时中断组织块的延时中断。使用SIGN参数,可以输入用于标识延时中断开始的标识符。执行指定的OB时,DTIME和SIGN值将再次显示在该OB的启动事件信息中。

如上图所示,每当M0.0由0变为1时,经过5S后OB20被执行,MW110执行了加1操作。监视变量表如下图所示:


4.3 时间日期中断(OB10)

OB10的执行可由3种办法来设定:

1)方法一:如下图所示在HW config窗口下双击300的CPU打开Properties,设定开始执行的时间和执行频率,然后选中Active下的复选框,点击OK。


通过Blocks ->Insert New Object ->Organization Block插入OB10,双击打开OB10并进行编程。


当程序下载到PLC中后OB10将按设定执行,通过监视变量表可观察到OB10的执行情况。

2)方法二:在HW config窗口下双击CPU300打开Properties,设定开始执行的时间和执行频率,不选中Active下的复选框,点击OK。

在程序中调用SFC30 "ACT_TINT" (激活时间中断),可以激活一个时间中断组织块。

编程OB10,参考前图,编译下载即可。

注意:SFC30只需执行一次,即CPU停机后再启动不需要再次调用SFC30。

3)方法三:在HW config中不作配置,调用SFC28和SFC30,通过SFC 28 "SET_TINT" (设置时间中断),可以设置时间中断组织块的启动日期和时间。将忽略指定的启动时间的秒和毫秒值,并将其设置为0。


在DB1中定义一个DATA_AND_TIME的变量

初始化数据块,将初值作为设定值


调用SFC28和SFC30


当M0.0由0变为1时SFC28被调用,M0.2由0变为1时SFC30被调用,OB10将按设定方式执行。

同样SFC28也只需执行一次即可。

5、时钟寄存器(Clock Memory)

西门子300和400的PLC提供一个Clock Memory的字节,每一位以不同的频率执行0到1的变化,打开HW config界面,双击CPU打开Properties窗口选择Cycle/Clock Memory选项,选中如下图所示的Clock Memory的复选框,在Memory byte后对话框中输入所需要的Memory byte号,如输入100,则MB100被设定为Memory byte。


M100.0-M100.7将按不同的频率变化


  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的例程,用于使用imx6ull内核的epit定时器字符驱动: ```c #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #include <linux/uaccess.h> #include <linux/errno.h> #include <linux/slab.h> #include <linux/io.h> #include <linux/interrupt.h> #define DEV_NAME "epit_timer" #define EPIT_BASE_ADDR 0x020D0000 #define EPIT_IRQ_NUM 88 typedef struct { dev_t dev_num; struct cdev cdev; struct class *cls; struct device *dev; void __iomem *epit_base; int irq_num; bool is_opened; } epit_timer_t; static epit_timer_t epit_timer; static irqreturn_t epit_irq_handler(int irq, void *dev_id) { // TODO: interrupt handler return IRQ_HANDLED; } static int epit_open(struct inode *inode, struct file *filp) { if (epit_timer.is_opened) { return -EBUSY; } epit_timer.is_opened = true; filp->private_data = &epit_timer; return 0; } static int epit_release(struct inode *inode, struct file *filp) { epit_timer.is_opened = false; return 0; } static ssize_t epit_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { // TODO: read timer value return -EINVAL; } static ssize_t epit_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { // TODO: write timer value return -EINVAL; } static const struct file_operations epit_fops = { .owner = THIS_MODULE, .open = epit_open, .release = epit_release, .read = epit_read, .write = epit_write, }; static int __init epit_init(void) { int ret; // Allocate device number epit_timer.dev_num = 0; ret = alloc_chrdev_region(&epit_timer.dev_num, 0, 1, DEV_NAME); if (ret < 0) { printk(KERN_ERR "Failed to allocate device number: %d\n", ret); return ret; } // Initialize cdev structure cdev_init(&epit_timer.cdev, &epit_fops); epit_timer.cdev.owner = THIS_MODULE; // Add cdev to system ret = cdev_add(&epit_timer.cdev, epit_timer.dev_num, 1); if (ret < 0) { printk(KERN_ERR "Failed to add cdev: %d\n", ret); goto err_cdev_add; } // Create device class and device epit_timer.cls = class_create(THIS_MODULE, DEV_NAME); if (IS_ERR(epit_timer.cls)) { ret = PTR_ERR(epit_timer.cls); printk(KERN_ERR "Failed to create class: %d\n", ret); goto err_cls_create; } epit_timer.dev = device_create(epit_timer.cls, NULL, epit_timer.dev_num, NULL, DEV_NAME); if (IS_ERR(epit_timer.dev)) { ret = PTR_ERR(epit_timer.dev); printk(KERN_ERR "Failed to create device: %d\n", ret); goto err_dev_create; } // Map epit base address epit_timer.epit_base = ioremap(EPIT_BASE_ADDR, 0x1000); if (!epit_timer.epit_base) { printk(KERN_ERR "Failed to map epit base address\n"); ret = -ENOMEM; goto err_ioremap; } // Request irq epit_timer.irq_num = EPIT_IRQ_NUM; ret = request_irq(epit_timer.irq_num, epit_irq_handler, IRQF_TRIGGER_RISING, DEV_NAME, &epit_timer); if (ret < 0) { printk(KERN_ERR "Failed to request irq: %d\n", ret); goto err_request_irq; } // Success printk(KERN_INFO "epit timer driver loaded\n"); return 0; err_request_irq: iounmap(epit_timer.epit_base); err_ioremap: device_destroy(epit_timer.cls, epit_timer.dev_num); err_dev_create: class_destroy(epit_timer.cls); err_cls_create: cdev_del(&epit_timer.cdev); err_cdev_add: unregister_chrdev_region(epit_timer.dev_num, 1); return ret; } static void __exit epit_exit(void) { // Free irq free_irq(epit_timer.irq_num, &epit_timer); // Unmap epit base address iounmap(epit_timer.epit_base); // Destroy device class and device device_destroy(epit_timer.cls, epit_timer.dev_num); class_destroy(epit_timer.cls); // Remove cdev from system cdev_del(&epit_timer.cdev); // Free device number unregister_chrdev_region(epit_timer.dev_num, 1); printk(KERN_INFO "epit timer driver unloaded\n"); } module_init(epit_init); module_exit(epit_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("imx6ull epit timer driver"); ``` 此代码仅供参考,其的TODO注释需要根据具体的应用场景来实现。同时,还需要在Makefile添加编译该模块的规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值