恭喜,你发布的帖子
发布于 2017-03-25 12:57:04
4楼
给你总结一下吧:
1------FC重复调用的时候,IN、OUT 形参对应的实参如果是DB块,那么多次调用之前会互相干扰,而实参IQM不会相互干扰
2------但是IN_OUT 形参对应的实参 DBIQM都不会干扰
3------TEMP变量不允许用来作为需要将上一次的值保留到下一次调用的情况,比如边沿状态。最好是任何时候在调用之前都对temp清零后在调用
4------FB的stat不存在TEMP的这种情况,可以随意使用。因为stat有专门的存储区
5-----FB不存在FC的这种特性,因为所有FB都有自己对应的DB。
IN OUT 与IN_OUT不同的是,IN_OUT每次调用的时候都是先读其值,结束时在讲运行的状态值付给他,而in就是块调用的时候读取实参其值,执行完后不刷新其状态,而out就是 只在块结束最后把out形参存储区域里的值甩出去刷新out对应实参的值。
temp就是 每次执行完后并不会保存其状态,每次调用之前其值可能是任意的-----,所以用之前最好清零
至于IQM 与DB的区别 我觉得是因为IQM 都是PLC固有的烧底层程序的时候就烧到PLC的CPU里了,你可以直接访问的印象区域,而DB块是人为后建立的,其实PLC在访问DB块的时候 要先执行一个动作就是打开DB块 这一步是比I/Q/M多出来的一步。我想这里的M与DB所产生的的区别就是因为DB块需要先打开的这个特性引起的,但至于具体分析逻辑,我却不知道,估计这要开发PLC的人应该知道,跟DB块的具体运行机制有关系
经过两天的琢磨,对于调用FC时,使用DB块和M、I、Q的区别貌似有一点思路,分享给大家:下图是使用OB1调用FC1的程序:
FC1程序见下图:形参A1为输入(pointer类型),形参A2为输出(real型),意思是将输入的地址对应的变量赋值给输入地址+P#4.0位置,具体程序意义有没有用不讨论,只看问题结果,下图为fc1内容
具体思路是通过断点来查看执行每次fc1调用后,输出值变化,第一个FC1和第三个FC1使用的是DB数据,中间使用的是M数据,主要目的想看一下在ob1调用第二个FC1时
存储输出点会有什么影响。
咱们先看一下ob1L堆栈含义:
图中:红色下划线:L21-L26为调用FC时输入点对应的地址(对应FC中的V21.0),图中的意思时pointer指针,对应db1.dbx8.0,绿色下划线意思下文推测(因为我是猜测的)。
正文开始:运行完第一个FC1,见下图:
我们发现L21-L26为第一个FC1,A1对应的pointer地址,后面绿线部分跟累加器1的内用相同,由此猜测,此处对应FC1最后的输出值。
执行第二个FC1,见下图:
图中三处标记:1.红线L21-L26处为M对应pointer的地址。但我们惊奇的发现,上次推测的累加器数值竟然和PLC寄存器的不一样,但是和上次执行的一样,我们由此猜测,L27-L30保存的仅为db块数据,M的不在ob1的临时变量保存,应该是保存到为M分配的固定的存储位置,此处有点像:DB数据类似于ob1的临时变量(因为不管他的地址,还是它的数值都存储在L区),而M的类似于全局变量。
再看第三个FC1:
第三个又一次验证了我们的猜测。
结论:在重复调用FC功能时,如果使用DB块作为数据传输,其每次执行数据都是存放在L堆栈中(临时变量),如果说在fc中有输出未使用(例如我刚发帖时的情况,由于有一个开关点将输出的db块断开,不能每次讲输出赋值),则在调用此处时会将上一步输出(即L27-30存放的地址),也赋值给此次输出。
望各位大侠对于此实验批评指导
请填写推广理由:
分享
只看
楼主