当前位置: 首页 > 工具软件 > Karel > 使用案例 >

谈FANUC KAREL与C的几点区别

房泉
2023-12-01

春招最后去了个制造业的小公司,被派去写发那科机器人的通信程序,要用到karel语言,看了一周多手册和资料,自己总结了以下几点:

Karel与C的区别

  1. 数组索引从1开始而不是从0开始, FOR s TO e的遍历区间是[s,e]而不是[s,e), 注意

  2. 不能操作变量地址,也不能隐式转换,因此在面临一些类型转换的情况很不灵活,虽然Karel本身有一些自带的例程比如CNV_STR_INT,CHR,ORD这些,但是有一些特殊情况,像字节串转换成数字之类的情况, 还是有必要自制函数。

  3. ROUTINE的参数列表,每个参数是以;区分的,而不是,区分的,别被坑了。

    相同类型的参数可以用,写在一起,比如

    ROUTINE func(x1,x2,y1,y2 : INTEGER)

  4. 不存在重载和重写,函数名确定下来了就是唯一的ID,不可重复实现,和C一样

  5. 数据类型对比:STRING - const char*, INTEGER - int, BYTE - char, REAL - float, STRUCTURE - struct, Karel还有一些独有类型比如VECTOR,XYZWPR, POS等

  6. Karel的STRING是只读的,可以拼接扩展(类似C的strcat,推测本质是另开辟更大的内存用于存放新拼接的字符,并重定向到那块内存), 有SUB_STR, STR_LEN等内置函数,没法下标索引取字节, 更没法通过下标赋值,但却是Karel的基本类型之一,可以直接=赋值 / READ / WRITE

  7. 各数据类型的转换总结:

    BYTE,INTEGER和REAL:
    	INTEGER(范围局限在0-255内) 可直接赋值给 BYTE
    	BYTE 可直接赋值给 INTEGER, REAL
    BYTE和STRING:
    	BYTE ---CHR---> STRING
    	STRING --ORD---> BYTE
    STRING和INTEGER:
        STRING单个字符转换成INTEGER可用ORD的方法
        STRING整体转化成INTEGER用CNV_STR_INT,注意实现类似于C++的stoi而不是隐式转换,如果STRING存在非法值如无法打印的字符是无法转换INTEGER的(返回UNINIT),因此幻想用它将HEX串转成数字就算了,必须自行实现
    	INTEGER可通过CHR转换成对应的ASCII字符
    	INTEGER也可通过CNV_INT_STR转换成对应的字符串,类似C++ to_string方法
    	
    
  8. IO对比:都有文件读写(FILE类型对FILE指针)和终端读写(TPDISPLAY和stdout)的形式,Karel的READ 还可以直接括号变量从外界输入取值,起到Python中input的作用

  9. FROM是个有用的东西,利用FROM可以实现头文件和模块化的编程,注意你要程序FROM引用的模块要确保已经编成pc程序放入示教器中了。

  10. Karel没有自己的自动化构建工具,但是也可以用C的makefile实现统一构建打包(把编好的各pc程序放在一个文件夹),配合ftp脚本把构建好的包内pc程序一次性加载到示教器上,再也不用到roboguide上一个个构建了,美滋滋!

    关于怎么搞自动化构建,可参考github的这位大佬:https://github.com/onerobotics/strings

  11. Karel的调试方法包括:

    1. 日志(WRITE TPDISPLAY)
    2. 单步调试(需在示教器上设置: MENU - 试运行 - 单步命令执行方式 设置为 每个命令)
    3. DATA查看变量,只能查看PROGRAM级别的全局变量,ROUTINUE内定义的变量看不了
    4. 伪断点:代码中插入PAUSE
    5. 设置全局STATUS变量,在调用返回status的例程时可用于检测例程是否正常运行(如socket中调用MSG_CONNECT)
    6. 示教器报错的代码可在https://www.shanghai-fanuc.com.cn/trouble/查询原因。
  12. Karel的循环方式:REPEAT-UNTIL, FOR-TO-DO-ENDFOR, WHILE-ENDWHILE,在Karel中没有continue和break这样的语句来实现循环内的条件控制,只能用GOTO这样的方法代劳(很古老吧,不过现代语言的continue和break本质上也是GOTO)

  13. Karel学习最有力的三大工具:手册, github, 交接资料上的相关视频及衍生群组(如飘雨阁i)

  14. Keep Learning!

 类似资料: