发布于 2014-10-20 23:38:46
11楼
楼主客气!我看到你在以前工作中遇到的困惑至今还在不断思考、反复推敲、以至精益求精。可见楼主喜欢思考,想必是个好学之人!碰巧我以前也做过和你类似的工作,在此试着写点代码我们相互交流一下。
首先,我们把你这个控制过程分解:第一步先做12个电磁阀(循环)的跑马灯程序;第二步然后再把4个气箱电磁阀(循环)加入其中。这样会相对容易一些。第一步的代码如下:
A M 100.1 //扫描启动、停止标志位(M100.1=1启动,M100.1=0停止)
FP M 100.2 //判断启动信号的上升沿
JCN M001 //如果启动上升沿没有到来,跳转到M001
L P#4.4 //如果启动上升沿到来,将起始地址装载到ACCU1(★定义起始地址)
T MD 102 //将起始地址暂存到MD102
M001: LAR1 MD 102 //将当前MD102里面的地址装载到地址寄存器1(载入上一周期的指针)
A T 1 //扫描T1的状态,并赋给RLO
= Q [AR1,P#0.0] //将当前的RLO赋给当前的Q点
A T 2 //扫描T2的状态
FN M 100.3 //判断T2的下降沿
JCN M002 //如果T2下降沿没有来到,跳转到M002
+AR1 P#0.1 //如果T2下降沿来到,将地址寄存器1的地址增大1位
M002: L P#4.4 //装载起始地址到ACCU1
L L#11 //将ACCU1移入ACCU2,并将需要寻址的位的个数★(12-1)装载到ACCU1
+D //将起始地址加寻址个数存入ACCU1(等于结束地址)
TAR1 //将ACCU1移入ACCU2,并将当前地址寄存器1内容传送到ACCU1
<D //进行长整数小于比较(注:把中文小于改为英文小于,不然会给系统吃了)
JCN M003 //如果当前的地址不大于结束地址,跳转到M003;如果当前的地址大于结束地址
LAR1 P#4.4 //装载起始地址到地址寄存器1(地址返回功能)
M003: TAR1 MD 102 //将地址寄存器1当前的内容存入MD102(暂存本周期当前的指针)
A M 100.1 //扫描启动、停止标志位(M100.1=1启动,M100.1=0停止)
AN T 2
L S5T#2S
SP T 1 //如果当前的RLO=1,启动定时器T1
AN T 1
L S5T#1S
SP T 2 //如果当前的RLO=1,启动定时器T2
AN M 100.1 //M100.1=0停止时,复位脉冲源定时器
R T 1
R T 2
//暂且T1定义脉宽为2s,T2定义脉宽为1s,第一步的程序我还没有来得及测试,楼主有时间可以先测试一下,有问题我们多交流。有点晚了,第二步程序明天弄。
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”