基于嵌入式芯片组的16路PLC的开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于嵌入式芯片组的16路PLC的开发
华中科技大学孙兆沛
内容摘要
这里介绍了一种新型软PLC——嵌入式PLC的开发过程。
它基于EASY CORE 嵌入式芯片组,通过软件来实现所有传统硬件PLC的控制功能,嵌入式PLC的硬件体系结构不再封闭,用户可以自己选择合适的硬件组成满足要求的PLC。
本文介绍的是最基本的16路数字量输入输出通用PLC的开发。
关键词:嵌入式PLC芯片组实时内核用户驱动接口
ABSTRACT
Here introduces a new development of SoftPLC——Development of Embedded PLC. It is based on the Easy Core embedded chipset,which achieves all the traditional hardware PLC control functions by software.The hardware system structure of embedded PLC is not ers can choose the appropriate hardware to constitute the PLC that meet the requirements .This article describes the development of the most basic 16-channel digital input and output common PLC.
KEY WORDS:Embedded PLC chipset Real-time kernel User-driven interfaces
一、前言
如今工业控制产品已发展到一个追求个性化、差异化的阶段。
传统的PLC产品已经无法满足更加细分化的市场需求,究其本质原因,不是梯形图语言,而是PLC的硬件不够灵活。
为了满足这种需求,嵌入式PLC产品应运而生。
它以PLC梯形图语言为内核,强化过程控制的运算能力,提供开放式扩展结构,增加网络互连功能。
它融合嵌入板的特殊要求,发扬PLC梯形图语言优势,为特定对象控制问题的解决提供了一个通用开发平台。
二、基本原理
嵌入式PLC是将PLC系统软件构建于控制器内,根据用户控制需要定制硬件,以PLC 的应用方式解决对象控制问题的PLC。
它由两部分组成:嵌入式PLC内核和嵌入式PLC芯片组。
2.1 嵌入式PLC系统软件
嵌入式PLC系统软件以PLC梯形图语言为内核,强化过程控制的运算能力,提供开放式扩展结构,增加网络互连功能。
它融合嵌入板的特殊要求,发扬PLC梯形图语言优势,为特定对象控制问题的解决提供了一个通用开发平台。
该系统软件具有以下特点:1.以梯形图语言为内核,添加了中断管理系统,能实现PLC无法实现的硬实时操作;2.强化运算能力,增加了CANBUS函数库、浮点数库、专家自整定PID、嵌入式WEB等,丰富了PLC的功能;3.提供开放式扩展结构,支持第三方开发扩展单元的接线;4.增加了网络互连功能,在远程端加载专用浏览器后,即可实现远程监控。
系统软件包括三个部分。
2.1.1 嵌入式PLC内核
它完成实时任务调度、梯形图语言解释、执
行、通讯等基本功能,并提供二次开发驱动接口;
2.1.2 二次开发驱动程序
通过系统软件提供的外挂任务,使用内核开发各种面向具体对象个性化、差异化的驱动程序;
用户驱动接口是为满足用户DI/DO、AI/AO处理及用户专用功能(如高速对象)设计而准备的用户程序嵌入接口,包括七个基本嵌入接口及多个中断入口。
七个基本嵌入接口如下:
1、用户I/O口配置程序:根据设计的输入输出功能配置相应的端口,用户不可配置的
I/O口资源为P4.4、P4.5、P4.6、P4.7、P5、P6、P7及UART0。
内核程序中已对串
口1和CAN口(有CAN时)配置,内核中串口1配置为OC输出,当需要SPI功能
或配置串口1为电平输出方式时,必须对串口1重新配置,此程序在内核重新上电
后调用一次。
2、用户上电初始化程序:用户嵌入程序中用到的输入输出变量,中间变量,指针变量,
位变量等以及IO、AD、DA,定时、计数,SPI,SMBUS,高速计数,高速输出,外部
中断等外设功能在重新上电后必需进行初始化处理,此程序在内核重新上电后调用
一次。
3、用户运行初始化程序:内核重新上电后第一次运行梯型图或内核从下载梯型图状态
进入梯型图运行状态时调用此程序一次,此程序必须使用户嵌入程序中用到的变量
及CPU(C8051F040/020/120)外设处于所需要的状态。
4、用户设置初始化程序:内核重新上电后进入梯型图下载状态或内核从梯型图运型状
态进入梯型图下载状态时调用此程序一次,此程序必须使用户嵌入程序中用到的
CPU(C8051F040/020/120)外设处于所需要的状态。
5、用户每步执行程序:梯形图每执行一步,即调用此程序一次。
需要快速执行的事件
可在此程序或用户中断程序中完成,内核周期性地调用此程序。
6、用户0.5mS定时运行程序:需要定时采样的流程可放在此程序中完成,但该段程序
代码执行时间必须小于50 US。
数据处理程序不宜放在此段程序中执行。
7、用户演算周期扫描程序:所有梯形图执行完后,即调用该程序,调用周期为梯型图
演算周期,一般的数据处理、开关量输入/输出的刷新及代码执行时间较长的程序
均放在此程序中执行。
中断入口:
EASYV1.00中断包括系统中断及用户中断。
其中系统中断是用户不可干预的,用户中断则是用户通过中断完成与系统实时上异步的各类事件处理。
USER-CONFIG、USER-START、USER-SET-INIT、USER-RUN-INIT为四个非实时部分嵌入的程序,而USER-STEP、USER-SCAN、USER-TMS则直接影响系统的实时性,用户另行嵌入的中断在异步状态下占用CPU时间,其调度上建议如下:
①USER_STEP: 处理100us级软实时任务
②USER_SCAN: 处理I/O、AI/AO
③USER_TMS: 处理硬实时任务,程序占用时间应小于40us
④用户中断:每1ms小于100us。
当大于500us时,有可能产生系统崩溃
2.1.3 终端应用程序
指面向工艺流程控制的梯形图语言程序。
2.2 嵌入式PLC芯片组
EASY CORE 1.00 是一个加载了嵌入式PLC系统软件的核心芯片组,作为一款加载了系统软件的硬件平台,可以用来设计通用和专用PLC。
2.2.1芯片组基本性能:
①供电:+5V 200mA,RAM掉电保护5年。
②CPU: C8051F040。
③嵌入扩展能力
●32 I/O:可复用成SPI、I2C接口及外中断、外计数、AD等。
●4 AD:12位精度,100 KPS。
●2 DA:12位精度,100 KPS。
④通信接口
●CANBUS:系统软件管理,使用工具软件CANSet构建CANBUS总线网络。
●UART0:系统软件管理,用于梯形图编程、监控,支持人机界面及用户驱动
程序下载。
●UART1:系统软件管理,用于下载CANBUS网络参数、构建RS485网络及支持
第三方设备互连。
2.2.2芯片组原理框图:
三、应用开发
基于嵌入式芯片组的PLC开发的主体思路是:对所要开发的PLC进行需求分析;根据需求设计搭载外部硬件电路;根据要实现的PLC的功能及设计好的硬件,在内核提供的七个嵌入程序接口及用户中断程序中写入驱动程序;设计测试梯形图,写入PLC并运行,进行PLC 功能实现的调试。
3.1 需求分析
这里要设计的是最基本的16路数字量通用PLC,要求:
①8个开关量输入通道,其中有两路可以用作高速计数通道。
②8个开关量输出通道。
③16个LED灯显示输入输出状态,两个LED灯显示PLC运行状态。
④高速单相计数功能
3.2 硬件设计
这里借用了科威公司出产的LP-08M08R-Z嵌入式PLC的硬件电路。
根据需求分析,硬件部分主要是要用到输入输出接口电路和LED灯显示电路两部分。
现分析这部分电路。
3.2.1 开关量输入接口电路
两路高速输入六路普通输入
两路高速输入:采用6N173光耦合器并添加相应的外围电路。
X0为信号输入引脚,在P0.6X引脚输出3.3V(高电平),0V(低电平)。
六路普通输入:采用TLP421普通数字型光耦合器,适用于一般信号隔离场合的中低速普通输入。
X2为信号输入引脚,AX2输出。
3.2.2 开关量输出驱动电路
六路达林顿反向驱动器三极管驱动电路
使用ULN2003驱动芯片(包含六路达林顿反向驱动器)或三极管将单片机的输出电平3.3V驱动为12V以适应外围电路(继电器),并起到隔离的作用。
3.2.3 LED灯显示电路
RUN灯,ERR灯,低电平使能。
八路输入LED灯和八路输出LED灯复用八路控制通道,控制端采用三极管开关。
另有两路三极管开关作为输入LED灯和输出LED灯的使能信号,来实现输入输出灯的交替控制。
采用这样的方式可以有效缩减IO中间信号处理电路的规模。
3.2.4 中间信号处理电路
中间信号处理电路将外部的输入输出接口和LED灯显示电路连接到芯片组IO口上,并通过逻辑电路实现对芯片组IO口的复用,最大程度节省芯片组IO口资源。
如电路图所示,主要使用了一个双向缓冲器74HC245,来控制P2口总的输入输出复用;一个单向缓冲器74HC244,来控制六路普通开关量输入通道的输入(另两路为高速计数通道,另接专用IO 口P0.6,P0.7);两个八路锁存器,分别控制八路输出通道的输出和LED灯显示的驱动。
下面来具体分析工作过程。
中间信号处理电路
①输入信号处理过程
信号从光耦输入端输入到单片机内部之前,先送入74HC244缓冲器,起信号缓冲隔离的作用。
但是由于IO口的复用,输入之前要先拉低双向缓冲器74HC245的DIR端(P3.6),使它工作在输入方向信号传递,然后拉低74HC244的低有效使能端(P3.5),开通输入通路。
之后就可以进行输入信号的读取了。
完成之后置高使能位,关闭缓冲器通路,单片机P2口就可以进行其他输入输出工作了。
(注意:输入通路开通前要保证另两个锁存器处在锁存状态,否则会引起输出状态和LED灯的变化,锁存器的锁存在输出过程时就要完成。
)高速计数通道X0,X1单独连接单片机P0.6,P0.7口,可以直接读取。
②输出信号处理过程
信号从单片机内部输出之前,首先要关闭输入通道的使能,即拉高74HC244使能端(P3.5),然后拉高双向缓冲器74HC245的DIR端(P3.6),使它工作在信号输出传递方向。
向P2端口写入数据后置高74HC573的锁存使能端(即拉低P1.6),开通通路,信号就输入到锁存器中。
等待三个机器周期后,拉低锁存使能端(置高P1.6),将本次的输出信号锁存。
这时,单片机端口P2就重新解放出来,可以进行其他输入输出通道工作了。
通过这样的输入缓冲,输出锁存方式,可以有效将各输入输出信号隔离起来,分别导通,达到对单片机P2口的复用,节省了单片机的IO负担,优化了电路和PCB设计。
3.3 软件设计
PLC指令的解释、与上位机的通信等核心功能已由EASYCORE内核完成,用户程序只要根据接口规范,结合用户设计要求,编制少量的接口驱动程序。
3.3.1 驱动程序的功能和规划
驱动程序要完成三个功能:
①PLC开关量输入输出口的驱动
输入驱动程序:对输入口进行八次采样,并进行比较是否相同,进而判断是否作为一次有效的输入值。
每个扫描周期将输入值写入PLC资源区一次。
输出驱动程序:每个扫描周期从PLC资源区读出一次输出量,并写入输出口。
②LED指示灯的驱动
从PLC资源区读出输入输出值,并周期性写到LED灯驱动端口来保持LED灯的刷新,输入灯输出灯交替赋值刷新。
③高速单向计数功能的驱动
利用C8051F020内部的PCA的捕捉模块,捕捉高速脉冲的上升沿,在PCA中断中进行加一计数操作,并写入数据寄存器中。
3.3.2 驱动程序的实现和嵌入
驱动程序的嵌入接口包括:
INIT_CONFIG: 用户I/O配置程序入口
INIT_START: 用户上电初始化程序入口
INIT_RUN: 用户运行初始化程序入口
INIT_SET: 用户设置初始化程序入口
STEP: 用户软中断程序入口(响应时间<100us)
TMS: 用户2.5ms定时运行程序入口
SCAN: 用户演算周期扫描程序入口
以及要用到的PCA用户中断程序入口
①端口初始化:
这里将单片机的所有控制端口P1.6 , P1.7 , P3.0 , P3.3 , P3.4 , P3.5 , P3.6和专用输出端口P4.0 , P4.1配置为推挽输出。
将输入输出复用的P2口初始化为数字输入口(后面将根据P2的工作通道重新配置)。
配置交叉开关,将高速计数输入端口P0.6 , P0.7分配给PCA0模块的CEX0,CEX1。
INIT_CONFIG: ORL P1MDOUT,#0C0H ;初始化为推挽输出
ORL P3MDOUT,#79H
ORL P74OUT,#03H
MOV P2MDOUT,#00H ;初始化P2口为数字输入
MOV P2,#0FFH
MOV P0MDOUT,#00H ;初始化交叉开关,配置P0.6 P0.7为高速计数
MOV P0,#0FFH
MOV XBR0,#15H
ORL XBR2,#40H
RET
②复位初始化:
PLC上电时执行一次,由于PLC通常情况下不断电,而是在运行和编程状态间转换,所以初始化的部分都写在运行初始化和编程初始化程序接口中。
INIT_START: RET
③运行初始化:
梯形图第一次运行时执行一次,这里将输出端口和LED驱动电路的使能端开通,并初始化PCA0的捕捉模块,开通PCA中断。
然后调用一次输入输出的刷新作为梯形图第一次扫描的数据。
INIT_RUN: CLR P1.7 ;输出端口和LED使能
MOV PCA0CN,00H ;PCA0捕捉模块初始化
MOV PCA0CPM0,21H ;开中断,捕捉上升沿
MOV PCA0CPM1,21H
ORL EIE1,#08H
LCALL SCAN ;进行一次输入输出刷新
RET
④编程初始化:
这里把所有运行过程中要用到的变量都初始化:输入采样次数8次,输入输出灯刷新标志,高速计数的数据寄存器,PLC资源区的X0~X7,Y0~Y7,输入输出LED灯的值。
并且关闭PCA中断,禁止高速计数运行。
INIT_SET: MOV INPUT_CNT,#08H ;输入采样次数初始化
SETB FLAG0 ;输入输出灯刷新标志位
MOV A,#00H
MOV DPTR,#RAM_PD;高速计数器初始化
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
MOV DPTR,#RAM_PD+4
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
MOV DPTR,#RAM_PX+1 ;输入输出初始化
MOVX @DPTR,A
MOV DPTR,#RAM_PY+1
MOVX @DPTR,A
MOV INPUT_LED,#0FFH ;LED灯赋值初始化
MOV OUTPUT_LED,#0FFH
ANL EIE1,#0F7H ;PCA0捕捉模块关中断
MOV PCA0CN,00H
RET
⑤指令周期扫描:
梯形图每执行一步,调用此程序一次。
需要快速执行的事件可在此程序或完成。
不需要。
STEP: RET
⑥2.5ms周期扫描:
程序每隔2.5ms执行一次,不断重复执行。
这里可以完成输入的采样工作和LED灯的刷新工作。
LED灯刷新:由于输入灯和输出灯共用八路P2口作为驱动,所以不能同时刷新,而采用交替刷新的方式,设置标志位FLAG0来判断是输入灯还是输出灯的刷新。
具体刷新的实现:设P2口为推挽输出,写P3.5 P3.6口来开通输出通路,判断FLAG0进入相应赋值程序,将存好的LED值INPUT_LED或OUTPUT_LED读出并写入P2口,写P3.0口开锁存器通
路,等待三个指令周期后锁存。
最后取反FLAG0供下次判断使用。
灯RUN ERR直接赋值刷新。
输入采样:设置一个计数字INPUT_CNT,记录采样的次数,每次的采样值存入连续地址,地址通过计数字INPUT_CNT和首地址计算得来,采样八次之后就不再采样,这意味着每个扫描周期只进行这一个八次采样,这样既可以有效滤波,又可以减轻内核负担。
每次的采样都要先配置P2口为数字输入模式,写P3.5 P3.6口来开通输入通路,然后读入P2口的值,并把高速通道的P0.6 P0.7的值一并读入存储到相应地址。
这里只进行采样工作,而八个采样结果将在扫描周期函数中进行运算和判断,进而产生一次有效的输入值。
TMS: MOV C,KEY_SET ;灯RUN ERR的刷新
CPL C
MOV ACC.1,C
MOV C,PLC_PRO_ERR
MOV ACC.0,C
MOV P4,A
MOV P2MDOUT,#0FFH ;P2口设置为推挽输出
ORL P3,#60H ;SETB P3.5 SETB P3.6 开输出通路
JB FLAG0,USER_TMS_OUTLED
USER_TMS_INLED: MOV P2,INPUT_LED ;输入灯刷新
CLR P3.3 ;关输出灯使能
SETB P3.4
SETB P3.0
NOP
NOP
NOP
CLR P3.0 ;锁存器锁存
SJMP USER_TMS_S
USER_TMS_OUTLED:MOV P2,OUTPUT_LED ;输出灯刷新
CLR P3.4 ;关输入灯使能
SETB P3.3
SETB P3.0
NOP
NOP
NOP
CLR P3.0 ; 锁存器锁存
USER_TMS_S: CPL FLAG0
MOV A,INPUT_CNT ;输入口八次采样
JZ USER_TMS_S1 ;若八次采样完成就跳转
DEC A
MOV DPTR,#XINPUT ;计算采样值储存地址
ADD A,DPL
MOV DPL,A
MOV A,DPH
ADDC A,#00H
MOV DPH,A
MOV P2MDOUT,#00H ;P2口设为数字输入
MOV P2,#0FFH
ANL P3,#9FH ;开输入通路
MOV A,P2 ;输入采样
MOV C,P0.6
MOV ACC.7,C
MOV C,P0.7
MOV ACC.6,C
MOVX @DPTR,A
SETB P3.5 ;关闭输入缓冲器
DEC INPUT_CNT
USER_TMS_S1: RET
⑦用户扫描周期执行程序:
每个扫描周期结束时执行一次。
传统PLC的集中输入采样集中输出刷新在这里进行实现。
并进行LED灯的赋值。
输出刷新:从PLC资源区RAM_PY+1读Y0~Y7的值,经解码(这是由于硬件连接顺序和内部存储顺序不同)后赋给存储输出LED灯值的变量OUTPUT_LED。
配置P2口为推挽输出,开输出通路,将值写入P2口,开锁存器通路,延迟一段时间,锁存。
输入刷新:将本个扫描周期的八个采样值取出进行比较,不够八次采样或八次采样值不相同则不进行本次输入刷新,保持之前的输入值。
如果合格,就作为一次有效的输入值,刷新到PLC资源区RAM_PX+1和赋值到输入灯值变量INPUT_LED(注意要结合硬件的连接顺序进行解码)。
SCAN: MOV DPTR,#RAM_PY+1 ;Y00--Y07
MOVX A,@DPTR ;对输出LED的赋值OUTPUT_LED
LCALL USER_SCAN_CHG
MOV OUTPUT_LED,A
MOVX A,@DPTR ;刷新输出
MOV C,ACC.7 ;调整输出位
SWAP A
RLC A
RLC A
RLC A
RLC A
RLC A
SWAP A
MOV P2MDOUT,#0FFH ;P2口设置为推挽输出
ORL P3,#60H ;开输出通路
MOV P2,A
CLR P1.6
NOP
NOP
NOP
SETB P1.6
LCALL USER_SCAN_I
MOV DPTR,#RAM_PX+1 ;X00--X07
MOV A,INPUT_PORTA
MOVX @DPTR,A ;更新X00--X07
LCALL USER_SCAN_CHG ;对输入LED的赋值INPUT_LED
MOV INPUT_LED,A
RET
USER_SCAN_CHG: MOV C,ACC.7 ;LED赋值调整
MOV F0,C
MOV C,ACC.6
MOV ACC.7,C
MOV C,F0
MOV ACC.6,C
MOV C,ACC.5
MOV F0,C
MOV C,ACC.4
MOV ACC.5,C
MOV C,F0
MOV ACC.4,C
MOV C,ACC.3
MOV F0,C
MOV C,ACC.2
MOV ACC.3,C
MOV C,F0
MOV ACC.2,C
MOV C,ACC.1
MOV F0,C
MOV C,ACC.0
MOV ACC.1,C
MOV C,F0
MOV ACC.0,C
CPL A
RET
USER_SCAN_I: MOV A,INPUT_CNT
JZ USER_SCAN_I1
RET
USER_SCAN_I1: LCALL USER_SCAN_IS ;八次采样结束,判断是否有效JB F0,USER_SCAN_I2 ;有效则更新输入数据寄存器
MOV C,ACC.7 ;调整输入口
MOV F0,C
MOV C,ACC.0
MOV ACC.7,C
MOV C,F0
MOV ACC.0,C
MOV C,ACC.6
MOV F0,C
MOV C,ACC.1
MOV ACC.6,C
MOV C,F0
MOV ACC.1,C
MOV C,ACC.5
MOV F0,C
MOV C,ACC.2
MOV ACC.5,C
MOV C,F0
MOV ACC.2,C
MOV C,ACC.4
MOV F0,C
MOV C,ACC.3
MOV ACC.4,C
MOV C,F0
MOV ACC.3,C
MOV INPUT_PORTA,A
USER_SCAN_I2: MOV INPUT_CNT,#08H ;重新赋计数值
RET
;判断8个采样数据是否相同,相同则F0=0
USER_SCAN_IS: MOV DPTR,#XINPUT
MOVX A,@DPTR
MOV M0,A
MOV R7,#7
USER_SCAN_IS1: INC DPTR
MOVX A,@DPTR
CJNE A,M0,USER_SCAN_IS2
DJNZ R7,USER_SCAN_IS1
CLR F0
RET
USER_SCAN_IS2: SETB F0
RET
⑧用户中断程序:
PCA模块的用户中断程序,用来实现高速单相计数功能。
由于用户中断发生的随机性,所以进中断要进栈保护重要寄存器,以免内核出现未知错误。
当PCA0捕捉模块在P0.6或P0.7口捕捉到上升沿时,进入中断。
在中段程序中通过检查寄存器PCA0CN的0,1位来判断是哪个口发生的中断请求,然后将该口对应的数据寄存器的值进行加一操作,注意双字的加1对字节的操作顺序。
然后清中断标志位,恢复现场即可出中断等待下一次中断的发生。
PCA : PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH ;现场保护
USER_PCA_CPM0: JNB PCA0CN.0,USER_PCA_CPM1 ;判断是哪个口的中断响应
LCALL USER_PCA_ADD0
USER_PCA_CPM1: JNB PCA0CN.1,USER_PCA_RET
LCALL USER_PCA_ADD1
USER_PCA_RET: MOV PCA0CN ,#00H ;清中断标志
POP DPH
POP DPL
POP PSW ;现场恢复
POP ACC
RETI
USER_PCA_ADD0: CLR C
MOV DPTR,#RAM_PD+1 ;数据寄存器D0D1双字地址
MOVX A,@DPTR
ADD A,#01H
MOVX @DPTR,A
MOV DPTR,#RAM_PD
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
MOV DPTR,#RAM_PD+3
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
MOV DPTR,#RAM_PD+2
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
RET
USER_PCA_ADD1: CLR C
MOV DPTR,#RAM_PD+4+1 ;数据寄存器D2D3双字地址
MOVX A,@DPTR
ADD A,#01H
MOVX @DPTR,A
MOV DPTR,#RAM_PD+4
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
MOV DPTR,#RAM_PD+4+3
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
MOV DPTR,#RAM_PD+4+2
MOVX A,@DPTR
ADDC A,#00H
MOVX @DPTR,A
RET
3.2.3 驱动程序的调试
①下载空梯形图进入PLC,调试PLC的输入采样驱动程序和输入指示灯驱动程序。
首先发现RUN灯,ERR灯工作不正常,输入指示灯未工作,输入采样情况不得而知。
错误原因是对RUN和ERR灯的赋值没有根据硬件电路而取反,对LED灯没有交替刷新且没有锁存。
改正程序后继续调试,观察到RUN灯,ERR灯,输入指示灯正常工作,输入指示灯随着输入的变化而变化,说明输入采样驱动程序正确工作。
②下载测试梯形图1,调试PLC的指示灯驱动程序和输出刷新驱动程序。
测试梯形图1
上电运行后,发现继电器在输入下进行不符合梯形图逻辑的不规则动作,输出指示灯不工作。
经过对嵌入式PLC资料的研究,发现在PLC资源区中是以字为单位存储的,也就是说X0~X7,Y0~Y7的对应地址是RAM_PX+1,RAM_PY+1,对PLC资源区的错误访问导致输入未被加入梯形图逻辑,而资源区的未知数据被输出。
改正输入输出刷新的地址后,继续调试,输出继电器可以正常工作,其动作规律符合输入和梯形图逻辑。
但是输出指示灯仍未工作,将输出灯刷新程序段和输入灯刷新程序段交换位置后,发现输出灯可以正常工作而输入指示灯不工作,这说明是分支程序的判断跳转有问题。
将要进行判断的指示灯刷新标志位由特殊寄存器PSW.1改为用户数据储存区的位变量FLAG0后,输入输出指示灯均正常工作。
这是由于PSW.1在内核的其他任务中会被改变,不能作为记录刷新状态的标志位。
③下载测试梯形图2,进一步检验输入输出驱动和LED指示灯刷新驱动。
测试梯形图2:1s开关一次
上电运行,输入输出指示灯工作正常,输出继电器动作正确。
发现一个前两次调试未发现的问题:整个运行过程中继电器有噪声。
排查输出刷新程序段,发现单片机IO口P1.6是取反后接到输出锁存器LE上的,对这一点的忽略导致对锁存器的操作错误,导致输出后没有锁存输出信号,继电器输出会被其他输入输出信号影响,产生未知动作,产生噪音。
改正后,噪声消失。
至此,输入输出驱动程序,LED指示灯驱动程序调试完成。
④加入高速单相计数部分的驱动程序。
发现此时无法正常下载梯形图,问题原因是在配置交叉开关时,错误改变了串口通信端口的配置,导致串口通信失败。
将交叉开关的配置改正。
使用脉冲发生器作为X0输入信号,使用人机界面监视数据寄存器D0D1的数据,输入信号频率逐渐增大至20K,最后比较脉冲发生器发出的脉冲数和监视到的D0D1的数据。
结果在误差范围内,高速单相计数驱动程序正确。
四、总结
通过利用嵌入式PLC芯片组开发的16路通用PLC产品的实例,可以总结出,嵌入式PLC 开发的思路就是分析需求,设计硬件,嵌入驱动程序,所以嵌入式PLC软硬件可裁剪的自由度极大。
相比传统PLC,它更加灵活且更节约硬件成本,得到了许多强大的功能,可以更好的满足用户的个性化需求;相比于普通嵌入式系统,其对于梯形图的应用可以大幅缩短研发周期,不同的产品使用相同的内核程序,只需要编写少量的驱动程序和相应的梯形图程序即可直接使用,相信它的出现必将使得PLC生产厂家生产出越来越多的贴近终端市场的PLC。
参考文献
1.黄石科威自控有限公司《嵌入式PLC原理及应用》
2. 沈阳新华龙有限公司《C8051F020数据手册》
3. 黄石科威自控有限公司《EASY编程手册》。