找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
,输出归0,
在时间到达前开或关到位信号到达,则复位定时器,控制输出归0,同时状态字为1,如果在定时器时间到达,定时器由1变为0产生下降沿,此
时状态位仍未0,则状态字为2,表示动作故障。
子程序名:阀门控制
接口:
名称 数据类型
IN
T_No Timer //每个不同的调用填一个定时器号,
T_set S5Time //本次调用阀门的开或关时间设定,
P Bool //脉冲启动指令
V_S Bool //该阀门的对应状态,开阀输出对应开到位,关阀输出对应关到位,
OUT
V_C Bool //控制输出,开发或关阀;
RE Byte //子程序执行返回值,也是该阀门开或关执行的状态字;
TEMP
temp1 Bool //临时变量
temp2 Bool //临时变量
temp3 Bool //临时变量
程序段一:
注释:P从0变为1时:
1.启动定时器,同时控制输出V_C(开或关阀门);
2.初始化返回值(阀门开或关操作状态字);
定时器的设定时间为:T_set(阀门的预设开或关动作时间),定时器的复位条件为V_S(开
或关到位状态);
A #P
= L 1.0
A L 1.0
L #T_set
SE #T_No
A #V_S
R #T_No
NOP 0
NOP 0
A #T_No
= #V_C
A L 1.0
FP #temp1
JNB _001
L 0
T #RE
_001: NOP 0
程序段二:
注释:到位信号从0变为1,状态字为1,表示正确执行了本子程序
A #V_S
FP #temp1
JNB _002
L 1
T #RE
_002: NOP 0
程序段三:
注释:定时器到达设定的时间,从1变为0,此时到位状态信号仍为0,状态字为2,表示该阀门开或
关操作超时,即在预设的时间内阀门动作失败。
A #T_No
FN #temp3
AN #V_S
JNB _003
L 2
T #RE
_003: NOP 0
该子程序使用参数传递被主程序调用,在1次调用中正常,被2次调用就出现问题,状态字有时不会被初始化,有时状态字不对,求大侠指点。50分送上。
小程序查看
手机扫码追踪该问题
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
WWWS:
你的错误主要是在使用“FP”“FN”指令时使用了临时变量作为信号的状态存储地址。因为不管是FB还是FC,程序中的临时变量都是存储在L堆栈空间,在FB或FC调用结束被临时变量所使用的L堆栈空间就释放给系统了,其他后续程序可以任意使用。建议使用M或DB区域作为上升/下降沿检测指令的存储地址,即在FC中使用M区域或共享DB块,在FB中可以使用M区域或共享DB块或FB的静态变量。
谢谢 so desu nei,在FB中测试过,一样的效果。不明白为什么要把temp3设为输出有何作用?
具体原因我也不是很明白
观察背景数据块时,发现只有FB块的输入输出,而内部临时变量并不在其中,据我的猜测,这样在调用两次功能块时也许#temp3的值会同时收到两次调用的影响,而最简单的方法就是将#temp3设置成out,虽然这个输出没有作用,但是这样修改之后经仿真可以达到原来设计要求
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
找答案微信小程序
提问
搜索
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!