| 作者 | 主题 |
|---|---|
|
Zane 版主
经验值:85171 发帖数:21052 精华帖:399 |
楼主
主题:题2
有35个灯炮,编号1-35,要求可以按任意顺序组合,让每盏灯依次点亮相应的规定时间
Zane
注册自动化系统工程师
Always save before download
|
|
伊默 至圣 经验值:19259 发帖数:4259 精华帖:118 |
楼
主题:回复:题2
这35个灯泡点亮的顺序要通过上位机来输入嘛! 在PLC内部做一个35位的表,用来存储这35个灯泡点亮的顺序,比如MW0,MW2...MW68,依次存储了1-35按任意顺序组合的数. 从表中读出当前需要点亮灯泡的编号,再用间接寻址的方法,不难实现的!
I can do it
|
|
伊默 至圣 经验值:19259 发帖数:4259 精华帖:118 |
楼
主题:回复:题2
试着回一下:) 新建一个数据块
1:DBB0—DBB34(我现在改成用字节存储了,呵呵)内存放了这35个灯泡执行的顺序; 在数据块中建立一个二维数组DATA:ARRAY[0..34][0..CONST] OF WORD,其中CONST为可定义的常量,代表在一个循环内这35个灯泡之中的一个可能被点亮次数的最大值,这里我假设CONST=2,即在一个循环中灯泡最多可能被点亮3次。DATA[0][0]表示一号灯泡在一个循环中第一次被点亮的时间,DATA[0][1]表示一号灯泡第二次被点亮的时间,DATA[0][2]表示一号灯泡第三次被点亮的时间;若DATA[0][0]为零则表示一号灯泡在该次循环中不会被点亮,其他灯泡的数据依次类推。接下来也还是用间接寻址的方式,先读出要被点亮的灯泡号码,再从二维数组读出它要被点亮的时间,直到DATA[X][Y]为零则表示该X号灯泡已经执行完毕。 2:利用JL和JU指令配合. 每一次读出当前要执行的事件的编号,再调用.假设这35个事件用FC1--FC35来表示,则 装载当前要执行事件的编号 JL C35 JU C1 JU C2 ........ JU C34 C1: CALL FC1 JU END C2: CALL FC2 JU END ........... C35: CALL FC35 END: NOP 0 3:可以利用分时调用(相当于一个分频器),这里我假设分二次调用. 新建两个FC:FC40,FC41. 然后把FC1---FC17放在FC40中调用,FC17--FC35放在FC41中调用. 接下来在OB1中有 AN M0.0 = M0.0 A M0.0 CC FC40 AN M0.0 CC FC41 当然如果这样觉得扫描周期还长的话,则可以用四分频,八分频,甚至更多. 我的思路就是这些,当然这还只是纸上谈兵而已,要想完全写出一个完善的程序出来还是得花些功夫的,请同行门指正,谢谢!
I can do it
|
|
shine 至圣 经验值:19820 发帖数:8803 精华帖:39 |
楼
主题:回复:题2
1、由于每个循环中每个灯泡是否点亮或可能多次点亮,那么每个循环中可能多于35步,也可能少于35步,那只须建立一个表,按点亮顺序将灯的编号及点亮的时长填入表中就可以了,总共有多少步,那这个表就建多少条目。
2、建立一个表,将每一步需要输出的点填入表中,这个表的结构就有讲究了。执行时读表,然后根据表中的设定输出。 3、程序本身就是循环执行的,充分利用这个特性,可以将程序做到最短,执行时间也可以做到最短。 |
|
shine 至圣 经验值:19820 发帖数:8803 精华帖:39 |
楼
主题:回复:题2
我做的程序,不过没有注释,灯的编号是0-34,而不是1-35
Fc1“35个灯炮,编号1-35,要求可以按任意顺序组合,让每盏灯依次点亮相应的规定时间” Fc2 “35个灯泡我不一定每个循环都用上,而且每个灯泡有可能在每个循环内被多次点亮,每次的点亮时间也不同” 点击此处查看附件 |