作者 | 主题 |
---|---|
芳季 至圣 经验值:67491 发帖数:14771 精华帖:100 |
楼主 2017-08-30 10:36:24
主题:在多次使用的子程序里用边缘指令就这样做吧 边缘指令之所以不能用在多次使用的子程序里,其原因是因为边缘指令需要由系统自动记录一个状态位。这个位不像M可以由用户操作。是属于全局的。你的子程序编译后就会自动分配一个寄存器。所以一个边缘指令就只分配了一个寄存器。然而多次使用之后都用上一个寄存器,那么结果当然冲突啦。 学plc的,课本上应该不会少了这个事情:用基本逻辑指令组织出边缘执行效果。这样的内容。 下面就以这个为中心在子程序里面形成一个边缘输出。 另外,在主程序里,仅指主程序,L区是属于独享的空间。这片空间和M的区别其中一个是M可以监视,而L不可监视。可以利用这片空间来充当边缘指令的寄存器。反正有60字节,比M区还大。你的程序中的一些中间量不使用M的话可以尝试使用L。 下面程序开始========================================================= ORGANIZATION_BLOCK MAIN:OB1 TITLE=程序注释 VAR 边缘0:BOOL; 边缘1:BOOL; 边缘2:BOOL; 边缘3:BOOL; END_VAR BEGIN Network 1 // 程序段注释 LD SM0.0 = L60.0 LD I0.0 = L63.7 LD L60.0 CALL SBR0, L63.7, L0.0, Q0.0 END_ORGANIZATION_BLOCK SUBROUTINE_BLOCK SBR_0:SBR0 TITLE=子程序注释 VAR_INPUT 输入:BOOL; END_VAR VAR_IN_OUT 记忆:BOOL; END_VAR VAR_OUTPUT 输出:BOOL; END_VAR BEGIN Network 1 // 程序段注释 LD L0.0 LPS AN L0.1 = L0.2 LPP = L0.1 END_SUBROUTINE_BLOCK INTERRUPT_BLOCK INT_0:INT0 TITLE=中断例程注释 BEGIN Network 1 // 程序段注释 END_INTERRUPT_BLOCK =============================================结束了 复制粘贴等号之间的内容到记事本上,然后以awl扩展名保存,可以在smart软件中导入成程序。 上面的几个边缘0边缘1边缘2其实是你把这个子程序调用多少次就分配各自单独的L位作为寄存器,这样的话不占用你全局的资源,又可以保证运行。 凡是子程序的输入点需要使用边缘指令的,都可以使用类似这样的一种架构去组织你的边缘用途。 每个子程序都要初始一个值,每次输入都先处理一次什么功能,每一个信号指令加一一次,用途是非常广泛的。我现在也正在使用这样的架构处理库程序的信号边缘。专门在库里面留一个B用于边缘的寄存器,整个字节进行存取。 |