IN1008


IN1008 利用IAP实现PLC程序升级
   PDF格式完整版本下载

概述

GUTTA平台目前对解释型PLC和编译型PLC都提供了支持。解释型PLC不需要得到PLC单片机的机器码。GUTTA Ladder Editor根据用户的PLC程序,生成一种可被PLC解释系统识别的特定数据。PLC解释系统根据这些特定数据,分别调用对应的指令操作。而在编译系统下,GUTTA Ladder Editor需要根据用户的PLC程序,得到PLC单片机可以直接执行的机器码。这些机器码若需要被执行,就需要用FLASH烧写工具通过特殊的硬件烧写到单片的FLASH。需要特殊硬件,会给PLC的最终使用者带来不便。所幸的是,目前绝大多数FLASH单片机都提供了在电路编程(或者叫做在系统编程)以及在应用编程。利用单片机的这两个功能,就能简化FLASH程序的修改。甚至PLC的使用者感觉不出编译型和解释型的区别。

对于目前单片机的FLASH的编程能力,可以归纳如下几种:

1. 支持在应用编程(IAP)。

也就是说在FLASH上运行程序时同时能够对FLASH进行擦除、写等操作。当然运行程序的FLASH和被操作的FLASH不能在同一页上。

2. 支持在电路编程(ICP)。

也就是说单片机IC不用取下来,直接在电路上,运用几个特殊的引脚就能够进行编程。根据这几个引脚使用上的不同,还可以分为:

3. 支持用户FLASH的启动选择

这就意味着用户自己可以编写自己的Boot Loader代码。

下面举例说明:
NXP的LPC2134单片机。这个单片机支持:

由于支持IAP,可以做解释型PLC。做编译型PLC时,若是完全编译(需要更新整个固件),必须使用芯片制造商提供的ICP编程工具LPC2000 Flash Utility。由于这个软件不能嵌入到GUTTA Ladder Editor中,使用上不是特别方便。也可以遵循LPC2000 Flash Utility的编程协议自己写下载器,这种下载器有开源项目,可供参考。

新华龙的C8051F04x单片机。这个单片机支持:

由于支持IAP,可以做解释型PLC。做编译型PLC时,若是完全编译(需要更新整个固件),必须使用JTAG接口编程。虽然是在电路编程(IC不用取下),但JTAG不是通用计算机通讯端口,用户必须配备专门的JTAG器件才能下载程序,不是特别理想。

ATMEL的ATMEGA64单片机。这个单片机支持:

由于支持IAP,可以做解释型PLC。做编译型PLC时,若是完全编译(需要更新整个固件),必须使用JTAG接口编程或者SPI编程接口。这两种接口都不是通用计算机通讯端口。JTAG需要特殊硬件,SPI虽然可以用计算机并口模拟,但目前大部分计算机没有并口。ATMEGA64支持用户FLASH的启动选择,这就意味着用户自己可以编写自己的Boot Loader代码。这正是本文详细介绍的内容。

实现

原理

ATMEGA64单片机Boot Loader工作原理:

通过配置ATMEGA64的熔丝位,可以将单片机的复位地址修改为62K的位置。这样单片机的FLASH就分为了两个区。一个是62K以下的应用程序区,大小为62K。一个是62K到64K的启动代码区,大小为2K。当片机复位后,先运行启动代码区的代码,启动代码先判断通讯口是否有数据。延时一段时间如果没有发现有效连接,转跳到应用程序区。由于这个延时时间很短,您很难察觉到启动代码区代码的执行。若通讯口有连接,说明有编程请求,单片机进入编程模式。这个时候启动代码通过和计算机通讯,一页一页的对应用程序区的FLASH进行编程。当所有FLASH数据页编程结束后,启动代码程序转跳到应用程序区。

使用

要通过ATMEGA64的Boot Loader对单片机进行编程,首先要运行编程软件:GUTTA Flash Utility:

第一步:

点击Filename下面的按钮(…),选择需要下载的文件。如果是在GUTTA Ladder Editor中下载弹出的对话框,这一步可以省略。GUTTA Ladder Editor调用编译器生成hex文件后,会自动载入数据,并在信息栏中显示如下文字:

Generating source file: Done.
Compiling source file: Done.
Parsing hex file: Done. (File size: 23738)

第二步:

在软件的(Connected To Port)中选择计算机串口。并将这个计算机串口连接到开发板的串口上。

第三步:

点击按钮(Write to Flash),GUTTA Flash Utlity会不断的发送握手信号到ATMEGA64(ATTACH通讯指令)。这个时候按下开发板的复位按钮。ATMEGA64复位后,开始运行启动代码程序,与GUTTA Flash Utlity连接后便开始了对ATMEGA64的编程。信息栏中显示如下文字:

Open the hex file: Done. (File size: 47129)
Excuting command <ATTACH>: Done.
Excuting command <GETID>: Done. (ID: "ATMEGA64")
Excuting command <PAGESZ>: Done. (Page Size: 256)
Excuting command <PAGECNT>: Done. (Page Count: 248)
Excuting command <CLRP>: Done.
Excuting command <DNLDP>: Done.
Excuting command <LOGOUT>: Done.

AVR ATMEGA64 FLASH分区

在编译型PLC模式下,启动代码通过调用IAP函数,更新应用程序区的内容。

在解释型PLC模式下,PLC系统区是固定的。若需要下载PLC程序(通过GUTTA通讯协议),PLC系统调用高端地址的IAP函数对PLC用户程序区进行操作。

GUTTA Flash Utility通讯协议

01H ATTACH 连接

ATTACH指令用于连接到目标芯片。GUTTA Flash Utility在按下(Wirte to Flash)按钮后,会不停的向串口发送ATTACH指令。和其他指令不同,GUTTA Flash Utility不会对芯片响应做等待,而是按照自己固定的时间间隔不停的发送(这个间隔很短),直到接收到正确的响应或者是ATTACH尝试时间到(这个时间较长,默认是5秒)。您需要在这段时间内复位芯片,使芯片运行Boot Loader程序,Boot Loader程序检测到串口的ATTACH指令,就能做出正确的返回。一旦ATTACH指令被正确返回,芯片正式进入Boot Loader下载模式。

发送数据:

功能码 LRC校验
01H FFH

返回数据:

功能码 LRC校验
01H FFH
02H LOGOUT 断开

LOGOUT指令用于断开目标芯片的连接。Boot Loader程序一旦检测到串口的LOGOUT指令,表示所有的程序下载已经完成。Boot Loader程序停止串口的通讯同时转跳到应用程序区。

发送数据:

功能码 LRC校验
02H FEH

返回数据:

功能码 LRC校验
02H FEH
03H CLRP 擦除程序

CLRP指令用于擦除目标芯片的应用程序区的FLASH。FLASH一旦被擦除,所有的FLASH数据都变成FFH。

发送数据:

功能码 LRC校验
03H FDH

返回数据:

功能码 LRC校验
03H FDH
04H DNLDP 下载程序

DNLDP指令用于下载程序。由于FLASH中的数据是按页组织的。一条DNLDP指令一次下载一个页的数据。因此DNLDP指令的实际长度由目标芯片的页大小决定。GUTTA Flash Utility在下载前需要先通过PAGESZ指令查询目标芯片的页大小,从而决定DNLDP指令的长度。

发送数据:

功能码 页地址 页数据 LRC校验
04H            

返回数据:

功能码 LRC校验
04H FCH

发送数据的页地址为字(16bit)长度。发送时高字节在前,低字节在后。

05H GETID 查询芯片ID

GETID指令用于查询目标芯片的识别ID。ID以字符串的形式返回。

发送数据:

功能码 LRC校验
05H FBH

返回数据:

功能码 芯片ID字符串 LRC校验
05H        
06H PAGESZ 查询FLASH页大小

PAGESZ指令用于查询目标芯片的FLASH页大小。GUTTA Flash Utility需要通过PAGESZ指令得到页大小从而确定DNLDP指令的长度,即一次下载多少应用程序。

发送数据:

功能码 LRC校验
06H FAH

返回数据:

功能码 页大小 LRC校验
06H      

返回数据的页大小为字(16bit)长度。发送时高字节在前,低字节在后。页大小的单位为字节。

07H PAGECNT 获得FLASH页数量

PAGECNT指令用于查询目标芯片的FLASH页数量。GUTTA Flash Utility需要通过PAGESZ指令得到页数量从而确定最多能够下载多少应用程序数据。

发送数据:

功能码 LRC校验
07H F9H

返回数据:

功能码 页数量 LRC校验
07H      

返回数据的页数量为字(16bit)长度。发送时高字节在前,低字节在后。

部分编译

对于编译型PLC,存在两种形式:全编译和部分编译。全编译指PLC系统固件和PLC用户程序做为一个整体下载到目标硬件上去。部分编译指PLC系统固件保持不变,下载程序时只编译PLC用户程序部分。然后GUTTA编程软件通过和PLC系统固件的通讯,利用IAP将用PLC户程序代码写入指定的FLASH地址中。

比较:

下面给出CPU-EC20 (AVR,Compile)部分编译的空间结构以及运行流程:

由于部分编译只更新部分代码,PLC系统固件保持不变,那么我们可以将PLC程序的上传下载通讯程序放入PLC系统固件中。这样只要单片机支持IAP功能,我们就能实现部分编译型PLC。PLC用户程序包括4部分:系统块、数据块、其他块、PLC用户代码块。系统块、数据块、其他块都是常数数据;PLC用户代码块是可执行数据。PLC系统固件使用前3.5KB的RAM。PLC用户代码块使用后0.5KB的RAM。这些分区信息必须以参数的形式传递给链接器,使其能够正确的定位代码和变量。PLC用户代码分为5部分:

附件

Boot Loader 源代码

http://www.visiblecontrol.com/technologies/inindex/in1008/BootLoader.zip

GUTTA Flash Utility 源代码

http://www.visiblecontrol.com/technologies/inindex/in1008/GuttaFlashUtility.zip