2 描述模型数据结构及执行机原理
PLC程序编译的最终目的是获得可执行文件。对于硬件PLC,将可执行文件送往硬件执行模块即可。对于本文中的软件PLC,程序描述模型的记录,即可执行程序通用数据结构,是可执行文件的主要内容。因此,选择恰当的程序描述模型是整个问题的关键,该模型需要完整地表述梯形图程序中所包含的层次特征和所有单元之间的逻辑关系。基于此点,我们设计模型结构如图3所示。
图3 模型结构
模型在形式上类似梯形图中的一个梯级,包含有5个层次,从低到高依次是:单元层次、逻辑行层次、段层次、梯级层次、梯形图层次。
a.自然行。梯形图中的所有水平并列的单元构成了一个自然行。
b.逻辑行。由单元组成,段内是并联关系。同处一个自然行的单元不一定同处一个逻辑行。图中的每个矩形框代表一个逻辑行。
c.段。由逻辑行组成。梯级内的段与段是串联关系。图3中,从上到下、并行排列的几个矩形框构成一段。
d.梯级。由相互联系而不可分割的一个或数个自然行组成,同时也由段串联组成。图3中前3个输入段与最后的输出段构成一个梯级。
e.梯形图。由一个或数个梯级依次排列而成。各梯级间一般有逻辑或者时间上的顺序。
针对具体梯形图的设计规模,还需要制定一些规则,即每个梯形图最多包含60个自然行;每个自然行包含12个单元;每个逻辑行至多包含6个单元;每段至多包含6个逻辑行,每个梯级至多包含4段,其中包含1个输出段;整个梯形图至多包含20个梯级以及30个输出单元。规则中的参数可以通过实际的情况灵活修改。
程序模型的作用在于为解析PLC程序提供参照,描述模型的数据结构即为PLC程序的最终数据结构。对应程序模型,数据结构同样分为5个层次,分别为单元、逻辑行、段、梯级、梯形图。
struct SLadderCell //单元层次
{
char type; //单元类型
int address; //地址
int setting_value; //设定
int current_value; //当前值
char reg_type; //寄存器类型
int result_value; //单元值
};
struct SLadderRow //逻辑行层次
{
int cell_num; //实际包含的单元数量
struct SLadderInputCell cell[MAX_CELL_OF
_ROW]; //记录一行的单元
int result_value; //行的值
};
段、梯级的数据结构与逻辑行的数据结构大体类似,不再重复。其中,最重要的梯形图程序模型的层次结构如下。
struct SLadderGragh //梯形图程序层次
{
int layer_num; //实际包含的梯级数
int output_num; //实际的输出单元的数
SLadderLayer layer [MAX _ LAYER _ OF _
GRAPH]; //梯级的记录
};
针对以上通用数据结构,设计软件PLC执行机结构如下。
PLC executive //PLC程序执行机
{
FOR (LAYER NO. < ACTUAL LAYER
NUMBER)
{
FOR (SEGMENT NO. < ACTUAL SEG-
MENT NUMBER)
{
FOR (LOGIC ROW NO. < ACTUAL LOG-
IC ROW NUMBER)
{
FOR (CELL NO. <ACTUAL CELL NUM-
BER)
{
ROW RESULT = ROW _ RESULT &&
VALUE OF THE NEXT CELL //单元之间执行
与运算
}
SEG RESULT = SEG_RESULT || VALUE
OF THE NEXT LOGIC ROW //逻辑行间执行
或运算
}
LAYER RESULT = LAYER RESULT &&
VALUE OF THE NEXT SEGMENT //段之间
执行与运算
}
}
}