机电专业技术网 我要投稿 |  资讯 |  机械 |  电气 |  软件 | 
机电专业技术网>电子电气>PLC>
赞助商连接
最新文档列表
热门文档列表

基于单片机的PLC系统的实现

可编程控制器(PLC)作为继电控制盘的替代物,以极高的可靠性和应用方便等特点,成为当今用途最为广泛的工业控制器。现在它的应用已突破了当初逻 辑控制的场合,深入到过程控制、位置控制、网络通讯等工程领域。本文根据某工程的实际需要,以三菱PLC为模拟目标,提出了一种以单片机构建PLC系统的思想

2 系统构成
系统框图见图1。


该 系统CPU芯片使用了一种新型的51系列单片机即Cygnal公司的 C8051F040。其指令集与MSC_51指令集完全兼容,使用方便,且采用流水线结构,其周期由标准的12个系统时钟周期降为1个系统时钟周期,处理 能力大大提高,峰值性能可达25MIPS。内部集成了64K Flash ROM、4352字RAM、64位数据I/O口以及几乎所有的模拟与数字外设如:ADC、DAC、SMBus、UART、CAN、SPI、PCA、电压比 较器、温度传感器、可编程增益放大器等。开发工具采用标准的JTAG接口,以边界扫描方式对CPU进行非入侵式全速的在系统调试。其性能较之传统51单片 机有了很大的提高。
CPU和外部I/O接口之间采用光电耦合器件,实行强电和弱电隔离,切断现场干扰。计算机通过RS232串口与PLC系统通信,将PLC程序指令传送到PLC。PLC将接收到的指令保存到非易失性RAM中。这样做即可以长期保存PLC程序,又可以方便地随时修改程序。

3 PLC程序的执行过程
常见PLC以扫描方式工作。每次扫描的工作过程分为三步。
(1) 输入处理 程序执行前,PLC将全部输入点的状态读到输入镜像寄存器。在程序执行过程中,PLC不再读取这些输入点的状态,直到下一个扫描周期的输入处理。
(2) 程序处理 PLC根据读入的外部输入状态和其它元件的状态执行用户程序。这时的输出指令只写到输出镜像寄存器,输出点的状态并没有发生变化。
(3) 输出处理 全部指令执行完毕,将输出寄存器的内容全部刷新到外部输出点。程序回到第一步工作过程。
本PLC系统的工作过程与此相同。输入处理和输出处理用单片机实现起来比较容易,无需赘述。系统的关键是用户程序的处理。下面以三菱FX系列PLC一个简单的例子来说明本PLC系统对用户程序的处理方法。梯形图和相应的指令表见图2。


0:LD X000 9: LD X010
1:AND X001 10:LD X011
2:AND X002 11:AND X012
3:LD X003 12:LD X013
4:OR X004 13:AND X014
5:ANB 14:ORB
6:OUT Y000 15:OR X015
7:OR X006 16:ANB
8:LD X010 17:OUT Y001
首 先分析指令 AND X001,指令执行前有状态B,执行该指令时,将当前状态B 和X001的状态进行与运算,形成状态C,这是指令AND X002执行前状态。C是B的刷新值,它们实际上是一个变量。这个变量反映程序执行时当前的状态值。当遇到输出指令OUT Y000时,就把当前状态值传送给输出寄存器。把AND X001作为一单元块,可认为这个单元块有单输入单输出的结构。输入状态和单元块内元件的状态运算后得到输出状态。
再分析指令LD X003、OR X004,如果将这两条指令组合后看作上述单输入单输出结构的单元块,执行前的状态为D,把X003、X004元件并联后的状态作为单元块内元件的状态, 和D与运算后得到状态G.。但细化一步执行LD X003这个子单元块时,当前状态D需保存,取X003的状态作为当前状态值E,和X004或运算后得到F。执行ANB时,把先保存的状态值D和状态值F 与运算后得到新的当前状态值G。
这里执行LD与AND产生区别是在于:AND指令没有分支,而LD指令产生分支,程序执行前的状态值需要保存。同 样,在遇到分支合并时,需要使用到先前保存的状态值 。根据梯形图的编写规则,状态值的保存和使用是一种先进后出的结构,所以可以使用进栈和出栈的方法来实现。指令的具体实现过程归纳如下:凡是遇到产生分支 的指令,例如LD指令,需将当前状态值进栈保存,取当前操作元件的状态作为当前状态值;凡是遇到分支合并的指令,例如ORB、ANB指令,需将栈顶值出栈 与当前状态值运算成为新的当前状态值。
在具体实现时,采用了另一种形式的栈。由于三菱FX系列PLC的LD连续使用不能超过八次,因此采用一个可 以位寻址的片内RAM字节作为栈空间来存放当前状态值。如果使用栈空间的最高位作为当前状态值,每次压栈就把该字节进行不带进位的循环右移,出栈时反之。 在LD X000指令执行后,进栈状态A没有出栈,LD X010指令又进栈保存当前状态值,以前的压栈值A废之不用,即每条与母线相连的LD指令产生压栈值都不出栈。这样避免了因使用PUSH POP指令用一个字节的空间来保存一位的当前状态值造成的RAM利用效率低的问题。
LD X010后的指令执行过程如下:LD X010 把当前状态值H压栈,取X010的状态作为当前状态值I;LD X011把当前状态值I压栈,取X011的状态作为当前状态值J;AND X012 把当前状态值J和X012的状态与运算后得到当前状态值K;LD X013把当前状态值K压栈,取X013的状态作为当前状态值L;AND X014把当前状态值L和X014的状态与运算后得到当前状态值M;ORB 弹出压栈值K和当前状态值M或运算后得到新的当前状态值M;OR X015把当前状态值M和X015的状态或运算后得到当前状态值N;ANB弹出压栈值I和当前状态值N与运算后得到新的当前状态值O;OUT Y002 把当前状态值写到Y002的输出镜像寄存器。

上一页12 下一页

实现   系统   基于   状态   指令   当前   程序   ld   plc   执行   输出   实现   系统   基于   状态   指令   当前   程序   ld   plc   执行   输出  

相关文档列表
推荐文档列表
精彩推荐

机械、电气、软件综合技术网,以广大机械,电气,设计行业从业者为目标全体,提供最新的技术文章与行业资讯.