技术论坛

 在多次使用的子程序里用边缘指令就这样做吧

返回主题列表
作者 主题
芳季
至圣

经验值: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用于边缘的寄存器,整个字节进行存取。

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。