前两天在测试一个程序时遇到了如下问题,提示传入参数的读写方式不正确。 FUNC string Rob_currentpos(tooldata tool_vis,wobjdata wobj_vis) VAR robtarget Position; var string CurrentPosition; Position:=CRobT(\Tool:=tool_vis \WObj:=wobj_vis); CurrentPosition:=numtostr(position.trans.x,3)+','+numtostr(position.trans.y,3)+','+numtostr(position.trans.z,3)+','+NumToStr(position.rot.q1,6)+','+NumToStr(position.rot.q2,6)+','+NumToStr(position.rot.q3,6)+','+NumToStr(position.rot.q4,6); RETURN currentposition; ENDFUNC 在排查之后基本确定了第四行有问题,但实际上语法是没问题的。而且将这个函数单独放入main中也是没有报错。最初是以为传入参数的变量不允许是复合类型,后来使用示教器之后排除了这一点,因为示教器同样也可以传入各种数据类型。但是在示教器上发现了一个传入参数模式的概念。 在查阅资料之后,找到了这几个参数之间的区别。以前没注意过这个细节,在此做个记录: 参数包括四种(按访问模式区分): · 正常情况下默认为此模式,参数仅用作输入,同时被视作程序变量。改变此变量,不会改变 对应参数; · INOUT参数规定,对应参数必须为变量(整体、元素或部分)或对应参数必须 为可为程序所改变的完整的永久数据对象; · VAR参数规定,对应参数必须为可为程序所改变的变量(整体、元素或部分); · PERS参数规定,对应参数必须为可为程序所改变的完整的永久数据对象。 更新INOUT、VAR或PERS参数事实上就等同于更新了参数本身,借此可用参数将多个 数值返回到调用程序。 综上,出现这个问题的原因为:不是一个持续的变量。那么将传入的变量模式改为PERS 或者INOUT,即在此函数中变量为持续的状态,就可以解决这个问题。
「 回顾 」 |
|