Devices & Hardware

CRIMSON 3 REFERENCE MANUAL

Description
ADLD0100 CRIMSON 3 REFERENCE MANUAL REVISION 2.2 Copyright Red Lion Controls Inc. All Rights Reserved Worldwide. The information contained herein is provided in good faith, but is subject to
Published
of 93
0
Published
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Share
Transcript
ADLD0100 CRIMSON 3 REFERENCE MANUAL REVISION 2.2 Copyright Red Lion Controls Inc. All Rights Reserved Worldwide. The information contained herein is provided in good faith, but is subject to change without notice. It is supplied with no warranty whatsoever, and does not represent a commitment on the part of Red Lion Controls. Companies, names and data used as examples herein are fictitious unless otherwise stated. No part of this document may be reproduced or transmitted in any form or by any means, electronic or mechanical, without the express written permission of Red Lion Controls Inc. The Red Lion logo is a registered trademark of Red Lion Controls Inc. Crimson and the Crimson logo are registered trademarks of Red Lion Controls Inc. All other trademarks are acknowledged as the property of their respective owners. Written by Mike Granby and Jesse Benefiel. TABLE OF CONTENTS TABLE OF CONTENTS FUNCTION REFERENCE...1 ABS(VALUE)... 2 ABSR64(RESULT, TAG)... 3 ACOS(VALUE)... 4 ACOSR64(RESULT, TAG)... 5 ADDR64(RESULT, TAG1, TAG2)... 6 ADDU32(TAG1, TAG2)... 7 ALARMACCEPT(ALARM)... 8 ALARMACCEPTALL()... 9 ALARMACCEPTEX(SOURCE, METHOD, CODE)...10 ALARMACCEPTTAG(TAG, INDEX, EVENT)...11 ASIN(VALUE)...12 ASINR64(RESULT, TAG)...13 ASTEXT(N)...14 ASTEXTR64(DATA)...15 ASTEXTR64WITHFORMAT(FORMAT, DATA)...16 ATAN(VALUE)...17 ATAN2(A, B)...18 ATANR64(RESULT, TAG)...19 ATAN2R64(RESULT, A, B)...20 BEEP(FREQ, PERIOD)...21 CANGOTONEXT()...22 CANGOTOPREVIOUS()...23 CLEAREVENTS()...24 CLOSEFILE(FILE)...25 COLBLEND(DATA, MIN, MAX, COL1, COL2)...26 COLFLASH(FREQ, COL1, COL2)...27 COLGETBLUE(COL)...28 COLGETGREEN(COL)...29 COLGETRED(COL)...30 COLGETRGB(R,G,B)...31 COLPICK2(PICK, COL1, COL2)...32 COLPICK4(DATA1, DATA2, COL1, COL2, COL3, COL4)...33 COLSELFLASH(ENABLE, FREQ, COL1, COL2, COL3)...34 COMMITANDRESET()...35 COMPACTFLASHEJECT()...36 COMPACTFLASHSTATUS()...37 COMPU32(TAG1, TAG2)...38 REVISION 2.2 PAGE I TABLE OF CONTENTS CRIMSON 3 REFERENCE MANUAL CONTROLDEVICE(DEVICE, ENABLE) COPY(DEST, SRC, COUNT) COPYFILES(SOURCE, TARGET, FLAGS) COS(THETA) COSR64(RESULT, TAG) CREATEDIRECTORY(NAME) CREATEFILE(NAME) DATATOTEXT(DATA, LIMIT) DATE(Y, M, D) DECR64(RESULT, TAG) DECTOTEXT(DATA, SIGNED, BEFORE, AFTER, LEADING, GROUP) DEG2RAD(THETA) DELETEDIRECTORY(NAME) DELETEFILE(FILE) DEVCTRL(DEVICE, FUNCTION, DATA) DISABLEDEVICE(DEVICE) DISPOFF() DISPON() DIVR64(RESULT, TAG1, TAG2) DIVU32(TAG1, TAG2) DRVCTRL(PORT, FUNCTION, DATA OR VALUE???) EJECTDRIVE(DRIVE) EMPTYWRITEQUEUE (DEV) ENABLEBATTERYCHECK(ENABLE) ENABLEDEVICE(DEVICE) ENDBATCH() ENDMODAL(CODE) ENUMOPTIONCARD(S) EQUALR64(A, B) EXP(VALUE) EXP10(VALUE) EXP10R64(RESULT, TAG) EXPR64(RESULT, TAG) FILESEEK(FILE, POS) FILETELL(FILE) FILL(ELEMENT, DATA, COUNT) FIND(STRING,CHAR,SKIP) FINDFILEFIRST(DIR) FINDFILENEXT() FINDTAGINDEX(LABEL) FLASH(FREQ) PAGE II TABLE OF CONTENTS FORCE(DEST, DATA)...80 FORCECOPY(DEST, SRC, COUNT)...81 FORCESQLSYNC()...82 FORMATCOMPACTFLASH()...83 FORMATDRIVE(DRIVE)...84 FTPGETFILE(SERVER, LOC, REM, DELETE)...85 FTPPUTFILE(SERVER, LOC, REM, DELETE)...86 GETALARMTAG(INDEX)...87 GETAUTOCOPYSTATUSCODE()...88 GETAUTOCOPYSTATUSTEXT()...89 GETBATCH()...90 GETCAMERADATA(PORT, CAMERA, PARAM)...91 GETCURRENTUSERNAME()...92 GETCURRENTUSERREALNAME()...93 GETCURRENTUSERRIGHTS()...94 GETDATE (TIME) AND FAMILY...95 GETDEVICESTATUS(DEVICE)...96 GETDISKFREEBYTES(DRIVE)...97 GETDISKFREEPERCENT(DRIVE)...98 GETDISKSIZEBYTES(DRIVE)...99 GETDRIVESTATUS(DRIVE) GETFILEBYTE(FILE) GETFILEDATA(FILE, DATA, LENGTH) GETFORMATTEDTAG(INDEX) GETINTERFACESTATUS(PORT) GETINTTAG(INDEX) GETLANGUAGE() GETLASTEVENTTEXT(ALL) GETLASTEVENTTIME(ALL) GETLASTEVENTTYPE(ALL) GETLASTSQLSYNCSTATUS() GETLASTSQLSYNCTIME(REQUEST) GETMODELNAME(CODE) GETMONTHDAYS(Y, M) GETNETGATE(PORT) GETNETID(PORT) GETNETIP(PORT) GETNETMASK(PORT) GETNOW() GETNOWDATE() GETNOWTIME() REVISION 2.2 PAGE III TABLE OF CONTENTS CRIMSON 3 REFERENCE MANUAL GETPORTCONFIG(PORT, PARAM) GETREALTAG(INDEX) GETRESTARTCODE(N) GETRESTARTINFO(N) GETRESTARTTEXT(N) GETRESTARTTIME(N) GETSTRINGTAG(INDEX) GETTAGLABEL(INDEX) GETUPDOWNDATA(DATA, LIMIT) GETUPDOWNSTEP(DATA, LIMIT) GETVERSIONINFO(CODE) GETWEBPARAMHEX(PARAM) GETWEBPARAMINT(PARAM) GETWEBPARAMSTRING(PARAM) GOTONEXT() GOTOPAGE(NAME) GOTOPREVIOUS() GREATEREQR64(A, B) GREATERR64(A, B) HASACCESS (RIGHTS) HASALLACCESS(RIGHTS) HIDEALLPOPUPS() HIDEPOPUP() INCR64(RESULT, TAG) INTTOR64(RESULT, N) INTTOTEXT(DATA, RADIX, COUNT) ISBATCHNAMEVALID(NAME) ISBATTERYLOW() ISDEVICEONLINE(DEVICE) ISLOGGINGACTIVE() ISPORTREMOTE(PORT) ISSQLSYNCRUNNING() ISWRITEQUEUEEMPTY(DEV) KILLDIRECTORY(NAME) LEFT(STRING, COUNT) LEN(STRING) LESSEQR64(A, B) LESSR64(A, B) LOADCAMERASETUP(PORT, CAMERA, INDEX, FILE) LOADSECURITYDATABASE(MODE, FILE) LOG(VALUE) PAGE IV TABLE OF CONTENTS LOG10(VALUE) LOG10R64(RESULT, TAG) LOGBATCHCOMMENT(SET, TEXT) LOGBATCHHEADER(SET, TEXT) LOGCOMMENT(LOG, TEXT) LOGHEADER(LOG, TEXT) LOGR64(RESULT, TAG) LOGSAVE() MAKEFLOAT(VALUE) MAKEINT(VALUE) MAX(A, B) MAXR64(RESULT, TAG1, TAG2) MAXU32(TAG1, TAG2) MEAN(ELEMENT, COUNT) MID(STRING, POS, COUNT) MIN(A, B) MINR64(RESULT, TAG1, TAG2) MINU32(TAG1, TAG2) MINUSR64(RESULT, TAG) MODU32(TAG1, TAG2) MOUNTCOMPACTFLASH(ENABLE) MOVEFILES(SOURCE, TARGET, FLAGS) MULDIV(A, B, C) MULR64(RESULT, TAG1, TAG2) MULU32(TAG1, TAG2) MUTESIREN() NETWORKPING(INT IPADDRESS, INT TIMEOUT) NEWBATCH(NAME) NOP() NOTEQUALR64(A, B) OPENFILE(NAME, MODE) PI() PLAYRTTTL(TUNE) POPDEV(ELEMENT, COUNT) PORTCLOSE(PORT) PORTGETCTS(PORT) PORTINPUT(PORT, START, END, TIMEOUT, LENGTH) PORTPRINT(PORT, STRING) PORTREAD(PORT, PERIOD) PORTSENDDATA(PORT, DATA, COUNT ) PORTSETRTS(PORT, STATE) REVISION 2.2 PAGE V TABLE OF CONTENTS CRIMSON 3 REFERENCE MANUAL PORTWRITE(PORT, DATA) POSTKEY(CODE, TRANSITION) POWER(VALUE, POWER) POWR64(RESULT, VALUE, POWER) PRINTSCREENTOFILE(PATH, NAME, RES) PUTFILEBYTE(FILE, DATA) PUTFILEDATA(FILE, DATA, LENGTH) R64TOINT(X) R64TOREAL(X) RAD2DEG(THETA) RANDOM(RANGE) READDATA(DATA, COUNT) READFILE(FILE, CHARS) READFILELINE(FILE) REALTOR64(RESULT, N) RENAMEFILE(HANDLE, NAME) RESOLVEDNS(NAME) RIGHT(STRING, COUNT) RSHU32(TAG1, TAG2) RXCAN(PORT, DATA, ID) RXCANINIT(PORT, ID, DLC) SAVECAMERASETUP(PORT, CAMERA, INDEX, FILE) SAVECONFIGFILE(FILE) SAVESECURITYDATABASE(MODE, FILE) SCALE(DATA, R1, R2, E1, E2) SENDFILE(RCPT, FILE) SENDFILEEX(RCPT, FILE, SUBJECT, FLAG) SENDMAIL(RCPT, SUBJECT, BODY) SET(TAG, VALUE) SETICONLED(ID, FLAG) SETINTTAG(INDEX, VALUE) SETLANGUAGE(CODE) SETNOW(TIME) SETREALTAG(INDEX, VALUE) SETSTRINGTAG(INDEX, DATA) SGN(VALUE) SHOWMENU(NAME) SHOWMODAL(NAME) SHOWNESTED(NAME) SHOWPOPUP(NAME) SIN(THETA) PAGE VI TABLE OF CONTENTS SINR64(RESULT, TAG) SIRENON() SLEEP(PERIOD) SQRT(VALUE) SQRTR64(RESULT, TAG) STDDEV(ELEMENT, COUNT) STOPSYSTEM() STRIP(TEXT, TARGET) SUBR64(RESULT, TAG1, TAG2) SUBU32(TAG1, TAG2) SUM(ELEMENT, COUNT) TAN(THETA) TANR64(RESULT, TAG) TESTACCESS(RIGHTS, PROMPT) TEXTTOADDR(ADDR) TEXTTOFLOAT(STRING) TEXTTOINT(STRING, RADIX) TEXTTOR64(INPUT, OUTPUT) TIME(H, M, S) TXCAN(PORT, DATA, ID) TXCANINIT(PORT, ID, DLC) USECAMERASETUP(PORT, CAMERA, INDEX) USERLOGOFF() USERLOGON() WAITDATA(DATA, COUNT, TIME) WRITEALL() WRITEFILE(FILE, TEXT) WRITEFILELINE(FILE, TEXT) SYSTEM VARIABLE REFERENCE HOW ARE SYSTEM VARIABLES USED ACTIVEALARMS COMMSERROR DISPBRIGHTNESS DISPCONTRAST DISPCOUNT DISPUPDATES ICONBRIGHTNESS ISPRESSED ISSIRENON PI TIMENOW REVISION 2.2 PAGE VII TABLE OF CONTENTS CRIMSON 3 REFERENCE MANUAL TIMEZONE TIMEZONEMINS UNACCEPTEDALARMS UNACCEPTEDANDAUTOALARMS USEDST PAGE VIII CRIMSON 3 REFERENCE MANUAL FUNCTION REFERENCE INTRODUCTION FUNCTION REFERENCE The following pages describe the various standard functions that provided by Crimson. These functions can be invoked within programs, actions or expressions as described in the previous chapters. Functions that are marked as active may not be used in expressions that are not allowed to change values, such as in the controlling expression of a display primitive. Functions that are marked as passive may be used in any context. REVISION 2.2 PAGE 1 ABS(VALUE) CRIMSON 3 REFERENCE MANUAL ABS(VALUE) ARGUMENT TYPE value int / float The value to be processed. Returns the absolute value of the argument. In other words, if value is a positive value, that value will be returned; if value is a negative value, a value of the same magnitude but with the opposite sign will be returned. This function is passive. int or float, depending on the type of the value argument. Error := abs(pv SP) PAGE 2 FUNCTION REFERENCE ABSR64(RESULT, TAG) ABSR64(RESULT, TAG) ARGUMENT TYPE result int The result. tag int The tag for which to compute the absolute value. Calculates the absolute value of tag using 64-bit (double precision) floating point math and stores the result in result. The input operand tag should be obtained from one of the 64-bit conversion functions provided or from a driver that can read double precision values. All arguments to this function must be integer arrays with lengths of 2. An in depth example is provided in the entry for AddR64. This function is active. void AbsR64(result[0], tag[0]) REVISION 2.2 PAGE 3 ACOS(VALUE) CRIMSON 3 REFERENCE MANUAL ACOS(VALUE) ARGUMENT TYPE value float The value to be processed. Returns the angle theta in radians such that cos(theta) is equal to value. This function is passive. float theta := acos(1.0) PAGE 4 FUNCTION REFERENCE ACOSR64(RESULT, TAG) ACOSR64(RESULT, TAG) ARGUMENT TYPE result int The result. tag int The value to be processed. Calculates the arccosine of tag using 64-bit (double precision) floating point math and stores the result in result. The input operand tag should be obtained from one of the 64-bit conversion functions provided or from a driver that can read double precision values. All arguments to this function must be integer arrays with lengths of 2. An in depth example is provided in the entry for AddR64. This function is active. void acosr64(result[0], tag[0]) REVISION 2.2 PAGE 5 ADDR64(RESULT, TAG1, TAG2) CRIMSON 3 REFERENCE MANUAL ADDR64(RESULT, TAG1, TAG2) ARGUMENT TYPE result int The result. tag1 int The first addend tag. tag2 int The second addend tag. Calculates the value of tag1 plus tag2 using 64-bit (double precision) floating point math and stores the result in result. The input operands tag1 and tag2 should be obtained from one of the 64-bit conversion functions provided or from a driver that can read double precision values. The value of result can be used for further 64-bit calculations or formatted for display as a string using the AsTextR64 function. This function is active. void This example shows how to calculate π + 2 using 64-bit math. In this example Operand1, Operand2 and Result are integer array tags, each with an extent of 2. int NumberTwo := 2; cstring PiString := ; IntToR64(Operand1[0], NumberTwo); TextToR64(PiString, Operand2[0]); AddR64(Result[0], Operand1[0], Operand2[0]); cstring PiPlusTwo := AsTextR64(Result[0]); PiPlusTwo now contains , the approximate value of π + 2 represented as a string. PAGE 6 FUNCTION REFERENCE ADDU32(TAG1, TAG2) ADDU32(TAG1, TAG2) ARGUMENT TYPE tag1 int The first addend tag. tag2 int The second addend tag. Returns the value of tag1 plus tag2 in an unsigned context. This function is passive. int Result := AddU32(tag1, tag2) REVISION 2.2 PAGE 7 ALARMACCEPT(ALARM) CRIMSON 3 REFERENCE MANUAL ALARMACCEPT(ALARM) ARGUMENT TYPE alarm int A value encoding the alarm to be accepted. This function is not implemented in the current build. This function is active. This function does not return a value. PAGE 8 FUNCTION REFERENCE ALARMACCEPTALL() ALARMACCEPTALL() ARGUMENT TYPE none Accepts all active alarms. This function is passive. This function does not return a value. AlarmAcceptAll() REVISION 2.2 PAGE 9 ALARMACCEPTEX(SOURCE, METHOD, CODE) CRIMSON 3 REFERENCE MANUAL ALARMACCEPTEX(SOURCE, METHOD, CODE) ARGUMENT TYPE source int The source of the alarm. method int The acceptance method. code int The acceptance code. Accepts an alarm that has been signaled by a rich communications driver that is itself capable of generating alarms and events. This functionality is not used by any drivers that are currently included with Crimson. This function is active. This function does not return a value. PAGE 10 FUNCTION REFERENCE ALARMACCEPTTAG(TAG, INDEX, EVENT) ALARMACCEPTTAG(TAG, INDEX, EVENT) ARGUMENT TYPE tag int The index of the tag for which the alarm is defined. index int The relevant element of an array tag, or zero otherwise. event int Either 1 or 2, depending on the alarm to be accepted. Accepts a alarm generated by a tag. The arguments indicate the tag number and the alarm number, and may optionally indicate an array element. When accepting alarm on tags that are not arrays, set the element number to zero. This function is active. This function does not return a value. AlarmAcceptTag(10, 0, 1) REVISION 2.2 PAGE 11 ASIN(VALUE) CRIMSON 3 REFERENCE MANUAL ASIN(VALUE) ARGUMENT TYPE value float The value to be processed. Returns the angle theta in radians such that sin(theta) is equal to value. This function is passive. float theta := asin(1.0) PAGE 12 FUNCTION REFERENCE ASINR64(RESULT, TAG) ASINR64(RESULT, TAG) ARGUMENT TYPE result int The result. tag int The value to be processed. Calculates the arcsine of tag using 64-bit (double precision) floating point math and stores the result in result. The input operand tag should be obtained from one of the 64-bit conversion functions provided or from a driver that can read double precision values. All arguments to this function must be integer arrays with lengths of 2. An in depth example is provided in the entry for AddR64. This function is active. void asinr64(result[0], tag[0]) REVISION 2.2 PAGE 13 ASTEXT(N) CRIMSON 3 REFERENCE MANUAL ASTEXT(N) ARGUMENT TYPE n int / float The value to be converted to text. Returns the numeric value, formatted as a string. The formatting performed is equivalent to that perform by the General numeric format. Note that numeric tags can be converted to strings by using their AsText property, by referring, for example, to Tag1.AsText. This function is passive. cstring Text = AsText(Tag1 / Tag2) PAGE 14 FUNCTION REFERENCE ASTEXTR64(DATA) ASTEXTR64(DATA) ARGUMENT TYPE data int The 64-bit floating point value to convert. Converts the value stored in data from a 64-bit floating point value into a string that is suitable for display. The tag data must be an integer array with an extent of at least 2. The value of data is typically obtained from one of the 64-bit floating point math functions provided. See the entry for AddR64 for an example of the intended use of this function. This function is passive. cstring Result := AsTextR64(data[0]) REVISION 2.2 PAGE 15 ASTEXTR64WITHFORMAT(FORMAT, DATA) CRIMSON 3 REFERENCE MANUAL ASTEXTR64WITHFORMAT(FORMAT, DATA) ARGUMENT TYPE format cstring A string containing the desired width, precision and flags. data int The 64-bit floating point value to convert. Converts the value stored in data from a 64-bit floating point value into a string that is suitable for display according to the format specified. The format should be encoded as width.precision.flags, where the width defines the maximum number of characters representing the numerical portion of the resulting string and the precision defines the number of numerical characters to the right of the decimal point in the resulting string. Flags available are as follows: 1 = show leading 0 s; 2 = hide trailing 0 s. The tag data must be an integer array with an extent of at least 2. The value of data is typically obtained from one of the 64- bit floating point math functions provided. See the entry for AddR64 for an example of the intended use of this function. This function is passive. cstring Result := AsTextR64WithFormat( , data[0]) PAGE 16 FUNCTION REFERENCE ATAN(VALUE) ATAN(VALUE) ARGUMENT TYPE value float The value to be processed. Returns the angle theta in radians such that tan(theta) is equal to value. This function is passive. float theta := atan(1.0) REVISION 2.2 PAGE 17 ATAN2(A, B) CRIMSON 3 REFERENCE MANUAL ATAN2(A, B) ARGUMENT TYPE a float The value of the side that is opposite the angle theta. b float The value of the side that is adjacent to the angle theta This function is equivalent to atan(a/b), except that it also considers the sign of a and b, and thereby ensures that the return value is in the appropriate quadrant. It is also capable of handling a zero value for b, thereby avoiding the infinity that would result if the singleargument form of tan were used instead. This function is passive. float theta := atan2(1,1) PAGE 18 FUNCTION REFERENCE ATANR64(RESULT, TAG) ATANR64(RESULT, TAG) ARGUMENT TYPE result int The result. tag int The value to be processed. Calculates the arctangent of tag using 64-bit (double precision) floating point math and stores the result in result. The input operand tag should be obtained from one of the 64-bit conversion functions provided or from a driver that can read double precision values. All arguments to this function must be integer arrays with lengths of 2. An in depth example is provided in the entry for AddR64. This function is active. void atanr64(result[0], tag[0]) REVISION 2.2 PAGE 19 ATAN2R64(RESULT, A, B) CRIMSON 3 REFERENCE MANUAL ATAN2R64(RESULT, A, B) ARGUMENT TYPE result int The result. a int The value of the side that is opposite the angle theta. b int The value of the side that is adjacent to the angle theta. The equivalent of atan(a/b) using 64-bit (double precision) floating point math and stores the result in result. This function considers the sign of a and b to calculate the value for the appropriate quadrant. It is the double precision equivalent of the atan2 function. The input operands a and b should be obtained from one of the 64-bit conversion functions provided or from a driver that can read double precision values. All arguments to this function must be integer arrays with lengths of 2. An in depth example is provided in the entry for AddR64. This function is active. void Atan2R64(result[0], a[0], b[0]) PAGE 20 FUNCTION REFERENCE BEEP(FREQ, PERIOD) BEEP(FREQ, PERIOD) ARGUMENT TYPE freq int The required frequency in semitones. period int The required period in milliseconds. Sounds the terminal s beeper for the indicated period at the indicated pitch. Passing a value of zero for period will turn off the beeper. Beep requests are not queued, so calling the function will immediately override any previous calls. For those of you with a musical bent, the freq argument is calibrated in semitones. On a more serious note, the Beep function can be a useful debugging aid, as it provides an asynchronous method of signaling the handling of an event, or the execution of a program step. This function is active. This function does not return a value. Beep(60, 100) REVISION 2.2 PAGE 21 CANGOTONEXT() CRIMSON 3 REFERENCE MANUAL CANGOTONEXT() ARGUMENT TYPE none Returns a true or false value indicating whether a call to GotoNext() will produce a page change. A value of false indicates that no further pages exist in the page history buffer. This function is passive. int PAGE 22 FUNCTION REFERENCE CANGOTOPREVIOUS() CANGOTOPREVIOUS() ARGUMENT TYPE none Returns a true or false value indicating whether a call to GotoPrevious() will produce a page change. A value of false indicates that no further pages exist in the page history buffer. This function is passive. int REVISION 2.2 PAGE 23 CLEAREVENTS() CRIMSON 3 REFERENCE MANUAL CLEAREVENTS() ARGUMENT TYPE none Clears the list of events displayed in the event log. This function is active. This function does not return a value. ClearEvents() PAGE 24 FUNCTION REFERENCE CLOSEFILE(FILE) CLOSEFILE(FILE) ARGUMENT TYPE file int The file handle as returned by OpenFile. Closes a file previously opened in a call to FileOpen(). This function is active. This function does not return a value. CloseFile(hFile) REVISION 2.2 PAGE 25 COLBLEND(DATA, MIN, MAX, COL1, COL2) CRIMSON 3 REFERENCE MANUAL COLBLEND(
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks
SAVE OUR EARTH

We need your sign to support Project to invent "SMART AND CONTROLLABLE REFLECTIVE BALLOONS" to cover the Sun and Save Our Earth.

More details...

Sign Now!

We are very appreciated for your Prompt Action!

x