随机数是用于试验的数,它是随机生成的,在发那科机器人系统中,系统变量中的$FAST_CLOCK为机器人系统自启动运行时的时间,该系统变量会实时进行刷新,时间单位毫秒(ms),本篇文章利用该变量生成随机数,可以指定随机数产生的范围。
KAREL程序
PROGRAM random
VAR
status :INTEGER
get_int :INTEGER
--***********************************
--random_(min_num : INTEGER;max_num:INTEGER;ret_status:INTEGER) : INTEGER
--Author: Zhaomengkang
--Date: 2021年10月4日
--[IN ] min_num : ***小随机数
--[IN ] max_num : ***大随机数
--[OUT ] ret_status:状态,-1 ***小数大于***大数
--[OUT ] ret_status:状态,-2 ***小数或***大数小于0
--[RETURN] INTEGER: 处于[min_num,max_num]区间的随机数
--***********************************
ROUTINE random_(min_num : INTEGER;max_num:INTEGER;ret_status:INTEGER) : INTEGER
VAR
ret_random1 :INTEGER
ret_random2 :INTEGER
random_real :REAL
BEGIN
-- 参数判断
IF (min_num > max_num)THEN ret_status = -1;RETURN(-1);ENDIF
IF (min_num<0) OR (max_num<0) THEN ret_status = -2;RETURN(-2);ENDIF
-- 产生随机数
REPEAT
DELAY(1) -- 必须有该延时,用于系统处理其它任务
-- 随机数初值
ret_random1 = max_num + $FAST_CLOCK
-- 算法来自C语言
ret_random1 =(25173*ret_random1+13849) MOD 65536
random_real = ret_random1 / 65535.0
-- 随机数取正整
ret_random2 = ROUND(ABS(random_real * max_num))
-- 结果判断,满足结束RETURN返回
UNTIL (ret_random2>=min_num) AND (ret_random2<=max_num)
ret_status = 0 --状态正常
-- 返回结果
RETURN(ret_random2)
END random_
--***********************************
--MAIN PROG
--测试随机数
--***********************************
BEGIN
get_int = random_(1,4,status)
-- 返回状态为0表示获取成功
IF status = 0 THEN
FORCE_SPMENU(TP_PANEL,SPI_TPUSER,1)
WRITE TPDISPLAY(CHR(128),CHR(137))
WRITE TPDISPLAY('Random number:',get_int,CR)
ELSE
FORCE_SPMENU(TP_PANEL,SPI_TPUSER,1)
WRITE TPDISPLAY(CHR(128),CHR(137))
WRITE TPDISPLAY('Random process error! status: ',get_int,CR)
ENDIF
END random
上述程序,产生的随机数区间属于N+(正整数),且下限必须小于或等于上限。生成的随机数∈[min_num,max_num]。
咨询详情:FANUC发那科机器人