Galil编程中无类型变量直接使用带来的可靠性问题 点击:1149 | 回复:6



Tiger周

    
  • 精华:0帖
  • 求助:2帖
  • 帖子:15帖 | 34回
  • 年度积分:0
  • 历史总积分:58
  • 注册:2014年5月27日
发表于:2015-01-04 10:59:09
楼主

各Galil运动控制爱好者:

在编写Galil指令程序时,变量可无需定义直接赋值使用,如cat=2.  但事先没有定义cat是整数还是字符型,如果到后面我又赋值cat=3.4 则这个变量cat究竟在内存中是如何分配的,是否会带来安全性问题。 实际上,我在某个项目中就遇到了问题,程序开始设置flag=0, 当某触发条件满足时flag=1,再无其它让flag=0的语句。 运行时上位机通过GalilController.Commandvalue("MG flag")不断查询flag状态。 问题来了:系统运行一段时间后,根本没有触发flag=1的事件,但却查询到flag=1。再打开galiltools 查询flag状态,却发现flag=0 (怎么变回去的,直到现在还没有搞清楚).

我怀疑: 是否是运动卡的问题,变量flag自动变了数据? 还可能是运行中受了电气干扰,使得变量发生脉冲式干扰变化? 还是未经定义的变量直接赋值带来的问题?

希望跟Galil高手一切研究一下这个问题....




刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:17帖 | 8240回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2015-01-04 11:27:41
1楼

GALIL没有无类型变量,所有变量都是定点数格式,四字节整数,两字节小数,数值的分辨率是1/65536。如果把变量理解为字符,就是6个字符。

 

变量原则上不会单纯因为电气干扰而改变数值,至少我之前从来没有看到或听到过。至于未经定义直接赋值的,这就是正常的使用方式,GALIL的变量就是以赋值来定义的。只是未经定义(赋值)不可查询或参与计算。

 

您之前是如何用GALIL卡的啊?难道您还定义过变量?

Tiger周

  • 精华:0帖
  • 求助:2帖
  • 帖子:15帖 | 34回
  • 年度积分:0
  • 历史总积分:58
  • 注册:2014年5月27日
发表于:2015-01-04 13:30:14
2楼

感谢刘工的回答。刘工与其它所有人一样,不认为电气干扰引起变量跳变。事实上,我描述的问题确实发生了,有一天频繁发生了布尔型flag数据从0到1的跳变,非常奇怪,以致系统频繁暂停。后来我就怀疑了这个内存变量的问题,解决方案是用I/O变量代替这个内存变量flag, 如flag=1 用SB 25代替, flag=0 用CB 25代替, 问题得到解决。 I/O变量的状态不太容易被干扰,我认为是这样。

我制作了两台机器,其中一台没有问题,另外一台就经常出现这个flag变量 跳变问题。 如果能像C语言定义变量类型就好了,如True/False....

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:17帖 | 8240回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2015-01-05 16:08:44
3楼

电气干扰引起存储数据的变化,这个我不敢说一定没有。但是只有一个变量变化,而其它的程序、变量、参数、信号都不变,这样的可能性我也不敢说绝对没有,但是其概率或者相当于一个人过河,鞋袜以及衣服都是干的,但是衣服兜里的钱包湿了。这种情况下,真的很难怀疑到河水上,正常的逻辑还是优先猜测身体出汗太多或是钱包里原本就放了湿纸巾以及其它诡异的原因。

 

任何语言,即使定义为true/false,存储器里存的,也必然是0/1。您随便看任何版本的任何语言的数据类型说明,应该都可以看到。

wannyblue

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 5回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2008年8月23日
发表于:2019-05-17 11:39:41
4楼

请教下楼主上位变量m_flag值怎么传给下位机变量flag的呢

//可以把下位机flag值传给上位机变量m_flag,反过来不行

m_flag = GalilController.Commandvalue("flag=");

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:17帖 | 8240回
  • 年度积分:397
  • 历史总积分:28760
  • 注册:2005年3月09日
发表于:2019-05-20 10:22:09
5楼

从pc程序中为控制器(下位机)上变量赋值,直接将赋值字符串,例如“flag=100.98”作为指令发送执行即可,g.command("flag=100.98")。

至于如何将一个变量的值转换为一组字符,并与其它字符拼成一个字符串,不同的的编程环境,细节也不尽相同。


wannyblue

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 5回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2008年8月23日
发表于:2019-05-20 15:00:58
6楼


回复内容:

对: 刘岩利 从pc程序中为控制器(下位机)上变量赋值,直接将赋值字... 内容的回复!

-------------------------

多谢您的回复,点醒了思路,已经解决了,感谢


热门招聘
相关主题

官方公众号

智造工程师