技术论坛

 回复:题2

返回主题列表
作者 主题
Zane
版主

经验值:85170
发帖数:21052
精华帖:399
楼主    2005-04-11 10:40:27
主题:题2
有35个灯炮,编号1-35,要求可以按任意顺序组合,让每盏灯依次点亮相应的规定时间
Zane 注册自动化系统工程师 Always save before download
伊默
至圣

经验值:19238
发帖数:4259
精华帖:118
    2005-04-12 13:32:21
精华帖  主题:回复:题2
这35个灯泡点亮的顺序要通过上位机来输入嘛! 在PLC内部做一个35位的表,用来存储这35个灯泡点亮的顺序,比如MW0,MW2...MW68,依次存储了1-35按任意顺序组合的数. 从表中读出当前需要点亮灯泡的编号,再用间接寻址的方法,不难实现的!
I can do it
伊默
至圣

经验值:19238
发帖数:4259
精华帖:118
    2005-04-13 09:00:58
精华帖  主题:回复:题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
    2005-04-13 09:43:40
精华帖  主题:回复:题2
1、由于每个循环中每个灯泡是否点亮或可能多次点亮,那么每个循环中可能多于35步,也可能少于35步,那只须建立一个表,按点亮顺序将灯的编号及点亮的时长填入表中就可以了,总共有多少步,那这个表就建多少条目。
2、建立一个表,将每一步需要输出的点填入表中,这个表的结构就有讲究了。执行时读表,然后根据表中的设定输出。
3、程序本身就是循环执行的,充分利用这个特性,可以将程序做到最短,执行时间也可以做到最短。
shine
至圣

经验值:19820
发帖数:8803
精华帖:39
    2005-05-18 02:24:48
精华帖  主题:回复:题2
我做的程序,不过没有注释,灯的编号是0-34,而不是1-35
Fc1“35个灯炮,编号1-35,要求可以按任意顺序组合,让每盏灯依次点亮相应的规定时间”
Fc2 “35个灯泡我不一定每个循环都用上,而且每个灯泡有可能在每个循环内被多次点亮,每次的点亮时间也不同”
点击此处查看附件
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。