设计一个简单的文本编辑器,用C语言实现

设计一个简单的文本编辑器,用C语言实现,第1张

#include <conioh>

#include <singh>

#include "keyscodeh"

#include "menuh"

suct line{

int charnum;

char base;

};

typedef suct line SequListElemType;

#include "sequlisth"

#define MAXLINES 1000

int key;

int cureditline=0;

int curscrtopline=0;

int cureditcol=0;

int funckey;

int editwinx=2;

int editwiny=3;

int editwinlines=20;

int mainover=0;

FILE curfile;

char filename[255]="testtxt";

SequList Document;

char ascii(int k);

prinoc(int startfileline,int startscrline);

readdoc(FILE fp);

editline(int curline,int maxcolnum)

{

char s[2000];

setscrcolor(BLUE,YELLOW);

scpy(s,Document->elem[curline]base);

getsing(editwinx,editwiny curline-curscrtopline,s,maxcolnum);

free(Document->elem[curline]base);

Document->elem[curline]base=(char )malloc(slen(s) 1);

scpy(Document->elem[curline]base,s);

}

prinoc(int startfileline,int startscrline)

{

int i;

int j;

cursor_hide();

i=startscrline;

j=startfileline;

setscrcolor(BLUE,YELLOW);

gotoxy(editwinx,editwiny startscrline);

while(i<=editwinlines && i<Document->length)

{

clearscrline(editwinx,editwiny i,78);

putsxy(editwinx,editwiny i ,Document->elem[j -1]base);

}

while(i<=editwinlines)

clearscrline(editwinx,editwiny i ,78);

cursor_show();

}

getline(FILE fp,char l)

{

int i=0;

while(!feof(fp))

if((l[i ]=fgetc(fp))=='\n')

break;

l[i-1]='\0';

}

closedoc(FILE fp)

{

int i;

fclose(fp);

for(i=0;i<Document->length;i )

free(Document->elem[i]base);

SequListDesoy(Document);

}

readdoc(FILE fp)

{

char newline;

char s[20000];

int linenum=0;

suct line curline;

if(!fp) return;

while(!feof(fp))

{

getline(fp,s);

linenum ;

newline=(char )malloc(slen(s) 1);

scpy(newline,s);

curlinebase=newline;

curlinecharnum=slen(newline);

SequListInsert(Document,linenum,curline);

}

}

char ascii(int k)

{

char c;

c=(k<<8)>>8;

if(c>=32&&c<127)

return c;

else

return 0;

}

insertchar(char s,char c,int pos)

{

int i;

for(i=slen(s) 1;i>pos;i--)

s[i]=s[i-1];

s[i]=c;

}

deletechar(char s,int pos)

{

int i;

int j;

j=slen(s);

for(i=pos;i<=j;i )

s[i]=s[i 1];

}

clearscrline(int x,int y,int num)

{

int i;

for(i=0;i<num;i )

putcxy(x i,y,'');

}

getsindiag(int x,int y,int w,char title,char s)

{

char buf[2000];

gettext(x,y,x w 2,y 2,buf);

setscrcolor(LIGHTGRAY,BLACK);

box(x,y,w 2,3);

putsxy(x 3,y,title);

getsing(x 1,y 1,s,w);

puttext(x,y,x w 2,y 2,buf);

}

insertnewline(int linenum)

{

suct line l;

lbase=(char )malloc(80);

lcharnum=0;

lbase[0]='\0';

SequListInsert(Document,linenum,l);

}

deleteline(int linenum)

{

SequListDelete(Document,linenum);

}

getsing(int x,int y,char s,int num)

{

int k;

int n;

char c;

int curpos=0;

int thisover=0;

cursor_show();

/ putsxy(x,y,s); /

gotoxy(x,y);

while(!thisover)

{

if(k=bioskey(1))

{ switch(k){

case KEYEsc:

case KEYReturn:

case KEYUp:

case KEYDown:

case KEYAlt_x:

case KEYCl_y:

return;

break;

default:

bioskey(0);

}

}

else

continue;

switch(k){

case KEYHome:

curpos=0;

gotoxy(x curpos,y);

break;

case KEYEnd:

curpos=slen(s);

gotoxy(x curpos,y);

break;

case KEYReturn:

thisover=1;

break;

case KEYLeft:

if(curpos) curpos--;

gotoxy(x curpos,y);

break;

case KEYRight:

if(curpos<num) curpos ;

gotoxy(x curpos,y);

break;

case KEYDelete:

if(curpos<slen(s))

{

deletechar(s,curpos);

cursor_hide();

clearscrline(x,y,num);

putsxy(x,y,s);

gotoxy(x curpos,y);

cursor_show();

}

break;

case KEYBackspace:

if(curpos)

{

deletechar(s,curpos-1);

curpos--;

cursor_hide();

clearscrline(x,y,num);

putsxy(x,y,s);

gotoxy(x curpos,y);

cursor_show();

}

break;

case KEYEsc:

return;

default:

c=ascii(k);

if (c&&slen(s)<num)

{

insertchar(s,c,curpos);

cursor_hide();

clearscrline(x,y,num);

curpos ;

putsxy(x,y,s);

gotoxy(x curp os,y);

cursor_show();

}

break;

}

}

}

dofunc(int itemno)

{

switch(itemno)

{

case 0:

break;

case 1: /Open file/

getsindiag(3,4,50,"Open file Name",filename);

if(curfile=fopen(filename,"r "))

{

readdoc(curfile);

prinoc(1,0);

}

break;

case 3:

mainover=1;

break;

case 21:

showmessagew();

default:

break;

}

}

main()

{ int i;

char c;

char mainmenuitem[10]={"File","Edit ","Help"};

char submenu1[10]={"New","Open","Save","Exit to system"};

char submenu2[10]={"Copy","Cut","Paste "};

char submenu3[20]={"HelpContent","About"};

initmenu(MAINMENU_V,3,&mainmenu,mainmenuitem);

initmenu(SUBMENU_H,4,&submenu[0],submenu1);

initmenu(SUBMENU_H,3,&submenu[1],submenu2);

initmenu(SUBMENU_H,2,&submenu[2],submenu3);

for(i=0;i<3;i )

addsubmenu(&mainmenu,i,&submenu[i]);

definemenupos(3,1,&mainmenu);

cursor_hide();

showmenu(&mainmenu);

showmainw(1,2,80,23);

showmessagew();

SequListInit(&Document,MAXLINES);

insertnewline(1);

setscrcolor(BLUE,YELLOW);

while(!mainover)

{

if(key=bioskey(1))

{if(!ascii(key))

bioskey(0);

}

else

continue;

switch(key){

case KEYBackspace:

case KEYDelete:

case KEYHome:

case KEYEnd:

case KEYReturn:

if(cureditline-curscrtopline<editwinlines)

cureditline ;

else

{

curscrtopline ;

prinoc(curscrtopline 1,editwiny);

}

insertnewline(cureditline 1);

prinoc(curscrtopline 1,0);

gotoxy(editwinx,editwiny cureditline);

editline(cureditline,78);

break;

case KEYUp:

if (cureditline>0)

{

cureditline--;

gotoxy(editwinx,editwiny cureditline);

editline(cureditline,78);

}

break;

case KEYDown:

if (cureditline<Document->length-1)

{

cureditline ;

gotoxy(editwinx,editwiny cureditline);

editline(cureditline,78);

}

break;

case KEYCl_y:

deleteline(cureditline 1);

if(Document->length==0)

insertnewline(cureditline 1);

if(cureditline>=Document->length)

insertnewline(cureditline 1);

prinoc(cureditline 1,cureditline-curscrtopline);

gotoxy(editwinx,editwiny cureditline);

editline(cureditline,78);

break;

case KEYLeft:

case KEYRight:

break;

case KEYCl_s:

break;

case ESC:

cursor_hide();

dofunc(getmenuitem());

break;

case KEYAlt_x:

mainover=1;

break;

default:

gotoxy(editwinx,editwiny cureditline-curscrtopline);

editline(cureditline,78);

break;

}

}

closedoc(curfile);

setscrcolor(BLACK,WHITE);

clrscr();

cursor_show();

}

你写的是C语言,文件保存格式应该是c,你提交的编译器的保存格式也是c

而你使用了cpp导致错误,有两处错误

#include<stdioh>

#include<stringh>

#include<malloch>

#define maxw 100

#define max(x,y) (x)>(y)(x):(y)

#define min(x,y) (x)<(y)(x):(y)

typedef struct win

{

int x1,y1,x2,y2;

int name;

struct win up;//

struct win down;//这两句必须加上struct

}win;

win stack[maxw];

win tail,head,cur;

long count;

void creatWin(int name,int x1,int y1,int x2,int y2)

{

char flag=name;

stack[name]=(win)malloc(sizeof(win));

(stack[name])name=name;

(stack[name])x1=min(x1,x2);

(stack[name])y1=min(y1,y2);

(stack[name])x2=max(x2,x1);

(stack[name])y2=max(y2,y1);

(cur)up=stack[name];

(stack[name])down=cur;

(stack[name])up=head;

(head)down=stack[name];

cur=stack[name];

}

void t(int name)

{

char flag=name;

win pre,next;

pre=(stack[name])down;

next=(stack[name])up;

(pre)up=next;

(next)down=pre;

(cur)up=stack[name];

(stack[name])down=cur;

(stack[name])up=head;

(head)down=stack[name];

cur=stack[name];

}

void b(int name)

{

char flag=name;

win pre,next;

pre=(stack[name])down;

next=(stack[name])up;

(pre)up=next;

(next)down=pre;

((tail)up)down=stack[name];

(stack[name])down=tail;

(stack[name])up=(tail)up;

(tail)up=stack[name];

}

void d(int name)

{

char flag=name;

win pre,next;

pre=(stack[name])down;

next=(stack[name])up;

(pre)up=next;

(next)down=pre;

free(stack[name]);

stack[name]=NULL;

}

void leafing(wincur,int x1,int y1,int x2,int y2)

{

int cx1,cy1,cx2,cy2;

if(cur==head)

{ count+=(x2-x1)(y2-y1);return;}

cx1=(cur)x1;cy1=(cur)y1;

cx2=(cur)x2;cy2=(cur)y2;

if(x1>=cx2||x2<=cx1||y1>=cy2||y2<=cy1)

leafing((cur)up,x1,y1,x2,y2);

else

{

if(x1<cx1)leafing((cur)up,x1,y1,cx1,y2);

if(x2>cx2)leafing((cur)up,cx2,y1,x2,y2);

if(y1<cy1)leafing((cur)up,x1,y1,x2,cy1);

if(y2>cy2)leafing((cur)up,x1,cy2,x2,y2);

}

}

void s(int name)

{

char flag=name;

long area;

count=0;

leafing((stack[name])up,(stack[name])x1,(stack[name])y1,(stack[name])x2,(stack[name])y2);

area=((stack[name])x2-(stack[name])x1)((stack[name])y2-(stack[name])y1);

printf("%3lf\n",((double)count/(double)area)100);

}

int main()

{

int tx1,ty1,tx2,ty2;//

char tname;//

char buff[maxw];//声明变量一定要在函数开头

freopen("windowin","r",stdin);

freopen("windowout","w",stdout);

tail=(win)malloc(sizeof(win));

head=(win)malloc(sizeof(win));

memset(buff,0,sizeof(buff));

memset(tail,0,sizeof(win));

memset(head,0,sizeof(win));

(head)down=tail;

(tail)up=head;

cur=tail;

while(scanf("%s",buff)!=EOF)

{

switch(buff[0])

{

case 'w':{

sscanf(buff,"%c(%c,%d,%d,%d,%d)",&tname,&tx1,&ty1,&tx2,&ty2);

creatWin((int)tname,tx1,ty1,tx2,ty2);break;

}

case 't':t((int)buff[2]);break;

case 'b':b((int)buff[2]);break;

case 'd':d((int)buff[2]);break;

case 's':s((int)buff[2]);break;

}

}

return 0;

}

电流不平衡。

电机电缆中不能有功率补偿或浪涌吸收器。 可能电机电缆损坏接地。另外故障后面的数字是故障的逆变器模块号。 不过有的时候报故障的逆变模块反倒可能是好的,坏的那个不报,这是因为报故障的通常是电流走高的那个,而走高的不一定是坏的。直流母线到逆变模块的螺丝没拧紧也会造成电流不平衡。也可能是模块内电流互感器连接或本身有问题。

你可以在1603中输入2303,打开100组到202组的参数,然后在10201中设为off,最后把14508设为4(总电流的13%,默认是3,也就是总电流的8%,总电流是指1902的值),来提高接地等级,可能会减少此故障发生的机会。 输出电缆有差异也会引起电流不平衡,多个逆变模块并联时,最好在模块输出侧通过输出公用铜排将同相的电缆连接起来,再连到电机上,可避免因电缆差异引起的模块之间电流不平衡的问题。

使用DSU供电时,除硬件电路板CMIB-11C损坏可能导致Current Unbalance(2330)外,电压检测板BAMU-01C的接线错误也会引起此故障的产生。相序应严格按照U—V—W到 X22—X23—X24 的顺序接入。否则进线处的三相电流会出现不平衡的现象引起DSU 模块触发Current Unbalance(2330)故障跳闸。

直流铜排搭接的紧固螺丝松动或是IGBT的性能不稳定等。

检查模块内外的铜排是否拧紧。

大陆世纪电子有限公司(www10kvcc)-高压变频器专业服务商,高压变频器维修、功率模块定制服务、升级改造、备品备件、维保维护服务。

荣信、新风光、国电思维、九洲高压变频器功率单元维修测试仪。

第一章 总 则

一、本规程参照厂家提供的使用说明书、技术资料和图纸,结合我厂设备具体情况进行制定。

二、本规程是进行设备维护、检修的技术性依据,检修人员应严格执行本规程。

第二章 变频装置介绍

一、变频装置特点

(1) 对电源影响小、高功率因数

本变频器(TMdrive-MV)采用多段电平PWM控制,使输出电压波形实现了阶段状的近似正弦波形输出,输出电流波呈正弦波,控制方式为无监测器矢量控制。实现了畸变小的清洁电源,即使不安装谐波滤波器,也能够达到高的谐波限制指标。另外,装置输入侧采用了二极管整流器,实现了电源功率因数95%以上的高功率因数。

(2) 对负载电动机影响小,高功率因数

通过变频器的多重连接及PWM控制,输出电压波形变为正弦波,因此扭矩波动低,不会发生共振浪涌电压,是对负载电动机影响小的高压变频器装置,能够继续使用原有的电动机。另外,为提高转换装置的效率,采用了低频PWM控制,能够进行高效运转。

(3) 高性能和高可靠性

通过采用大容量IGBT,在提高可靠性的同时,降低了开关损失,提高了控制性能。控制电路采用了新开发的电力电子设备控制处理器PP7 ,并且通过采用8层集成电路板,实现了高集成化和高可靠性。

二、变频装置技术性能

(1)变频装置类型为高-高方式

(2)变频装置在6KV电源的瞬间闪变低于额定电压的75%(300ms以内)及工作电源切备用电源时,不会导致变频装置的停机。额定运行工况下,使用变频器后电动机不降容。

(3)变频调速装置具有良好的调节性能,负荷从100%调节到40%的响应时间小于1min,现场可根据需要连续可调。

(4)变频器内的每一套冷却装置拆装方便,满足变频装置的安全可靠地运行。

(5)变频装置设有以下保护:过电压、过电流、欠电压、缺相保护、短路保护、超频保护、失速保护、变频器过载、电机过载保护、半导体器件的过热保护、瞬时停电保护等、严重过流、缺相并能联跳输入侧6KV开关。

(6)变频装置控制系统具有极高的可靠性。控制电源采用双路互投切换后的电源,允许失电时间为300ms。满足一般的控制电源切换时间。变频装置控制系统采用32位数字微处理器控制器,具有就地监控方式和远方监控方式。就地控制窗口、功能设定、参数设定采用字符代码操作界面。

(7)变频装置带故障自诊断功能,能对所发生的故障类型及故障位置提供字符代码指示。

(8)变频器系统在故障后可以采用外部旁路,使系统仍能正常运行。

(9)变频装置内部通讯采用光纤连接,以便提供电气隔离,还可以提高通讯速率和抗干扰能力;变频装置柜内强电信号和弱电信号分开布置,以避免干扰;柜内设有屏蔽端子和接地设施。

(10)当电源电压降低到额定电压的不低于75%时变频器可以继续运行。

(11) 当电源电压降低到额定电压的75%以下时,此时间在不超过03S的情况下,变频器可自动恢复正常运转,满足母线电压瞬间丢失和动态切换的要求。

(12)当电源的瞬停或瞬降(25%以上)超过03S时,变频器临时停止电流输出。电源电压在6秒以内恢复正常时,变频器在电机自由转动的基础上通过转速跟踪自动再加速,不需要人工干预。

(13)电网停电后6秒以内电源未恢复时将被视为电网故障,变频器发出电源故障指令,并连锁断开用户输入侧高压断路器(可以选择不跳闸),电源电压恢复后,变频器必须重新启动。

(14)当母线上最大一台电机启动时,对变频装置无影响。

三、变压器技术性能

(1)进线变压器与变频器配套供货,为原装进口产品。

(2)进线变压器过负载能力:125%-1分钟。

(3)变压器承受短路电流的能力:变压器在各分接头位置时,能承受线端突发短路的动、热稳定而不产生任何损伤、变形及紧固件松动。

(4)变压器本体系统的测量和控制项目。

①变压器通过±2×5%的抽头,可以对电网电压的输入范围进行调整。

②变压器有温度检测传感器,进行温度的检测和监控。

四、技术参数

1、进线变压器技术数据

序号 规范 单位 参数 1 型式,型号

干式,TMdrive-MV-2720/6 2 制造商及产地

东芝-三菱,日本 3 系统最高电压 KV 66 4 额定容量 KVA 2×1360 5 额定电压 V 一次: 6 二次:064 6 额定电流 A 263 7 额定频率 Hz 50 8 相数 相 3 9 接线组别

一次:Y二次:扩展△接、△接、扩展△接 10 付边绕组

二次:18绕组 11 总损耗 KW 46 12 阻抗电压 % 54 13 冷却方式

风冷 14 过载能力

100%-连续,125%-1分钟 15 变压器外形尺寸 mm 2×1545×800×1585 16 变压器重量 Kg 2×3050 17 变压器防护等级

IP20

2、变频装置技术数据

序号 规范 单位 参数 1 型式及型号

Tmdrive-MV-2720/6 2 制造商及产地

东芝-三菱,日本 3 额定输入电压/允许变化范围 KV 6±10% 4 系统输入电压 KV 6 5 变频装置输出电压/变化范围 KV 0-6 6 变频装置输出电流/变化范围 A 266/0-125% 7 逆变侧最高输出电压 KV 6 8 额定容量 KVA 2760 9 额定输入频率/允许变化范围 Hz 50±5% 10 输入侧功率因数

095 11 控制方式

无传感器矢量控制 12 控制电源

三相3800/VAC,7KVA 13 冷却方式

强迫风冷 14 变频器损耗 KW 35 15 系统总损耗 KW 81

五、变频器电路构成

1主电路构成

如图表示TMdrive-MV(6600V输出)电路构成。外部交流电源经过装置内的变压器向输出为单相的单元变频器提供交流电。每相6级串联,通过6套这样的单相变频器转换为电动机所需的三相交流(频率、电压)电力。

2、单元变频器电路构成

如图所示,单元变频器由将交流转换成直流的二极管整流器,以及将直流逆变为交流的IGBT逆变器构成。

第三章 日常维护

一、维护目的

维护、检查是防止装置发生偶发性故障的有效手段。为了有效进行维护、检查,应制作检查检验单,记录并保存装置固有的特性变化和构成部件的稳定性,防止发生故障,以及在发生故障时调查故障原因。维护、检查分为日常检查和定期检查,在装置的安装之初,应缩短检查周期,详细进行检查,防止发生初始故障,运转时间变长后,需要检查部件是否出现特性劣化等。

二、检查、维护作业时的准备步骤

停止装置 → 主电路电源OFF → 控制电源OFF → 确认主电路电源放电 → 验电

三、日常检查

1、检查周期:每月一次。

2、检查项目:

①确认安装环境:确认温度、湿度、有无特殊气体、有无尘埃;

②确认电抗器、变压器、冷却风扇等有无异常声音,有无振动;

③确认有无异味、绝缘物的气味及各电路元件特有的气味;

④确认空气滤清器脏污情况,根据脏污情况减少清洁周期;

对于以上项目,以目测检查为中心实施,有异常时应立即进行维修。

四、定期检查

1、检查周期:按机组小修周期进行。

2、检查的项目如下:

①柜内的清洁;

②空气滤清器的清洁;

③电路部件的变色、变形,漏液(电容器电阻电抗器变压器等)的确认;

④基板(电阻、电容器的变色、变形,基板的变色、变形、脏污、焊接的老化等)的确认和清洁;

⑤配线(有无因发热导致的变色、腐蚀)的确认;

⑥紧固部分(螺栓,螺帽,螺钉类的松动)的确认;

进行本装置的主电路部分的检查时,应在断开(OFF)输入电源后,经过约5分钟以上,在验电后进行。

请注意:装置内部的电容器在将输入电源断开(OFF)后电荷仍会残留一段时间,会有触电的危险。

另外,为防止发生触电事故,在设备运转的状态下请不要打开门。

五、维护重点

1、 主电路部及控制电路部的清洁

维护,检查的第一步就是清洁。清洁(1次/月 ~ 1次/年)应根据设备的状态实施。清洁时,应在切断电源,确认主电路没有电压后,通过吸引或吹扫等将设备内的尘埃取去。注意:如果压缩空气的压力太强,有可能会损坏部件和配线。另外,吹扫无法除去的附着物应用布擦掉。 清洁原则上从上部开始,在下部结束。灰尘,金属的切屑从上面落下,如果从先从下部检查,则无法发现和除去上面的落下物。

2、 柜体,结构用品

(1) 冷却风扇(随时)

确认风量有无异常,风扇的噪声是否増加。特别是拆除后重新安装时,如果忘记拧紧螺栓等,会因为振动使轴承叶片等受到损坏,因此要特别小心。___

(2) 空气滤清器(1次/月~1次/年)

目测检查空气滤清器是否堵塞。在室外轻轻拍打,去掉粉尘,在中性清洗剂的溶液中去掉脏物,水洗后干燥。

(3) 主电路部件,柜内全体(1次/月~1次/年)

检查机壳内有无灰尘堆积,电抗器,导体紧固部分、保险丝、电容器、电阻有无变色、发热、异常声音、异味、损坏。

仔细检查配线、安装零件有无断线、断开的配线、紧固有无松动、是否有损坏的地方。

3、 印刷电路板

由集成电路和电子部件构成的印刷电路板需要加以保护,以免受到尘埃、腐蚀性气体、温度等的影响。因此,应考虑设备的安装环境。另外,定期检查清洁,保持良好的环境对于减少故障也非常重要。

由于部件小,抵御外力的能力差,因此在清洁时,应使用毛刷等擦试。

l使用注意事项

印刷电路板的维护作业,必须在切断所有电源,经过5分钟后再实施。

拆除印刷电路板时,应去掉所有的连接器和电线,拆掉印刷电路板上部的固定螺钉。

此时,应注意不要使印刷电路板和固定螺钉落下。

安装印刷电路板时,应按照拆除时相反的步骤进行。

另外,由于控制电路板带有电容器,因此即使在切断电源的状态,仍有部分部件在工作。保存时应将使铝框向下,小心不要短路。

备用电路板是装在防静电袋中出厂的,保管时应放入袋中。注意防静电袋只有袋的内侧起作用。

六、装置检查维护作业步骤

1、准备步骤:

装置停止

(1)使装置停止,确认电动机完全停止。

(2)按下操作面板的联锁开关,使其点亮(禁止操作)。

切断主电源

(3)使外部主电源(6kV开关)断开。 应进行充分的安全处理,以保证确实断开,并且不会发生误投入。

(4)检查确保控制和变压器面板上的“AC MAIN”灯熄灭。

切断控制电源

(5)使控制电源MCCB("CONTROL")断开。

确定放电

(6)等待5 分钟以上。

(7)开启变压器柜的门锁,打开防盗锁(挂锁)。

(8)移开变压器柜的门的螺栓,打开楔子。

(9)在主电路输入端子验电,保证主电路电压为安全电平。

(10) 移开变频器柜的门的螺栓,打开挂锁和楔子。

(11) 当打开变频单元柜的门时,确认所有单元变频器的LED 关闭 (OFF)。

(12) 检查用于连接控制柜的外部电缆终端没有电压。

检查电压

(13) 检查控制电源输入端,确保控制电源电压在安全水平。

接地

(14) 在主电路输入端使三相输入电源接地。

开始操作

(15) 开始检查和维护。

(16) 在替换单元变频器的情况下,请遵循指导手册“单元变频器更换过程”6F3A4829, 6F3A4830,6F3A4831,6F3A4832,6F3A4833。 根据需要,打开变频单元柜、变压器柜的门进行作业。

2、复原步骤:

拆除接地

(1)将主电路的接地线去掉。

关门

(2)关上门,必须加上防盗锁(挂锁)和门锁。 如果与主电路有关的柜的门打开,则不能运转。

(3)锁紧变压器门和变频器柜的螺栓

(4)锁好变压器和变频器柜的挂锁,接通控制电源(ON)

(5)使控制电源MCCB("CONTROL")接通(ON)。

接通主电源

(6)使外部主电源(6kV)接通(ON )。 外部主电源投入时必须确认控制盘面的指示灯“AC MAIN ” 点亮。 没有点亮时,可能是保险丝或指示灯等断线,请将外部主 电源及控制电源断开,验电后更换部件。

装置的运转准备

(7)进行安全确认,作好运转准备。按下操作面板的联锁开关。 (LED 熄灭,联锁解除。)

七、定期更换部件

为使TMdrive-MV 保持在最佳状态,延长使用寿命,需要定期更换(维修)性能老化的构件。变频器装置使用的部件中,建议定期更换的部件及更换期间如下表所示 :

品名 推荐更换周期 备注

冷却风扇 3年

空气滤清器 6 个月 也可清洁

铝电解电容器 主电路 7年

基板内 7年

控制电源装置 7年

保险丝 主电路 7年

7年

控制电路

基板内 7年 单元变频器驱动基板ARND-8207A外部I/F板ARND-8219A

*基板内的铝电解电容器的更换作业,应委托厂家进行。另外,主控制基板(ARND-3110)没有使用铝电解电容器,因此不需要更换。

第四章 变频器保护功能整定值

序号 保护功能 参数名称 保护整定值 备注 1 控制电源欠压保护 CP_PSF 143(V)

2 一次电流限制 LMT_I1 125%

3 转矩电流限制 LMT_IQ_BAS 125%

4 变频器过电流 CP_OCA 175%

5 超速运行水平 CP_OSP 115%

6 过载运行5分钟 CP_RMS_5 1055%

7 过载运行20分钟 CP_RMS_20 1014%

8 过载报警设定 CP_RMS_A 1006%

9 主电源欠压保护 CP_UVA 75%

10 主电源失败恢复时间 CP_PSFRCV_TIME 6秒

11 控制电源失电再启动恢复时间

2秒

12 变压器过热保护 硬件设定 140℃

13 变频单元过热保护 硬件设定 100℃

14 DC过电压检测水平 CP_OV 140%

15 电机失速检测标准 CP_SP_DIFF 20%

第五章 变频器故障代码及故障原因

故障代码及故障原因 故障代码及故障原因 AC_NL 输出端开路 CPU_M 主CPU故障 AC_P 交流输入断路器开 CURU U相电流故障 ACSW_C 交流接触器合 CURW W相电流故障 ACSW_F 交流接触器故障 DS 门打开 ACSW_T 交流接触器开定时器 DS_T 门开定时器 AIN_FAULT 基准模拟输入信号丢失错误 ENCODER_F 速度编码器未探测到 B_HLTY 制动(系统)正常检测 GIF_CLKDN20 GIF板20MHz时钟停 BLA 变换器交流电路断路器跳闸 GIF_CLKDN7 GIF板7MHz时钟停 BLR 电气危险故障 GR_A 变换器接地探测报警 BLR_CPSF 除了电源之外的电气危险故障 GR_T 变换器接地探测报警定时器 BP_CTT 旁通接触器闭合互锁 IL 外部互锁 BR_F 电磁制动使能电路故障 M_FN 电机冷却风扇停 C_FN 设备通风风扇停 M_FN_T 电机冷却风扇停定时器 C_FN_B 设备通风风扇停止B组 M_OH 电机过热 C_FN_T 设备通风风扇停止定时器 M_OH_A 电机过热报警 C_IL 关闭互锁 MPSF _ MV 主电源故障 CELL_CDMF 单元通信故障 MTMP_S 电机温度探测器故障 CELL_FUSE 单元保险丝烧 NU 未使用 CELL_DC_OV 单元直流过电压 N_IM 感应电机数量错误 CELL_DC_UV 单元直流失电压 OCA 交流过流 CELL_GPSF 单元门极电源故障 OCA_B 组交流过流 CELL_OH 单元过热 OH设 备过热 CHG_START 系统正在改变 OH_ACL 变换器输入ACL过热 CL_T 电流限制定时器 OH_ACL_T 变换器输入ACL过热定时器 CL_TA 电流限制定时器报警 OH_B B组设备过热 CPSF 控制电源故障 OH_TR 输入变压器过热 CPT_FAIL 捕捉失败 OH_TR_A 输入变压器过热报警 CPU_A 从CPU A故障 OL_A 设备过负荷报警 故障代码及故障原因 故障代码及故障原因 OL20 设备过负荷20分钟 SP_SIL 零速度启动互锁 OL5 过负荷5分钟 STALL 低频过载失速检测 OSS 超速 STCMD 驱动信号启动互锁 OSS_FO 输出频率过大 STPRQ 运行中故障(停机请求) P_SW 柜互锁开关启动 SYS_ERR 系统配置错误 PARA_ERR 设置参数检查错误 TL_F1 传输故障1-本地故障 PHASE_ERR 变换器相序错误 TL_F2 传输故障2-初始化和在线故障 PLD_ERR PLD错误 TL_F3 传输故障2-初始化和在线故障 PLL 电源同步PLL(锁相环)错误 TL_F3 传输故障3-中继线故障 PLLPSF 变换器PLL(锁相环)电源错误 TL_F4 传输故障4-驱动到驱动故障 PRE_CTT_F 变换器预充电接触器错误 TLNE_IL 自动调节互锁 QSTOP_FAULT 快速停止故障 UV 电气条件 REV_ROT_F 反转故障 UV_MPSF 电气条件 ROTATE_FAIL 电机旋转故障 UV_READY 外部电气准备好条件 SOFT_STL 过负荷时自动减速 UV_SIL 直流电压跌落启动互锁 SPA1 备用1 UVA 电气准备好条件 SPA1_T:备用1定时器 UVA_EX 外部电气准备好条件 SPA2 备用2 UVA_SIL 交流电压跌落启动互锁 SPA2_T 备用2定时器 UVD 直流电压跌落 SPA3 备用3 UVD_B组直流电压跌落 SPA3_T 备用3定时器 UVS 外部安全开关 SPA4 备用4 Ux_F相单元故障,x 表示单元编号 SPA4_T 备用4定时器 VAC_PH_LOSS 输入电压缺相 SP_ERR 速度检测错误 VINV_PH_LOSS 输出电流缺相 SP_ERR2 速度检测错误2 Vx_F V相单元故障 SP_LOST 速度基准丢失 WxF W相单元故障 SP_LST_A 速度基准丢失报警 XFR_FAIL 传输故障

一动态规划求解0-1背包问题

//

/ 0-1背包问题:

/ 给定n种物品和一个背包

/ 物品i的重量为wi,其价值为vi

/ 背包的容量为c

/ 应如何选择装入背包的物品,使得装入背包中的物品

/ 的总价值最大?

/ 注:在选择装入背包的物品时,对物品i只有两种选择,

/ 即装入或不装入背包。不能将物品i装入多次,也

/ 不能只装入部分的物品i。

/

/ 1 0-1背包问题的形式化描述:

/ 给定c>0, wi>0, vi>0, 0<=i<=n,要求找到一个n元的

/ 0-1向量(x1, x2, , xn), 使得:

/ max sum_{i=1 to n} (vixi),且满足如下约束:

/ (1) sum_{i=1 to n} (wixi) <= c

/ (2) xi∈{0, 1}, 1<=i<=n

/

/ 2 0-1背包问题的求解

/ 0-1背包问题具有最优子结构性质和子问题重叠性质,适于

/ 采用动态规划方法求解

/

/ 21 最优子结构性质

/ 设(y1,y2,,yn)是给定0-1背包问题的一个最优解,则必有

/ 结论,(y2,y3,,yn)是如下子问题的一个最优解:

/ max sum_{i=2 to n} (vixi)

/ (1) sum_{i=2 to n} (wixi) <= c - w1y1

/ (2) xi∈{0, 1}, 2<=i<=n

/ 因为如若不然,则该子问题存在一个最优解(z2,z3,,zn),

/ 而(y2,y3,,yn)不是其最优解。那么有:

/ sum_{i=2 to n} (vizi) > sum_{i=2 to n} (viyi)

/ 且,w1y1 + sum_{i=2 to n} (wizi) <= c

/ 进一步有:

/ v1y1 + sum_{i=2 to n} (vizi) > sum_{i=1 to n} (viyi)

/ w1y1 + sum_{i=2 to n} (wizi) <= c

/ 这说明:(y1,z2,z3,zn)是所给0-1背包问题的更优解,那么

/ 说明(y1,y2,,yn)不是问题的最优解,与前提矛盾,所以最优

/ 子结构性质成立。

/

/ 22 子问题重叠性质

/ 设所给0-1背包问题的子问题 P(i,j)为:

/ max sum_{k=i to n} (vkxk)

/ (1) sum_{k=i to n} (wkxk) <= j

/ (2) xk∈{0, 1}, i<=k<=n

/ 问题P(i,j)是背包容量为j、可选物品为i,i+1,,n时的子问题

/ 设m(i,j)是子问题P(i,j)的最优值,即最大总价值。则根据最优

/ 子结构性质,可以建立m(i,j)的递归式:

/ a 递归初始 m(n,j)

/ //背包容量为j、可选物品只有n,若背包容量j大于物品n的

/ //重量,则直接装入;否则无法装入。

/ m(n,j) = vn, j>=wn

/ m(n,j) = 0, 0<=j<wn

/ b 递归式 m(i,j)

/ //背包容量为j、可选物品为i,i+1,,n

/ //如果背包容量j<wi,则根本装不进物品i,所以有:

/ m(i,j) = m(i+1,j), 0<=j<wi

/ //如果j>=wi,则在不装物品i和装入物品i之间做出选择

/ 不装物品i的最优值:m(i+1,j)

/ 装入物品i的最优值:m(i+1, j-wi) + vi

/ 所以:

/ m(i,j) = max {m(i+1,j), m(i+1, j-wi) + vi}, j>=wi

/

//

#define max(a,b) (((a) > (b)) (a) : (b))

#define min(a,b) (((a) < (b)) (a) : (b))

template <typename Type>

void Knapsack(Type v, int w, int c, int n, Type m)

{

//递归初始条件

int jMax = min(w[n] - 1, c);

for (int j=0; j<=jMax; j++) {

m[n][j] = 0;

}

for (j=w[n]; j<=c; j++) {

m[n][j] = v[n];

}

//i从2到n-1,分别对j>=wi和0<=j<wi即使m(i,j)

for (int i=n-1; i>1; i--) {

jMax = min(w[i] - 1, c);

for (int j=0; j<=jMax; j++) {

m[i][j] = m[i+1][j];

}

for (j=w[i]; j<=c; j++) {

m[i][j] = max(m[i+1][j], m[i+1][j-w[i]]+v[i]);

}

}

m[1][c] = m[2][c];

if (c >= w[1]) {

m[1][c] = max(m[1][c], m[2][c-w[1]]+v[1]);

}

}

template <typename Type>

void TraceBack(Type m, int w, int c, int n, int x)

{

for (int i=1; i<n; i++) {

if(m[i][c] == m[i+1][c]) x[i] = 0;

else {

x[i] = 1;

c -= w[i];

}

}

x[n] = (m[n][c]) 1:0;

}

int main(int argc, char argv[])

{

int n = 5;

int w[6] = {-1, 2, 2, 6, 5, 4};

int v[6] = {-1, 6, 3, 5, 4, 6};

int c = 10;

int ppm = new int[n+1];

for (int i=0; i<n+1; i++) {

ppm[i] = new int[c+1];

}

int x[6];

Knapsack<int>(v, w, c, n, ppm);

TraceBack<int>(ppm, w, c, n, x);

return 0;

}

二贪心算法求解0-1背包问题

1贪心法的基本思路:

——从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。

该算法存在问题:

1)不能保证求得的最后解是最佳的;

2)不能用来求最大或最小解问题;

3)只能求满足某些约束条件的可行解的范围。

实现该算法的过程:

从问题的某一初始解出发;

while 能朝给定总目标前进一步 do

   求出可行解的一个解元素;

由所有解元素组合成问题的一个可行解;

2例题分析

1)[背包问题]有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。

要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

物品 A B C D E F G

重量 35 30 60 50 40 10 25

价值 10 40 30 50 35 40 30

分析:

目标函数: ∑pi最大

约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)

(1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?

(2)每次挑选所占空间最小的物品装入是否能得到最优解?

(3)每次选取单位容量价值最大的物品,成为解本题的策略。

<程序代码:>(环境:c++)

#include<iostreamh>

#define max 100 //最多物品数

void sort (int n,float a[max],float b[max]) //按价值密度排序

{

int j,h,k;

float t1,t2,t3,c[max];

for(k=1;k<=n;k++)

c[k]=a[k]/b[k];

for(h=1;h<n;h++)

for(j=1;j<=n-h;j++)

if(c[j]<c[j+1])

{t1=a[j];a[j]=a[j+1];a[j+1]=t1;

t2=b[j];b[j]=b[j+1];b[j+1]=t2;

t3=c[j];c[j]=c[j+1];c[j+1]=t3;

}

}

void knapsack(int n,float limitw,float v[max],float w[max],int x[max])

{float c1; //c1为背包剩余可装载重量

int i;

sort(n,v,w); //物品按价值密度排序

c1=limitw;

for(i=1;i<=n;i++)

{

if(w[i]>c1)break;

x[i]=1; //x[i]为1时,物品i在解中

c1=c1-w[i];

}

}

void main()

{int n,i,x[max];

float v[max],w[max],totalv=0,totalw=0,limitw;

cout<<"请输入n和limitw:";

cin>>n >>limitw;

for(i=1;i<=n;i++)

x[i]=0; //物品选择情况表初始化为0

cout<<"请依次输入物品的价值:"<<endl;

for(i=1;i<=n;i++)

cin>>v[i];

cout<<endl;

cout<<"请依次输入物品的重量:"<<endl;

for(i=1;i<=n;i++)

cin>>w[i];

cout<<endl;

knapsack (n,limitw,v,w,x);

cout<<"the selection is:";

for(i=1;i<=n;i++)

{

cout<<x[i];

if(x[i]==1)

totalw=totalw+w[i];

}

cout<<endl;

cout<<"背包的总重量为:"<<totalw<<endl; //背包所装载总重量

cout<<"背包的总价值为:"<<totalv<<endl; //背包的总价值

}

三回溯算法求解0-1背包问题

10-l背包问题是子集选取问题。

一般情况下,0-1背包问题是NP难题。0-1背包

问题的解空间可用子集树表示。解0-1背包问题的回溯法与装载问题的回溯法十分类

似。在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入其左子树。当

右子树有可能包含最优解时才进入右子树搜索。否则将右子树剪去。设r是当前剩余

物品价值总和;cp是当前价值;bestp是当前最优价值。当cp+r≤bestp时,可剪去右

子树。计算右子树中解的上界的更好方法是将剩余物品依其单位重量价值排序,然后

依次装入物品,直至装不下时,再装入该物品的一部分而装满背包。由此得到的价值是

右子树中解的上界。

2解决办法思路:

为了便于计算上界,可先将物品依其单位重量价值从大到小排序,此后只要顺序考

察各物品即可。在实现时,由bound计算当前结点处的上界。在搜索解空间树时,只要其左儿子节点是一个可行结点,搜索就进入左子树,在右子树中有可能包含最优解是才进入右子树搜索。否则将右子树剪去。

回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。

2算法框架:

a问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。

b回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。换句话说,这个结点不再是一个活结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。

3运用回溯法解题通常包含以下三个步骤:

a针对所给问题,定义问题的解空间;

b确定易于搜索的解空间结构;

c以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索;

#include<iostream>

using namespace std;

class Knap

{

friend int Knapsack(int p[],int w[],int c,int n );

public:

void print()

{

for(int m=1;m<=n;m++)

{

cout<<bestx[m]<<" ";

}

cout<<endl;

};

private:

int Bound(int i);

void Backtrack(int i);

int c;//背包容量

int n; //物品数

int w;//物品重量数组

int p;//物品价值数组

int cw;//当前重量

int cp;//当前价值

int bestp;//当前最优值

int bestx;//当前最优解

int x;//当前解

};

int Knap::Bound(int i)

{

//计算上界

int cleft=c-cw;//剩余容量

int b=cp;

//以物品单位重量价值递减序装入物品

while(i<=n&&w[i]<=cleft)

{

cleft-=w[i];

b+=p[i];

i++;

}

//装满背包

if(i<=n)

b+=p[i]/w[i]cleft;

return b;

}

void Knap::Backtrack(int i)

{

if(i>n)

{

if(bestp<cp)

{

for(int j=1;j<=n;j++)

bestx[j]=x[j];

bestp=cp;

}

return;

}

if(cw+w[i]<=c) //搜索左子树

{

x[i]=1;

cw+=w[i];

cp+=p[i];

Backtrack(i+1);

cw-=w[i];

cp-=p[i];

}

if(Bound(i+1)>bestp)//搜索右子树

{

x[i]=0;

Backtrack(i+1);

}

}

class Object

{

friend int Knapsack(int p[],int w[],int c,int n);

public:

int operator<=(Object a)const

{

return (d>=ad);

}

private:

int ID;

float d;

};

int Knapsack(int p[],int w[],int c,int n)

{

//为Knap::Backtrack初始化

int W=0;

int P=0;

int i=1;

Object Q=new Object[n];

for(i=1;i<=n;i++)

{

Q[i-1]ID=i;

Q[i-1]d=10p[i]/w[i];

P+=p[i];

W+=w[i];

}

if(W<=c)

return P;//装入所有物品

//依物品单位重量排序

float f;

for( i=0;i<n;i++)

for(int j=i;j<n;j++)

{

if(Q[i]d<Q[j]d)

{

f=Q[i]d;

Q[i]d=Q[j]d;

Q[j]d=f;

}

}

Knap K;

Kp = new int[n+1];

Kw = new int[n+1];

Kx = new int[n+1];

Kbestx = new int[n+1];

Kx[0]=0;

Kbestx[0]=0;

for( i=1;i<=n;i++)

{

Kp[i]=p[Q[i-1]ID];

Kw[i]=w[Q[i-1]ID];

}

Kcp=0;

Kcw=0;

Kc=c;

Kn=n;

Kbestp=0;

//回溯搜索

KBacktrack(1);

Kprint();

delete [] Q;

delete [] Kw;

delete [] Kp;

return Kbestp;

}

void main()

{

int p;

int w;

int c=0;

int n=0;

int i=0;

char k;

cout<<"0-1背包问题——回溯法 "<<endl;

cout<<" by zbqplayer "<<endl;

while(k)

{

cout<<"请输入背包容量(c):"<<endl;

cin>>c;

cout<<"请输入物品的个数(n):"<<endl;

cin>>n;

p=new int[n+1];

w=new int[n+1];

p[0]=0;

w[0]=0;

cout<<"请输入物品的价值(p):"<<endl;

for(i=1;i<=n;i++)

cin>>p[i];

cout<<"请输入物品的重量(w):"<<endl;

for(i=1;i<=n;i++)

cin>>w[i];

cout<<"最优解为(bestx):"<<endl;

cout<<"最优值为(bestp):"<<endl;

cout<<Knapsack(p,w,c,n)<<endl;

cout<<"[s] 重新开始"<<endl;

cout<<"[q] 退出"<<endl;

cin>>k;

}

四分支限界法求解0-1背包问题

1问题描述:已知有N个物品和一个可以容纳M重量的背包,每种物品I的重量为WEIGHT,一个只能全放入或者不放入,求解如何放入物品,可以使背包里的物品的总效益最大。

2设计思想与分析:对物品的选取与否构成一棵解树,左子树表示不装入,右表示装入,通过检索问题的解树得出最优解,并用结点上界杀死不符合要求的结点。

#include <iostreamh>

struct good

{

int weight;

int benefit;

int flag;//是否可以装入标记

};

int number=0;//物品数量

int upbound=0;

int curp=0, curw=0;//当前效益值与重量

int maxweight=0;

good bag=NULL;

void Init_good()

{

bag=new good [number];

for(int i=0; i<number; i++)

{

cout<<"请输入第件"<<i+1<<"物品的重量:";

cin>>bag[i]weight;

cout<<"请输入第件"<<i+1<<"物品的效益:";

cin>>bag[i]benefit;

bag[i]flag=0;//初始标志为不装入背包

cout<<endl;

}

}

int getbound(int num, int bound_u)//返回本结点的c限界和u限界

{

for(int w=curw, p=curp; num<number && (w+bag[num]weight)<=maxweight; num++)

{

w=w+bag[num]weight;

p=w+bag[num]benefit;

}

bound_u=p+bag[num]benefit;

return ( p+bag[num]benefit((maxweight-w)/bag[num]weight) );

}

void LCbag()

{

int bound_u=0, bound_c=0;//当前结点的c限界和u限界

for(int i=0; i<number; i++)//逐层遍历解树决定是否装入各个物品

{

if( ( bound_c=getbound(i+1, &bound_u) )>upbound )//遍历左子树

upbound=bound_u;//更改已有u限界,不更改标志

if( getbound(i, &bound_u)>bound_c )//遍历右子树

//若装入,判断右子树的c限界是否大于左子树根的c限界,是则装入

{

upbound=bound_u;//更改已有u限界

curp=curp+bag[i]benefit;

curw=curw+bag[i]weight;//从已有重量和效益加上新物品

bag[i]flag=1;//标记为装入

}

}

}

void Display()

{

cout<<"可以放入背包的物品的编号为:";

for(int i=0; i<number; i++)

if(bag[i]flag>0)

cout<<i+1<<" ";

cout<<endl;

delete []bag;

}

欢迎分享,转载请注明来源:品搜搜测评网

原文地址:https://pinsoso.cn/meirong/2637812.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-12-18
下一篇2023-12-18

随机推荐

  • 油性皮肤的护肤品,具体具体~~~~

    亲~你的皮肤属于混合的不过有些偏油勒,其实现在这样的皮肤比较多类,洗面奶方面我推荐下婵真银杏的那个,价格在淘宝上是40-50这样,找到好的卖家可以买到正品哦,泡沫很细腻的,而且一点点就可以揉出好多的泡沫,银杏的味道也很舒服啊~~淡淡的,然后

    2024-04-15
    26000
  • 精华露和精华液什么区别

    1、两者的质感与适合的肤质以及功能不同。精华液的主要成分由动物、植物或者矿物质等成分组成。精华露是乳液的一种,如果使用了精华露,就不用再使用别的乳液,精华露不适合冬季使用,精华露适合干性或者中性皮肤。2、精华露和精华液的区别在于它们的质感不

    2024-04-15
    26300
  • 妮维雅美白身体乳怎么样?妮维雅美白身体乳效果

    妮维雅美白身体乳,真的是一款平价大碗的产品,不少妹纸是因为美白的原因购入,但是没有想到居然还很滋润,香味不是很浓郁,反正用起来不怕用量的一款身体乳妮维雅美白身体乳好用吗妮维雅美白身体乳,便宜大碗好用,一百分推荐。轻薄的乳液状,吸收快

    2024-04-15
    11100
  • 7月在某东买的妮维雅男士日期MFG20170329,今天超市买EXP20200511,为啥有区别!

    根据您提供的信息,这两款妮维雅男士产品的生产日期和保质期存在明显的差异。一般来说,产品的生产日期和保质期是反映其质量和安全性的重要指标。下面是一些可能导致这种差异的原因:1 不同批次的产品:妮维雅男士产品可能会在不同的时间批次生产。不同批次

    2024-04-15
    18100
  • 肌底液和精华液的区别 肌底液和精华液哪个重要

    1 肌底液和精华液的区别主要有以下区别:功效不一样肌底液中含有大量的亲水又亲油的成分,能将护肤品中的水分以及油分分解,从而使其更容易被肌肤吸收,其主要的作用就是帮助打开肌肤的胃口,促进

    2024-04-15
    22800
  • 精油批发市场是真精油吗

    是。没有说精油的真伪之说,市场上卖的精油,主要区别的是精油的纯度,目前市场上出售的,要么说是所谓纯高度进口精油,要么说是原装进口,其实很多外国品牌进到中国市场,80%是进了纯精油到国内稀释后贴包装出售。帮你找了厦门做香料的一大堆公司的资料—

    2024-04-15
    8800
  • 全世界最好用的护手霜推荐 平价好用护手霜分享

    平价好用的护手霜在市面上很常见,品牌也是五花八门,相信很多集美都不知道该怎么挑选,作为一名多年的护肤达人,接下来我就分享给大家5款常用实惠好用的护手霜,快快收藏起来吧!凡士林护手霜参考价格:169元50ml凡士林护手霜的主要成分就是凡士林

    2024-04-15
    9800

发表评论

登录后才能评论
保存