一台设备改造,操作界面是一台西门子一体机电脑,触摸屏,XP系统WinCC 7.0,没有配置鼠标键盘。原来的参数设置是通过设置激活屏幕键盘来进行输入,现场反馈操作很别扭经常容易点错,后来都是通过点击界面上组态的“+”/“-”按钮来实现设定值的增大或减小,还好需要经常修改的参数不多。
改造基于现有硬件,重新组态画面。首先要解决的就是数字输入的问题。在WinCC全局库中有这么个数字键盘是这个样子的。
只可惜这个键盘只能输入整数,不能输入浮点数,实际情况是画面上大部分数据都是浮点数,所以是不能直接使用的。但是全局库里的这个模板其实挺不错的,于是拿来改造一下吧,重新编辑了下界面,改造成下面这个样子。增加了几个按钮,可以输入小数、负数等,基本满足了我的需求了。
其实这个键盘的原理就是通过按钮点击后将所有字符拼接为一个字符串,然后再将字符串转换为数值,将这个数值直接赋值给WinCC中的变量。这里面有一个问题就是,如果IO域组态了上限和下限,由于是直接赋值给变量,所以上下限是不起作用的,同时会导致IO域上数值超限而显示***。原库里是输出直接连接变量的,这样其实不方便重复调用键盘,因此将其改成了变量的间接调用,这样直接将io域的关联的变量名传给这个小键盘就可以了。
附上pdl文件
Box_NumKeyboard.zip
使用说明:
1、 在WinCC中创建3个内部变量,如下
其中VarName用于存储IO域关联的变量的名称
LimitMax和LimitMin分别存储IO域的设定的最大值和最小值
2、 在画面中,添加一个“画面窗口”,命名为“PIC”,做为键盘弹窗的容器。
3、 在IO域中关联显示的变量,如下图
4、 设置IO域的限幅值“Limits”
此处不要使用默认值,否则会有问题。
5、 在IO域的鼠标动作中添加脚本,弹出数字键盘的窗口,脚本如下
#pragma option(mbcs)
#define PictureName "Box_NumKeyboard.PDL"
#define HEIGHT 800 //画面高度
int x,y,w,h;
char* Tag=NULL;
Tag=GetLinkedVariable(lpszPictureName,lpszObjectName,"OutputValue");//Return-Type: char*
SetTagChar("VarName",Tag);//获取变量名称
SetTagFloat("LimitMax",(float)GetLimitMax(lpszPictureName,lpszObjectName)); //输入框最大限制值
SetTagFloat("LimitMin",(float)GetLimitMin(lpszPictureName,lpszObjectName)); //输入框最小限制值
SetVisible(lpszPictureName,"PIC",0); //"PIC"为画面窗口对象名称
SetPictureName(lpszPictureName,"PIC",PictureName); //Return-Type: BOOL
x= GetLeft(lpszPictureName,lpszObjectName); //获取IO域坐标
y= GetTop(lpszPictureName,lpszObjectName); //获取IO域坐标
w=GetWidth(lpszPictureName,lpszObjectName); //获取IO域宽度
if(x-280<0)
SetLeft(lpszPictureName,"PIC",x+w+20); //设置弹窗位置
else
SetLeft(lpszPictureName,"PIC",x-280); //设置弹窗位置
if(y+300>HEIGHT)
SetTop(lpszPictureName,"PIC",HEIGHT-320); //设置弹窗位置
else
SetTop(lpszPictureName,"PIC",y); //设置弹窗位置
SetVisible(lpszPictureName,"PIC",1); //显示窗口
运行效果如下:
后来发现,在Win10系统下激活屏幕键盘的效果也很漂亮,比XP下运行情况好了很多,这种小键盘的使用应该也就不需要了吧。
?