楼主最近还看过
·西门子300PLC,313cpu+3块24位DI;
·程序块0B1:主循环,以OB1循环扫描时间累加作为1800和90s定时器;
OB100:数据上电初始化;
FC1:循环体,以寄存器指针方式访问DI;
0B100-------------------------------------------------
AN "M_1800s"
S "M_1800s"
AN "M_90s"
S "M_90s"
L 0.000000e+000
T "M_Timer1800s"
T "M_Timer90s"
0B1--------------------------------------
L LD 6
ITD
DTR
L 1.000000e+003
/R
T "M_CycleTimeOB1" //OB1循环时间转换
L "M_Timer1800s"
L "M_CycleTimeOB1"
+R
T "M_Timer1800s"
L 1.800000e+003
>R
JCN _001
L 0.000000e+000 //1800s计时累加
T "M_Timer1800s"
S "M_1800s"
_001: L "M_Timer90s" // 90s计时累加
L "M_CycleTimeOB1"
+R
T "M_Timer90s"
L "M_Timer90s"
L 9.000000e+001
>R
JCN _002
S "M_90s"
L 0.000000e+000
T "M_Timer90s"
_002: CALL "LoopCtrl"
FC1-------------------------------------
nw1--------------
AN "M_1800s"
SAVE
BEC
nw2------------------------------------
A "M_1800s"
A(
L #LoopCounter
L 20 //20次循环结束,复位1800s标志位,等待下一次触发;
==I
)
JCN run
L 0
T #LoopCounter
R "M_1800s"
run: A "M_1800s" //循环开始,初始化指针;
FP M 11.0
= M 12.0
JCN loop
L 0
T #LoopCounter
L P#0.0
T #FirstPointer
NW3------------
loop: A "M_90s"
L S5T#5S
SE T 30
A T 30
= "M_FirBit"
nw4-----------------------
A "M_90s"
AN T 30
L S5T#2S
SE T 31
A T 31
= "M_SecBit"
nw5--------------------------
A "M_90s"
AN T 30
AN T 31
L S5T#500MS
SE T 32
A T 32
= "M_ThirdBit"
nw6----------------------------
L #FirstPointer
LAR1
A "M_FirBit"
= Q 【AR1,P#0.0】
A "M_SecBit"
= Q 【AR1,P#0.1】
A "M_ThirdBit"
= Q 【AR1,P#0.2】
nw7-----------------------------
A "M_90s"
AN T 30
AN T 31
AN T 32
FP M 11.2
= L 6.0
A L 6.0
BLD 102
R "M_90s"
A L 6.0
JNB _001
L #LoopCounter
L 1
+I
T #LoopCounter
_001: NOP 0
nw8---------------------------
A "M_90s"
FN M 11.3
= M 12.3
JCN _005
L #FirstPointer
L P#0.3
+D
T #FirstPointer
_005: NOP 0
其中loop循环体用SE计时器完成,本用梯形图很明了,苦于无法上传图片,转为stl编写,不明了了。
我的思路:按着雷主要求用S7-200编写了一个子程序(SBR_1),该子程序运行时间为半小时,在此时间内重复执行20次类似的控制动作,不同点就是输出口依次下移:第一次输出口为Q0.0、Q0.1,第二次输出为Q0.2、Q0.3,第三次输出为Q0.4、Q0.5……。在主程序中,设定I0.1为启动命令按钮,设I0.2为停止运行按钮。只要按一下I0.1启动,程序将自动执行每半小时调一次SBR_1子程序,重复调用,直到按下I0.2停止按钮,程序才终止运行。
该子程序共占据输出口40个,整整是5个输出通道( QB0、QB1、…QB5)如按正常编程,这20个类似动作由于输出口不同,需一一调用,这样编出的程序太长。经过反复思考,我是这样编程的:
1、 我利用指针指令,首址指向QB0,每执行完一个通道动作后,令指针地址加1,这样循环5次,其输出即可由QB0依次移到QB5。
2、 对一个输出通道内的传送地址,是采用“与”、“或”指令进行的,比如第一次输出,先将QB0清0,将MB2=1,MB3=2。当运行80秒时将QB0与MB2相或运算,其结果:Q0.0=1,延时82秒将QB0与MB3相或运算,其结果:Q0.0=1,Q0.1=1。当运行85秒时将MB2求反送入MB4,此时MB4=16#FE,再用QB0与MB4相与运算,其结果:Q0.0=0,Q0.1=1,当运行87秒时将MB3求反送入MB5,此时MB5=16#FB,再用QB0与MB5相与运算,其结果:Q0.0=0,Q0.1=0,从而达到在第一个90秒内使Q0.0输出为1且保持5秒后复位,使Q0.1滞后Q0.1两秒输出为1且保持5秒复位的控制要求。第二次动作时,先将MW2左移2位,即使MB2=04,MB3=8再重复上述动作,其结果:Q0.2=1,延时5秒复位,Q0.3滞后二秒输出为1,保持5秒复位,从而达到第二次动作时其输出下移到Q0.2、Q0.3。具体动作控制,请见下面梯形图:
主程序:
子程序:SBR_1
该程序经上机运行(为缩短运行时间按图中注解的试验时改动数据运行),动作正确,符合命题要求。