任务
在我看来,编程的魅力就在于利用有限的语言写出无限的循环,把清晰的指令交给计算机去做最枯燥无味的重复工作。
因此,对于本次电梯的控制,当完成了对应输入输出变量的控制能够进行初始化工作及前往指定楼层后,便需要把电梯的选层与当前楼层综合得到前进目标的逻辑完整。
虽然资格赛的要求只是控制单部电梯,而电梯又只有区区六层,则暴力穷举的方式也是行得通的。但我可不想把自己有限的时间去做无限的重复劳动,而是保留人的尊严。于是,我便按照自己的思路逐渐找到了利用梯形图编写循环语句的方式。
过程
首先,接上篇PLC学习笔记(二)循环遍历的工作,用定时脉冲触发计数器可以得到做为遍历的index,而可以利用这个index通过移位访问【数组】,这里的【数组】大小为8,是8个bit组成的1个byte,每一bit都储存了我需要的数据——该楼层是否被选通。
由于更多出于自己的思路完成设计,因此对一些指令的用法认识不到位就想当然使用,最初遇到很多使我困惑不解的问题,之后才恍然大悟,留下记录。
转换思维
最初的想法是,利用相同的脉冲控制计数器和循环移位,这样便可得到移位的数目。然而尝试过程发现,循环移位与计数器的使能端不同:
- 循环移位指令是高电平有效
- 高电平期间一直进行移位,据网上资料为1个循环周期进行一次,约200ms
- 计数器指令是上升沿使能
- 与之前使用的性质相同
在理不清头绪如何将计数器和循环移位相匹配后,发现需要转变思维:
直接用计数器的当前数值做为循环移位的位数,再判断这个数值代表的楼层数是否被选通。
计数器的正确使用
首先直接上终于调试正确的实例:
这里进行解释,当初始化函数findOutTarget接通后,视为进入这一计数模块。
计数输入CU
这里的计数输入便是利用脉冲信号进行加计数,并通过之后的判断语句判定计数的终止。
复位输入R
利用TP(“生成脉冲”(Generate pulse) 指令),将加计数器置数为0.
TP:可以将输出 Q 置位为预设的一段时间,可以视为将上升沿信号IN转换为一段时长为PT的脉冲信号Q。
阈值PV与使能Q
PV 参数的值作为确定“Q”输出的限制。只要当前计数器值大于或等于操作数“PV”的值,输出“Q”的信号状态就为“1”。在其它任何情况下,输出“Q”的信号状态均为“0”。
我们可以利用上述信号原理,将PV做为我们需要计数开始的阈值,则之后的index的有效值便可通过“Q”的状态使能,从PV参数开始。
伪代码
不妨给出上述梯形图实现功能对应C语言格式的伪代码:
for(upCnt=向上寻找目标楼层阈值;upCnt<=顶层;upCnt++)
{
//Todo
}