Fanuc Karel(基于Pascal)需要帮助

Fanuc Karel(基于Pascal)需要帮助,pascal,Pascal,我项目的任务是通过语音操纵fanuc robot…问题在于我在机器人控制器karel中的第二个代码…首先,机器人在tcp/ip上以整数的形式获得命令后,不知何故它将其存储在缓冲区中,所以下一次我启动程序时,它会从上一个会话运行命令而不运行..这可能非常危险..所以我在前面的karel过程中找到BYTES_并尝试清除端口,但它不会工作。下一个问题是条件循环…我已经尝试运行多个命令,只要有服务器连接与循环重复…直到…但这也不会工作。请我需要帮助…不知道下一步做什么…提前感谢大家!这是我在卡雷尔的代码

我项目的任务是通过语音操纵fanuc robot…问题在于我在机器人控制器karel中的第二个代码…首先,机器人在tcp/ip上以整数的形式获得命令后,不知何故它将其存储在缓冲区中,所以下一次我启动程序时,它会从上一个会话运行命令而不运行..这可能非常危险..所以我在前面的karel过程中找到BYTES_并尝试清除端口,但它不会工作。下一个问题是条件循环…我已经尝试运行多个命令,只要有服务器连接与循环重复…直到…但这也不会工作。请我需要帮助…不知道下一步做什么…提前感谢大家!这是我在卡雷尔的代码

PROGRAM nikola
%NOLOCKGROUP
%NOPAUSE = ERROR + COMMAND + TPENABLE



VAR
  i,n,tmp_int,STATUS:INTEGER
  file_var:FILE
  vox_str:STRING[128]
  stat,n_bytes,entry,prog_index:INTEGER
  FINISHED:BOOLEAN
  ----------------------VANJSKE RUTINE-------------------------
  ROUTINE OPEN_FILE_(FILE_ : FILE; TAG_ : STRING) FROM LIB_FILE
  ROUTINE CLOSE_FILE_(FILE_ : FILE; TAG_ : STRING) FROM LIB_FILE
  ROUTINE WRITE_(STRING_ : STRING) FROM LIB_FILE
  ROUTINE HANDSHAKING_(ID_ : STRING; TIP_: STRING) FROM LIB_FILE
  --------------------------------------------------------------

  BEGIN
  SET_FILE_ATR(file_var, ATR_IA)
  --set the server port BEFORE doing a CONNECT
  SET_VAR(entry, '*SYSTEM*','$HOSTS_CFG[5].$SERVER_PORT',12350,STATUS)
  stat=SET_PORT_ATR (PORT_1, ATR_READAHD,1)

  --Spajanje tag-a
  WRITE TPDISPLAY('Uspostava veze sa R2...',CR)
  CLOSE_FILE_(file_var,'S5:')
  OPEN_FILE_(file_var,'S5:')

  IF IO_STATUS(file_var)<>0--inpput,output,value have to be 0 if there is connection established
  THEN FINISHED=TRUE
  ENDIF

  REPEAT
   BYTES_AHEAD (file_var, n_bytes, STAT)--catching number of bytes ready to be read
   IF (n_bytes >= 1) THEN --if there is byres to be read
   READ file_var(vox_str::1) --read byte by byte
   stat=IO_STATUS (file_var) --status of operation
   ENDIF
   UNTIL stat <> 0 --continue until there is no bytes



 REPEAT
   FINISHED=FALSE
  --Reading Command "Robovox go up" 
   REPEAT
   BYTES_AHEAD (file_var, n_bytes, STAT)--catching number of bytes ready to be read
   IF (n_bytes >= 1) THEN --if there is byres to be read
   READ file_var(vox_str::1) --read byte by byte
   stat=IO_STATUS (file_var) --status of operation
   ENDIF
   UNTIL stat <> 0 --continue until there is no bytes
   --
   IF (n_bytes = 0) THEN --is there is no bytes
   READ file_var(vox_str::3)
    ENDIF
   IF UNINIT(vox_str) THEN
    vox_str=''
   ENDIF
   IF (vox_str='120') THEN
   CALL_PROG('NIK_UP',prog_index) 
   ENDIF

--Reading command "Robovox go down"
   REPEAT
   BYTES_AHEAD (file_var, n_bytes, STAT)--catching number of bytes ready to be read
   IF (n_bytes >= 1) THEN --if there is byres to be read
   READ file_var(vox_str::1) --read byte by byte
   stat=IO_STATUS (file_var) --status of operation
   ENDIF
   UNTIL stat <> 0 --continue until there is ni bytes
   --
   IF (n_bytes = 0) THEN --if there is no bytes
   READ file_var(vox_str::3)
   ENDIF
   IF (vox_str='130') THEN
    ENDIF
   CALL_PROG('NIK_DOWN',prog_index)
   ENDIF

 UNTIL (FINISHED=TRUE)


END nikola
节目尼古拉
%诺洛克集团
%NOPAUSE=错误+命令+TPENABLE
变量
i、 n,tmp_int,状态:整数
file\u var:file
vox_str:STRING[128]
stat,n_字节,条目,prog_索引:整数
完成:布尔值
----------------------万斯克芦丁-------------------------
例程从LIB_文件打开_文件(文件:文件;标记:字符串)
从LIB_文件关闭_文件(文件:文件;标记:字符串)
从LIB_文件执行例程写入(字符串:字符串)
从LIB_文件进行例行握手(ID_uu:STRING;TIP_uu:STRING)
--------------------------------------------------------------
开始
设置文件ATR(文件变量、ATR IA)
--在进行连接之前设置服务器端口
设置变量(条目“*SYSTEM*”,“$HOSTS\U CFG[5]。$SERVER\U PORT”,12350,状态)
stat=设置端口ATR(端口1,ATR读取,1)
--Spajanje tag-a
写入TPDISPLAY('Uspostava veze sa R2…',CR)
关闭文件(文件变量'S5:')
打开文件(文件变量'S5:')
如果IO_状态(file_var)为0——如果建立了连接,则输入、输出、值必须为0
然后完成=真
恩迪夫
重复
提前字节数(文件变量,n字节,STAT)--捕获准备读取的字节数
如果(n_bytes>=1),那么——如果要读取byres
读取文件_var(vox_str::1)--逐字节读取
stat=IO_状态(文件_变量)——操作状态
恩迪夫
直到stat 0--继续,直到没有字节为止
重复
完成=错误
--读取命令“Robovox上升”
重复
提前字节数(文件变量,n字节,STAT)--捕获准备读取的字节数
如果(n_bytes>=1),那么——如果要读取byres
读取文件_var(vox_str::1)--逐字节读取
stat=IO_状态(文件_变量)——操作状态
恩迪夫
直到stat 0--继续,直到没有字节为止
--
如果(n_bytes=0),那么——是否没有字节
读取文件变量(vox\u str::3)
恩迪夫
如果未指定(vox_str),则
vox_str=''
恩迪夫
如果(vox_str='120'),则
调用程序('NIK_UP',程序索引)
恩迪夫
--读取命令“Robovox下降”
重复
提前字节数(文件变量,n字节,STAT)--捕获准备读取的字节数
如果(n_bytes>=1),那么——如果要读取byres
读取文件_var(vox_str::1)--逐字节读取
stat=IO_状态(文件_变量)——操作状态
恩迪夫
直到stat 0--继续,直到有ni个字节
--
如果(n_bytes=0),那么——如果没有字节
读取文件变量(vox\u str::3)
恩迪夫
如果(vox_str='130'),则
恩迪夫
调用程序('NIK_DOWN',程序索引)
恩迪夫
直到(完成=真)
结束尼古拉

您发布的代码很难阅读(缺少缩进),而且有些外观 奇数(例如,接近尾端:if(vox_str='130')然后endif

所以…这是一个更一般的回答

尝试在开始时添加代码来初始化变量,看看问题是否存在 消失。如果它消失了,这意味着代码中有一些路径 没有设置一个或多个

i:=0; n:=0; vox_str:=''; 统计:=0; n_字节:=0; 分录:=0; 进步指数:=0


您可能还想读取

我使用此例程初始化缓冲区:

ROUTINE init_buffer
BEGIN
    WRITE('init buffer',CR)
    n_bytes=0
    REPEAT
        BYTES_AHEAD (file_var, n_bytes, STATUS) --Get number of bytes ready  to be read 
        WRITE('remaining byte:',n_bytes,' STATUS ',STATUS, CR)
        IF (n_bytes >= 1) THEN --there are bytes to be read 
            IF n_bytes>128 THEN
                READ file_var(init_bufs::128) 
                STATUS=IO_STATUS (rs232) --get the status of the read operation 
            else
                READ file_var(init_bufs::n_bytes) 
                STATUS=IO_STATUS (rs232) --get the status of the read operation 
            ENDIF
        ENDIF 
    UNTIL n_bytes = 0 --continue until no more bytes are left 
END init_buffer

你找到问题了吗?