Fanuc Karel语言中,integer-32位整数(-2147483648 到+2147483646),Real-浮点数;GIN和GOUT是最高16位的无符号整数,在Karel中不能为负数;R寄存器可以存放整数和浮点数,但它不能认为是一个绝对地址,更像一个全局变量,有数据类型和数据值两个属性。
通过实验来学习Karel语言对R寄存器和GOUT组输出的操作,以及数据类型和运算的关系。
一,程序规划
Karel程序功能:
将GO(GO[11])的值加1,并赋值到integer变量;
integer变量赋值到real变量,将integer和real变量分别写入到R寄存器(R[2]和R[3]);
输出integer和GO值到user画面。
读出R寄存器(R[1],R[2],R[3])值,输出到user画面。
TP程序功能:
寄存器指令,将GO值传到R寄存器(R[1])
调用上面的Karel程序。
二,准备工作
示教器上配置好GO[11],组合16个DO点
建立Karel程序,构建pc程序
TP程序:
三,代码及测试:
1,GO(GO[11])的值加1
在示教器上将GO[11]修改成32766,
执行一次TP程序,示教器上查看 R[1]=32766, GO[11]=32767;
再执行一次TP程序,示教器上查看R[1]=32767, GO[11]=32768;
再执行一次TP程序,示教器上查看R[1]=32768, 出现报警信息:
karel代码中 第18行,GOUT[11]=GOUT[11]+1 执行出错:
出错可能原因:karel对GOUT[11]进行读取或运算时,GOUT[11]被当成16位整数处理,但在对GOUT[11]进行赋值时,被当成16位无符号处理。
为验证上述分析,修改代码之后再测试:
在示教器上将GO[11]修改成32766,
执行一次TP程序,示教器上查看 R[1]=32766, GO[11]=32767;
再执行一次TP程序,示教器上查看R[1]=32767, GO[11]=32768;
再执行一次TP程序,示教器上查看R[1]=32768, GO[11]=32769.
通过以上实验,可以看出:
A, GO[X]是16位无符号整数;
B, 在TP程序中,R寄存器存储格式长度32位,能以整数(?)形式获取GO[X]表达的16位无符号整数。
C,在karel中,对GO[X]赋值时,必须以16位无符号整数形式赋值,不能出现负整数;对GO[X]值运算或取值时,以16位整数处理。
2,integer变量赋值到real变量,将integer和real变量分别写入到R寄存器(R[2]和R[3]);输出integer和GO值到user画面。
写入寄存器时,写入integer和real数据类型,需要用不同的指令。
测试:
从上面可以看出:
A,karel中,输出GOUT[11]的WRITE 语句中,获取GOUT[11]值时,还是以整数形式获取。
B,虽然在示教器中DATA画面中,R[3]看起来是整数,但实际上是以real的形式存在的。
3,读出R寄存器(R[1],R[2],R[3])值,输出到user画面。
从上面可以看出:
虽然在示教器上看,R[3]看起来像整数,实际上是浮点数。
4,直接在示教器DATA画面中R寄存器值,用karel读出并输出到user画面
修改读取R[1]并输出的语句,删除TP程序中R[1]的赋值语句:
在示教器中给R[1]输入一个较大的2147483646,会自动转换为浮点数,
执行TP程序结果:
在示教器中给R[1]输入一个略小的65536,显示为整数,
执行TP程序结果:
从上面可以看出:
A,在示教器DATA中输入R寄存器数值时,系统自动会切换整数/浮点数形式,在karel读取时,要注意分辨数据类型。
四:实验总结
1, 在TP或KAREL中,GO[X]存储16位无符号整数。
2,在karel中,对GO[X]赋值时,必须以16位无符号整数形式赋值,不能出现负整数;对GO[X]值运算或取值时,以16位整数处理,GO[X]值>32767,以负整数读取和运算。
3,在TP程序中,R寄存器存储格式长度32位,32位整数形式获取GO[X]表达的16位无符号整数。
4, R寄存器具有数据类型和数据值两个属性,可以“结构变量”来理解,Type[ integer | real] / Val (integer) / Val(real),不能以“绝对地址”理解.
5, R寄存器在示教器DATA画面中输入值时,会自动切换为整数或浮点数,对于不确定的R寄存器,在karel中读取时,需要分辨数据类型。
五:本次实验Karel的完整代码:
(完) |