6.5 模拟输入/输出
6.5.2 模拟输入
通过简单地给REAL变量分配一个值,可以用变量$ANIN[1]到$ANIN[8]读KRC…中的32 个 模拟输入,:
REAL PART
. .
PART=$ANIN[3]
或
SIGNAL SENSOR3 $ANIN[3]
REAL PART
. .
PART=SENSOR3
$ANIN[No]中范围在+1.0和-1.0之间的值对应输入电压+10V到-10V。
ANIN 用ANIN声明来循环读模拟输入。使用该声明,最多可以同时读3个模拟输入。以插补循环 速率来读。
使用指令顺序 SIGNAL SENSOR3 $ANIN[3]
REAL PART
. .
ANIN ON PART=1*SENSOR3
可以循环读模拟输入3。而使用指令 ANINOFFSENSOR3
您可以结束读。
注意同时最多可以激活3个ANIN ON语句。在两种语句中都允许存储相同的模拟接口和定 义相同的变量。 直接指定$ANIN[No]。
因子 REAL 任何因素,可以是变量、信号名或常数。
偏置 REAL 可随意编程的偏置。该偏置可以是变量、信号名或常数。
长沙工控帮教育科技有限公司
专家编程
有关模拟输入和输出的指令在下面的例子中举例说明。使用系统变量$TECHIN[1]和一个连 接到模拟输入的轨迹跟踪传感器。可在运动期间进行轨迹修正。变量$VEL_ACT总是包含当 前轨迹的速度,可用作速度比例模拟输出,可在焊接应用中控制分配的胶数量。
DEFANSIG()
;---声明部分---
EXT BAS (BAS_COMMAND:IN,REAL:IN)
DECL AXIS HOME INT I
SIGNAL ADHESIVE $ANOUT[1] ;打开胶的喷嘴 SIGNAL CORRECTION $ANIN[5] ;轨迹跟踪传感器
;---初始化---
BAS(#INITMOV,0) ;初始化速度,
;加速度,$BASE,$TOOL,等 HOME={AXIS:A1 0,A2 -90,A3 90,A4 0,A5 0,A6 0}
FOR I=1 TO 16
IF $ANIN[1]>=0 THEN ;仅当模拟输入1为正电压时进 行胶操作
PTP POS1
;根据传感器信号,使用系统变量$TECHIN进行轨迹修正 ANIN ON $TECHIN[1]=1*CORRECTION+0.1
;速度比例模拟输出;系统变量$VEL_ACT包含当前的轨迹速度 ANOUT ON ADHESIVE=0.5*$VEL_ACT+0.2 DELAY=-0.12
LIN POS2
长沙工控帮教育科技有限公司
6 输入输出指令(续)
$DIGIN1CODE…$DIGIN6CODE,$STROBE1…$S TROBE6 和$STROBE1LEV…$STROBE6LEV 来定义::
DECL DIGINCODE $DIGIN3CODE=#UNSIGNED ;前面无符号
SIGNAL $STROBE3 $OUT[1000] ;定义选通脉冲输出 BOOL $STROBE3LEV=TRUE ;选通脉冲是高脉冲
选通脉冲输出是指KRC…输出一个冻结外部装置(例如旋转编码器)的信号的特定脉 12位长度不带符号(#UNSIGNED) 范围:0…4095 数字输入可通过通常的值分配静态地读:
INT NUMBER . . .
NUMBER=$DIGIN2
DIGIN 或循环使用DIGIN语句读:
INTNUMBER . . .
DIGIN ON NUMBER=FACTOR*$DIGIN2+OFFSET .
. .
DIGIN OFF $DIGIN2
同时允许使用全部6个DIGINON指令。模拟输入信号也可以在DIGIN ON语句中读入(例 如作为因素)。语法与ANIN ON语句完全类似:
长沙工控帮教育科技有限公司
专家编程
自变量 数据类型 含义
Value REAL 值可以是变量或(输出)信号名。循环读的结果存储在 value中。
Signalname REAL 指定数字输入的信号变量,仅允许使用
$DIGIN1…$DIGIN6。
Factor REAL 任何因素,可以是变量、信号名或常数。
Offset REAL 可随意编程的偏置。该偏置可以是变量、信号名或常数。
表24 DIGIN语句中的自变量
长沙工控帮教育科技有限公司
7 子程序和函数(续)
7 子程序和函数
当处理相似的,通常是重复的程序部分时,为了减少字符的数量和程序的长度,引 入子程序和函数作为语言结构。
对于大的程序来说,使用子程序和函数效果明显,可以重复使用。即已经写过的运 算法则和用于建立程序的子程序的重复使用。这种建立方法可以产生一个分级配置,
使单独的子程序可以被更高级的程序调用,完全可以处理任务和传递结果。
7.1 声明
子程序和函数是一个独立的程序部分,有它们自己的程序描述、声明部分和指令部 分。可在主程序的任何位置调用子程序和函数。子程序和函数执行完后,程序跳跃 调用返回子程序的下一个命令(见图35)。
而且,子程序和/或函数内部也可以调用子程序和/或函数。最大允许的嵌套深度为 20。如果超过该值,则错误消息“PROGRAM STACK OVERFLOW”产生。允许子程序和 或函数的循环调用,换句话说就是子程序和函数可调用它们自己。
DEF 所有的子程序与主程序的声明方法一样,使用DEF声明加上名字,以END结束,举例 说明:
DEF SUBPROG()
… END
图35子程序调用和返回到主程序
长沙工控帮教育科技有限公司
8 中断处理(续)
DEFFCT 函数是子程序类型中的一种;不同的是,程序名同时也是一个指定数据类型的变量。
函数的结果可以通过简单地给变量分配一个值来传递。因此,当使用关键字DEFFCT 声明函数时,函数的数据类型和函数的名字都要指定。函数以ENDFCT指令结束。因为 函数假设为传递一个值,所以必须在ENDFCT语句前使用RETURN语句指定该值。例子:
DEFFCT INT FUNCTION()
…
RETURN(X)
ENDFCT
局部 在局部和全局子程序或函数之间存在基本的区别,对于局部子程序或函数,主程序和
PROG_3()
FUNCTION(REAL:IN)
局部和全局子程序/函数的差别在图36中图示说明::PROG.SRC,PROG_1.SRC和 PROG_3.SRC是各自独立的主程序,而PROG_2FUN.SRC是函数。从PROG.SRC中调用程序
(例如PROG_1.SRC)则自动将被调用的程序变为全局子程序。LOCAL()是PROG.SRC 一个局部子程序,LOCALFUN()是PROG.SRC的一个局部函数。
长沙工控帮教育科技有限公司
7 子程序和函数(续)
图36 局部和全局子程序之间的差别
长沙工控帮教育科技有限公司
8 中断处理(续)
7.2 子程序和函数的调用和参数传递
通过输入子程序名加上圆括号调用子程序。看起来象是一条指令(见节1.1),例子:
SUBPROG1()
函数调用是值分配的一种特殊种类。因此函数永远不是孤立的;经常在相同数据类 型的变量表达式框架内进行函数值的分配。例如:
INTVAR=5*INTFUNCTION()+1 REALVAR=REALFUNCTION()
参数表 主程序中的数据表中声明过的所有变量可以在局部子程序和函数中被识别。而对于 的变量NUMBER重写。
长沙工控帮教育科技有限公司
7 子程序和函数(续)
图37 “通过值调用”和“通过参考调用”之间的差别
在子程序或函数中通过在参数表的每个变量后输入关键字IN输入“通过值调用”。通 过输入字OUT得到 “通过参考调用”,OUT也是缺省设置。例如:
DEF CALCULATE(X:OUT,Y:IN,Z:IN,B)
IN和OUT的使用在下面的例子中说明。子程序和函数是全局的。
长沙工控帮教育科技有限公司
8 中断处理(续)
DEF PROG()
CALCULATE(INT:OUT,INT:IN,INT;IN)
FUNCT1(REAL:IN,REAL:OUT,REAL:OUT,REAL:IN,REAL:OUT)
INT A,B,C
REAL D,E,F,G,H,X A=1
CALCULATE(A,B,C)
;A现在是1
;B现在是2
;C现在是3
X=FUNCT1(H,D,E,F,G)
;D现在是3
DEF CALCULATE(X1:OUT,X2:IN,X3:IN);全局SP
INT X1,X2,X3 X1=X1+10 X2=X2+10 X3=X3+10 END
DEFFCT REAL FUNCT1(X1:IN,X2:OUT,X3:OUT,X4:IN,X5:OUT);全局fct。
REAL X1,X2,X3,X4,X5 X1=X1*2
X2=X2*3 X3=X3*4 X4=X4*5 X5=X5*6 RETURN(X4)
ENDFCT
当传输一个阵列时,在子程序和函数中也必须声明该阵列,但是没有索引。请参考下 面的例子,在这个例子中,阵列X[ ]的值被乘以2(函数是全局函数):
长沙工控帮教育科技有限公司
7 子程序和函数(续)
DEF ARRAY()
EXT BAS(BAS_COMMAND:IN,REAL:IN)
INTX[5] ;阵列声明
INTI
BAS(#INITMOV,0)
FOR I=1 T O5
X[I]=I ;初始化阵列X[ ] ENDFOR ;X[1]=1,X[2]=2,X[3]=3,
X[4]=4,x[5]=5
DOUBLE(X[ ]);使用阵列参数调用子程序
;X[1]=2,X[2]=4,X[3]=6,X[4]=8,X[5]=10‘
END
DEF DOUBLE(A[ ]:OUT)
INTA[ ] ;重复阵列的声明
INT I
FOR I= 1 TO 5
A[I]=2*A[I] ;加倍阵列值 ENDFOR
END
同样地,当传递多维阵列时也没有索引;但是必须通过输入逗号指定阵列的维数。例如:
A[,]两维阵列 A[,,] 三维阵列
长沙工控帮教育科技有限公司
8 中断处理(续)
长沙工控帮教育科技有限公司
专家编程
8 中断处理
当在复杂的制造系统中使用机器人时,需要机器人可以明确地和立即地对某些外部或内 部事件作出反应,还有可能要求其它动作的执行与机器人处理同时进行。换句话说就是 必须中断正在运行的机器人程序,启动中断子程序和函数。子程序执行完成后,如果没 有其它的事件发生,则中断的机器人程序重新开始。
使用中断语句可以使程序中断或开始。以该方法,用户通过编程可以对与程序的执行不 同时发生的事件有反应的能力。
下列情况可以触发中断
类似于传感器的装备,外围设备单元等,
错误消息 用户或 安全回路
例如,当急停按钮被按下时可以调用一个复位某些输出信号的中断程序(已经准备好的 程序IR_STOPM.SRC)。
长沙工控帮教育科技有限公司
8 中断处理(续)
8.1声明
可能产生中断的原因和系统将对它们采取的措施,必须在中断可以被激活前定义好。
INTERRUPT 使用中断声明完成该操作,给每个中断分配一个优先级、事件和调用的中断程序。完整 的语句是:
自变量的含义见表25。.
自变量 数据类型 含义
Priority INT 指定中断优先级的算术表达式,可以使用的优先级为 1…39和81…128。
值40…80为机器人系统的自动优先级分配保留。
INTERRUPT DECL 4 WHEN $IN[3]==TRUE DO UP1()
声明一个优先级为4的中断,例如一旦输入3设置为高就调用子程序UP1()。
中断声明是一条指令,因此,千万不要在声明部分中使用。
中断仅可以在声明的编程级或以下被识别,在更高的编程级中,即使中断被激活,也不能 被识别出。换句话说就是在子程序中声明的中断不能在主程序中被识别。(见图38)。
GLOBAL 另一方面,在任何子程序中声明中断为GLOBAL时,级别即使在左边也不会丢失其有效性(见 图38)。
GLOBAL INTERRUPT DECL 4 WHEN $IN[3]= TRUE DO UP1()
长沙工控帮教育科技有限公司
专家编程
●一个声明可能在任何时候被另一个声明重写。
●GLOBAL中断不同于一般的中断,即使声明的子程序在左边仍然保持有效。
●一次最多可以声明32个中断。
●在中断条件下不能存储结构变量和成分。
●除GLOBAL变量和数据表中声明的变量外,实时变量不能当作中断程序参数被传输。
主程序
子程序
中断 1、3、23 有效
中断 2 有效 主程序
图38根据位置和声明的类型决定的中断的有效性范围
长沙工控帮教育科技有限公司
8 中断处理(续)
8.2 激活的中断
开中断 当第一次被声明时,中断是关的。使用指令 INTERRUPT ON 4
开优先级为4的中断,且 INTERRUPT ON
开所有中断。定义的中断直到被开后才会起作用。中断事件现在被循环监视。
边缘触发的 检查是边缘触发型的,也就是说一个中断仅在逻辑条件从FALSE状态变化为TRUE状态时被 触发,反之如果当开中断时条件已经是TRUE则不触发。
由于实时性的原因,一次仅可以开 16 个中断,在所有中断全部激活时特别注意。
关中断 与开的方法相同,中断可以单独或所有一起被关:
INTERRUPT OFF 4 或
INTERRUPT OFF
禁止/使能 使用关键字ENABLE和DISABLE,已经打开的中断可以被单独或全部使能或禁止。
禁止命令可以在被中断前保护程序的某些部分。一个禁止的中断可以被识别和存储,但是 不能被执行。仅当被使能后,已经发生的中断才以它们的优先级顺序被执行。
DISABLE 4 或
DISABLE
如果触发前中断被关,则已经存储的事件没有进一步的作用。当中断被禁止时如果发生了 多次中断,则被使能后仅执行一次。
触发一个中断的前提条件是:
●中断必须是声明过的(INTERRUPT DECL…)
●中断必须是声明过的(INTERRUPT DECL…)