现代电梯的信息处理及计算机监控系统的设计 第四章 系统的软件设计实现
一个以该信号为结尾的一串信号已被响应完。设置这个概念的原因是如果处于一串信号的初始响应时(此时一定是停车状态),登记信号为本层的选呼信号,则由于电梯就停在该层,该信号不能予以登记。在实际中,也许你会觉得谁会这么无聊做这种事情,但作为一个程序员来说,应该考虑到程序的健壮性,不能因为一个小概率事件没有考虑到而导致整个程序出现问题,在zhzhyx()过程的其它部分,你也会看到类似的情况,这样做的目的只是为了使调度程序能够应付所有情况,确保调度程序的健壮性与饱满性。这里要提的是,在核心调度程序放在下位机写时不会出现这种一个情况没考虑到就会导致整个程序无法运行的问题,原因是PLC程序是针对已有各个情况来运行的,而上位机写调度除了实现调度的功能外,更有一种模拟仿真的色彩,打个比方来说,就像是置身于圈外实现圈内的功能,从这个角度来说,上位机写调度对于像电梯控制这种工控系统来说应该算是一条弯路,实现起来更复杂,但对于毕业设计来说,它也不失为一种不错的方案。就如前面所说,上位机写调度更有一种模拟仿真的色彩,我的编程过程也正是如此,由于上位机写调度程序,调试调度时要考虑到上下位机的通信问题,还要关乎到下位机程序是否正确、硬件是否正常等等一系列问题,所以,我其实是首先编了一个调试系统,用上位机模拟选层、呼梯、平层等信号的输入,通过这个调试系统来校验我的调度程序是否正确,调试正确后,再用实际的选层、呼梯、平层等信号代替模拟信号运行。这时,就相当于把调度模块封装起来,单独调试,正常后把它加入系统,再用它来调试通信、下位机等其它模块。这样就大大减小了核心调度放在上位机的程序调试时的困难,这部分在5.1节中将给以详细介绍。
由于zhzhyx()过程中的情况分支比较复杂,我将用文字的形式来代替流程图介绍zhzhyx()过程中比较典型的二层平层和三层减速信号的响应过程:
如果调用zhzhyx()过程时恰好第二层平层,则代码进入二层平层分支执行。 进入后,首先判断是否是一个选呼串的初始,并且是由于选层或呼梯引起的该过程的执行(4.2.1节中已述,接收到选层、呼梯、平层、减速信号均会调用zhzhyx()过程,这里只处理选层或呼梯引起的该过程的调用)。如果条件成立,又是本层的选层或呼梯信号且只响应过一次(通过zhzhxyg变量判断,由于每一次通常延时后都又会自动调用zhzhyx()过程,这里就通过zhzhxyg变量确保下面的代码只在一个选呼串的初始时响应一次),那么就进行相应的设置。如果不
36
现代电梯的信息处理及计算机监控系统的设计 第四章 系统的软件设计实现
是本层的选层或呼梯信号引起的zhzhyx()过程的调用,则输出加速信号。以上执行结束后,还要退出整个zhzhyx()过程。以上这段代码的作用是:由于一个选呼串的初始必定是在停车以后,如果此时调用zhzhyx()过程的选层或呼梯信号就是该层的选层或呼梯信号,则此时根本不需要响应,并且要撤销本层的选层或呼梯信号的登记,使其对以后的运行不产生影响。但如果不是本层的选层或呼梯信号引起的zhzhyx()过程的调用,则电梯一定会要向其它层运行,所以此时必须输出加速信号,控制下位机变频器频率变化,至于电梯运行的方向,由此时调用的zhzhxch()过程予以判断并发给下位机。
如果当前的程序运行状态不是一个选呼串的初始,则进而判断电梯是否需要在该层停车,即判断变量willt2的值。变量willt2的值在减速信号引发的zhzhyx()过程的调用中会被判断出,在这里只是检测它的当前值以决定现在的操作。我们敢肯定willt2此时已被赋予正确值的原因是不管是上行还是下行,停车前电梯一定是经过了其相应的减速干簧片。如果本层需停,则将变量willt2复位,启动控制开门、等待、关门的时序操作过程(参见5.4节)。再根据当前的行程状态决定该层的选层与上、下呼梯哪个需要复位与取消登记,并进行发信号给下位机等相应的操作。最后,在此分支的结尾退出整个zhzhyx()过程。
如果当前的程序运行状态是已在本层停车,并完成了控制开门、等待、关门的时序操作过程(在控制开门、等待、关门的时序操作过程的结尾处,我要求程序重新调用zhzhyx()过程,原因是只有在时序操作过程结束后,才应该再判断下一步的运行,使整个电梯的运行具有时序性),则复位时序操作过程结束变量,调用zhzhxch()过程给出行程状态,并判断出当前是否是一个信号串的结束。如果当前是一个信号串的结束,则复位相应变量值(注意,很多全局变量都是在一个信号串的结束处复位的,也就是说,这些变量是附属与一个信号串的执行过程的,与其附属的信号串具有同样的生命周期)。如果信号没有响应完,但经过zhzhxch()过程判断出行程既非上行也非下行,则说明当前所剩的信号该层本身的选呼信号,程序不执行任何操作,直接退出整个zhzhyx()过程。否则,也就是说如果还有其它层的选呼信号,则程序向下位机发出加速信号,驶向新的目的地。下面是二、三层间减速信号响应分支的代码及讲解: 检测到二、三层间减速干簧片信号的响应分支流程图:
37
现代电梯的信息处理及计算机监控系统的设计 第四章 系统的软件设计实现
N
开始 检测到二三层减速信号 N Y
Y
调用willting()过程判断停车 上行 N 三层需停车 Y
结束 图4.7 检测到二三层减速信号且上行时的响应分支流程图
退出整个调度过程 输出减速信号 对于不同的行程方向,二、三层间减速信号响应分支分为两个过程:一个是上行时遇到二、三层间减速干簧片检测信号;一个是下行时遇到二、三层间减速干簧片检测信号。第一种情况中,电梯需要判断是否需要在三层平层时停车,所以调用willting()过程后,即判断willt3的值,如果三层需停,则此时输出减速信号,最后退出整个zhzhyx()过程。第二种情况中,电梯需要判断是否需要在二层平层时停车,所以调用willting()过程后,即判断willt2的值,如果二层需停,则此时输出减速信号,最后退出整个zhzhyx()过程。以上这两种情况是对应的,只是对于不同的行程方向而言。
在这里仍要提出的是,我在调度过程zhzhyx()的每一个子分支中,都会根据不同的情况退出整个zhzhyx()过程,其实理论上这样并不必要,因为有的的子分支的执行确实是联在一起的,是时序相接的,而且让它们接着执行可以减少调度过程zhzhyx()的调用次数,这样做表面上似乎可以降低代码的长度与复杂
38
现代电梯的信息处理及计算机监控系统的设计 第四章 系统的软件设计实现
性。但是,这是很不切合实际的,因为不同的情况需要子分支联在一起执行的个数是不同的,况且这样联在一起的组合可能有八、九种之多。且不说为了让它们联在一起执行而必须费尽心机地刻意安排每一子分支在zhzhyx()过程之中的排放顺序,我还要考虑什么时候可以调用zhzhyx()调度过程,什么时候不可以调用(因为此时的情况可能已被前面调用时子分支联在一起执行时给执行过了,如果此时再调用zhzhyx(),很可能发生时序混乱,导致整个程序瘫痪)。所以,这样可以减少代码的长度,但只会增加代码的复杂性(无论是设计的复杂性,还是代码本身的可读性),这对于一个程序员来说是一个大忌。与其如此,我不如把zhzhyx()调度过程分解为不同的子分支来用,一次调用只允许调用一个子分支,也就是说,一次调用zhzhyx()过程进行调度只能调度一小步,但在每次需要调度的时候我都调用zhzhyx()调度过程,这样在实际上就大大减少了程序的复杂性。
4.2.3 上位机调度的系统的下位机设计
由于信号的登记、调度与响应均已在该系统的上位机实现,我们在下位机所要实现的功能将只有:
1、 实现上下位机正常通信 2、 控制变频器频率变化 3、 控制显示灯的显示
4、 对硬件上检测到的呼梯、选层、平层、减速信号向上位机发送 5、 接收上位机发送的控制信号,并进行相应动作 以下将对其中的主要功能进行介绍: 实现上下位机正常发送、接收通信操作:
在S7-200系列PLC的系统特殊存储区中,有一个专门用于控制通信功能的控制字节SMB30。缺省的设置是点对点模式,这也是唯一的与标准的通信装置以及操作员接口实现通信的协议。要想改变通信功能的特性,如串行通信的波特率、奇偶校验特性、字符长度等,在必须改写这个控制字节而进入可编程通信模式。
在对SMB30赋值之后,通信模式就被确定。要发送数据则使用XMT指令;要接收数据则可在相应的中断程序中直接从特殊存储区中的SMB2(可编程通信模式
39
现代电梯的信息处理及计算机监控系统的设计 第四章 系统的软件设计实现
的接收寄存器)读取。若是采用有奇偶校验的可编程通信模式,还需在接收数据之前,检查特殊存储区中的SMB3.0(可编程通信模式的校验错标志位,置位时表示出错)。至于发送和接收的谐调问题,有查询方式与中断方式之分,这里不再详述。
可见,利用下位机进行通信,对于初学者来说,首先就是要记住和搞清楚一些用于控制通信功能的控制字节的意义,例如SMB30、SMB2等,记住这些特殊控制字节,差不多就搞清楚了下位机进行通信的方法。
在本设计中也是利用这些控制自节进行操作的。
首先,对SMB30赋值,初始化通信模式。将其赋值9表示可编程通信口模式,每字符8位,无奇偶校验,波特率为9600bps等特性。代码如下:
图4.8 初始化通信模式梯形图
其中还有一句将VB20赋值1表示发送缓冲区为该字节开始的1个字节。 初始化后便可进行发送和接收操作,一层选层信号向上位机发送代码如下:
以上代码中,EU以上表示判断该信号的条件及自锁等。该信号接通后,通过EU给出一个上升沿,激发XMT指令,将VB21中的内容通过指定的串行口port0发送出去。
40