关于置位变量问题

分享到:
335
下一篇 >

菜鸟提问:

我使用的是D445-1 var_a由ib_sensor**次触发且var_b置位,ib_sensor**次触发且NOT var_b经行复位 ,使用的是if语句,ib_sensor使用trace查看触发的时间长度是3ms,大部分情况下var_a都能被置位,但是当机器运行40分钟至80分钟之间的某个时刻,会出现var_a没有被置位的情况;

另外观察trace的监控曲线发现,var_a被置位是发生在ib_sensor信号被trace显示关闭的时候,即ib_sensor关闭的同时var_a被置位;

请问以上问题可能出在哪里?

监控的时候还出现过一次var_a没有被复位的情况,这个情况只出现过一次且出现未复位的时候ib_sensor的trace时间长度也是3ms。

一楼侠士:

您这是绕口令啊,

1、是st编程的吗,把程序贴上来

2、检查程序你可以用排除法,保证只有一段程序处理这几个变量。无关的程序屏蔽掉。

当你把问题简化到 1+1=2,结果也就出来了

3、系统逻辑是肯定不会有问题的,肯定是程序问题

二楼斑竹:

ob_valve 电磁阀输出 定义在address list中

ib_sensor1 传感器输入 定义在address list中

ib_sensor2 传感器输入 定义在address list中

var_a bool变量 定义在程序中

var_b bool变量 定义在程序中

if ob_valve then

if ib_sensor1 then

var_a :=true;

end_if;

if ib_sensor2 then

var_b:=false;

end_if;

end_if;

if not ob_valve then

if ib_sensor1 then

var_a :=false;

end_if;

if ib_sensor2 then

var_b:=true;

end_if;

end_if;

ob_valve由其他程序控制,var_a var_b 只在这里控制其置位与复位;

情况我再复述一次,机器运行1小时左右的时候,在trace以上程序所有

变量的曲线中出现一次var_b没有被置位的情况;但是ib_sensor2是被触发了的,

触发时长在trace上显示的是3ms,由于我另有报警程序,如果var_b 没有被置位,

且达到一定时间会报警停机,这时候复位重新开机,1小时左右会再次发生var_b

未置位现象;如此反复试过5次,在其中一次还观察到var_b没有被复位,且当时

ib_sensor2的触发时长在trace中显示的也是3ms。而var_a 不存在这种情况,且

其对应的ib_sensor1的触发时长在trace中显示都长于3ms。

三楼大虾:

变量应该置位但没有置位,可能原因有

1、干扰,我们不考虑

2、压根没被置位

3、只为了又被复位了

我们一个一个排除

原因1、不考虑

原因2、没被置位

程序是不是在BackGround里面执行?BackGround执行周期多长?

假设你的执行周期8ms,然后出现了一个2ms的信号,有可能程序没反应的。

因为硬件的刷新时间可能比BackGround块。而Trace也比BackGround快。

原因3、置位了又被复位

只能够是"ob_valve"发生了改变,您如果Trace过,就能排除这个可能。

建议1:

所以我觉得原因2*大,为了确定这个问题。

可以建个变量,i32_CommandCounter,

放在 var_b:=true;下面

i32_CommandCounter:=i32_CommandCounter+1;这样可以检查命令是否真的执行了。

建议2:

您的传感器信号可能很快,很短暂。

如果确定传感器信号 > ipo周期,那么把程序放到ipo程序里去执行。

建议3:

如果传感器信号可能小于ipo周期,需要用Measuring Input.

把Measuring input放到任何一个轴下面,程序里使能Measuring input.

然后用Measuring input里面的Counter Value(就是个计数器)的值,取个上升沿来作触发。


你可能感兴趣: 工控菜鸟园 驱动技术 SIMOTION 传感器
无觅相关文章插件,快速提升流量