发表于:2005-12-25 16:55:00
1楼
如果是硬解题的PLC或者解释型的PLC都比较容易做到这一点。
因为这两种都是基于虚拟机的,变量地址和程序地址是可控的,一般这两种的程序都可以很容易的恢复成梯型图或语言,而编译型的相当困难,原因是程序每一次编译每条PLC的指令都被分解开,不可再退回PLC的语言,不过困难不是做不到。
因为是5年前做的了,所以不一不定记得很准确,请您批评,具体的实现如下:
实现方式一、
1、如果是编译型的PLC,在实现上可以考虑将用户程序定位在一块固定的基址,这一块程序单独编译链接,主程序也单独编译,主程序内每次要解题时固定跳至该地址运行。
2、在线修改时,其实只下载重新编译过的用户程序块,先下载至SRAM,下载完后设一标记,在这一轮解题完后在主程序内将用户程序更新为新程序,再接着运行。
在实现上这种方式相对简单,但一定要小心空间的应用,特别是变量空间的定位,需要对每个变量用行固定定址,比方说输入变量的基址要固定在某个地方,输出的要固定在某个地方,中间变量要固固定在某个地方,临时变量也需要固定,而不要动态分配,尽量不要用堆做临时变量的分配,或自行管理。
实现方式二、
在下面实现重定位,也就是说下载的程序在下面将几个关键基址进行重定位
实现方式三、
现在很多单片机支持在线升级,如ST的51就有一块单独的4K空间可以用来编写下载程序,这一块空间是独立的,你可以用这一块空间来实现对你程序和更新维护。但要想做到变量地址不变,这一点很难,除非对C编译器进行很多改动。