wincc学习技巧2 - 图文

更新时间:2023-11-25 20:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、组态软件 二、C语言基础

1.WINCC中的语言

Wincc语言由C脚本(C-script)和B脚本(VB-script)组成。 WINCC中C脚本:(1)C动作(在画布中编辑的程序代码)。

(2)全局脚本编辑器:项目函数、标准函数和内部函数。 项目函数:自定义本项目(保护性) 标准函数:编辑好供C动作调用 内部函数:(微软)自定义编辑函数在项目函数中 例如:#pragma()

int NEW_Add (int a; in b) {

int c; c=a+b; return c;

}

2.WINCC中的(Tag)变量------程序使用的变量(书上P31--35)变量:C变量、WINCC变量

C变量:int(数值型)、char(字符型)、BOOL(布尔型)---也就是二进制(为常用) WINCC变量:word(数值型) 、char(字符型) 、Bit(布尔型) (为常用) 常用变量如下:

布尔型:SetTagBit(参数1,参数2)、GetTagBit(参数) 数值型:SetTagWord(参数1,参数2)、GetTagWord(参数) 字符型:SetTagChar(参数1,参数2)、GetTagChar(参数)

参数1:变量名。参数2:具体要求。例如参数1为液位,参数2为a 举例1二进制变量“启动”控制电机启停 BOOL a;

a= GetTagBit(“启动”); if(a==0)

SetTagBit(“启动”,1);

举例2二进制变量“启动”控制电机启停 BOOL a;

static int i=0;(类似int i; i=0;) a= GetTagBit(“启动”); if(a==0) i++;

两者区别:

不加static 加static

启动一次i=1 启动一次i=1 启动二次i=1 启动二次i=2

1

启动三次i=1 启动三次i=3 启动四次i=1 启动四次i=4

3.WINCC中的运算符

3.WINCC中的常用语句

2

3

三、变量组态

WINCC中的变量分为:内部变量、外部变量和C动作(函数中的变量)

1. 利用变量进行增减计数

步骤1:进行画面构建,需要两个按钮和一个输入输出域(属性调整-)(变量、有变化时、输出)。新建内部变量,命名为“计数”,属性为无符16位。如下图所示;

步骤2:在名字为“启动增加”的按钮中-----属性----事件---鼠标左键C动作:

unsigned short a; a=GetTagWord(\计数\a++;

SetTagWord(\计数\

步骤3:在名字为“启动减少”的按钮中-----属性----事件---鼠标左键C动作:

unsigned short a; a=GetTagWord(\计数\a--;

SetTagWord(\计数\

2. 利用变量进行增减计数(带有步长控制),可定义步长

步骤1:进行画面构建,需要两个按钮和两个输入输出域(属性调整-)(变量为计数、有变

化时、输出)步长对应的输入输出域(属性调整-)(变量为步长、有变化时、输入)。新建2个内部变量,命名为“计数”和“步长”,属性为无符16位。如下图所示;

4

步骤2:在名字为“启动增加”的按钮中-----属性----事件---鼠标左键C动作: unsigned short a;

unsigned short b;

a=GetTagWord(\计数1\b=GetTagWord(\步长\a=a+b;

SetTagWord(\计数1\

步骤3:在名字为“启动减少”的按钮中-----属性----事件---鼠标左键C动作:

unsigned short a; unsigned short b;

a=GetTagWord(\计数1\b=GetTagWord(\步长\a=a-b;

SetTagWord(\计数1\

步骤4:如果调整步长,可直接输入

3. 利用变量进行电机启动

新建内部变量,命名为“起停”,属性为无符16位。

在名字为“启停”的按钮中-----属性----事件---鼠标左键C动作:

BOOL a;

a=GetTagWord(\起停\if(a==0)

SetTagWord(\起停\if(a==1)

SetTagWord(\起停\

4. 利用变量进行windows窗口对象的修改

5

四、画面组态

5. 画面的切换

方法1:利用直接连接切换单个画面,即为在下图中“单击鼠标改变画面”的部分点击链接到所要去的画面。组态完毕后,点击按钮即可达到。

6

方法2:通过对象名称和画面名称的变量连接打开画面。在书上P101 方法3:通过内部函数打开画面。

在按钮属性中事件中鼠标左键中C动作利用软件内部函数输入程序如下:

OpenPrevPicture (\画面名称\

6. 利用画面窗口显示画面

方法:SetVisible(\画面名称\对象名称\或0);

SetVisible表示可见度;画面名称表示画面的名字,例如1.pdl等;对象名称表示“画面窗口n”, “画面窗口n”在智能对象中; 1或0表示可见或不可见。

步骤:第一步:新建三个画面,1.pdl、2.pdl、3.pdl。目的将2.pdl、3.pdl在1.pdl中通过按钮的控制显示出来;

第二步:分别在2.pdl、3.pdl中组态一个目标物;

第三步:在1.pdl中组态两个按钮和两个画面窗口控件(名称为画面窗口1、画面窗口2),在智能对象中找到“画面窗口”,更改画面窗口属性(属性----几何----宽度为246,高度为129;属性---其它---边框改为是,显示改为否,画面名称添加2.pdl或3.pdl);

7

第四步:将2.pdl、3.pdl画面的大小调整为和两个画面窗口一样大;

第五步:进行按钮组态,在按钮属性中事件中鼠标左键中C动作中编写程序如下:

按钮1:SetVisible(\画面窗口1\

SetVisible(\画面窗口2\

按钮2:SetVisible(\画面窗口1\

SetVisible(\画面窗口2\

7. 画面窗口属性-----时控显示

这个技巧功能是对上一个的继承,最终结果就是将三个画面循环显示。

步骤:第一步:新建四个画面,1.pdl、2.pdl、3.pdl、4.pdl。目的将2.pdl、3.pdl、4.pdl在1.pdl中通过按钮的时间控制显示出来;(这里并非按钮按下显示,系统运行自动显示) 第二步:分别在2.pdl、3.pdl、4.pdl中组态一个目标物;

第三步:在1.pdl中组态一个按钮和三个画面窗口控件(名称为画面窗口1、画面窗口2、画面窗口3),在智能对象中找到“画面窗口”,更改画面窗口属性(属性----几何----宽度为246,高度为129;属性----其它----边框改为是,显示改为否,画面名称添加2.pdl或3.pdl或4.pdl); 第四步:将2.pdl、3.pdl、4.pdl画面的大小调整为和三个画面窗口一样大;

第五步:进行按钮组态,在按钮属性中几何中宽度中(假如宽度为70)C动作中编写程序如下:

static int a=0; a++; if(a==1) {

SetVisible(\画面窗口3\SetVisible(\画面窗口4\SetVisible(\画面窗口5\} if(a==2) {

SetVisible(\画面窗口3\SetVisible(\画面窗口4\

8

SetVisible(\画面窗口5\} if(a==3) {

SetVisible(\画面窗口3\SetVisible(\画面窗口4\SetVisible(\画面窗口5\a=0; }

return 70;

触发器调整为1S中,即为间隔1S闪烁显示。

8. 动画旋转组态(例如风扇转动)

这个技巧是为了组态一个旋转的动画,例如工业上的搅拌机等。举例如下:

步骤1:组态基本画面,可以在显示库中寻找,也可以自己绘制。

显示库:从显示库中调用,若使用,首先将元件导出(注意保存),然后将元件删掉,然后再导入(插入)这个元件,便可以进行调整(折开、组装、编组)注意,编组时必须至少两个一组。

自己绘制:例如矩形、圆等(注意属性的调整)全选编组。 例如编为4个组:组1、组2、组3、组4

步骤2:程序的编写-------在画布属性---几何---宽度(如果此时宽度为800)---C动作:

static int a=0; a++; if(a==1) {

SetVisible(\组1\SetVisible(\组2\SetVisible(\组3\SetVisible(\组4\}

9

if(a==2) {

SetVisible(\组1\SetVisible(\组2\SetVisible(\组3\SetVisible(\组4\a=0; }

return 800;

步骤3:触发器的调整,标准周期,250MS 9. 动态化------------颜色改变

颜色改变是最基本的动态化的技巧,就是动态对话框的基本功能,利用颜色的变化来完成一个部件的动作或结束。例如,画布属性---颜色-----动态对话框(事件名称也就是触发器的调整、表达式的填充或者变量、选择表达式结果的展现形式(布尔型或者其它调整颜色))。

10. 动态化------------闪烁组态(元件闪烁)

此技巧主要是针对于元件库中的元件来讲。例如,随便调出一个元件(属性----控件属性-----闪烁样式(4种选择,包括不闪烁-0、不可见-1、阴影-2、实心-3))。点击后面的灯泡标志,选择动态对话框-----闪烁颜色------布尔型等。

此技巧元件可单独作用,亦可由按钮控制。

11. 动态化------------动态填充组态

动态填充组态就是控制元件的动态填充。例如,新建一个内部变量(命名为level、无符号16位、上限100、下限0、起始值0)、调出一个元件或绘制一个矩形(属性----动态填充改为“是”、填充量改为“0”、 点击填充量后面的灯泡标志,直接连接变量level)。在矩形---几何---宽度(假设宽度为100)----C动作:(注意触发器调整250毫秒)

(1)填充增加 static int a=0; if(a>=100) a=0;

10

SetTagWord(\a++; return 100; (2)填充减少 static int a=100; if(a==100) a=100;

SetTagWord(\a——; return 100;

(3)填充增减结合(先增加、再减少)static int a=0;

static int b=0;(方向控制) if(b==0) {

if(a>=100) { b=1; } a++; } if(b==1) { if(a<=0) { b=0; } a——; }

SetTagWord(\

11

return 100;

12. 动态化------------对象的移动

对象的移动就是控制元件在画布上水平左右或者垂直上下的移动,亦或沿对角线移动,也可以综合性的各方向的移动。以小车移动为例进行步骤分析如下:

步骤一:选中元件----属性----几何(选择位置X、位置Y)----灯泡标志(C动作): 特别注意:计算移动的距离范围,选出一个起点和一个终点(如果双向起点和终点

和互换的)。计算两点之间的距离。如果水平移动,计算X之间的距离;如果垂直移动,计算Y之间的距离。例如,起点X的坐标为500,终点X的坐标为20,那么距离为480。(水平移动就是不断增加或者不断减少x)

步骤二:下面以水平移动为例,进行C动作分析: (1)水平左移(不断减少x)

static int a=500; if(a<=0) a=480; else

a=a-4;(每次移动的距离,可以自动调整) return 20+a;

(2)水平右移(不断增加x) static int a=0; if(a>=500) a=0; else

a=a+4; (每次移动的距离,可以自动调整) return 20+a;

(3)水平左右移动(双向移动) static int a=500; static int b=0; (方向控制) if(b==0) {

12

if(a<=0) {

b=1;(调整方向) }

a=a-4; (每次移动的距离,可以自动调整) } if(b==1) { if(a>=500) {

b=0; (调整方向) }

a=a+4; (每次移动的距离,可以自动调整) }

SetTagWord(\return 20+a;

步骤三:触发器调整250毫秒 注意:位置X------水平(左右)移动

位置Y------垂直(上下)移动 高度---------放大或者缩小(上下) 宽度--------拉伸或缩短(左右)

13. 动态化------------复杂动画设计

复杂动画设计是动态化画面的主要特色,也是工业画面组态主要部分。本技巧的展现以混合液的控制系统为例进行论述。 (1) 管道中液体流动

步骤一:在元件库中调用管道。管道在plantElemer-----pipes-----2270(弯管道)、2206(横放管道)、2180(纵放管道)中寻找。画出液体流动的三种状态,第一种状态为原始状态,就是没有任何液体流动;第二种和第三中为液体流动的两种不同状态。三种状态画好并导出到桌面,画好一个就导出一个。分别命名(0、1、2)(3次)

13

步骤二:新建一个变量,命名为“进水”,为无符号16位。

步骤三:在智能对象中-----状态显示------组态对话框(变量为“进水”、有变化时、增加三页(0、1、2)将三个画面状态拖入0、1、2下面,相对应)。

步骤四:在状态显示控件-----几何-----宽度(假设宽度为100)---C动作:

static int a=0;//////或者static unsigned short a=0; //三种画面的第0张画面 if(a>2) 当循环超过第二张画面,强制回到第一张画面。 a=1; 三种画面的第1张画面

SetTagWord(\进水\变量状态转移,将a变化给“进水”C变量转WINCC变量 a++; return 100;

步骤五:触发器为标准周期,250或500MS,保存---运行 (2) 进水阀控制的管道中液体流动

此技巧和(1)的区别主要是增加阀门的控制。即由阀门控制水流的通和断。 对于进水阀门:

步骤一:在元件库中---- plantElemer----valves(阀门)。(注意导入和导出) 步骤二:新建一个变量,命名为“进水阀”,为二进制变量。 新建一个变量,命名为“进水”,为无符号16位。

步骤三:阀门------属性-----背景颜色-----动态对话框(事件名称为变量和触发器的调整为有变化时、表达式为“进水阀”、选择布尔型变量(真----1-----绿、假-----0-----红))。 步骤四:阀门-----属性-----事件中-----鼠标左键-----C动作: BOOL a;

a=GetTagBit(“进水阀”); if(a==1)

SetTagBit(“进水阀”,0); else

SetTagBit(“进水阀”,1); 对于进水状态显示控件:

在状态显示控件-----几何-----宽度(假设宽度为100)---C动作:

static int a=0;//////或者static unsigned short a=0;/////////a表示水量

BOOL b;

14

b=GetTagBit(“进水阀”);

if(b==0)//////////////////如果没有按键按下,无液体流动。 {

SetTagWord(\进水\return 100; }

if(a>2)//////////////////////// 如果有按键按下,有液体流动。 a=1;

SetTagWord(\进水\ a++; return 100;

触发器为标准周期,250或500MS,保存---运行

(3) 进水阀和出水阀共同控制的管道中液体流动以及液位的状态显示 进水阀控制如上(2) 对于出水阀门:

步骤一:在元件库中---- plantElemer----valves(阀门)。(注意导入和导出) 步骤二:新建一个变量,命名为“出水阀”,为二进制变量。 新建一个变量,命名为“出水”,为无符号16位。

步骤三:阀门------属性-----背景颜色-----动态对话框(事件名称为变量和触发器的调整为有变化时、表达式为“出水阀”、选择布尔型变量(真----1-----绿、假-----0-----红))。 步骤四:阀门-----属性-----事件中-----鼠标左键-----C动作: BOOL a;

a=GetTagBit(“出水阀”); if(a==1)

SetTagBit(“出水阀”,0); else

SetTagBit(“出水阀”,1); 对于出水状态显示控件:

在状态显示控件-----几何-----宽度(假设宽度为100)---C动作:

static int a=0;//////或者static unsigned short a=0;

15

BOOL b;

b=GetTagBit(“出水阀”); if(b==0) {

SetTagWord(\出水\return 100; }

if(a>2) a=1;

SetTagWord(\出水\ a++; return 100;

触发器为标准周期,250或500MS,保存---运行

对于液位的设定:

步骤一:在标准对象中-----矩形(或者其它)进行属性调整(大小、颜色和管道液体同色)。 步骤二:新建一个变量,命名为“液位”,为无符号16位。上限100,下限0,起始值0。 步骤三:矩形------属性------填充(动态填充改为“是”、填充量改为0其后面的灯泡标志-----直接连接变量“液位”(有变化时))。

步骤四:矩形----属性-----几何-----宽度(假设为100)-----C动作如下: static int a=0;//////或者static unsigned short a=0;

BOOL b; BOOL c;

a= GetTagWord(“液位”); b=GetTagBit(“进水阀”); c=GetTagBit(“出水阀”); if(b==1) a++; if(c==1) a--;

SetTagWord(\液位\

16

return 100;

步骤五:触发器为250MS。(标准周期) (4) 增加设定值的控制

本技巧是对(3)中液位部分的调整。增加设定值。使水位恒定在设定值所定在的位置。 对于液位的调整:

步骤一:新建变量,命名“设定值”,无符号16位。连接输入输出域输入设定值(变量为设定值、类型为输入、有变化时)。

步骤二:程序修改------矩形----属性-----几何-----宽度(假设为100)-----C动作如下: static unsigned short a;

static unsigned short d; BOOL b; BOOL c;

a= GetTagWord(“液位”); d= GetTagWord(“设定值”); b=GetTagBit(“进水阀”); c=GetTagBit(“出水阀”); if(a>d) {

SetTagBit(\出水阀\a--; } if(a

SetTagBit(\进水阀\a++; } if(a==d) {

SetTagBit(\进水阀\SetTagBit(\出水阀\

17

}

SetTagWord(\液位\return 100;

步骤三:触发器为250MS。(标准周期) (5) 增加急停方式的控制(了解) 步骤一:新建变量“急停”,二进制变量。

按钮------事件-------鼠标-------C动作(按下,两个地方同时停下)

14. 操作控制权限(保护权限)

15. 字符串的应用

18

16. 日期与时间的设置--------正确的提取日期和时间

方法1:利用控件显示(直接显示) ,如图所示;

方法2:利用程序显示

步骤一:提取系统日期和时间;

变量管理-----添加新的驱动连接,如下图所示;

19

建立日期和时间变量,命名“date 和time”,date(在“选择”中格式为日期、

8位字符集、MM-DD-YYYY), time(在“选择”中格式为时间、8位字符集、HH-MM-SS),如下图所示:

分别建立对应的输入/输出域(在“组态对话框”中:对应变量、有变化时,

输出)如下图所示。注意:输入/输出域属性调整(输出格式:字符串)

步骤二:建立内部变量,命名“shijian”,建立相应的输入/输出域(在“组态对话框”中:

对应变量(shijian)、有变化时,输出)如下图所示。注意:输入/输出域属性调整(输出格式:字符串)

步骤三:将日期和时间相连;

20

步骤:全局脚本-----C-Editor----项目函数------新建-----在特定的形式中输入要编的程序,如下所示:

#pragma option(mbcs)

void New_Function()\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\此为函数名字(可以自己起名) {

输入要编写的程序 }

最后的程序如下: #pragma option(mbcs) void New_Function() {

char a[20],b[20]; char*p;

char aa[10],bb[10],cc[10]; int i;

int val1,val2,val3; int val4,val5,val6; int val7,val8,val9; long sum1,sum2,temp;

p=GetTagChar(\strcpy(a,p); for(i=0;i<2;i++) {

aa[i]= a[i]; bb[i]= a[i+3]; cc [i]= a[i+6]; }

aa[2]='\\0';

26

bb[2]='\\0'; cc [2]='\\0'; val1=atoi(aa); val2=atoi(bb); val3=atoi(cc);

p=GetTagChar(\strcpy(a,p); for(i=0;i<2;i++) {

aa[i]= a[i]; bb[i]= a[i+3]; cc [i]= a[i+6]; }

aa[2]='\\0'; bb[2]='\\0'; cc [2]='\\0'; val4=atoi(aa); val5=atoi(bb); val6=atoi(cc);

sum1=val1*3600+val2*60+val3; sum2=val4*3600+val5*60+val6; temp=sum2-sum1; temp=abs(temp);

val7=temp/3600; val8=(temp600)/60; val9=temp`;

27

b[0]=val7/10+48; b[1]=val7+48; b[2]=':'; b[3]=val8/10+48; b[4]=val8+48; b[5]=':'; b[6]=val9/10+48; b[7]=val9+48; b[8]='\\0';

SetTagChar(\}

加密:菜单栏中----编辑----信息----(创建者:冯晨曦;口令:123456),以后每次输入都得登录正确的口令才可以登录;

加密后,在C动作中只显示函数名,不显示函数内容;

15.关于文件的操作(对WINCC的扩展)

(1)文件指针格式 *txt

*dat(打不开,存放登录过的密码) (2)文件操作 ①打开文件 ②操作文件(复杂) ③关闭文件

(3)打开文件(首先定义文件指针)

FILE*fp;

fp=fopen(“C:\\\\Test.txt”, “r”);

28

打开文件方式:r-----表示只读:如文件不存在或者路径错误,返回NULL(空指针) w----表示写入:如文件不存在或者路径错误,则新建用于清空某个文

件。

a------表示写:为追加,写时不会删除原有文件。以r 、a使用最多 。 (4)关闭文件

Fclose(fp);\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\f表示file ,中文为“文件”; (5)操作文件

①写数据fputs(字符,文件指针);字符为常量或者数组 举例:fputs(china,fp); char a[20]; strcpy(a[20], fp);

②读数据fgets(,数组名,n,文件指针); 作用是从文件中读取n-1个字符放入数组中;

16.项目-----班级数据录入

借助本项目巩固文件操作技巧,本项目就是对一个班级信息的记录(姓名、班级、学号)。 步骤一:新建三个内部变量:分别命名为“name”、“class”、“number”,并建立相应的输入输出域,注意:输入/输出域属性调整(输出格式:字符串),如下图所示:

步骤二:新建两个按钮,分别命名为“写入一次信息”、“写入信息”。 任务一:在按钮“写入一次信息”中---属性----事件----鼠标左键----C动作: FILE*fp;

fp=fopen(\

29

fputs(\冯晨曦\

fputs(\自动化\fputs(\fputs(\fclose(fp);

任务二:在按钮“写入信息”中---属性----事件----鼠标左键----C动作:

FILE*fp;、、、、、、、、、、、、、、、、、、、、、、、、、文件指针 char a[20]; char b[20]; char c[20]; char*p;、、、、、、、、、、、、、、、、、、、、、、、、、、字符指针 //int i;

p=GetTagChar(\strcpy(a,p);

p=GetTagChar(\strcpy(b,p);

p=GetTagChar(\strcpy(c,p);

目的:将三个变量一一对应,使各列对齐; 对齐方法1:

if(strlen(a)==4)、、、、、、、、、、、等于4,说明有4个字符,即两个字(两个字的姓名) strcat(a,\ \if(strlen(a)==6) 、、、、、、、、、、、等于6,说明有6个字符,即三个字(三个字的姓名) strcat(a,\ \对齐方法2:

//for(i=strlen(a);i<8;i++) //strcat(a,\目的:输出数据

fp=fopen(\、、、、、、、、、、、、、、打开文件 fputs(a,fp);、、、、、、、、、、、、、、、、、、、、、、、、、、、写入数据a fputs(b,fp); 、、、、、、、、、、、、、、、、、、、、、、、、、、、写入数据a fputs(c,fp); 、、、、、、、、、、、、、、、、、、、、、、、、、、、写入数据a fputs(\、、、、、、、、、、、、、、、、、、、、、、、、回车换行 fclose(fp);、、、、、、、、、、、、、、、、、、、、、、、、、、、、关闭文件

特别注意:为了免除干扰,防止重复输入相同数据-------方法:加入延时函数 步骤:

#pragma option(mbcs) void delay(WORD a) {

#pragma code(\

30

VOID WINAPI Sleep(WORD dwMilliSeconds); #pragma code() Sleep(a); }

任务二:在按钮“写入信息”中---属性----事件----鼠标左键----C动作:

FILE*fp;、、、、、、、、、、、、、、、、、、、、、、、、、文件指针 char a[20]; char b[20]; char c[20]; char*p;、、、、、、、、、、、、、、、、、、、、、、、、、、字符指针 //int i;

p=GetTagChar(\strcpy(a,p);

p=GetTagChar(\strcpy(b,p);

p=GetTagChar(\strcpy(c,p);

目的:将三个变量一一对应,使各列对齐; 对齐方法1: if(strlen(a)==4)、、、、、、、、、、、等于4,说明有4个字符,即两个字(两个字的姓名) strcat(a,\ \if(strlen(a)==6) 、、、、、、、、、、、等于6,说明有6个字符,即三个字(三个字的姓名) strcat(a,\ \对齐方法2:

//for(i=strlen(a);i<8;i++) //strcat(a,\

目的:输出数据

fp=fopen(\、、、、、、、、、、、、、、打开文件 delay(2000);、、、、、、、、、、、、、、、、、、、、、、、、、、延时2秒 fputs(a,fp);、、、、、、、、、、、、、、、、、、、、、、、、、、、写入数据a fputs(b,fp); 、、、、、、、、、、、、、、、、、、、、、、、、、、、写入数据a fputs(c,fp); 、、、、、、、、、、、、、、、、、、、、、、、、、、、写入数据a fputs(\、、、、、、、、、、、、、、、、、、、、、、、、回车换行 fclose(fp);、、、、、、、、、、、、、、、、、、、、、、、、、、、、关闭文件

31

17.项目----------------对文件的综合处理(未完)

本项目是对文件处理的综合运用,是对组态系统人员登录的统计和记录。总体布局如下图所示;

项目步骤如下:

步骤一:完成下图图形的构建和脚本程序的编写,方法如上;

32

(1) 新建三个内部变量,分别命名“name”“class”“number”,分

别连接相应的输入输出域(组态对话框:该变量、有变化时、类型为I/O域)。注意:输入/输出域属性调整(输出格式:字符串)。

(2) 在名字为“写入文件”的按钮中---属性---事件----C动作: FILE*fp;

char a[20];

char b[20]; char c[20]; char*p; int i;

p=GetTagChar(\strcpy(a,p);

p=GetTagChar(\strcpy(b,p);

p=GetTagChar(\strcpy(c,p);

//if(strlen(a)==4)、、、、、、、、、、、、、、、、、、、、、蓝色和红色部分功能一致,选用一个即可 //strcat(a,\ \//if(strlen(a)==6) //strcat(a,\ \//if(strlen(a)==8) //strcpy(a);

for(i=strlen(a);i<8;i++);、、、、、、、、、、、、、、、蓝色和红色部分功能一致,选用一个即可 strcat(a,\

fp=fopen(\fputs(a,fp); fputs(b,fp);

33

fputs(c,fp); fputs(\fclose(fp);

步骤二:完成下图图形的构建和属性的调整;

(1) 智能对象-----控件(选择ListView control 6.0 sp6)----拉

大控件----双击(显示属性)-----在General(常规)中修改View(选择3-lvwreport)(报表输出);------在Colum Header(列标题)----

(点击insert Colum(增加一列)index为列号(text:

姓名;Width(列宽):80;)-----二次点击insert Colum(增加一列)index为列号(text:班级;Width(列宽):80;)----三次点击insert Colum(增加一列)index为列号(text:学号;Width(列宽):80;);

)------点击应用-----点击确定。

(2) 选中属性---控制属性----GridLines----改“是”为“否”。 步骤三:完成下图图形的构建和脚本程序的编写;

34

(1) 新建4个按钮和1个输入输出域,注意:输入/输出域属性调

整(输出格式:字符串)。如上图所示;

新建内部变量:命名“search”,文本8位字符集;

(2) 在按钮名为“显示数据”中----属性----事件----鼠标左键----C 动作:

#define GetObject GetObject

__object*pdl=NULL;、、、、、、、、、、、、、指向当前运行系统(NULL为空值、初始化) __object*pic=NULL;、、、、、、、、、、、、、指向当前系统激活画面 __object*obj=NULL;、、、、、、、、、、、、、指向画面中的某个对象 __object*item=NULL;、、、、、、、、、、、、对象中对行的操作 int i; char aa[10]; char a[20],b[20],c[20]; FILE*fp;

fp=fopen(\

if(fp==NULL)、、、、、、、、如果打不开,指向下面判断路径是否正确 {

HWND hwnd=NULL ;、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、指针 hwnd=FindWindow(NULL,\运行系统 - \、、、、、、、、指针

MessageBox(hwnd,\文件打开出错\警告\、、、系统函数

35

弹出对话框(可能是XP系统中的。WIN7不弹出) return ;、、、、、、、、、、、、、、、、、、、、、返回空指针 }

打开文件:

pdl=__object_create(\、、、、、指向当前运行系统中的激活画面 pic=pdl->GetPicture(\obj=pic->GetObject(\控件1\

//d=GetTagChar(\ //////////

//strcpy(dd,d); /////////// obj->ListItems->Clear();、、、、、调用函数为对象清零 obj->view=3;、、、、、、、、、、、、、、对控件1操作所有的行 rewind(fp);、、、、、、、、、、、、、、、、对文件操作,光标定位函数

for(i=1; feof(fp)==0;)、、、、、蓝色部分为文件尾判断函数(0:光标不到尾;1光标到尾) 、、、、、、、、、、、、、、、、、、、、、、只要光标不到尾,此段程序始终循环 {

fgets(a,9,fp);、、、、、、、、读取8个字符放入a中 a[9]='\\0';、、、、、、、、、、、结束符

if(feof(fp)!=0)、、、、、、、如果不等于0,说明光标到尾,执行跳出 break;

fgets(b,11,fp);、、、、、、、读取10个字符放入b中 fgets(c,11,fp); 、、、、、、、读取10个字符放入c中 b[11]='\\0';、、、、、、、、、、、结束符 c[11]='\\0';、、、、、、、、、、、结束符

fgets(aa,3,fp);、、、、、、、、读取3个字符放入aa中,\\r\\n回车换行是两个字符;目

的是跳过第一行,去读第二行

item=obj->ListItems->Add();、、、、、、、、、、、、、、、、、

obj->ListItems->Item(i)->Text=a;、、、、、、、、、、、、、将a写入控件第一行第一列 obj->ListItems->Item(i)->ListSubItems->Add(1,\、、、、增加一列写b

36

obj->ListItems->Item(i)->ListSubItems->Add(2,\、、、、增加一列写c i++;、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、进入下一行,光标定位到第二行 }

fclose(fp);、、、、、、、、、、、、、、、、、、、、关闭文件

__object_delete(item);、、、最后四行为销毁指针,否则占用内存,从里往外销毁; __object_delete(obj); __object_delete(pic); __object_delete(pdl);

(3) 在按钮名为“搜索”中----属性----事件----鼠标左键----C 动作:

#define GetObject GetObject __object *pdl=NULL; __object *pic=NULL; __object *obj=NULL; __object *item=NULL; int i; char *d; char aa[10];

char a[20],b[20],c[20],dd[20],ee[20]; FILE *fp;

fp=fopen(\if(fp==NULL) {

HWND hwnd=NULL;

hwnd=FindWindow(NULL,\运行系统 - \

MessageBox(hwnd,\文件打开出错\警告\ return;

37

}

pdl=__object_create(\pic=pdl->GetPicture(\obj=pic->GetObject(\控件1\搜索功能

//////////////////////////////////////////////////////// d=GetTagChar(\、、、、、、、、、、、、读取 strcpy(dd,d);

////////////////////////////////////////////////////////// 同上,选其1

//d=GetTagChar(\//strcpy(dd,d);

////////////////////////////////////////////////////////// obj->ListItems->Clear(); obj->view=3; rewind(fp);

for(i=1; feof(fp)==0;) {

fgets(a,9,fp); a[9]='\\0'; if(feof(fp)!=0) break; 搜索功能

////////////////////////////////////////////////////// strcpy(ee,a);

ee[strlen(dd)]='\\0'; 、、、、、、、、、、、、、把数组ee字符的内容限制限制与输入内容一样 if( strcmp(ee,dd)!=0)、、、、长度相同,信息不同,长度相同才能比较大小(冯与冯晨曦) {

fseek(fp,23L,1);、、、、、、、、、、、、、、、当光标定位到下一行 continue;、、、、、、、、、、、、、、、、、、、、、、跳出当前循环进入下一次

38

////////////////////////////////////////////////////////////// }

fgets(b,11,fp); fgets(c,11,fp); b[11]='\\0'; c[11]='\\0'; fgets(aa,3,fp);

item=obj->ListItems->Add(); obj->ListItems->Item(i)->Text=a;

obj->ListItems->Item(i)->listSubItems->Add(1,\obj->ListItems->Item(i)->listSubItems->Add(2,\i++; } fclose(fp);

__object_delete(item); __object_delete(obj); __object_delete(pic); __object_delete(pdl);

步骤四:完成下图图形的构建和脚本程序的编写;

(1) 新建三个内部变量:分别命名“姓名”“班级”“学号”;分别

39

连接相应的输入输出域;

(2) 在控件属性----事件----对象事件----Dblclick----C动作:(就是双

击控件中的信息内容,所点击的内容就会出现在相应的输入输出域中)。 #define GetObject GetObject

__object *pdl=NULL; __object *pic=NULL; __object *obj=NULL; int i;

char a[20],b[20],c[20];

pdl=__object_create(\pic=pdl->GetPicture(\obj=pic->GetObject(\控件1\i=obj->SelectedItem->Index;

strcpy(a,obj->ListItems->Item(i)->Text);

strcpy(b,obj->ListItems->Item(i)->ListSubItems(1)); strcpy(c,obj->ListItems->Item(i)->ListSubItems(2));

SetTagChar(\姓名\SetTagChar(\班级\SetTagChar(\学号\

__object_delete(obj); __object_delete(pic); __object_delete(pdl); 40

17. 项目----------------完成用户登录信息记录(练习) 18.

41

本文来源:https://www.bwwdw.com/article/fikt.html

Top