菜鸟提问:
我使用的是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(就是个计数器)的值,取个上升沿来作触发。