1、指令分为单扫描周期指令和多扫描周期指令。对于多扫描周期指令,如果EN或者REQ只使能一个扫描周期,该指令不能成功执行;例如大多数的通信指令;
2、FB块的输入输出形参存储于背景数据块中,在调用该FB时实参可选;而FC块的输入输出是临时内存,必须*实参才能运行;
3、FB块的输入输出虽不是静态变量,但亦有保持功能,具体视程序而定;
4、注意变量被多次赋值时的先后顺序!因为变量的值总会被较后执行动作更新,前面的值将被覆盖;例如下图:
程序初衷为当接受响应完成时ERR置位,或响应**时ERR置位。上述程序是可以完成正常功能的;但若二者互换,如下图
程序初衷为当接受响应完成时ERR置位,或响应**时ERR置位。上述程序是可以完成正常功能的;但若二者互换,如下图
接收**时时,ERR不会置位,因为rev_done为0,ERR被复位!5、STEP 7中的梯形图操作数、能流的监控特征色(蓝绿)、以及监控表中的布尔变量的刷新频率有限,可能不能反映真实的实时运行状况,可借助一个累加器来监视程序的运行状态;例如下图:
接收**时时,ERR不会置位,因为rev_done为0,ERR被复位!5、STEP 7中的梯形图操作数、能流的监控特征色(蓝绿)、以及监控表中的布尔变量的刷新频率有限,可能不能反映真实的实时运行状况,可借助一个累加器来监视程序的运行状态;例如下图:
接收**时时,ERR不会置位,因为rev_done为0,ERR被复位!
5、STEP 7中的梯形图操作数、能流的监控特征色(蓝绿)、以及监控表中的布尔变量的刷新频率有限,可能不能反映真实的实时运行状况,可借助一个累加器来监视程序的运行状态;例如下图:
6、单个扫描周期中,一个布尔变量的上升/下降沿只能读取一次;因为读取一次之后,其Pre变量已被立即刷新,后续的读取不能成功读到该变量的状态变化;7、数组访问越界将导致CPU错误,ERR灯闪烁;8、单扫描周期指令的循环操作是在单扫描周期完成的;9、多使用宏定义,可使程序易读、方便修改;10、关于能流:(1)能流流经某个具备EN和ENO的指令,并不一定代表该指令功能执行完成,只代表该扫描周期扫描完成;(2)算数运算、bool变量操作等单扫描周期指令的ENO输出代表该指令执行完成。11、FB/FC的EN端将为能流提供扫描通道,EN端断路,能流无扫描通路,内部变量将不再刷新,即该函数不再执行;当FB/FC的EN端总是使能,Enable输入断开,块内部仍有能流通路,相应变量会被扫描以致刷新;请注意二者区别;例见下图:
6、单个扫描周期中,一个布尔变量的上升/下降沿只能读取一次;因为读取一次之后,其Pre变量已被立即刷新,后续的读取不能成功读到该变量的状态变化;7、数组访问越界将导致CPU错误,ERR灯闪烁;8、单扫描周期指令的循环操作是在单扫描周期完成的;9、多使用宏定义,可使程序易读、方便修改;10、关于能流:(1)能流流经某个具备EN和ENO的指令,并不一定代表该指令功能执行完成,只代表该扫描周期扫描完成;(2)算数运算、bool变量操作等单扫描周期指令的ENO输出代表该指令执行完成。11、FB/FC的EN端将为能流提供扫描通道,EN端断路,能流无扫描通路,内部变量将不再刷新,即该函数不再执行;当FB/FC的EN端总是使能,Enable输入断开,块内部仍有能流通路,相应变量会被扫描以致刷新;请注意二者区别;例见下图:
6、单个扫描周期中,一个布尔变量的上升/下降沿只能读取一次;因为读取一次之后,其Pre变量已被立即刷新,后续的读取不能成功读到该变量的状态变化;
7、数组访问越界将导致CPU错误,ERR灯闪烁;
8、单扫描周期指令的循环操作是在单扫描周期完成的;
9、多使用宏定义,可使程序易读、方便修改;
10、关于能流:(1)能流流经某个具备EN和ENO的指令,并不一定代表该指令功能执行完成,只代表该扫描周期扫描完成;(2)算数运算、bool变量操作等单扫描周期指令的ENO输出代表该指令执行完成。
11、FB/FC的EN端将为能流提供扫描通道,EN端断路,能流无扫描通路,内部变量将不再刷新,即该函数不再执行;当FB/FC的EN端总是使能,Enable输入断开,块内部仍有能流通路,相应变量会被扫描以致刷新
1.通过OB1的启动参数读出运行时间在非优化的OB1启动信息中带有OB1的运行时间,如图1所示。
图1.读出非优化的OB1中运行时间将启动信息参数传递到全局变量中就可以读出CPU的上次扫描、较小、较大扫描时间,编程非常方便。2.调用RD_SINFO函数读出运行时间如果使用优化的OB1,启动信息简化而没有这些运行信息,如图2所示,则必须调用函数读出。
图1.读出非优化的OB1中运行时间将启动信息参数传递到全局变量中就可以读出CPU的上次扫描、较小、较大扫描时间,编程非常方便。2.调用RD_SINFO函数读出运行时间如果使用优化的OB1,启动信息简化而没有这些运行信息,如图2所示,则必须调用函数读出。
图1.读出非优化的OB1中运行时间
将启动信息参数传递到全局变量中就可以读出CPU的上次扫描、较小、较大扫描时间,编程非常方便。
2.调用RD_SINFO函数读出运行时间
如果使用优化的OB1,启动信息简化而没有这些运行信息,如图2所示,则必须调用函数读出。
图2优化OB1的启动信息例如在OB1中调用RD_SINFO函数读出运行时间,程序如图3所示。参数TOP_SI为当前OB1的启动信息,数据类型为SI_classic,需要手动键入,ZI1为上次扫描时间,ZI2_3包含较小、较大扫描时间,低字为较小扫描时间,高字为较大扫描时间,示例中分别传送到MW10和MW12中。START_UP_SI为暖启动OB的启动信息,示例中没有进行引用。
图2优化OB1的启动信息例如在OB1中调用RD_SINFO函数读出运行时间,程序如图3所示。参数TOP_SI为当前OB1的启动信息,数据类型为SI_classic,需要手动键入,ZI1为上次扫描时间,ZI2_3包含较小、较大扫描时间,低字为较小扫描时间,高字为较大扫描时间,示例中分别传送到MW10和MW12中。START_UP_SI为暖启动OB的启动信息,示例中没有进行引用。
图2优化OB1的启动信息
例如在OB1中调用RD_SINFO函数读出运行时间,程序如图3所示。参数TOP_SI为当前OB1的启动信息,数据类型为SI_classic,需要手动键入,ZI1为上次扫描时间,ZI2_3包含较小、较大扫描时间,低字为较小扫描时间,高字为较大扫描时间,示例中分别传送到MW10和MW12中。START_UP_SI为暖启动OB的启动信息,示例中没有进行引用。
图3调用RD_SINFO函数3.调用RT_INFO函数读出运行时间通过函数RT_INFO也可以读出CPU的运行时间,示例程序如图4所示。
图3调用RD_SINFO函数3.调用RT_INFO函数读出运行时间通过函数RT_INFO也可以读出CPU的运行时间,示例程序如图4所示。
图3调用RD_SINFO函数
3.调用RT_INFO函数读出运行时间
通过函数RT_INFO也可以读出CPU的运行时间,示例程序如图4所示。
图4调用RT_INFO函数通过模式1、2、3可以读出CPU的上次扫描、较小、较大扫描时间,在这三种模式下,参数INFO的数据类型为LTIME,可以直接读出。也可以通过其他模式读出运行时间的百分比。4.调用RUNTIME指令读出运行时间通过指令RUNTIME可以从参数RET_Val直接读出CPU的运行时间,单位为秒,MEM为中间保存程序运行的存储器,两个参数类型都是LREAL,除此之外还可以读出一段程序的运行时间。如图5所示。
图4调用RT_INFO函数通过模式1、2、3可以读出CPU的上次扫描、较小、较大扫描时间,在这三种模式下,参数INFO的数据类型为LTIME,可以直接读出。也可以通过其他模式读出运行时间的百分比。4.调用RUNTIME指令读出运行时间通过指令RUNTIME可以从参数RET_Val直接读出CPU的运行时间,单位为秒,MEM为中间保存程序运行的存储器,两个参数类型都是LREAL,除此之外还可以读出一段程序的运行时间。如图5所示。
图4调用RT_INFO函数
通过模式1、2、3可以读出CPU的上次扫描、较小、较大扫描时间,在这三种模式下,参数INFO的数据类型为LTIME,可以直接读出。也可以通过其他模式读出运行时间的百分比。
4.调用RUNTIME指令读出运行时间
通过指令RUNTIME可以从参数RET_Val直接读出CPU的运行时间,单位为秒,MEM为中间保存程序运行的存储器,两个参数类型都是LREAL,除此之外还可以读出一段程序的运行时间。如图5所示。