紫金桥软件作为一款强大的现场控制软件平台,具有丰富的现场控制功能,灵活的配方处理方式就是其中的一个典型代表。
我们平常说的配方指的是是几中原料间的配比关系,比如药方,营养配方等等。紫金桥软件中的配方不仅仅指原料间的配比关系,还包括温度压力等因素。从实质上来说,紫金桥软件中的配方,就是把一组变量依照不同的配方名和一组组的数据对应起来,当在脚本中加载不同的配方时,利用对应的数值给变量赋值的过程。
这里介绍两种配方处理方式,一种是利用紫金桥软件中的配方组件完成配方,另一种是利用紫金桥自由报表强大的与关系数据通讯的能力实现配方的功能。
设计要求:
这里以一个面包加工的工艺为例,针对不同类型的面包,配置面粉,白糖,食盐,水,黄油的含量,要实现的配方功能如下:
1. 自由选择使用的配方
2. 下置配方
3. 修改配方
4. 增加/删除配方
具体功能:
一. 利用配方组件
紫金桥在线帮助中提供了一个利用配方组件实现配方的例子,这里是对该例子的扩展。
由于涉及到修改配方,为避免修改过程中对现场生产产生影响,这里选用中间变量做配方的处理单元。如果系统运行时没有增加/修改/删除报表的功能,可以直接用相应的数据库点作为处理单元。使用中间变量作配方的处理单元时,每次使用配方都需要和数据下置开关一同使用。
步骤一:定义实时数据库点
首先定义几个数据库点用来表示现场各物理量。
切换导航器到数据库页,双击点组态启动点组态管理程序,使用点组态管理程序创建如下数据库点:
点名 |
点说明 |
类型 |
Flour |
面粉 |
模拟IO点 |
Salt |
食盐 |
模拟IO点 |
Sugar |
白糖 |
模拟IO点 |
Water |
水 |
模拟IO点 |
Butter |
黄油 |
模拟IO点 |
步骤二:定义中间变量
定义如下中间变量,作为配方的直接处理单元。
变量名 |
说明 |
类型 |
Flour_T |
面粉 |
实型 |
Salt_T |
食盐 |
实型 |
Sugar_T |
白糖 |
实型 |
Water_T |
水 |
实型 |
Butter_T |
黄油 |
实型 |
CurName |
显示当前配方名 |
字符型 |
NewName |
新建配方名 |
字符型 |
nUpdate |
下置数据开关 |
整型 |
步骤三:创建配方
把导航器切换到画面页,在“自定义/配方”项上点击鼠标右键,选择右键菜单中“创建”项,创建一个新的配方。展开配方,在新创建的配方上点击右键,选择“名称”给此配方另起一个新的名称,在这里起名为Re。双击配方Re弹出配方编辑对话框,在此对话框中做如下的设置:
在变量栏中填入已经创建的中间变量点名,在配方名栏里填入每一条配方的名字,在中间输入每一个中间变量下的对应值。然后使用行列操作,删除多余的行和列,点击保存按钮保存对配方的设置。
步骤四:创建画面
把导航器切换到画面页,双击“窗口”项,创建一个新的窗口,窗口名默认为“Draw1”并在窗口中绘制如下的画面:
双击面粉右侧的字符串,在弹出的动画联接对话框中,点击
按钮创建一个模拟输入输出动画联接,把此字符串和Flour_T关联起来。同样,将左侧的文本与对应的中间变量相关联,右侧的文本与数据库点相关联。当前使用配方处的文本与中间变量CurName相关联。
步骤四:使用脚本调用配方
选择配方:完成配方的选择并使用,双击“选择”按钮,在动画关联对话框中选择
,在“按下鼠标”动作中输入如下的脚本:
String cs;
#Re.Select(cs);
if StrLen(cs) > 0 then
CurName = cs;
#Re.Load(cs);
nUpdate = 1;
endif
这样当使用鼠标点击此按钮时,就会弹出配方选择对话框,如果用户选择了配方,并且点击了“确定”按钮,那么#Re.Select(cs)语句运行之后cs的值将变成用户选择的配方的名字,否则它的值为空。当它的值不为空时我们调用#Re.Load(cs)来加载该配方即可。
其中,nUpdate = 1用来控制中间变量向数据库变量赋值,起到下置数据开关的作用。这需在画面的应用脚本中作一些相关的设置。
将导航器切换到“画面”页,选择“脚本”下的“应用”,打开,在“程序周期执行”里输入如下脚本:
if nUpdate == 1 then
nUpdate = 0;
Flour.PV = Flour_T;
Sugar.PV = Sugar_T;
Salt.PV = Salt_T;
Water.PV = Water_T;
Butter.PV = Butter_T;
Endif
这样,当nUpdate = 1时,系统会自动将每一个与配方有关的中间变量赋值给相应的数据库变量,完成配方值的下置。注意:必须将nUpdate赋值为0,防止不断赋值。
增加配方:这里把新加配方单独做成一个窗口,新建过程和前一个窗口一样,窗口名默认为“Draw2”,效果图如下:
首先在“
Draw1”窗口中,需要在增加按钮中添加脚本动作,双击“增加”按钮,在动画关联对话框中选择
,在“按下鼠标”动作中输入如下的脚本:
Display("DRAW2");
用此脚本打开“Draw”窗口。
然后设置“Draw2”窗口中的各项。将各量对应的文本与相应的中间变量进行关联。
将填入配方名的文本框命名为Name。选中该文本框,在软件的左下角属性框处,填入对象的名称,如下:
最后设置确定按钮,双击“确定”按钮,在动画关联对话框中选择
,在“按下鼠标”动作中输入如下的脚本:
NewName = #Name.Text; //获得文本框中内容
if NewName == "" then //判断文本框中内容是否为空,为空则返回
MsgBox("请输入配方名!");
return; //不执行剩余脚本
endif
if #Re.Add(NewName)==0 then //以文本框内容为名称新增配方,如果返回值为0
MsgBox("此配方名已存在!"); //则与已有配方名冲突,
return; //返回,不执行剩余脚本
endif
#Re.Save(); //保存新增配方
CloseCurWindow(); //关闭当前窗口
这样,运行时点击“确定”按钮时,首先在对应的各量处输入新配方的各个量的值,并设置一个配方名,如果新增的配方名不为空,并且不与已有配方名冲突,新配方就可以添加并保存,“Draw2”窗口也会相应关闭。
修改配方:返回“Draw1”窗口,设置修改配方按钮,双击“修改”按钮,在动画关联对话框中选择 ,在“按下鼠标”动作中输入如下的脚本:
#Re.Modify(CurName);
#Re.Save();
这样,使用“修改”按钮时,就会按照当前各个量的值修改当前选择的配方。
删除配方:双击“删除”按钮,在动画关联对话框中选择
,在“按下鼠标”动作中输入如下的脚本:
String cs;
#Re.Select(cs);
#Re.Delete(cs);
#Re.Save();
这样,在使用“删除”时,就会弹出配方选择的对话框,如果用户选择了配方,并且点击了“确定”按钮,那么#Re.Delete(cs)语句运行之后选择的配方就会被删除。调用#Re.Save()保存当前设置。
步骤六:运行系统查看结果
运行整个系统,即可实现设计要求的功能。包含配方的选择,增加新的配方,修改当前配方,删除配方等。
总结:
紫金桥配方功能,使用方便,易理解、易上手,并且具有配方保护的功能,在多个行业中都有成功的应用。比如长城润滑油的防冻液调和系统,不仅能够精确控制配方比例,节约原料成本,而且能够保护配方的细节,保证配方信息的安全性,赢得了用户的一致好评。