王善红
摘 要:本文设计了一种基于单片机开发控制器的新方案以实现内核驱动与逻辑运算、控制分离。
关键词:单片机;梯形图;结构化数据;自编程
中图分类号:TP334 文献标识码:A
一、概述
通常基于单片机开发的智能控制器,因内部程序已固化,开发完成后,其功能基本定型,只能应用于设计时的特定目标,现场如需变更控制方案也非常困难。针对这一短板,我们设计一种基于单片机开发控制器的一种新方案,实现内核驱动与逻辑运算、控制分开,并以简明梯形图语言实现运行逻辑编程,不仅扩展了控制器的应用范围,而且减轻现场调试难度,控制方案的变动,只需修改梯形图逻辑即可解决。
二、原理
单片机应具备的特性:足够容量的可擦写flash程序存储器,支持IAP功能,现在大多单片机芯片都支持用户自编程IAP功能,如Atmega128、STM32F3、STM32F4系列皆能满足要求。首先将单片机flash存储器划分为3块,一部分存储实现IAP功能的Boot Loader程序,一部分存储单片机内核程序,余下的部分用于存储用户程序。内核程序主要是硬件驱动及用户程序间代码接口与算法。用户程序即为用梯形图编辑工具形成顺序控制逻辑,比较规则及数据输出去向等。
内核程序周期性地扫描内外部设备内存映射地址,并调用用户区逻辑运算,将结果以数据量及消息量的方式输出到设备,如此周而复始,完成用户逻辑的控制方案。
三、具体实现
单片机如何实现硬件驱动及通信不在本议题讨论范围内,重点论述如何实现梯形图编译工具软件与单片机执行梯形图控制逻辑。
1.用户程序编辑与编译(梯形图编译工具):
梯形图的编辑元器件主要包括常开接点、常闭接点、继电器等简单元件和定时、比较等功能元器件。为了灵活应用和扩展编辑元器件,方便编程,将梯形图元件数据结构定义如下:
type
Tmdevice=record
name: string[4]; //元件名称
mclass: byte; //元件类型
memo: string; //元件备注,消息变量为消息变量实体
end;
其中Mclass的取值0:开关量输入(DI),1:开关量输出(DO),2:定时器(T),3:计数器(C),4:内部继电器(M),5:数据寄存器(D),6:消息输入(MI),7:消息输出(MO)。
梯形图用户程序我们可以看成是有限个逻辑节点构成固定列宽,可扩展行数的表,每个节点代表元件加逻辑操作构成的数据结构体,因此首先定义节点数据结构:
Type
Tprodata=record
Opclass: byte; //节点类型(元件类型+连接类连)
notop: byte; //操作码
Address: byte; //操作数内存地址
Chadd: word; //比较数
end;
依据上述约定实现绘制的梯形图,如图1所示。
2.梯形图逻辑扫描算法
梯形图语言描述一个逻辑网络自左向右的能量潮,元件的逻辑运算总是与左侧的运算“与”运算,分支总是与左侧结果“或”运算,逐行扫描遇分支节点先将运算结果压入栈,扫描暂时放弃分支节点右侧元件,进行下一行扫描,如遇分支,继续执行压栈,一直扫描到没有分支时,将结果与栈顶“或”运算,执行出栈(先进先出原则),同时判断栈顶节点连接类型,决定下一步是出栈还是扫描,如遇出栈节点有右侧分支,则扫描右侧元件,并作逻辑运算,直至扫描至行结束标志节点,并将运算结果赋值与最后节点元件,因此位于结束标志点的元件一定是输出型元件。如果在扫描过程中,能量潮在开始标志与结束标志中有中断或能量潮开始与结束标志不完整,都视为梯形图编译未能通过。
我们将上面元件扫描顺序及元件操作类型记录在一个顺序数据组中,这个顺序数组结构应是这样:
Type
Tprodata=record
Oprate: byte; //数据运算类型
selfop: byte; //自身附加运算
Address: byte;//元件内存映射地址
Chadd: word;//比较运算值
end;
其中Oprate对应的逻辑运算,1表示与,2表示异或,4表示赋值,5表示压栈,6表示出栈,7表示栈更新,8表示定时器操作,9:定时器溢出处理,10:计数器操作,11:计算器溢出处理,12:表示位操作,13:寄存器数值比较。
然后定义一个Tprodata类型变长数组,将上面梯形图扫描编译顺序结果存放在这个变长数组中,最后将这个数据数据按Intel Hex格式格式化输出文件,并保存在磁硬盘中。
3.下载用户程序到单片机用户程序寄存器
单片机具有自编程(IAP)功能,将梯形图编译结果文件(Intel Hex格式)下载到单片机用户程序寄存器分区,因用户程序寄存器分区是可单独通过IAP擦写,这样修改控制器运行逻辑,只需修改梯形图,编译下载就可实现控制逻辑与内核程序分离。
4.单片机执行梯形图逻辑实现
5.梯形图元件在单片机内存映射
单片机内核程序中首先定义一组元件内存映射,数组的大小与梯形图中元件数组大小一致,并保持与梯形图编辑工具中元件类型对应,这里定义为u16 opdate[255]。
为处理梯形图用户逻辑,在单片机内核程序中建立几个接口函数,如图2所示。
接口函数实现方式中已明确了数据处理细节,单片机内核循环执行ReadDI()、checkprodata()、OutDO()函数。ReadDI()将输入端口的逻辑状态读入映射区。通信控制字、消息输入通过中断接口调用中断处理函数将数据存入相应的内存映射地址,checkprodata()顺序读取、处理用户逻辑,并将逻辑运算、比较结果传递相应的输出映射内存地址,OutDO()函数将输出映射地址中的结果输出控制器的输出端。通过图3更清晰彼此间的作用机制。
结论
本文设计基于单片机开发智能控制器,实现内核程序与用户控制逻辑分离,控制逻辑通过梯形图编辑工具编译与下载,控制目标的变更,只需修改梯形图逻辑即可实现。此设计方案成功应用在江苏盐城供电公司东郊变、安泰变环境监测与报警,智能排水不同控制目标。
参考文献
[1]杜开初.基于AT89C51单片机的微型可编程控制器[J].单片机与嵌入式系统应用,2002(1):17-18.