FANUC KAREL XML parser



也许这里有人对FANUC KAREL有一点了解。 我必须创建一个XML解析器,以获取电报的特定部分。

我从 FANUC 模板代码开始,但目前没有得到任何结果。无。

在这里你可以看到消息,我必须解析:

<?xml version="1.0" ?>
<message><name>Run.Locate.Ok</name><job>1</job><match>1</match><matches>1</matches><x>90.735872311523</x><y>-5.0591040552784</y><z>0</z><rx>0</rx><ry>0</ry><rz>166.37113177833</rz><px>90.735872311523</px><py>-5.0591040552784</py><pz>0</pz><prx>0</prx><pry>0</pry><prz>166.37113177833</prz><scale>1.0</scale><score>97.627884149551</score><time>134</time><exposure>1</exposure><identified>1</identified></message>

在这里你可以看到我目前的卡雷尔来源:

PROGRAM xmlparse
%NOLOCKGROUP
%NOPAUSESHFT
%NOPAUSE = ERROR + COMMAND + TPENABLE
%NOABORT = ERROR + COMMAND
%ENVIRONMENT xml
%include klerxmlf
CONST
MYXML_CONST = 3
TYPE
xmlstrct_t = STRUCTURE
first   :   integer
second  :   real
third   :   boolean
fourth  :   string[20]
ENDSTRUCTURE
-- Local Vars
VAR
xml_result  :   file
status      :   INTEGER
tag_name    :   string[32]
attrnames   :   array[32] of string[32]
attrvalues  :   array[32] of string[64]
text        :   array[32] of String[128]
xmlstrct    :   xmlstrct_t
tag_ident   :   integer
textdone    :   boolean
func_code   :   integer
text_idx    :   integer
numattr     :   integer
done        :   boolean 
startdata   :   boolean
xmlp_done   :   boolean

Routine xml_parse:boolean
BEGIN   
-- Parse XML Data
SET_FILE_ATR(xml_result, ATR_XML)
CLR_IO_STAT(xml_result)
WRITE TPDISPLAY('XML_Start',CR)
OPEN FILE xml_result('RO','MC:result.xml')
WRITE TPDISPLAY('File OK',CR)
status = IO_STATUS(xml_result)
WRITE TPDISPLAY('Status 1',CR)
IF (status <> 0) THEN
POST_ERR(status, '', 0, 0)
abort
ENDIF
WRITE TPDISPLAY('Status 2',CR)
xml_addtag (xml_result, 'xmlstrct_t', 32, FALSE, MYXML_CONST, status)
WRITE TPDISPLAY('Status 3',CR)
textdone = TRUE
done = FALSE
startdata = FALSE
while (done = FALSE) DO
xml_scan(xml_result,'message',tag_ident,func_code,status)
WRITE TPDISPLAY('Status 4',CR)
if (status = 0) THEN
done = TRUE
ENDIF
IF (status = XML_FUNCTION) THEN
Status = 0
SELECT tag_ident of
Case (MYXML_CONST) :
SELECT func_code of
Case (XML_START) :
text_idx = 1
xml_setvar (xml_result, 'message', 'xmlstrct', status)
xml_getdata(xml_result, numattr, attrnames, attrvalues, text[text_idx], textdone, status)
Case (XML_END) :
IF (startdata = TRUE) THEN
startdata = FALSE
ELSE
text_idx = 1
xml_setvar (xml_result, 'message', 'xmlstrct', status)
xml_getdata(xml_result, numattr, attrnames, attrvalues, text[text_idx], textdone, status)
ENDIF
Case (XML_TXCONT) :
text_idx = text_idx + 1
xml_getdata (xml_result, numattr, attrnames, attrvalues, text[text_idx], textdone, status)
ELSE:
ENDSELECT
ELSE:
ENDSELECT
ELSE
IF (status <> XML_SCANLIM) THEN
POST_ERR(status, '', 0, 0)
done = TRUE
ENDIF
ENDIF
ENDWHILE
WRITE TPDISPLAY('Status 5',CR)
xml_remtag(xml_result, 'xmlstrct_t', status)
close file xml_result
status = IO_STATUS(xml_result)
IF (status <> 0) THEN
POST_ERR(status, '', 0, 0)
xmlp_done = FALSE
ELSE
xmlp_done = TRUE
ENDIF
WRITE TPDISPLAY('File Closed 3',CR)
RETURN (xmlp_done)
END xml_parse
Begin
END xmlparse

我需要的是单独的标签内容,例如位置。

有人可以给我一些大脑输入吗?

谢谢!

FANUC Karel 手册对 XML 函数肯定不清楚。5年前,我只写过一次Karel XML解析器,所以我不能像以前那样准确,但我清楚地记得一些可能对你有帮助的提示。

首先,尝试一个单行XML文件并为其编写一个特定的Karel程序,它将对你理解Karel的工作原理有很大帮助。

请记住,STRUCTURE应该描述与 XML 标记将包含的完全相同的数据类型和数量:手动示例的结构是为 XML 近似制作的,如下所示

<data>
<first>5</second>
<second>5.5</second>
<third>1</third>
<fourth>some text here</forth>
</data>

在您的情况下,让我格式化您的 XML:

<message>
<name>Run.Locate.Ok</name>
<job>1</job>
<match>1</match>
<matches>1</matches>
<x>90.735872311523</x>
<y>-5.0591040552784</y>
<z>0</z>
<rx>0</rx>
<ry>0</ry>
<rz>166.37113177833</rz>
<px>90.735872311523</px>
<py>-5.0591040552784</py>
<pz>0</pz>
<prx>0</prx>
<pry>0</pry>
<prz>166.37113177833</prz>
<scale>1.0</scale>
<score>97.627884149551</score>
<time>134</time>
<exposure>1</exposure>
<identified>1</identified>
</message>

我宁愿采用更务实的方法:

TYPE
your_data = STRUCTURE
name: STRING[64]
job: INTEGER
x: REAL
-- All other things
ENDSTRUCTURE

而不是直接使用 XML 函数,而无需循环开销。

一个小提示:FANUC机器人对实数使用32位单精度表示;如果可能的话,我宁愿对浮点数使用较短的表示,否则Karel程序将大量舍入值,您可能会错过一些相关数据。

希望这有帮助,以防万一让我知道我可以尝试搜索我的卡雷尔。

我认为问题可能是:

OPEN FILE xml_result('RO','MC:result.xml')

应该是:

OPEN FILE xml_result('RW','MC:result.xml')

打开 XML 文件时是 RW 而不是 RO

最新更新