GE Fanuc Automation

Computer Numerical Control Products

Series 30i-Model A Series 300i-Model A Series 300is-Model A

C Language Executor

Operator’s Manual

GFZ-63944EN-3/01 January 2004 GFL-001 Warnings, Cautions, and Notes as Used in this Publication

Warning

Warning notices are used in this publication to emphasize that hazardous voltages, currents, temperatures, or other conditions that could cause personal injury exist in this equipment or may be associated with its use. In situations where inattention could cause either personal injury or damage to equipment, a Warning notice is used.

Caution

Caution notices are used where equipment might be damaged if care is not taken.

Note Notes merely call attention to information that is especially significant to understanding and operating the equipment.

This document is based on information available at the time of its publication. While efforts have been made to be accurate, the information contained herein does not purport to cover all details or variations in hardware or software, nor to provide for every possible contingency in connection with installation, operation, or maintenance. Features may be described herein which are not present in all hardware and software systems. GE Fanuc Automation assumes no obligation of notice to holders of this document with respect to changes subsequently made.

GE Fanuc Automation makes no representation or warranty, expressed, implied, or statutory with respect to, and assumes no responsibility for the accuracy, completeness, sufficiency, or usefulness of the information contained herein. No warranties of merchantability or fitness for purpose shall apply.

©Copyright 2004 GE Fanuc Automation North America, Inc. All Rights Reserved. Introduction

This is a description of Executor function specification for following FANUC CNC.

Applied CNC ------MODEL Abbreviated name ------FANUC Series 30i-MODEL A 30i-A or Series 30i

Notes - It is necessary knowledge of C language programming to develop application program on C Executor. If you don't have experience of C programming, you must study C programming with ordinary C programming reference books.

* Microsoft, MS, Windows, NT, and the Windows logo are either trademarks or registered trademarks of Microsoft Corporation. Diab SDS , alone and in combination with D-CC are trademarks of Diab SDS,INC. * Additionally, the described company name and the product name are the registered trademark of each company or trademarks.

B-63944EN-3/01 TABLE OF CONTENTS

TABLE OF CONTENTS

I. SPECIFICATION 1. Overview ...... 3 1.1 Feature ...... 4 2. System components...... 6 2.1 C Executor ...... 6 2.2 C library...... 7 2.3 Application program...... 8 2.4 The hardwares of CNC which are used in C Executor...... 11 3. Application program development environment...... 14 3.1 Composition of development system ...... 14 3.2 Development procedure...... 16 4. C language library function list ...... 18 4.1 ANSI C standard library ...... 18 4.2 MS-C extended C standard library...... 21 4.3 Graphic library...... 22 4.4 CNC/PMC window library...... 24 4.5 Other libraries ...... 26

II. PROGRAMMING 0. INDEX ...... 35 0.1 Required software for application development...... 37 1. List of Functions...... 38 1.1 ANSI C Standard library...... 38 1.3 Graphic library...... 46 1.4 CNC/PMC window library...... 48 1.5 Other libraries ...... 51 2. How to make application program ...... 59 2.1 Outline ...... 59 2.2 Special files...... 62 2.3 MAKEFILE ...... 63 2.4 Installing the Diab C/C++ Power-PC compiler ...... 65 2.5 Compatibility related to variables of type 'int' ...... 66

c-1 TABLE OF CONTENTS B-63944EN-3/01

2.6 Using compiler libraries...... 66 2.7 Describing 2-byte characters in source-codes ...... 66 2.8 Remarks ...... 67 3. Function References ...... 68 3.1 ANSI C standard library ...... 70 3.2 MS-C extended C standard library...... 204 3.3 Graphic library...... 207 3.4 CNC/PMC window library...... 301 3.5 MDI operation library...... 482 3.6 CRT operation library...... 507 3.7 File Operation Library ...... 604 3.8 Serial Library...... 612 3.9 Task management library ...... 631 3.10 FCA Library...... 659 3.11 F-ROM Library ...... 692 3.12 Touch-panel Library...... 707 4 Code Tables ...... 713 4.1 Save current environment for non-local jump. ...... 111 4.1.1 Keycode...... 713 4.1.2 Keycode of special keys on MDI panel...... 714 4.1.3 CRT display control characters ...... 715 4.1.4 Display control escape sequences ...... 715 4.2 Displayable characters...... 719 4.2.1 Single byte characters...... 719 4.2.2 2-byte characters...... 720 4.2.3 Display code for single byte characters...... 723 4.2.4 Kanji character code...... 726 5 Other References...... 727 5.1 Multitasking...... 727 5.1.1 Task classes ...... 727 5.1.2 Difference of each task class ...... 728 5.1.3 Task switching...... 728 5.1.4 Data access between tasks ...... 729 5.1.5 Task Management...... 730 5.2 File system...... 731 5.3 Power-on procedure ...... 734

c-2 B-63944EN-3/01 TABLE OF CONTENTS

5.3.1 Key operation at power on ...... 734 5.4 Parameter setting on CNC...... 735 5.5 Dat2mem utility manual ...... 738 5.6 Conforming O8-digits program number ...... 744 5.7 Window task ...... 745 5.7.1 Overview...... 745 5.7.2 Window task's execution ...... 745 5.7.3 Usage of the window task...... 746 5.7.4 Available functions for the window task...... 747 5.7.5 How to make application program ...... 748 5.7.6 Notes ...... 748 5.8 Conforming CNC screen display...... 749 5.8.1 Overview...... 749 5.8.2 How do application program run on each equipment...... 750 5.8.3 Restrictions on specification ...... 754 5.8.4 Making application program ...... 755 5.8.5 Function reference...... 757 5.9 High-Level Task...... 760 5.9.1 Overview of High-Level Task ...... 760 5.9.2 Specification...... 760 5.9.3 Task execution rule...... 762 5.9.4 Application programming...... 764 5.9.5 Function reference...... 765 5.10 Programming technique...... 770 5.10.1 Various techniques ...... 770 5.10.2 Applying C Executor to machine ...... 772

c-3

I. SPECIFICATION

1. Overview

FANUC Series 30i C Executor enables to add the Machine Tool Builder's original screen into FANUC Series 30i and to customize screen displaying and operation interface of CNC software. It is possible to replace arbitrary screens of CNC with user application's screen. The user application program about screen displaying and operation interface is developed using general C language just like ordinary PC's application program developing. The executable file which is developed by the Machine Tool Builder is built in CNC unit. The user program which is compiled on PC is stored in flash ROM of CNC unit, and it is read into CNC's memory by CNC's start-up procedure, then, executed on C Executor.

Application program is Application program stored in CNC software and the user application is developed on PC. flash ROM. program is executed simultaneously. +------+ +------+ | +------+ | | | | | | | | Series 30i | | | PC | | | | | +------+ | |------| +------+ +------+ | User | C library | CNC | +------+ | Memory | | Application | | Soft | | == == | -> | Card | -> |------| +------+ +------+ +------+ | | +------+ | +------+ oooooo | Machine Tool Builder's | o |.... | oooooo | original screen is | o |...... | oooooo | displayed | |...... | oooooo | | |------| oooooo | | +------+ | | o o o o o | +------+ (LCD/MDI unit) 1.1 Feature

(1) Low-cost customization

No addtional hardware is required to use C Executor and application program on FANUC Series 30i. (*) The user application program can be built in your Series 30i as it is.

(*) It may be necessary to increase flash ROM or DRAM capacity.

(2) Application program development on PC

You can develop application program on generic PC (Personal Computer). Designing, editing, compiling, linking and also some debugging works are executed on PC.

(3) High level compatibility with C application on PC Function libraries of C language which are provided by C Executor has compatibitily with ANSI and MS-C. Therefore, ordinary application programs on PC can be translated to CNC's as long as they don't depend on specific hardware.

(4) Combination of CNC software and application program The application program which is developed by the Machine Tool Builder is executed as a task in CNC softwares. Some arbitrary screens of existing CNC screens can be replaced with user screens which are displayed by the user application program. Application program can read or write various CNC data via libaries which are provided by C Executor. Therefore, the user app- lication program works as a part of CNC software. Additionally, it is possible not only to replace existing CNC screens, but also to add new user's screens.

(5) Graphic display and communication (*) Graphic display function, which has 640x480 resolution and 256color/pixel, is used in application program. This graphic screen is imposed on character screen. For graphic display, MS-C compatible graphic functions, such as line, rectangle and arc drawing, painting, etc., are provided. Communication with personal computer, etc. is available using reader/puncher interface (RS-232C) on CNC unit. Communication driver is built in the C library, there- fore, communication is processed by just calling communication functions. The user application program can read from or write to FANUC FLOPPY CASSETTE ADAPTER and FANUC HANDY FILE connected to CNC unit.

(*) "READER/PUNCHER INTERFACE CONTROL" option is required to use communication function. (6) Using with Macro Executor

C Executor can be used with Macro Executor (Execution Macro and also Conversational Macro) of Series 30i-A. The screen displaying part of macro program which has been developed by the Machine Tool Builder can be replaced with C program, therefore, existing software property does not become useless. (C Executor doesn't have Execution Macro function.)

(7) Easy installation to CNC unit

The user application program which is developed by the Machine Tool Builder is installed to CNC unit using memory card (JEIDA/PCMCIA compatible SRAM card or ATA flash memory card). It is easy to install and update the applicaton program because it isn't need to write EPROM using ROM-writer.

(8) Storing various data in flash ROM

It is available to store various data (message strings to be displayed, individual parameters for each machines and tool information, etc.) made on PC. The user application program can read them arbitrarily.

(9) Supporting touch-panel and input/output via memory card.

C Executor supports hardwares such as touch-panel and input/output via memory card. These I/O devices are good for building better user interface. (*) "TOUCH PANEL" option is required to use touch-panel.

(10) Simultaneous displaying of CNC and user screen using window display The user application program can display user window on the arbitrary screens including the CNC screens using window display function (VGA window). It is possible to display Machine Tool Builder's original message window or the software machine operation panel on the existing CNC screen. 2. System components

The system components that C Executor and the user application program are shown below.

+------+ +----+ +------+ | | | <- | | | User | | | CNC window | -> | | <- | application | | | | *3 | | -> | program | | CNC software |------| | | *1 | | | | | | | +------+ | | C Executor | <- | +------+ | | | -> | C library | | | | *4 | | +------+ +------+ ^ | ^ | *2 | v | v +------+ | FANUC Series 30i Hardware | +------+ *1 library function call by user application *2 output to screen, reading MDI key or touch-panel, etc. *3 reading/writing of CNC information *4 task switching, screen switching, etc.

2.1 C Executor C Executor provides following functions. (1) Loading and starting application program C Executor loads the user application program and C library from flash ROM into DRAM in start-up procedure of CNC unit, and starts executing the user application program.

(2) Switching CNC screen and user screen C Executor watches screen switching by operator's MDI operation. When any user screen is selected, C Executor switches execution to user application. When CNC screen is selected again, C Executor returns execution to CNC soft- ware.

(3) Managing CNC task and user task

C Executor manages the user application's background task in addtion to switching process by screen switching. 2.2 C library

C library provides following functions.

(1) Input/output between peripheral equipments (LCD and MDI key)

C library executes input/output operations, which are called by the user application program, such as character displaying to screen by "printf" function, reading MDI key by "getch" function, graphic displaying by MS-C compatible function and input/output via reader/puncher interface etc.

(2) Input/output CNC information (current position, parameter and tool offset, etc.)

C library provides input/output function of various CNC information using CNC window function, and also PMC information using PMC window.

(3) ANSI and MS-C compatible C language function library

C library provides ANSI compatible C language standard library (there are some exceptions) and MS-C extended C language standard library which doesn't depend on specific hardware and .

(4) MS-DOS compatible file system C library provides MS-DOS compatible file system. The user application program can access SRAM disk (max 63KB(standard)/255KB(optional)) on non- volatile memory (SRAM) or memory card (PC card) via this file system. It is possible to read or write files using functions such as "fopen", "fprintf", "fgets", etc. in application program. 2.3 Application program

(1) Program structure

Application program consists of three independent tasks.

+- USER APPLICATION ------+ | +======+ | | | | | | | (A)MAIN TASK | | | | | | | +======+ | | +- AUXILIARY TASK ------+ | | | +======+ +======+ | | | | | (B)ALARM | | (C)COMMUNI- | | | | | | TASK | | CATION TASK | | | | | +======+ +======+ | | | +------+ | +------+ (A) MAIN TASK Almost all processes, such as screen displaying, key input, read/write CNC information, etc., are executed in this task.

(B) ALARM TASK This task is periodically started usally and watches various conditions. (C) COMMUNICATION TASK This task is usually used for processing of input/output via reader/puncher interface independently of MAIN TASK. ALARM TASK and COMMUNICATION TASK are called AUXILIARY TASK. (Also called BACKGROUND TASK because these tasks are executed in background of MAIN TASK) AUXILIARY TASKS are limited in their function. MAIN TASK ALARM TASK COMMUNICATION TASK ------Standard function x x x Key input x Character display x Graphic display x File I/O x x (*1) x (*1) CNC/PMC window x x (*2) Reader/puncher interface x x (*3) x (*3) Reading F-ROM x x (*3) x (*3) Reading touch-panel x x x ("x" means "available" "BLANK" means "not available") (*1) The same file cannot be accessed by two or more tasks simulta- neously. It is necessary to control exclusively in application program. (*2) Simultaneous access with MAIN TASK causes BUSY ERROR. (*3) It is necessary to control communication port and F-ROM reading exclusively by the application program itself.

Task switching between MAIN TASK and AUXILIARY TASK is done by calling task control library function in application program. Periodically starting of AUXILIARY TASK is also commanded in application program. It is possible to compose application program with only one task. In this case, only MAIN TASK is used.

Additionally, the window task is available in addition to the above tree tasks. The window task runs simultaneously with above tree tasks and is used to display windows on arbitrary screen. The following functions are available in the window task. WINDOW TASK ------Standard function x Key input Character display x (*1) Graphic display x (*1) File I/O CNC/PMC window x (*2) Reader/puncher interface Reading F-ROM Reading touch-panel x ("x" means "available" "BLANK" means "not available") (*1) The target screen to output is not the ordinary screen but VGA window. (*2) It is necessary to contol exclusively with the other tasks.

(2) Executable program model Executable file format is different from EXE-format of MS-DOS. Also exe- cution environment is not compatible with MS-DOS. However, the same function as MS-DOS PC's can be used in application program as long as they are not depend on specific hardware. (3) Example of application program

For example, the program which consists of only Main task has following structures.

++------++ || main function || ++------+------++ | +------+------+ | Initialization | +------+------+ | +------+------+ | Setting of user | | screens | +------+------+ | +------+------+ | Setting of softkeys | | by which user | | screens are selected| +------+------+ | Repetition |<------+ +------+------+ | | Get current screen | | | index | | +------+------+ | | | +------+------+ | | Branch to each | | | screen's procedure | | +------+------+ | | | +------+------+------+--... | | | | | +------+------+ +------+------+ +---+---+ | | Read CNC information| | Read numeric value | |.... | | | and display them on | | from MDI key and | | | | | screen | | update data | | | | +------+------+ +------+------+ +---+---+ | | | | | +------+------+------+--... | | | +------+ 2.4 The hardwares of CNC which are used in C Executor

ITEM SPECIFICATION REMARKS ======CPU PowerPC compatible processor It is common with CNC software. ------DRAM MAX 1, 2, 3, 4, 5, or 6MB Independent area from CNC software is used. One capacity must be specified optionally.

DRAM FOR USER 384 - 5504KB This is usable capac- APPLICATION ity of above DRAM (*1) size in the user app- lication. Value up to (DRAM capacity - 640KB) is set in parameter. ------SRAM 64/256KB(option)

SRAM DISK MAX 63/255KB(with SRAM 256KB) Sum of SRAM disk and non-volatile variables NON-VOLATILE MAX 63/255KB(with SRAM 256KB) is up to VARIABLES (SRAM capacity - 1KB). ------MEMORY CARD PCMCIA or JEIDA compatible Other cards than SRAM cards 256KB - 2MB specified card aren't ATA Flash memory card supported Supporting MS-DOS format ------F-ROM Available to store arbitrary Data size to store is data variable according to Application program can read F-ROM capacity, etc. stored data (Max: about 6MB) ------MDI KEY ONG keyboard Key arrangement is or QWERTY keyboard custmizable. ------TOUCH-PANEL 640x480 resolution "TOUCH-PANEL" option Reading status and position is required. ------ITEM SPECIFICATION REMARKS ======DISPLAY DEVICE 10.4-inch color LCD (*2) 10.4-inch color LCD with touch-panel (*2) - Alphanumeric character (80x25(*3)) - Kanji character (40x25(*3)) - 16-grayscale, reverse, blink, background color, for each character

------PRINTABLE - Alphanumeric and Kana CHARACTER (ANK character) - FANUC Kanji character (about 2,400 characters of JIS 1ST LEVEL) - Special signs - User definition character (MAX 256 characters (half)) - JIS Kanji character (1st and 2nd level, about 6,800 characters)

COEXISTENCE It is possible to coexist WITH CNC'S with each CNC's screens. SCREEN ------DISPLAY DEVICE - 640x400 x1(page), or It is impossible to (GRAPHIC) 640x480 x1(page) coexist with CNC's - 16 or 256-color for each graphic screen. pixel "GRAPHIC DISPLAY" - imposed output on character option is required. screen for 16-color mode, no imposed output for 256- color mode ------ITEM SPECIFICATION REMARKS ======WINDOW DISPLAY - Max 8 windows on user screen (overlapping only character) - Max 2 windows on arbitrary screen (overlapping both character and graphics) (*4) ------READER/PUNCHER 1 or 2 channels "READER/PUNCHER INTER- INTERFACE FACE CONTROL" option (RS-232C) is required. ------FANUC CASSETTE Available for application "READER/PUNCHER INTER- ADAPTER, FANUC program FACE CONTROL" option HANDY FILE is required.

( "KB" means "kilo bytes" (1024 bytes), "MB" means "mega bytes" (1024 kilo bytes) )

(*1) Usable memory capacity of Macro Executor is ( (custom soft capacity) - (C Executor capacity) ) (*2) These display devices are VGA graphic devices. "16-color", "256-color" and "16-grayscale" mean number of color palettes which can be simultaneously displayed on the screen. The application program can map the arbitrary color from 4096 colors into each color palette. (*3) 30-line in a screen is also available. (*4) This is available on VGA display device. 3. Application program development environment

Application program of C Executor is developed by the Machine Tool Builder.

- General PC(personal computer) is used to develop (edit and compile) appli- cation program. - Only execution of application program is possible on CNC unit. - Debugging of application program is worked on both PC and CNC. Some parts of application program which can work on PC can be debugged on PC as ordi- nary PC's software. Whole program is debugged on CNC.

3.1 Composition of development system

(1) Goods on the market

+------+ | +------+ | .... - Executable for 2000 | | | | or Windows 98 | | PC | | | +------+ | +------+ +------+ +------+ | == == |----| MEMORY CARD | .... - PCMCIA Rel.1.0, +------+ | READER/WRITER | JEIDA V4.0 +------+ compatible +------+ | MEMORY CARD | .... - 1MB or more capacity | (SRAM CARD) | (Required capacity +------+ depends on application program) +------+ |COMMERCIAL| - Microsoft Windows 2000 or Microsoft | SOFTWARE | .... Windows 98 | +------+ | - Text editor(arbitrary) | | | | - Diab C/C++ Power-PC compiler developed by | | | | WindRiver +-+------+-+

(*) You can use not only SRAM card but also ATA flash memory card as the memory card for the development system.

(2) Purchases from FANUC +------+ | FANUC | - ANSI compatible C standard library | library | .... - MS-C compatible library | +------+ | - CNC window | | | | | | | | +-+------+-+ Software of the Machine Tool Builder +------+ | | | | | +------+ | ----+ | | | | | | | | | | +------+ +-+------+-+ | | | | | | +--- ( LINK ) ---> | +------+ | FANUC library | | | | | +------+ | | | | | | | | +-+------+-+ | | | | | +------+ | ----+ | | | | | | | | | | | +-+------+-+ | v +------+ personal computer | | ------| MEMORY CARD | ------FANUC Series 30i-MODEL A +------+ | v +------+ +-- | Application program & library | | +------+ Flash ROM ----+ | C Executor | | +------+ +-- | CNC system software | +------+ +------+ | CNC hardware | +------+ 3.2 Development procedure

The development procedure of software for C Executor is as follows.

+------+ --+ | SPECIFICATION | | | DESIGN | | +------+------+ | | | +------+------+ | | FUNCTION | | | DESIGN | | +------+------+ | | | +------+------+ | | PROGRAMIMIG | | | CODING, | +-- working on PC | EDITING | | +------+------+ | | | +------+------+ | | COMPILING, | | | LINKING | | +------+------+ | | | +------+------+ | --+ | DEBUGGING | | | +------+------+ --+ | | +-- working on CNC +------+------+ | | TESTING | | +------+ ------+

(1) Developing program which works on PC You develop program just like as ordinary PC's program. In this step, some parts of application program which can work on PC are developed. However, only library functions which are provided by C Executor can be used in application program. Some extended functions by compiler maker may not be used on C Executor. Also hardware depending program such as BIOS call is not available on C Executor.

(2) Testing on PC Source level debugging of application program on PC can be done by using compiler for PC. Function mudule level testing can be completed even if there are some difference between PC and C Executor. (3) Completing program for C Executor

After module level testing on PC, you develop entire application with FANUC library. If any error occured in this step, you confirm usage of C language library. You use makefile which is provided from FANUC to compile, link and make memory card file.

(4) Installing to CNC

You write application program to flash ROM on CNC via memory card.

(5) Testing application program on CNC

You test application program on CNC. 4. C language library function list

4.1 ANSI C standard library

The following ANSI C language standard functions are provided.

(1) Diagnostics

assert

(2) Character handling

isalnum islower isxdigit isalpha isprint tolower iscntrl ispunct toupper isdigit isspace isgraph isupper

(3) Non-local jumps setjmp longjmp

(4) Valiable arguments va_start va_arg va_end (5) Input/output

remove sscanf ungetc rename vfprintf fread tmpnam vprintf fwrite fclose vsprintf fgetpos fflush fgetc fseek fopen fgets fsetpos freopen fputc ftell setbuf fputs rewind setvbuf getc clearerr fprintf getchar feof fscanf gets ferror printf putc perror scanf putchar sprintf puts

(6) General utilities

atoi calloc abs atol free div strtol malloc labs strtoul realloc ldiv rand bsearch atof srand qsort strtod

(7) String handling memcpy strcmp strspn memmove strncmp strstr strcpy memchr strtok strncpy strchr memset strcat strcspn strlen strncat strpbrk memcmp strrchr

(8) Date and time clock time gmtime asctime localtime mktime ctime difftime (9) Mathematics

acos fabs pow asin floor sin atan fmod sinh atan2 frexp sqrt ceil ldexp tan cos log tanh cosh log10 exp modf 4.2 MS-C extended C standard library

The following MS-C extended functions are provided.

_chdrive _fstrpbrk kbhit _dos_findfirst _fstrrchr lseek _dos_findnext _fstrrev ltoa _dos_getdiskfree _fstrset memicmp _expand _fstrspn mkdir _fcalloc _fstrstr open _fexpand _fstrtok read _ffree _fstrupr rmdir _fmalloc _getdrive stackavail _fmemchr _lrotl strcmpi _fmemcmp _lrotr stricmp _fmemcpy _msize strlwr _fmemicmp _rotl strnicmp _fmemmove _rotr strnset _fmemset _tolower strrev _fmsize _toupper strset _frealloc alloca strupr _fstrcat cabs swab _fstrchr chdir tell _fstrcmp close toascii _fstrcpy creat ultoa _fstrcspn ecvt write _fstricmp eof _fstrlen fcvt _fstrlwr gcvt _fstrncat getch _fstrncmp getcwd _fstrncpy hypot _fstrnicmp isascii _fstrnset itoa 4.3 Graphic library

(1) MS-C compatible graphic functions

The following MS-C graphic functions are provided. However, some detail specifications of functions may be different between PC and CNC because both hardwares are not compatible completely.

_arc _getvideoconfig _setbkcolor _clearscreen _getviewcoord _setcliprgn _ellipse _getvisualpage _setcolor _floodfill _getwritemode _setfillmask _getactivepage _grstatus _setfont _getarcinfo _imagesize _setgtextvector _getbkcolor _kanjisize _setlinestyle _getcolor _lineto _setpixel _getcurrentposition _moveto _settextposition _getfillmask _outgtext _settextrows _getfontinfo _outmem _settextwindow _getgtextextent _outtext _setvideomode _getgtextvector _pie _setvideomoderows _getimage _polygon _setvieworg _getkanji _putimage _setviewport _getlinestyle _rectangle _setvisualpage _getphyscoord _registerfonts _setwritemode _getpixel _remapallpalette _unregisterfonts _gettextposition _remappalette _wrapon _gettextwindow _setactivepage (2) Original graphic functions

These functions are C Executor original graphic functions.

NAME FUCNTION ------gr_displaychar Draw a standard size character gr_displayfourlarge Draw a quad size character gr_displaysixlarge Draw a hex size character _putpattern Put monochrome image data _getpattern Get monochrome image data gr_dispstr Draw a standard size string gr_disp6str Draw a hex size strings gr_bitblt Copy image data gr_disp4str Draw a quad size string. gr_displaysmlchar Draw a small size character. gr_dispsstr Draw a small size string. gr_displayfchar Draw a FANUC character. gr_dispfstr Draw a FANUC character string. gr_disp9ifchar Draw 9-inch font character. gr_disp9ifstr Draw 9-inch font character string. mmc_line_b Draw a line between specified two points. mmc_polyline Draw a polyline. mmc_circle_b Draw a circle. mmc_ellipse_b Draw an ellipse. mmc_pie_b Draw a pie figure. mmc_arc_b Draw an arc. mmc_gettext Get character in the specified area. mmc_puttext Put character data on memory to text screen. mmc_textsize Get required byte size for getting character. 4.4 CNC/PMC window library

The following functions which are used to input/output data between CNC /PMC are provided.

(1) CNC window

NAME FUCNTION ------cnc_sysinfo Read CNC system information cnc_dwnstart Start output of NC program to be registered cnc_download Output NC program to be registered cnc_dwnend Stop output NC program to be registered cnc_vrfstart Start output NC program to be compared cnc_verify Output NC program to be compared cnc_vrfend Stop output NC program to be compared cnc_dncstart Start output NC program to be executed cnc_dnc Output NC program to be executed cnc_dncend Stop output NC program to be executed cnc_upstart Start input NC program cnc_upload Input NC program cnc_upend Stop input NC program cnc_search Search specified program cnc_delall Delete all program cnc_delete Delete specified program cnc_rdprogdir Read program directory cnc_rdproginfo Read program information cnc_rdprgnum Read program number in executing cnc_rdseqnum Read sequence number in executing cnc_actf Read actual feed rate of controlled axes cnc_acts Read actual spindle speed cnc_absolute Read absolute position cnc_machine Read machine position cnc_relative Read relative position cnc_distance Read distance to go cnc_skip Read skipped position cnc_srvdelay Read servo delay amount cnc_accdecdly Read acceleration/deceleration delay amount cnc_rddynamic Read dynamic data cnc_statinfo Read CNC status information cnc_alarm Read alarm status cnc_rdalminfo Read alarm information cnc_rdtofs Read tool offset amount cnc_wrtofs Write tool offset amount cnc_rdtofsr Read tool offset amount (range specified) cnc_wrtofsr Write tool offset amount (range specified) cnc_rdzofs Read work zero offset cnc_wrzofs Write work zero offset cnc_rdzofsr Read work zero offset (range specified) cnc_wrzofsr Write work zero offset (range specified) NAME FUNCTION ------cnc_rdparam Read parameter cnc_wrparam Write parameter cnc_rdparar Read parameters (range specified) cnc_wrparas Write parameters (multiple output) cnc_rdset Read setting parameter cnc_wrset Write setting parameter cnc_rdsetr Read setting parameters (range specified) cnc_wrsets Write setting parameters (multiple output) cnc_rdpitchr Read pitch error compensation data (range specified) cnc_wrpitchr Write pitch error compensation data (range specified) cnc_rdmacro Read custom macro variable cnc_wrmacro Write cumtom macro variable cnc_rdmacror Read custom macro variables (range specified) cnc_wrmacror Write custom macro variables (range specified) cnc_rdpmacro Read P-code macro variable cnc_wrpmacro Write P-code macro variable cnc_rdpmacror Read P-code macro variables (range specified) cnc_wrpmacror Write P-code macro variables (range specified) cnc_modal Read modal data cnc_diagnoss Read diagnostics data cnc_diagnosr Read diagnostics data (range specified) cnc_adcnv Read A/D conversion data cnc_rdopmsg Read operator's message cnc_setpath Set path index (multi-path system) cnc_getpath Get path idnex (multi-path system) cnc_settimer Set calendar timer of CNC cnc_rdspload Read load information of serial spindle cnc_rdexecprog Read executing program cnc_rdmovrlap Read manual handle override amount

(2) PMC window NAME FUNCTION ------pmc_rdpmcrng Read arbitrary PMC data (range specified) pmc_wrpmcrng Write arbitrary PMC data (range specified) pmc_rdpcmsg Read PMC message 4.5 Other libraries

(1) MDI operation library

These funcitons are used to control key input from CNC's MDI panel.

NAME FUNCTION ------aux_mdi_getmatrix Get MDI key matrix aux_mdi_putmatrix Put MDI key matrix aux_mdi_rstmatrix Reset MDI key matrix aux_mdi_altmatrix Alter MDI key matrix aux_mdi_putc Put one character to key input buffer aux_mdi_write Write block data to key input buffer aux_mdi_control Test or control key input buffer aux_mdi_repeat Set key repeating interval time aux_mdi_getstat Read inputting status of MDI key. aux_mdi_clrbuf Clear input buffer of MDI key.

(2) CRT operation library

These functions are used to control CRT display and multiple window display.

NAME FUNCTION ------crt_getcurscrn Get current screen index crt_setuserscrn Register user screen index crt_isnewscrn Test screen switching status crt_gettype Set CRT information crt_setmode Set CRT screen mode crt_cncscrn Switch to CNC screen crt_fchar Outpout character by FANUC character code crt_setuserskey Customize softkey on CNC screen crt_setswt Set switching method between CNC's screen and user's crt_setscrlarea Set scroll area crt_opengr Open graphic display crt_closegr Close graphic display crt_graphic Enable or disable graphic display crt_readfkey Read the status of function keys crt_2ndcursor Display the secondary cursor crt_settextattr Set attribute of characters on VRAM crt_gettextattr Get attribute of character on VRAM crt_setpalette Set color palette of VGA characters crt_setallpalette Set all color palette of VGA characters NAME FUNCTION ------crt_getcncpalette Get color palette of CNC screen crt_fstr Output character string by FANUC character code. crt_gettextimg Get text data from VRAM. crt_puttextimg Put text data into VRAM. crt_setgraphpage Select graphics page to use. crt_set6chmode Select drawing method of 6x sized character. crt_setgsvmode Select saving method of graphic contents. win_open Open window win_close Close window win_select Select window win_activate Activate window win_move Move window win_size Alter window size win_full Let active window be full screen size win_window Let active window be window size win_info Set window information win_col Set color of window frame and title string win_hide Hide window win_show Show window win_setttl Set window title string win_setfrm Set window frame line character win_getstat Get window display status win_redraw Redraw windows. crt_reguserchar Register user character crt_mapuch Map user character crt_getcgpttn Get CG pattern vwin_open Open VGA window vwin_close Close VGA window vwin_select Select VGA window vwin_show Show VGA window vwin_hide Hide VGA window vwin_info Get VGA window information

(3) File operation library This function is used to maintain file device.

NAME FUNCTION ------aux_file_format Format specified drive aux_file_mount Mount memory card aux_file_unmount Unmount memory card aux_file_memcinfo Get memory card information (4) Serial communication library

These functions are used to communicate with peripherals via reader/ puncher interface(RS-232C).

NAME FUNCTION ------rs_open Initialize communication device rs_close Terminate communication rs_putc Put one character to communication buffer rs_getc Get one character from communication buffer rs_write Write block data to communication buffer rs_read Read block data from communication buffer rs_buffer Test or control communication buffer rs_status Get status of communication line and buffer rs_wait Wait communication event

(5) Task control library These functions are used to control task execution.

NAME FUNCTION ------os_show_tim Read timer os_set_tim Set timer os_sync_tim Wait until specified time os_wait_tim Wait until specified term os_make_flg Make event flag os_delt_flg Delete event flag os_sign_flg Signal event flag os_wait_flg Wait event flag signal os_clar_flg Clear event flag os_puls_flg Signal event flag (pulse type) os_make_sem Make counter-type semaphore os_delt_sem Delete semaphore os_sign_sem Signal semaphore os_wait_sem Wait swmaphore signal os_strt_wtsk Start window task (6) FCA library

These are the functions which communicate with FCA (FANUC CASSETTE ADAPTOR) or FANUC Handy File.

NAME FUNCTION ------fca_setparam Initialize communication line fca_bye Close communication line fca_open Open a binary file on FCA device fca_close Close a binary file fca_read Read binary data from the file fca_write Write binary data to the file fca_fopen Open a text file on FCA device fca_fclose Close a text device fca_getc Read a character from the text file fca_putc Write a character to the text file fca_delete Delete a file on FCA device fca_rename Change name of a file on FCA device fca_readdir Read directory information of FCA device fca_status Read status information of FCA device fca_remains Read free space size of a floppy disk

(7) F-ROM library These are the functions which read C Executor data stored in the flash ROM module. NAME FUNCTION ------aux_from_open Open the specified F-ROM file aux_from_close Close the F-ROM file aux_from_select Select data in the F-ROM file aux_from_moveptr Move read pointer aux_from_read Read data from the F-ROM file aux_from_getdir Read directory information of a F-ROM file aux_from_getinfo Read F-ROM file information aux_from_getc Read a character from the F-ROM file aux_from_gets Read a line from the F-ROM file

(8) Touch-panel library This is the function which reads the status and (X,Y) coordinate of the touch-panel.

NAME FUNCTION ------aux_tpl_read Read the status and (X,Y) coordinate of touch-panel

II. PROGRAMMING

- This manual is intended to explain the C executor for the FANUC Series 30i. - Do not use the manual for any purpose other than creation of applications for the FS30i C executor. - Some descriptions in the manual include JIS ruled lines and half-size katakana characters. If your PC environment cannot display or print these lines or characters correctly, convert them to appropriate character code. - To display or print descriptions in the manual, set the tab step to "8". - Most pages of the manual are in 80-column ( 60-line format. So they can be printed normally on a typical printer. - To display or print descriptions in the manual, use a fixed-pitch font for both half-size (English) and full-size (Japanese) characters.

Microsoft, Windows, Windows NT, MS, and MS-DOS are Microsoft Corporation's trademarks registered in the USA and other countries. * The other corporate names and product names mentioned in the manual are the trademarks or registered trademarks of the respective companies. Description of CNC name, etc. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C Executor works on the following CNC equipments.

FS30i

In this document, the CNC names are described as the following abbreviated names.

Abbreviation CNC ------+------FANUC Series 30i The generic name of all FS30i on which or FS30i C Executor works.

C Executor supports the following display devices.

Device Size, Monochrome/Color ------+------LCD 10.4-inch color, 10.4-inch color(with touch-panel) In this document, the CNC device names may be described as the following abbreviated names.

Abbreviation Device ------+------14-inch CRT The generic name of the display devices which have 10(+2) softkeys and 80-column x 25-line character screen (in standard mode). For more information about display devices, see "3.6 CRT operation library". 0. INDEX ~~~~~~~~

Filename Contents ------+------00index.man 0. INDEX 01soft.man 0.1 Required software for application development

10functn.man 1. List of Functions

20mkapp.man 2. How to make application program

30fref.man 3. Function References 31ansi_c.man 3.1 ANSI C Standard library 32ms_c.man 3.2 MS-C extended C standard library 33graph.man 3.3 Graphic library 34window.man 3.4 CNC/PMC window library 35mdi.man 3.5 MDI operation library 36crt.man 3.6 CRT operation library 37file.man 3.7 File operation library 38serial.man 3.8 Serial library 39task.man 3.9 Task management library 3afca.man 3.10 FCA library 3bfrom.man 3.11 F-ROM library 3ctpl.man 3.12 Touch-panel library

4. Code Tables 41code.man 4.1 Keycode, Screen control code 42char.man 4.2 Displayable characters (42char_j.man including Japanese KANJI characters) 5. Other References 51mtask.man 5.1 Multitasking 52fsys.man 5.2 File system 53pwon.man 5.3 Power-on procedure 54cncprm.man 5.4 Parameter setting on CNC 55d2m.man 5.5 Manual of dat2mem 56o8d.man 5.6 Adaptation for 8-digit program number 57wintsk.man 5.7 Window task 58cncscr.man 5.8 Conforming CNC screen display 59hilev.man 5.9 High-Level Task 5aprotec.man 5.10 Programming technique

cexec01.spc C Executor Specification Update history

2003. 4. 1 1st edition. 0.1 Required software for application development ======

The following softwares are required for development of the C Executor application program. Please purchase each package softwares on the market by yourself.

(1) C Compiler.

Use the WindRiver Diab C/C++ Power-PC compiler. Only the limited compiler versions can be used. Ask FANUC for them.

(2) Linker.

Use the linker attached to the WindRiver Diab C/C++ Power-PC compiler.

(3) OS environment on PC.

The C Executor application is developed on the command prompt environment of Microsoft Windows 2000 or MS-DOS prompt environment of Windows 98.

(4) Other tools. Developing application software additionally requires the following tools. Get their commercial versions or equivalents. nmake.exe : Microsoft-developed make tool, included in the Microsoft Visual C/C++ package. gawk.exe : GNU's awk tool, available from http://source.redhat.com/cygwin. sed.exe : GNU's sed tool, available from http://source.redhat.com/cygwin. 1. List of Functions ======

(abbreviation) CExe : C Executor ANSI : American National Standards Institute MS-C : Microsoft Corp. MS-C Ver 6.0, Ver 7.0 or Ver 8.0 (mark) x : available blank : not available M : available only on Main task MA : available on Main task and Alarm task MAC : available on Main task, Alarm task and Communication task

1.1 ANSI C Standard library

C language standard functions which are prescribed in ANSI.

(1) Diagnostics ( assert.h )

------Name CExe ANSI MS-C ------+----+----+----- assert M x x ------

(2) Character handling ( ctype.h ) ------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- isalnum MAC x x ispunct MAC x x isalpha MAC x x isspace MAC x x iscntrl MAC x x isupper MAC x x isdigit MAC x x isxdigit MAC x x isgraph MAC x x tolower MAC x x islower MAC x x toupper MAC x x isprint MAC x x ------

(3) Localization ( local.h ) ------Name CExe ANSI MS-C ------+----+----+----- localeconv x x setlocale x x ------(4) Mathematics ( math.h )

------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- acos MAC x x frexp MAC x x asin MAC x x ldexp MAC x x atan MAC x x log MAC x x atan2 MAC x x log10 MAC x x cos MAC x x modf MAC x x sin MAC x x pow MAC x x tan MAC x x sqrt MAC x x cosh MAC x x ceil MAC x x sinh MAC x x fabs MAC x x tanh MAC x x floor MAC x x exp MAC x x fmod MAC x x ------

(5) Non-local jumps ( setjmp.h ) ------Name CExe ANSI MS-C ------+----+----+----- setjmp MAC x x longjmp MAC x x ------

(6) Signal handling ( signal.h ) ------Name CExe ANSI MS-C ------+----+----+----- signal x x raise x x ------

(7) Variable arguments ( stdarg.h ) ------Name CExe ANSI MS-C ------+----+----+----- va_start MAC x x va_arg MAC x x va_end MAC x x ------(8) Input/output ( stdio.h )

------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- remove MAC x x fputc MAC x x rename MAC x x fputs MAC x x tmpfile x x getc M x x tmpnam MAC x x getchar M x x fclose MAC x x gets M x x fflush MAC x x putc M x x fopen MAC x x putchar M x x freopen MAC x x puts M x x setbuf MAC x x ungetc MAC x x setvbuf MAC x x fread MAC x x fprintf MAC x x fwrite MAC x x fscanf MAC x x fgetpos MAC x x printf M x x fseek MAC x x scanf M x x fsetpos MAC x x sprintf MAC x x ftell MAC x x sscanf MAC x x rewind MAC x x vfprintf MAC x x clearerr MAC x x vprintf M x x feof MAC x x vsprintf MAC x x ferror MAC x x fgetc MAC x x perror M x x fgets MAC x x ------

(9) General utilities ( stdlib.h ) ------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- atof MAC x x exit x x atoi MAC x x getenv x x atol MAC x x system x x strtod MAC x x bsearch MAC x x strtol MAC x x qsort MAC x x strtoul MAC x x abs MAC x x rand MAC x x div MAC x x srand MAC x x labs MAC x x calloc MAC x x ldiv MAC x x free MAC x x mblen x malloc MAC x x mbtowc x realloc MAC x x wctomb x abort x x mbstowcs x atexit x x wcstombs x ------(10) String handling ( string.h )

------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- memcpy MAC x x memchr MAC x x memmove MAC x x strchr MAC x x strcpy MAC x x strcspn MAC x x strncpy MAC x x strpbrk MAC x x strcat MAC x x strrchr MAC x x strncat MAC x x strspn MAC x x memcmp MAC x x strstr MAC x x strcmp MAC x x strtok MAC x x strcoll x x memset MAC x x strncmp MAC x x strerror x x strxfrm x x strlen MAC x x ------

(11) Date and time ( time.h ) ------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- clock MAC x x ctime MAC x x difftime MAC x x gmtime MAC x x mktime MAC x x localtime MAC x x time MAC x x strftime x x asctime MAC x x ------1.2 MS-C extended C standard library

Compatible functions with extended library of Microsoft C Compiler (MS-C Ver 6.0).

------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- FP_OFF x _fheapset x FP_SEG x _fheapwalk x _atold x _fjstradv x _bcalloc x _fjstrchr x _beginthread x _fjstrcmp x _bexpand x _fjstrcspn x _bfree x _fjstricmp x _bfreeseg x _fjstrlen x _bheapadd x _fjstrlwr x _bheapchk x _fjstrmatch x _bheapmin x _fjstrncat x _bheapseg x _fjstrncmp x _bheapset x _fjstrncpy x _bheapwalk x _fjstrnicmp x _bios_xxxxxxx x _fjstrnset x _bmalloc x _fjstrrchr x _bmsize x _fjstrrev x _brealloc x _fjstrset x _cexit x _fjstrskip x _c_exit x _fjstrspn x _chain_intr x _fjstrstr x _chdrive MAC x _fjstrtok x _clear87 x _fjstrupr x _control87 x _fmalloc MAC x _disable x _fmemccpy x _dos_xxxxxxxx x _fmemchr MAC x _dos_findfirst MAC x _fmemcmp MAC x _dos_findnext MAC x _fmemcpy MAC x _dos_getdiskfree MAC x _fmemicmp MAC x _enable x _fmemmove MAC x _endthread x _fmemset MAC x _exit x _fmsize MAC x _expand MAC x _fmtob x _fbtom x _fnthctype x _fcalloc MAC x _fpreset x _fexpand MAC x _frealloc MAC x _ffree MAC x _freect x _fheapchk x _fsopen x _fheapmin x _fstrcat MAC x ------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- _fstrchr MAC x _nmsize x _fstrcmp MAC x _nrealloc x _fstrcpy MAC x _nstrdup x _fstrcspn MAC x _pclose x _fstrdup x _pipe x _fstricmp MAC x _popen x _fstrlen MAC x _rotl MAC x _fstrlwr MAC x _rotr MAC x _fstrncat MAC x _searchenv x _fstrncmp MAC x _spilitpath x _fstrncpy MAC x _status87 x _fstrnicmp MAC x _strdate x _fstrnset MAC x _strerror x _fstrpbrk MAC x _strtime x _fstrrchr MAC x _strtold x _fstrrev MAC x _tolower MAC x _fstrset MAC x _toupper MAC x _fstrspn MAC x _y0l x _fstrstr MAC x _y1l x _fstrtok MAC x _ynl x _fstrupr MAC x access x _fullpath x acosl x _getdcwd x alloca MAC x _getdrive MAC x asinl x _harderr x atanl x _hardresume x atan2l x _hardretn x bdos x _heapadd x btom MAC x _heapchk x cabs MAC x _heapmin x cabsl x _heapset x ceill x _heapwalk x cgets x _j0l x chdir MAC x _j1l x chkctype MAC x _jnl x chmod x _lrotl MAC x chsize x _lrotr MAC x close MAC x _makepath x coshl x _matherrl x cosl x _memavl x cprintf x _memmax x cputs x _msize MAC x creat MAC x _ncalloc x cscanf x _nexpand x cwait x _nfree x dieeetomsbin x _nheapchk x dmsbintoieee x _nheapmin x dosexterr x _nheapset x dup x _nheapwalk x dup2 x _nmalloc x ecvt MAC x ------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- eof MAC x iskana MAC x execl x iskanji MAC x execle x iskanji2 MAC x execlp x iskmoji MAC x execlpe x iskpun MAC x execv x ispnkana MAC x execve x isprkana MAC x execvp x itoa MAC x execvpe x j0 x expl x j1 x fabsl x jisalpha MAC x fcloseall x jisdigit MAC x fcvt MAC x jishira MAC x fdopen x jiskata MAC x fgetchar x jiskigou MAC x fieeetomsbin x jisl0 MAC x filelength x jisl1 MAC x fileno x jisl2 MAC x floorl x jislower MAC x flushall x jisprint MAC x fmodl x jisspace MAC x fmsbintoieee x jistojms MAC x fputchar x jisupper MAC x frexpl x jiszen MAC x fstat x jmstojis MAC x ftime x jn x gcvt MAC x jstradv x getch M x jstrchr x getche x jstrcmp x getcwd MAC x jstrcspn x getpid x jstricmp x getw x jstrlen x halloc x jstrlwr x hantozen MAC x jstrmatch x hfree x jstrncat x hypot MAC x jstrncmp x hypotl x jstrncpy x inp x jstrnicmp x inpw x jstrnset x int86 x jstrrchr x int86x x jstrrev x intdos x jstrset x intdosx x jstrskip x isalkana MAC x jstrspn x isalnmkana MAC x jstrstr x isascii MAC x jstrtok x isatty x jstrupr x iscsym x jtohira MAC x iscsymf x jtokata MAC x isgrkana MAC x jtolower MAC x ------Name CExe ANSI MS-C Name CExe ANSI MS-C ------+----+----+------+----+----+----- jtoupper MAC x spawnlpe x kbhit M x spawnv x ldexpl x spawnve x lfind x spawnvp x locking x spawnvpe x logl x sqrtl x log10l x stackavail MAC x lsearch x stat x lseek MAC x strcmpi MAC x ltoa MAC x strdup x matherr x stricmp MAC x max x strlwr MAC x memccpy x strnicmp MAC x memicmp MAC x strnset MAC x min x strrev MAC x mkdir MAC x strset MAC x mktemp x strupr MAC x modfl x swab MAC x movedata x tanl x mtob MAC x tanhl x nthctype MAC x tell MAC x onexit (atexit) x tempnam x open MAC x toascii MAC x outp x tzset x outpw x u_strtoldltoa x powl x ultoa MAC x putch x umask x putenv x ungetch x putw x unlink x read MAC x utime x rmdir MAC x wait x rmtmp x write MAC x segread x y0 x setmode x y1 x sinhl x yn x sinl x zentohan MAC x sopen x ------spawnl x spawnle x spawnlp x ------1.3 Graphic library

(1) MS-C compatible graphic functions

Compatible functions with a part of graphic library of Microsoft C Compiler (MS-C Ver 6.0).

------Name CExe Function ------+----+------_arc M Draw an arc or an elliptic arc. _clearscreen M Clear screen. _ellipse M Draw a circle or an ellipse. _floodfill M Paint the closed region. _getactivepage M Get the current active page number. _getarcinfo M Get the information of the previous arc or pie. _getbkcolor M Get the current back ground color. _getcolor M Get the current fore ground color. _getcurrentposition M Get the current position in the view coordinate. _getfillmask M Get the current fill mask pattern. _getfontinfo M Get the current font information. _getgtextextent M Get the text extent by pixel unit. _getgtextvector M Get the output vector of text. _getimage M Get screen image. _getkanji M Get the font pattern of Kanji character. _getlinestyle M Get the current line style. _getphyscoord M Convert view coordinate into physical. _getpixel M Get color number the pixel. _gettextposition M Get the current output position of text. _gettextwindow M Get the text window border. _getvideoconfig M Get the graphic configuration. _getviewcoord M Convert physical coordinate into view. _getvisualpage M Get the current visual page number. _getwritemode M Get the current writing mode. _grstatus M Get the return status of graphic function. _imagesize M Get image buffer size. _kanjisize M Get font pattern size of Kanji character. _lineto M Draw a line. _moveto M Move the current graphic output position. _outgtext M Draw a text string using the current font. _outmem M Draw a text string in a memory. _outtext M Output a text string in the current position. _pie M Draw a pie figure. _polygon M Draw a polygon. _putimage M Put image data on the screen. _rectangle M Draw a rectangle. _registerfonts M Register font file. _remapallpalette M Map colors into all color palette. _remappalette M Map a color into a color palette. _setactivepage M Set the current active page number. _setbkcolor M Set the current back ground color. _setcliprgn M Set the clipping region. _setcolor M Set the current fore ground color. _setfillmask M Set the current fill mask pattern. _setfont M Set the current font. ------Name CExe Function ------+----+------_setgtextvector M Set the current output vector of text. _setlinestyle M Set the current line style. _setpixel M Draw a pixel. _settextposition M Set the current output position of text. _settextrows M Set the text row number. _settextwindow M Set the text window. _setvideomode M Set the screen video mode. _setvideomoderows M Set the screen video mode and text row number. _setvieworg M Set the origin of the view port. _setviewport M Set the clipping region and the view coordinate. _setvisualpage M Set the current visual page number. _setwritemode M Set the current writing mode. _unregisterfonts M Delete registered font file. _wrapon M Enable/disable line wrapping. ------

(2) C Executor original graphic functions These are graphic drawing functions specific to the C Executer. ------Name CExe Function ------+----+------gr_displaychar M Draw a standard size character. gr_displayfourlarge M Draw a quad size character. gr_displaysixlarge M Draw a hex size character. _putpattern M Put monochrome image data. _getpattern M Get monochrome image data. gr_dispstr M Draw a standard size string. gr_disp6str M Draw a hex size string. gr_bitblt M Copy image data. gr_disp4str M Draw a quad size string. gr_displaysmlchar M Draw a small size character. gr_dispsstr M Draw a small size string. gr_displayfchar M Draw a FANUC character. gr_dispfstr M Draw a FANUC character string. gr_disp9ifchar M Draw 9-inch font character. gr_disp9ifstr M Draw 9-inch font character string. mmc_line_b M Draw a line between specified two points. mmc_polyline M Draw a polyline. mmc_circle_b M Draw a circle. mmc_ellipse_b M Draw an ellipse. mmc_pie_b M Draw a pie figure. mmc_arc_b M Draw an arc. mmc_gettext M Get character in the specified area. mmc_puttext M Put character data on memory to text screen. mmc_textsize M Get required byte size for getting character. ------1.4 CNC/PMC window library

Functions whish are used to input/output data between CNC/PMC.

(1) CNC window library

------Name CExe Function ------+----+------cnc_sysinfo MA Read CNC system information. cnc_dwnstart MA Start output of NC program to be registered. cnc_download MA Output NC program to be registered. cnc_dwnend MA Stop output NC program to be registered. cnc_vrfstart MA Start output NC program to be compared. cnc_verify MA Output NC program to be compared. cnc_vrfend MA Stop output NC program to be compared. cnc_dncstart MA Start output NC program to be executed. cnc_dnc MA Output NC program to be executed. cnc_dncend MA Stop output NC program to be executed. cnc_upstart MA Start input NC program. cnc_upload MA Input NC program. cnc_upend MA Stop input NC program. cnc_search MA Search specified program. cnc_delall MA Delete all programs. cnc_delete MA Delete specified program. cnc_rdprogdir MA Read program directory. cnc_rdproginfo MA Read program information. cnc_rdprgnum MA Read program number in executing. cnc_rdseqnum MA Read sequence number in executing. cnc_actf MA Read actual feed rate of controlled axes. cnc_acts MA Read actual spindle speed. cnc_absolute MA Read absolute position. cnc_machine MA Read machine position. cnc_relative MA Read relative position. cnc_distance MA Read distance to go. cnc_skip MA Read skipped position. cnc_srvdelay MA Read servo delay amount. cnc_accdecdly MA Read acceleration/deceleration delay amount. cnc_rddynamic MA Read dynamic data. cnc_statinfo MA Read CNC status information. cnc_alarm MA Read alarm status. cnc_rdalminfo MA Read alarm information. cnc_rdtofs MA Read tool offset amount. cnc_wrtofs MA Write tool offset amount. cnc_rdtofsr MA Read tool offset amount (range specified). cnc_wrtofsr MA Write tool offset amount (range specified). cnc_rdzofs MA Read work origin offset. cnc_wrzofs MA Write work origin offset. cnc_rdzofsr MA Read work origin offset (range specified). ------Name CExe Function ------+----+------cnc_wrzofsr MA Write work origin offset (range specified). cnc_rdparam MA Read parameter. cnc_wrparam MA Write parameter. cnc_rdparar MA Read parameters (range specified). cnc_wrparas MA Write parameters (multiple output). cnc_rdset MA Read setting parameter. cnc_wrset MA Write setting parameter. cnc_rdsetr MA Read setting parameters (range specified). cnc_wrsets MA Write setting parameters (multiple output). cnc_rdpitchr MA Read pitch error compensation data (range specified). cnc_wrpitchr MA Write pitch error compensation data (range specified). cnc_rdmacro MA Read custom macro variable. cnc_wrmacro MA Write custom macro variable. cnc_rdmacror MA Read custom macro variables (range specified). cnc_wrmacror MA Write custom macro variables (range specified). cnc_rdpmacro MA Read P-code macro variable. cnc_wrpmacro MA Write P-code macro variable. cnc_rdpmacror MA Read P-code macro variables (range specified). cnc_wrpmacror MA Write P-code macro variables (range specified). cnc_modal MA Read modal data. cnc_diagnoss MA Read diagnostics data. cnc_diagnosr MA Read diagnostics data (range specified). cnc_adcnv MA Read A/D conversion data. cnc_rdopmsg MA Read operator's message. cnc_setpath MA Set path index (multi-path system). cnc_getpath MA Get path index (multi-path system). ------Name CExe Function ------+----+------cnc_settime MA Set calendar timer of CNC. cnc_rdspload MA Read load information of serial spindle. cnc_rdexecprog MA Read executing program. cnc_rdmovrlap MA Read manual handle override amount. ------

(2) PMC window library

------Name CExe Function ------+----+------pmc_rdpmcrng MA Read arbitrary PMC data (range specified). pmc_wrpmcrng MA Write arbitrary PMC data (range specified). pmc_rdpcmsg MA Read PMC message. ------1.5 Other libraries

(1) MDI operation library

These are the functions which customize key-input from MDI panel, alter key code, enable key repeating and generate key code by the application program.

------Name CExe Function ------+----+------aux_mdi_getmatrix MA Get MDI key matrix. aux_mdi_putmatrix MA Put MDI key matrix. aux_mdi_rstmatrix MA Reset MDI key matrix. aux_mdi_altmatrix MA Alter MDI key matrix. aux_mdi_putc MA Put one character to key input buffer. aux_mdi_write MA Write block data to key input buffer. aux_mdi_control MA Test or control key input buffer. aux_mdi_repeat MA Set key repeating interval time. aux_mdi_getstat MA Read inputting status of MDI key. aux_mdi_clrbuf MA Clear input buffer of MDI key. ------(2) CRT operation library

These are the functions which control CRT display and multiple window display.

------Name CExe Function ------+----+------crt_getcurscrn MA Get current screen index. crt_setuserscrn M Register user screen index. crt_isnewscrn MA Test screen switching status. crt_gettype MA Get CRT information. crt_setmode MA Set CRT screen mode. crt_cncscrn MA Switch to CNC screen. crt_fchar M Output character by FANUC character code. crt_setuserskey M Customize softkey on CNC screen. crt_setswt MA Set switching method between CNC's screen and user's. crt_setscrlarea M Set scroll area. crt_opengr M Open graphic display. crt_closegr M Close graphic display. crt_graphic MA Enable or disable graphic display. crt_readfkey MA Read the status of function keys. crt_2ndcursor M Display the secondary cursor. crt_settextattr M Set attribute of characters on VRAM. crt_gettextattr M Get attribute of character on VRAM. crt_setpalette M Set color palette of VGA characters. crt_setallpalette M Set all color palette of VGA characters. crt_getcncpalette M Get color palette of CNC screen. crt_fstr M Output character string by FANUC character code. crt_gettextimg M Get text data from VRAM. crt_puttextimg M Put text data into VRAM. crt_setgraphpage M Select graphic page to use. crt_set6chmode M Select drawing method of 6x sized character. crt_setgsvmode M Select saving method of graphic contents. win_open M Open window. win_close M Close window. win_select M Select window. win_activate M Activate window. win_move M Move window. win_size M Alter window size. win_full M Let active window be full screen size. win_window M Let active window be window size. win_info M Get window information. win_col M Set color of window frame and title string. win_hide M Hide window. win_show M Show window. win_setttl M Set window title string. win_setfrm M Set window frame line character. win_getstat M Get window display status. win_redraw M Redraw windows. crt_reguserchar M Register user character. crt_mapuch M Map user character. crt_getcgpttn M Get CG pattern. vwin_open M Open VGA window. vwin_close M Close VGA window. vwin_select M Select VGA window. ------Name CExe Function ------+----+------vwin_show M Show VGA window. vwin_hide M Hide VGA window. vwin_info M Get VGA window information. ------(3) File operation library

These are the functions which maintain file device.

------Name CExe Function ------+----+------aux_file_format M Format specified drive. aux_file_mount MAC Mount memory card. aux_file_unmount MAC Unmount memory card. aux_file_memcinfo MAC Get memory card information. ------

(4) Serial communication library

These are the functions which communicate with peripherals via reader/ puncher interface(RS-232C).

------Name CExe Function ------+----+------rs_open MAC Initialize communication device. rs_close MAC Terminate communication. rs_putc MAC Put one character to communication buffer. rs_getc MAC Get one character from communication buffer. rs_write MAC Write block data to communication buffer. rs_read MAC Read block data from communication buffer. rs_buffer MAC Test or control communication buffer. rs_status MAC Get status of communication line and buffer. rs_wait MAC Wait communication event. ------(5) Task control library

These are the functions which control task execution.

------Name CExe Function ------+----+------os_show_tim MAC Read timer. os_set_tim MAC Set timer. os_sync_tim MAC Wait until specified time. os_wait_tim MAC Wait until specified term. os_make_flg MAC Make event flag. os_delt_flg MAC Delete event flag. os_sign_flg MAC Signal event flag. os_wait_flg MAC Wait event flag signal. os_clar_flg MAC Clear event flag. os_puls_flg MAC Signal event flag. (pulse type) os_make_sem MAC Make counter-type semaphore. os_delt_sem MAC Delete semaphore. os_sign_sem MAC Signal semaphore. os_wait_sem MAC Wait semaphore signal. os_strt_wtsk M Start window task. ------

(6) FCA library These are the functions which communicate with FCA (FANUC CASSETTE ADAPTOR) or FANUC Handy File. ------Name CExe Function ------+----+------fca_setparam MAC Initialize communication line. fca_bye MAC Close communication line. fca_open MAC Open a binary file on FCA device. fca_close MAC Close a binary file. fca_read MAC Read binary data from the file. fca_write MAC Write binary data to the file. fca_fopen MAC Open a text file on FCA device. fca_fclose MAC Close a text device. fca_getc MAC Read a character from the text file. fca_putc MAC Write a character to the text file. fca_delete MAC Delete a file on FCA device. fca_rename MAC Change name of a file on FCA device. fca_readdir MAC Read directory information of FCA device. fca_status MAC Read status information of FCA device. fca_remains MAC Read free space size of a floppy disk. ------(7) F-ROM library

These are the functions which read C Executor data stored in the flash ROM module.

------Name CExe Function ------+----+------aux_from_open MAC Open the specified F-ROM file. aux_from_close MAC Close the F-ROM file. aux_from_select MAC Select data in the F-ROM file. aux_from_moveptr MAC Move read pointer. aux_from_read MAC Read data from the F-ROM file. aux_from_getdir MAC Read directory information of a F-ROM file. aux_from_getinfo MAC Read F-ROM file information. aux_from_getc MAC Read a character from the F-ROM file. aux_from_gets MAC Read a line from the F-ROM file. ------

(8) Touch-panel library This is the function which reads the status and (X,Y) coordinate of the touch-panel.

------Name CExe Function ------+----+------aux_tpl_read MAC Read the status and (X,Y) coordinate of the touch-panel. ------Japanese(Multi-byte character) functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Jananese character/string functions (Multi-byte character functions) included in "MS-C extended C standard library" are not available for Series 30i C Executor.

Functions not available on FANUC Series 30i (FS30i) C Executor ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The following functions are available on FS16i/18i C Executor, but not avail- able on FS30i C Executor because of different system configurations and hard- ware. It is, however, possible to call these functions to create applications. This is intended to maintain compatibility with applications developed for FS16.

With the FS30i, when these functions are called, they return a normal end code without processing anything. The values they return are undefined.

When using these functions, be sure to bear what is described above in mind. If you find any problem with your application in regard to the functions, modify the application.

Libraries for 2-path system crt_getcurscrn2() : Get current screen index. (for 2-path system) crt_setuserscrn2() : Register user screen index. (for 2-path system) crt_setuserskey2() : Customize softkey on CNC screen. (for 2-path system) Task management library os_chng_duty() : set CPU time ratio between user task and CNC task os_chng_wdty() : Change CPU time of window task os_new_mem() : Allocate new memory block os_disp_mem() : Deallocate memory block MS-C extended C standard library _clear87() : Get and clear the floating point status word. _control87() : Get and set the floating point status word. _status87() : Get the floating point status word. Super CAP M window library capm_rdtool() : Read tool data file. capm_wrtool() : Write tool data file. capm_rdpretool() : Read pre-tool list. capm_wrpretool() : Write pre-tool list. capm_rdmcncond() : Read machining condition file. capm_wrmcncond() : Write machining condition file. capm_rddef() : Read default data file. capm_wrdef() : Write default data file. capm_closebge() : Terminate back ground editing. crt_capmaccess() : Set accessing method to Super CAP M. crt_capmscrn() : Switch to Super CAP M screen. CNC window library cnc_windowma() : Call CNC window.

CNC window library for punch-press cnc_rd1punchtl() : Read punch-press tool data. (by registration number) cnc_rd2punchtl() : Read punch-press tool data. (by tool number) cnc_wrpunchtl() : Write punch-press tool data.

Serial Library rs_dma() : Select DMA transmission channel. 2. How to make application program ======

Table of contents

2.1 Outline 2.2 Special files 2.3 MAKEFILE 2.4 Installing the Diab C/C++ Power-PC compiler 2.5 Compatibility related to variables of type 'int' 2.6 Using compiler libraries 2.7 Describing 2-byte characters in source-codes 2.8 Remarks

2.1 Outline

In this documentation we assume that the "C Executor library disk" has been installed in the directory C:\APP.

The application program is made by the following procedures.

(1) Make the working directory. (2) Copy \APP\TOOL\MAKEFILE, \APP\TOOL\VERSION.C into the working directory. (3) Edit the source files. (4) Modify MAKEFILE to fit to user application. (5) Modify user application's version number in VERSION.C. (6) Execute NMAKE.

(1) Making the working directory. Usually, the working directory is made in the directory( C:\APP ) in which the C library has been installed. We assume that the working directory name is PROG1. C:\> md c:\app\prog1

(2) Copying specific files. Copy the necessary files at a minimum from TOOL directory to the working directory. C:\> cd c:\app\prog1 C:\APP\PROG1> copy ..\tool\makefile C:\APP\PROG1> copy ..\tool\version.c (3) Editing the source files. Make the source files ( *.c and *.h files ) of the application program in the working directory. Use an arbitrary text editor to edit the files. You may name the file as you like. Here, we assume that the following source files are made.

Main task main.c sub1.c sub2.c Alarm task alarm.c alm_sub.c Communication task comm.c Common header file prog1.h

(4) Modifying MAKEFILE to fit to user application. Modify the following parts of makefile.

* The top part of makefile

#------# Task definition block. Modify here for your application. #------

TASK1 = <- list of the object filenames which constitute the Main task. TASK2 = <- list of the object filenames which constitute the Communication task. TASK3 = <- list of the object filenames which constitute the Alarm task. TASK4 = <- list of the object filenames which constitute the Window task. TASK5 = <- list of the object filenames which constitute the High-Level task. * The bottom of makefile #------# .O and .C dependency block. #------<- relationship of dependence between files. #------# End of .O and .C dependency block. #------

In this case, modify makefile as follows. #------# Task definition block. Modify here for your application. #------TASK1 = main.o sub1.o sub2.o TASK2 = comm.o TASK3 = alarm.o alm_sub.o TASK4 = TASK5 = #------# .O and .C dependency block. #------main.o : main.c prog1.h sub1.o : sub1.c prog1.h sub2.o : sub2.c prog1.h comm.o : comm.c prog1.h alarm.o : alarm.c prog1.h alarm.o : alm_sub.c prog1.h

#------# End of .O and .C dependency block. #------

(5) Modifying user application's version number in VERSION.C. Modify the following definition sentence in version.c. char version[] = "TEST0001" ;

Here, we assume that the application version number is "PROG-A001". char version[] = "PROGA001" ;

(6) Executing NMAKE. Change the working directory as the current directory, then execute nmake command. C:\APP\PROG1> nmake When any compile error or link error occurs, modify the source file and execute nmake again. The memory card file "cexec.mem", which will be stored in the CNC unit, will be generated by completing execution of nmake. Copy this file into the memory card, and write the application program into F-ROM of the CNC unit according to the operating procedure of the CNC's boot software. 2.2 Special files

The following files are special files, whose usage is reserved.

VERSION.C : Definition file of the user application's version number. (must be required)

The user application's version number is defined in this file. For example, version number definition is as follows. char version[] = "TEST0001" ; "TEST" is the series string and "0001" is edition number. You can replace them with your original version number. There are no particular naming rules of version number. You can define them arbitrarily. However, limited characters (such as uppercase and numeric character, some marks) are available in the version string. The version string which is defined in this file is displayed in SYSTEM screen of CNC.

DRAMVER.C : Definition file of common variables between tasks. (optional) Define the variables which can be accessed from all tasks. Be sure to define only the variables, but not the functions.

SRAMVER.C : Definition file of SRAM variables. (optional)

Define the variables which should be allocated into SRAM (static memory) area. The variables defined in this file also can be accessed from all tasks. Be sure to define only the variables, but not the functions. SRAM variables must have the initial values. The initial values are necessary to allocate the variables into SRAM area and not effective in the execution time of the application. 2.3 MAKEFILE

Modify two blocks in MAKEFILE.

(1) Task definition block

#------# Task definition block. Modify here for your application. #------

TASK1 = TASK2 = TASK3 = TASK4 = TASK5 =

#------# End of task definition block #------

Define the macro TASK to specify the object files which compose the task.

In case of the task 1 consists of S1.C and S2.C, define it as follows.

TASK1 = s1.o s2.o

You can split the long line by '\'. TASK1 = s1.o s2.o \ s3.o For the single task application, you should only define the macro TASK1. TASK1 = s1.o s2.o TASK2 = TASK3 = TASK4 = TASK5 = For the multi-task application, define the macro for all the tasks involved. TASK1 = s1.o s2.o TASK2 = x.o TASK3 = y1.o y2.o y3.o TASK4 = TASK5 = (2) Dependency block

#------# .O and .C dependency block. #------

#------# End of .O and .C dependency block. #------

The relations between the object file, the source file and the include file are described here.

If S1.C includes ABC.H, and S2.C includes DEF.H, describe them as follows.

#------# .O and .C dependency block. #------s1.o : s1.c abc.h s2.o : s2.c def.h

#------# End of .O and .C dependency block. #------2.4 Installing the Diab C/C++ Power-PC compiler

How to install the Diab C/C++ Power-PC compiler is described below by taking its version 4.3f as an example. Refer to the applicable compiler reference manual for detailed descriptions about individual items. Inserting the Diab C/C++ Power-PC compiler CD into your PC automatically starts the installer. If the installer fails to start, open the CD folder and click SETUP.EXE in the folder to start it.

1) DIAB Installation Directory Specify a folder in which you want to install the compiler. Any folder can be specified.

2) Installation Options Check all the following check boxes. - Install DIAB Compiler Suites - Set Compiler Defaults - Set Eval Key or License File Location 3) Tools Selection Specify the type of the compiler you are going to install. Check the C Compiler (D-CC) check box. Do not use C++ Compiler, RTA Tools, FastJ Compiler, or Library Source.

4) Target Architectures Select the following target system. Target : PowerPC Components : ELF (EABI) 5) Select program folder Select a program folder that can be specified from the Windows Start menu. Any folder can be specified. 6) License Key Option Selection Select a license key entry method specified when you purchased the compiler. Select: "I have an eval key and I will enter it now." (Note: The entry method may vary depending on the license form. For details, ask the store from which you bought your compiler.) 7) Enter eval key Enter your license key. 8) File Selection Specify a file to which you want to save the license key. 9) Select option for modify .bat file Set up environment variables. Select the following: "Let Setup modify the C:\Autoexec.bat file" 10) PowerPC Select PPC603. 11) PPC603 Select "Hardware Floating Point." 12) ELF(EABI) Select "cross." Note) You may need to set up License Manager (FLEXlm License Manager) depending on the license form. For details, ask the store from which you bought your compiler.

2.5 Compatibility related to variables of type 'int'

For the compiler used with the FS30i C Executor, variables of type 'int' are 4-bytes long, while, for the compiler used with the FS16i/18i C Executor, they are 2-bytes long. This difference in size may result in loss of compatibility. The first part of some structures specified in CNC/PMC window functions con- tains dummy variables of type 'int'. This does not impair compatibility when the structures are used for data input/output. If a data area secured using, for example, the malloc function is used for data input/output, however, the data area may not function normally when its beginning part is offset based on 2-byte conversion. Compatibility can be secured by a 'sizeof(int)' operator instead of 2-byte conversion.

2.6 Using compiler libraries

The following functions use the library supplied together with the compiler. To use these functions, add the library to the LD.OPT file in the TOOL folder in your development environment.

1) Functions that use the library supplied together with the compiler setjmp, longjmp va_start, va_arg, va_end vprintf, vprintf, vsprintf 2) Adding library path to LD.OPT -m2 -lc <-- Add this line.

2.7 Describing 2-byte characters in source-codes The Diab C/C++ Power-PC compiler does not support Japanese language. If a 2-byte character whose second byte happens to be 5Ch is included directly in a source file, it is not recognized as correct data. 2.8 Remarks

C Executor uses the different include files from the compiler's default. So, the object files made for the personal computer debugging cannot be used for execution on CNC. Recompile using include files for C Executor. (The include directory is switched by the macro CC in MAKEFILE)

Do not change MAKEFILE except the place mentioned above.

When creating application programs, observe the following cautions:

1) Do not perform division by zero. 2) When using data of type float or double, do not perform an arithmetic operation on that data with NaN (nonnumeric) held. 3) Before converting data from type float or double to an integral type, make sure that the resulting data will not fall outside the valid data range of the target integral type. 4) The following restrictions are imposed on the alignment of variables to be placed. One-byte variable : No restriction Two-byte variable : The least significant digit of the address must be 0, 2, 4, 8, a, c, or e. Four-byte variable : The least significant digit of the address must be 0, 4, 8, or c. Eight-byte variable : The least significant digit of the address must be 0 or 8. [**WARNING**] If an application program performs one of the following operations, the CNC may behave in an unexpected manner. - Access to data in an area other than the application data area. - Execution of a program other than an application program (except call the function that the C Executor offers it) 3. Function References ======

The function specifications that C library provides with are described in this function reference with following format.

[Example] > ------> 1. Format specified drive.

> ------> > > [Name] > aux_file_format > > > [Syntax] > #include > int aux_file_format( unsigned char drive ) ; > > > [Arguments] > drive Drive name ( ='A' ). > > > [Return] > 0 Successfully. > 9 Invalid drive name. > > > [Description] > Formats specified drive. > > Specify drive name to be formatted in "drive". For formatting S-RAM > disk, execute as follows. > > aux_file_format( 'A' ) ; > > All files in specified drive will be deleted by execution of this > function. > > Automatic initialization of S-RAM disk is done by setting CNC > parameter No.8662, S-RAM capacity setting, and rebooting system. "
" after title shows that this function is available in the MAIN task, not available in the Communication task and the Alarm task. If "" is in this section, this function is available in all tasks. "[Name]" shows the name of this function.

"[Syntax]" shows required header files to use this function, type of return value of this function and sequence and types of all arguments. "[Arguments]" shows meanings of all arguments.

"[Return]" shows all possible return values and their types and meanings.

"[Description]" shows behavior of this function, concrete values to be specified in arguments and some notices, etc. 3.1 ANSI C standard library ======

Lists of Functions ~~~~~~~~~~~~~~~~~~

1. Diagnostics ( assert.h )

------Name Function ------1.1 assert Abort by assertion. ------

2. Character handling ( ctype.h )

------Name Function ------2.1 isalnum Test for alphanumeric character. 2.2 isalpha Test for alphabetic character. 2.3 iscntrl Test for control character. 2.4 isdigit Test for numeric character. 2.5 isgraph Test for visible character. 2.6 islower Test for lowercase alphabetic character. 2.7 isprint Test for printable character. 2.8 ispunct Test for punctuation character. 2.9 isspace Test for whitespace character. 2.10 isupper Test for uppercase alphabetic character. 2.11 isxdigit Test for hexadecimal numeric character. 2.12 tolower Convert uppercase to lowercase. 2.13 toupper Convert lowercase to uppercase. ------3. Mathematics ( math.h )

------Name Function ------3.1 acos Calculate the arc cosine value. 3.2 asin Calculate the arc sine value. 3.3 atan Calculate the arc tangent value. 3.4 atan2 Calculate the arc tangent value. 3.5 ceil Calculate the smallest integer value. 3.6 cos Calculate the cosine value. 3.7 cosh Calculate the hyperbolic cosine value. 3.8 exp Calculate the exponential function. 3.9 fabs Calculate the absolute value. 3.10 floor Calculate the largest integer value. 3.11 fmod Calculate the floating point remainder value. 3.12 frexp Calculate the mantissa value. 3.13 ldexp Calculate the value multiplied by the power of 2. 3.14 log Calculate the natural (base-e) logarithm value. 3.15 log10 Calculate the base-10 logarithm value. 3.16 modf Get the fractional part and the integer part. 3.17 pow Calculate the raised value. 3.18 sin Calculate the sine value. 3.19 sinh Calculate the hyperbolic sine value. 3.20 sqrt Calculate the square root value. 3.21 tan Calculate the tangent value. 3.22 tanh Calculate the hyperbolic tangent value. ------

4. Non-local jumps ( setjmp.h ) ------Name Function ------4.1 setjmp Save current environment for non-local jump. 4.2 longjmp Execute a non-local jump. ------

5. Variable arguments ( stdarg.h ) ------Name Function ------5.1 va_start Initialize arg_ptr. 5.2 va_arg Get a next argument. 5.3 va_end Reset arg_ptr. ------6. Input/output ( stdio.h )

------Name Function ------6.1 remove Delete a file. 6.2 rename Change the name of a file. 6.3 tmpnam Generate a temporary file name. 6.4 fclose Close a stream. 6.5 fflush Flush a stream buffer. 6.6 fopen Open a stream. 6.7 freopen Re-open a same stream. 6.8 setbuf Set a buffer for stream. 6.9 setvbuf Control a buffer for stream. 6.10 fprintf Print formatted data to a stream. 6.11 fscanf Read formatted data from a stream. 6.12 printf Print formatted data to standard output. 6.13 scanf Read formatted data from standard input. 6.14 sprintf Print formatted data to memory. 6.15 sscanf Read formatted data from memory. 6.16 vfprintf Print formatted data to a file using variable arguments. 6.17 vprintf Print formatted data to standard output using variable arguments. 6.18 vsprintf Print formatted data to memory using variable arguments. 6.19 fgetc Read a character from a stream. 6.20 fgets Read a strings from a stream. 6.21 fputc Write a character to a stream. 6.22 fputs Write a string to a stream. 6.23 getc Read a character from a stream. 6.24 getchar Read a character from standard input. 6.25 gets Read a line string from standard input. 6.26 putc Write a character to a stream. 6.27 putchar Write a character to standard output. 6.28 puts Write a string to standard output. 6.29 ungetc Put a character into a steam. 6.30 fread Read data from a stream. 6.31 fwrite Write data to a stream. 6.32 fgetpos Get the current file position of a stream. 6.33 fseek Move the current file pointer. 6.34 fsetpos Set the current file position of stream. 6.35 ftell Get the current file pointer. 6.36 rewind Rewind the current file pointer to the top of file. 6.37 clearerr Reset error indicator of a stream. 6.38 feof Test for end-of-file. 6.39 ferror Test for error on stream. 6.40 perror Print error message. ------7. General utilities ( stdlib.h )

------Name Function ------7.1 atoi Convert string to int value. 7.2 atol Convert string to long value. 7.3 strtol Convert string to long value. 7.4 strtoul Convert string to unsigned long value. 7.5 rand Generate pseudo-random number. 7.6 srand Seed pseudo-random number generator. 7.7 calloc Allocate memory block initialized by 0. 7.8 free Free memory block. 7.9 malloc Allocate memory block. 7.10 realloc Reallocate memory block. 7.11 bsearch Perform binary search. 7.12 qsort Perform quick sort. 7.13 abs Get absolute value. 7.14 div Get quotient and remainder. 7.15 labs Get absolute value. 7.16 ldiv Get quotient and remainder. 7.17 atof Convert string to double value. 7.18 strtod Convert string to double value. ------

8. String handling ( string.h ) ------Name Function ------8.1 memcpy Copy a memory block. 8.2 memmove Move a memory block. 8.3 strcpy Copy a string. 8.4 strncpy Copy a string. 8.5 strcat Concatenate a string. 8.6 strncat Concatenate a string. 8.7 memcmp Compare two memory blocks. 8.8 strcmp Compare two strings. 8.9 strncmp Compare two strings. 8.10 memchr Find a character in a memory block. 8.11 strchr Find a character in a string. 8.12 strcspn Get string length which doesn't include a character. 8.13 strpbrk Find a character position in a string. 8.14 strrchr Find the last character in a string. 8.15 strspn Get string length composed by specified character. 8.16 strstr Find a string in a string. 8.17 strtok Get a token. 8.18 memset Fill data in a memory block. 8.19 strlen Get string length. ------9. Date and time ( time.h )

------Name Function ------9.1 clock Get the current time. 9.2 mktime Convert local time to calender time. 9.3 time Get the current time. 9.4 asctime Convert time to string. 9.5 ctime Convert time to string. 9.6 gmtime Convert time to Greenwich mean time. 9.7 localtime Convert time to local time. 9.8 difftime Compute the difference between the two times. ------Function Reference ~~~~~~~~~~~~~~~~~~

Refer ANSI C language regulation for detail function specifications.

1. Diagnostics ( assert.h )

------1.1 Abort by assertion.

------

[Name] assert

[Syntax] #include void assert( int expression ) ;

[Arguments] expression Expression to be diagnosed.

[Return] ------

[Description] "assert" is used to debug programs simply. "assert" displays diagnostic message and stops the program when the value of "expression" is false (i.e. "0"). To stop the program, "while(1);" is execute, the next step is never executed. When "expression" is true (i.e. non-zero), "assert" does nothing. "assert" is defined as MACRO, so, define NDEBUG identifier and recompile to remove it. The diagnostic message is displayed with the following format. "Assertion failed : expression [expression] in file [filename] at line linenum" Only programmer can understand this diagnostic message. It is recommended to do user's own error checking and to display error messages for easy application maintenance. 2. Character handling ( ctype.h )

------2.1 Test for alphanumeric character. ------

[Name] isalnum

[Syntax] #include int isalnum( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is an alphanumeric character, otherwise zero.

[Description] "isalnum" tests whether "c" is an alphanumeric character ('A'-'Z', 'a'-'z','0'-'9') or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.2 Test for alphabetic character. ------

[Name] isalpha

[Syntax] #include int isalpha( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is an alphabetic character, otherwise zero.

[Description] "isalpha" tests whether "c" is an alphabetic character ('A'-'Z', 'a'-'z') or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.3 Test for control character. ------

[Name] iscntrl

[Syntax] #include int iscntrl( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a control character, otherwise zero.

[Description] "iscntrl" tests whether "c" is a control character (0x00-0x1f,0x7f) or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.4 Test for numeric character. ------

[Name] isdigit

[Syntax] #include int isdigit( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a numeric character, otherwise zero.

[Description] "isdigit" tests whether "c" is a numeric character ('0'-'9') or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.5 Test for visible character. ------

[Name] isgraph

[Syntax] #include int isgraph( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a visible character, otherwise zero.

[Description] "isgraph" tests whether "c" is a visible character (0x21-0x7e) or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.6 Test for lowercase alphabetic character. ------

[Name] islower

[Syntax] #include int islower( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a lowercase alphabetic character, otherwise zero.

[Description] "islower" tests whether "c" is a lowercase alphabetic character ('a'-'z') or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.7 Test for printable character. ------

[Name] isprint

[Syntax] #include int isprint( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a printable character, otherwise zero.

[Description] "isprint" tests whether "c" is a printable character (0x20-0x7e) or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.8 Test for punctuation character. ------

[Name] ispunct

[Syntax] #include int ispunct( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a punctuation character, otherwise zero.

[Description] "ispunct" tests whether "c" is a punctuation character (0x21-0x2f, 0x3a-0x40,0x5b-0x60,0x7b-0x7e) or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.9 Test for whitespace character. ------

[Name] isspace

[Syntax] #include int isspace( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a whitespace character, otherwise zero.

[Description] "isspace" tests whether "c" is a whitespace character (0x09-0x0d, 0x20) or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.10 Test for uppercase alphabetic character. ------

[Name] isupper

[Syntax] #include int isupper( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is an uppercase alphabetic character, otherwise zero.

[Description] "isupper" tests whether "c" is an uppercase alphabetic character ('A'-'Z') or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.11 Test for hexadecimal numeric character. ------

[Name] isxdigit

[Syntax] #include int isxdigit( int c ) ;

[Arguments] c Character code to be tested.

[Return] Returns non-zero value if "c" is a hexadecimal character, otherwise zero.

[Description] "isxdigit" tests whether "c" is a hexadecimal character ('A'-'Z', 'a'-'f','0'-'9') or not. This function works correctly for integer value of ASCII character set. The result is not warranted for other input value. ------2.12 Convert uppercase to lowercase. ------

[Name] tolower

[Syntax] #include int tolower( int c ) ;

[Arguments] c Character code to be converted.

[Return] Returns a lowercase alphabetic character if "c" is an uppercase, otherwise "c" as it is.

[Description] "tolower" converts "c" to a lowercase alphabetic character if "c" is uppercase. ------2.13 Convert lowercase to uppercase. ------

[Name] toupper

[Syntax] #include int toupper( int c ) ;

[Arguments] c Character code to be converted.

[Return] Returns an uppercase alphabetic character if "c" is a lowercase, otherwise "c" as it is.

[Description] "toupper" converts "c" to an uppercase alphabetic character if "c" is lowercase. 3. Mathematics ( math.h )

------3.1 Calculate the arc cosine value. ------

[Name] acos

[Syntax] #include double acos( double x ) ;

[Arguments] x A floating point value to be calculated arc cosine.

[Return] Returns the arc cosine value (in radian) of "x". If argument is out of valid range, returns 0 and sets EDOM in the global variable "errno".

[Description] Calculates the arc cosine value of "x". "x" must be in -1 through 1. The result is in 0 through PI radian. ------3.2 Calculate the arc sine value. ------

[Name] asin

[Syntax] #include double asin( double x ) ;

[Arguments] x A floating point value to be calculated arc sine.

[Return] Returns the arc sine value (in radian) of "x". If argument is out of valid range, returns 0 and sets EDOM in the global variable "errno".

[Description] Calculates the arc sine value of "x". "x" must be in -1 through 1. The result is in -PI/2 through PI/2 radian. ------3.3 Calculate the arc tangent value. ------

[Name] atan

[Syntax] #include double atan( double x ) ;

[Arguments] x A floating point value to be calculated arc tangent.

[Return] Returns the arc tangent value (in radian) of "x".

[Description] Calculates the arc tangent value of "x". The result is in -PI/2 through PI/2 radian. ------3.4 Calculate the arc tangent value. ------

[Name] atan2

[Syntax] #include double atan2( double y, double x ) ;

[Arguments] x A denominator of the value to be calculated arc tangent. y A numerator of the value to be calculated arc tangent.

[Return] Returns the arc tangent value (in radian) of y/x. If both "y" and "x" are 0, returns 0 and sets EDOM in the global variable "errno".

[Description] Calculates the arc tangent value of y/x. Both "x" and "y" are must not be 0. The result is in -PI through PI radian. ------3.5 Calculate the smallest integer value. ------

[Name] ceil

[Syntax] #include double ceil( double x ) ;

[Arguments] x A floating point value whose fractions is raised.

[Return] Returns the smallest integer value that is greater than or equal to "x".

[Description] Calculates the smallest integer value that is greater than or equal to "x". ------3.6 Calculate the cosine value. ------

[Name] cos

[Syntax] #include double cos( double x ) ;

[Arguments] x A floating point value in radian to be calculated cosine.

[Return] Returns the cosine value of "x". If "x" is too large, returns 0 and sets ERANGE in the global variable "errno".

[Description] Calculates the cosine value of "x". ------3.7 Calculate the hyperbolic cosine value. ------

[Name] cosh

[Syntax] #include double cosh( double x ) ;

[Arguments] x A floating point value in radian to be calculated hyperbolic cosine.

[Return] Returns the hyperbolic cosine value of "x". If the result is too large, returns +/-HUGE_VAL and sets ERANGE in the global variable "errno".

[Description] Calculates the hyperbolic cosine value of "x". ------3.8 Calculate the exponential function. ------

[Name] exp

[Syntax] #include double exp( double x ) ;

[Arguments] x A floating point value to be calculated exponential function.

[Return] Returns the exponential function value of "x". If the result is too large, returns HUGE_VAL and sets ERANGE in the global variable "errno". If the result is too small, returns 0.

[Description] Calculates the exponential function ("e" raised to "x" power) of "x". ------3.9 Calculate the absolute value. ------

[Name] fabs

[Syntax] #include double fabs( double x ) ;

[Arguments] x A floating point value to be calculated the absolute value.

[Return] Returns the absolute value of "x".

[Description] Calculates the absolute value of "x". ------3.10 Calculate the largest integer value. ------

[Name] floor

[Syntax] #include double floor( double x ) ;

[Arguments] x A floating point value whose frantions is discarded.

[Return] Returns the largest integet value that is less than or equal to "x"

[Description] Calculates the largest integer value that is less than or equal to "x". ------3.11 Calculate the floating point remainder value. ------

[Name] fmod

[Syntax] #include double fmod( double x, double y ) ;

[Arguments] x A divident to be calculated remainder. y A divosor to be calculated remainder.

[Return] Returns the remainder of "x" and "y". If "y" is 0, returns 0 and sets EDOM in the global variable "errno".

[Description] Calculates the remainder of "x" and "y". The remainder satisfies "x - i*y ("i" is an integer value)" and its absolute value is smaller than the absolute value of "y". ------3.12 Calculate the mantissa value. ------

[Name] frexp

[Syntax] #include double frexp( double value, int *exp ) ;

[Arguments] value A floating point value to be divided. exp A integer variable in where the exponential part is stored.

[Return] Returns the mantissa of a divided floating point value.

[Description] Divides "value" into a mantissa part "m" and an exponential part "n" "m" relates with "n" as "value = m * 2^n" and the absolute value of "m" is greater than or equal to 0.5 and less than 1. If "value" is 0, both "m" and "n" are 0. ------3.13 Calculate the value multiplied by the power of 2. ------

[Name] ldexp

[Syntax] #include double ldexp( double x, int exp ) ;

[Arguments] x A floating point value of the manttisa. exp A exponential part.

[Return] Returns the raied value. If the result is too large, returns +/-HUGE_VAL and sets ERANGE in the global variable "errno".

[Description] Calculates the raised value "x * 2^exp" by the mantissa and the exponent. ------3.14 Calculate the natural (base-e) logarithm value. ------

[Name] log

[Syntax] #include double log( double x ) ;

[Arguments] x A floating point value to be calculated natural logarithm.

[Return] Returns the natural logarithm value of "x". If "x" is 0, returns HUGE_VAL and sets ERANGE in the global variable "errno". If "x" is negative, returns HUGE_VAL and sets EDOM in the global variable "errno".

[Description] Calculates the natural logarithm (base-e logarithm) value of "x". ------3.15 Calculate the base-10 logarithm value. ------

[Name] log10

[Syntax] #include double log10( double x ) ;

[Arguments] x A floating point value to be calculated base-10 logarithm.

[Return] Returns the base-10 logarithm value of "x". If "x" is 0, returns HUGE_VAL and sets ERANGE in the global variable "errno". If "x" is negative, returns HUGE_VAL and sets EDOM in the global variable "errno".

[Description] Calculates the base-10 logarithm value of "x". ------3.16 Get the fractional part and the integer part. ------

[Name] modf

[Syntax] #include double modf( double value, double *iptr ) ;

[Arguments] value A floating point value to be divided. iptr A integer variable in where the integer part is stored.

[Return] Returns the fractional part of "value".

[Description] Divides "value" into a fractional part and an integer part, both parts have the same sign. ------3.17 Calculate the raised value. ------

[Name] pow

[Syntax] #include double pow( double x, double y ) ;

[Arguments] x A floating point value to be raised. y An exponent value.

[Return] Returns "x" raised to the power of "y". If "x" is 0 and "y" is negative, returns HUGE_VAL and sets EDOM in the global variable "errno". If both "x" and "y" are 0 or "x" is negative and "y" is not an integer, returns 0 and sets EDOM in the global variable "errno". If the result is too large, returns +/-HUGE_VAL and sets ERANGE in the global variable "errno".

[Description] Calculates "x" raised to the power of "y". ------3.18 Calculate the sine value. ------

[Name] sin

[Syntax] #include double sin( double x ) ;

[Arguments] x A floating point value in radian to be calculated sine.

[Return] Returns the sine value of "x". If "x" is too large, returns 0 and sets ERANGE in the global variable "errno".

[Description] Calculates the sine value of "x". ------3.19 Calculate the hyperbolic sine value. ------

[Name] sinh

[Syntax] #include double sinh( double x ) ;

[Arguments] x A floating point value in radian to be calculated hyperbolic sine.

[Return] Returns the hyperbolic sine value of "x". If the result is too large, returns +/-HUGE_VAL and sets ERANGE in the global variable "errno".

[Description] Calculates the hyperbolic sine value of "x". ------3.20 Calculate the square root value. ------

[Name] sqrt

[Syntax] #include double sqrt( double x ) ;

[Arguments] x A floating point value to be calculated square root.

[Return] Returns the square root value of "x". If "x" is negative, returns 0 and sets EDOM in the global variable "errno".

[Description] Calculates the square root value of "x". ------3.21 Calculate the tangent value. ------

[Name] tan

[Syntax] #include double tan( double x ) ;

[Arguments] x A floating point value in radian to be calculated tangent.

[Return] Returns the tangent value of "x". If "x" is too large, returns 0 and sets ERANGE in the global variable "errno".

[Description] Calculates the tangent value of "x". ------3.22 Calculate the hyperbolic tangent value. ------

[Name] tanh

[Syntax] #include double tanh( double x ) ;

[Arguments] x A floating point value in radian to be calculated hyperbolic tangent.

[Return] Returns the hyperbolic tangent value of "x".

[Description] Calculates the hyperbolic tangent value of "x". 4. Non-local jumps ( setjmp.h )

------4.1 Save current environment for non-local jump. ------

[Name] setjmp

[Syntax] #include int setjmp( jmp_buf env ) ;

[Arguments] env Buffer in which contents of stack is saved.

[Return] Returns zero. When "setjmp" is called again by "longjmp", it returns "value", one of arguments of "longjmp". If "value" is zero, it returns 1.

[Description] "setjmp" saves contents of stack in "env" for restoring by the later "longjmp". This enables jumping between functions. See also "longjmp" for more information. This function use the library supplied together with the compiler. For details, see "How to make application program." ------4.2 Execute a non-local jump. ------

[Name] longjmp

[Syntax] #include void longjmp( jmp_buf env, int value ) ;

[Arguments] env Buffer in which contents of stack is saved. value Return value of "setjmp".

[Return] ------

[Description] "longjmp" restores environment which has been saved by "setjmp" before, and jumps to the previous "setjmp" function. This enables jumping between functions. When "setjmp" is called from "longjmp", "setjmp" returns "value" which is an one of arguments of "longjmp". If "value" is zero, "setjmp" returns 1. After re-calling "setjmp", values of all variables are ones at calling "longjmp". Global variables whish has been changed by the other functions are not restored. All register variables are undefined. Usually, "setjmp" is called in the function which calls a function in which "longjmp" is called. That is, "setjmp" must be the outer nested function than "longjmp". When "longjmp" jumps to an inner function, the program doesn't work correctly. outer <- -> inner main()-+-- process1() ---- process2() ---- process3() | calls calls calls | setjmp() longjmp() longjmp() | <------+ | | <------+ | ^^^ GOOD | ||| | ||| | ||| NO GOOD | ||| | ||+------+ | |+------+ | +-- process4() ---- process5() ---- process6() calls calls calls longjmp() longjmp() longjmp() This function use the library supplied together with the compiler. For details, see "How to make application program." 5. Variable arguments ( stdarg.h )

------5.1 Initialize arg_ptr. ------

[Name] va_start

[Syntax] #include void va_start( va_list arg_ptr, prev_param ) ;

[Arguments] arg_ptr Pointer to the list of arguments. prev_param Previous argument to the first optional argument.

[Return] ------

[Description] Initialize "arg_ptr" to let it point the first argument of the arguments list. This function is defined as MACRO. There are two definitions of this macro, such as ANSI standard macro defined in stdarg.h and UNIX System V macro defined in varargs.h. Only the ANSI standard macro is defined in C library. This function use the library supplied together with the compiler. For details, see "How to make application program." ------5.2 Get a next argument. ------

[Name] va_arg

[Syntax] #include type va_arg( va_list arg_ptr, type ) ;

[Arguments] arg_ptr Pointer to the list of arguments. type Type of an argument to be gotten.

[Return] Returns an argument pointed by "arg_ptr".

[Description] Returns a value whose type is "type" in a position pointed by "arg_ptr", then increments "arg_ptr" to let it point the next argument in the list. The next argument position is determined by size of "type". More arguments can be gotten using "arg_ptr" repeatedly. This function use the library supplied together with the compiler. For details, see "How to make application program." ------5.3 Reset arg_ptr. ------

[Name] va_end

[Syntax] #include void va_end( va_list arg_ptr ) ;

[Arguments] arg_ptr Pointer to the list of arguments.

[Return] ------

[Description] Initializes "arg_ptr" as NULL. This function use the library supplied together with the compiler. For details, see "How to make application program." 6. Input/output ( stdio.h )

------6.1 Delete a file. ------

[Name] remove

[Syntax] #include int remove( const char *path ) ;

[Arguments] path Pathname of a file to be deleted.

[Return] Returns zero if a file has been successfully deleted. If not, returns -1 and sets an one of following values in the global variable "errno". Symbol Meaning ------+------EACCES Specified file is a Read-Only file. ENOENT Specified file or path does not exist, or "path" is a directory.

[Description] Deletes a file specified by "path". ------6.2 Change the name of a file. ------

[Name] rename

[Syntax] #include int rename( const char *oldname, const char *newname ) ;

[Arguments] oldname Pointer to the old name. newname Pointer to the new name.

[Return] Returns zero if file name has been successfully changed. If not, returns -1 and sets an one of following values in the global variable "errno". Symbol Meaning ------+------EACCES A file or directory whose name is "newname" already exists, "path" is invalid, or a different path is specified in "newname" for a directory. ENOENT Specified file or path does not exist. EXDEV Attempted moving a file to the another device.

[Description] Changes a file name or directory name specified by "oldname" to a new name specified by "newname". The old name must be a path name of a file or a directory which already exists. The new name must not be a path name of a file or a directory which already exists. A file can be moved from some directory to another one by specifying a different path name in "oldname" from "newname". But it is impossible to move a file from some device to the another device. For directory, only renaming is available, moving is not available. (Note) The library of the current version can not move any file. rename() function calling to move a file makes an error. (errno=EACCES) ------6.3 Generate a temporary file name. ------

[Name] tmpnam

[Syntax] #include char *tmpnam( char *string ) ;

[Arguments] string Pointer to a temporary file name.

[Return] Returns a pointer to a generated unique file name if it has been successfully generated. If not, returns NULL.

[Description] Generates a file name by which a temporary file can be opened without overwriting existing files. This name is stored in a buffer pointed by "string". If "strings" is NULL, the result is stored in the internal static buffer. So, the following calling destroy this result. At least buffer size must be larger than L-tmpnam bytes (defined in stdio.h). This function can generate up to TMP_MAX of unique file names. The generated string is composed of a path prefix, such as P_tmpdir define in stdio.h, and following sequence of numeric characters. The values of this numeric string are 1 through 65535. A process of "tmpnam" is not changed by modifying L_tmpnam or P_tmpdir. ------6.4 Close a stream. ------

[Name] fclose

[Syntax] #include int fclose( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] Returns zero if a stream has been successfully closed. If not, returns EOF.

[Description] Closes specified stream. Buffers linked to the stream will be flushed before closing. Buffers allocated by the system will be deallocated. But buffers which has been allocated by user using "setbuf" or "setvbuf" will not be deallocated automatically. ------6.5 Flush a stream buffer. ------

[Name] fflush

[Syntax] #include int fflush( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] Returns zero if a buffer has been successfully flushed. Also if specified stream has no buffer, or it has been opened with Read-Only mode, returns zero. If any error occurs, returns EOF. In this case, any data may be missed because of incorrect writing.

[Description] Flushes specified stream. If specified stream has been opened for output, contents of the buffer are written to the file. If for input, they are cleard. All streams for output are flushed by specifying NULL in argument. Steams will still exist as they are after calling "fflush". Calling "fflush" makes the result of "ungetc" ineffective. Buffers are automatically flushed when a buffer is full, a stream is closed, or program successfully terminated without closing streams. This function does not influence to the streams without buffering. ------6.6 Open a stream. ------

[Name] fopen

[Syntax] #include FILE *fopen( const char *filename, const char *mode ) ;

[Arguments] filename Path name of a file. mode Permitted access type.

[Return] Returns a pointer to the opened file. If any error, returns NULL pointer.

[Description] Opens a file specified by "filename". Specify access type which is requested to the file in "mode".

Type Meaning ------+------r Opens with Read-Only mode. Error if specified file does not exist. w Opens with output mode. Opens an empty file. Contents of the existing file are destroyed. a Opens with output mode, appending to the end of the file. If specified file does not exist, creates it. r+ Opens with both input and output mode. Specified file must exist. w+ Opens an empty file with both input and output mode. Contents of the existing file are destroyed. a+ Opens with both input and output. If no specified file, creates it. Addtionally, the following open mode can also be specified as additional character in the above list. Mode Meaning ------+------t Opens the file in text mode.(default) In this mode, line feed characters are converted as follows. Input CR+LF --> LF Output LF --> CR+LF b Opens the file in binary mode. In this mode, line feed characters are not converted. ------6.7 Re-open a same stream. ------

[Name] freopen

[Syntax] #include FILE *freopen( const char *filename, const char *mode, FILE *stream ) ;

[Arguments] filename Path name of a new file. mode Permitted access type. stream Pointer to a FILE structure.

[Return] Returns a pointer to the newly opened file. If any error, closes a old file and returns NULL pointer.

[Description] Closes a file linked to the stream, then reallocates the stream to the file specified by "filename". This function is usually used to redirect already opened standard input (stdin), standard output (stdout) or standard error output (stderr) to specified file. The new file to be linked the steam is opened with "mode". Specify access type which is requested to the file in "mode". Type Meaning ------+------r Opens with Read-Only mode. Error if specified file does not exist. w Opens with output mode. Opens an empty file. Contents of the existing file are destroyed. a Opens with output mode, appending to the end of the file. If specified file does not exist, creates it. r+ Opens with both input and output mode. Specified file must exist. w+ Opens an empty file with both input and output mode. Contents of the existing file are destroyed. a+ Opens with both input and output. If no specified file, creates it. Addtionally, the following open mode can also be specified as additional character in the above list.

Mode Meaning ------+------t Opens the file in text mode.(default) In this mode, line feed characters are converted as follows. Input CR+LF --> LF Output LF --> CR+LF b Opens the file in binary mode. In this mode, line feed characters are not converted. ------6.8 Set a buffer for stream. ------

[Name] setbuf

[Syntax] #include void setbuf( FILE *stream, char *buffer ) ;

[Arguments] stream Pointer to a FILE structure. buffer Buffer allocated by user.

[Return] ------

[Description] Controls buffering of a stream. Specified stream must be already opened file from/to which any input/output has not been done. Buffering is not performed for the stream if "buffer" is NULL. Otherwise, "buffer" must point a buffer whose size is BUFSIZ. BUFSIZ is a buffer size defined in stdio.h. By calling this function, user defined buffer is used as an input/output buffer instead of system defined one. Functions of "setbuf" is included in "setvbuf". It is recommended to use "setvbuf" for newly made programs. "setbuf" is provided for compatibility with existing programs. ------6.9 Control a buffer for stream. ------

[Name] setvbuf

[Syntax] #include int setvbuf( FILE *stream, char *buffer, int mode, size_t size ) ;

[Arguments] stream Pointer to a FILE structure. buffer Buffer allocated by user. mode Buffering mode. size Buffer size.

[Return] Returns zero if successful. If not (invalid mode or buffer size), returns non-zero.

[Description] Controls buffering and buffer size of stream. Specified stream must be already opened file from/to which any input/output has not been done. Buffer pointed by "buffer" is used unless "buffer" is NULL. If NULL, new buffer whose size is "size" is automatically allocated. "mode" is one of follows. Mode Meaning ------+------_IOFBF Full buffering. "buffer" is a pointer to the buffer, and "size is a size of the buffer. If "buffer" is NULL, new buffer of "size" byte allocated automatically is used. _IONBF No buffer is used regardless of "buffer" and "size". ------6.10 Print formatted data to a stream. ------

[Name] fprintf

[Syntax] #include int fprintf( FILE *stream, const char *format [, argument]... ) ;

[Arguments] stream Pointer to a FILE structure. format Format control string. argument Optional arguments.

[Return] Returns number of characters which have been output. If any error, returns negative value.

[Description] Outputs a series of formatted data to a stream. Each arguments (if exist) are output with conversion according to the format specification in "format". Formats of "format" are same as ones of "printf". See "printf" for details of "format" and "argument". ------6.11 Read formatted data from a stream. ------

[Name] fscanf

[Syntax] #include int fscanf( FILE *stream, const char *format [, argument]... ) ;

[Arguments] stream Pointer to a FILE structure. format Format control string. argument Optional arguments.

[Return] Returns a number of fields converted successfully. This does not includes fields which has been read and not converted. Returns EOF if any error is detected in a stream before the first conversion, or the end of file is detected. Return value zero means that no fields have been converted.

[Description] Reads formatted data to arguments (if exist) from a stream. "argument" are pointer to variables whose types are same as type specification in "format". Formats of "format" are same as "scanf". See "scanf" for details of "format" and "argument". ------6.12 Print formatted data to standard output.

------

[Name] printf

[Syntax] #include int printf( const char *format [, argument]... ) ;

[Arguments] format Format control string. argument Optional arguments.

[Return] Returns number of characters which have been output. If any error, returns negative value.

[Description] Outputs a series of formatted data to the standard output stream (stdout). "format" is composed of ordinary characters, escape sequences and format specifications. Ordinary characters and escape sequences are output to the standard output in order. If any arguments follow the format string, output formatting for the arguments are performed using the format string. The first character of format specification is '%'. Format specification is decoded rightward from the left. The first argument following "format" is output according to the first format specification. The second argument is output according to the second format specification, and so forth. More arguments than the format specifications are ignored. If a number of arguments is short of format specifications, the result of "printf" is not warranted. 1) Format specification format.

% [flags] [width] [.precision] [{h|l|L}] type

type : Type of argument, character, strings or numeric value. flags : Justification, sign, space, decimal point, prefix of octal/hexadecimal number. width : Minimum width of output column. precision : Maximum number of characters output in whole or a part of output field. h,l,L : Size of argument.

2) "type" field specification.

Char Type Output format -----+------+------d int Signed decimal number. i int Signed decimal number. u int Unsigned decimal number. o int Unsigned octal number. x int Unsigned hexadecimal number, using "abcdef". X int Unsigned hexadecimal number, using "ABCDEF". f double Signed floating point value with "[-]dddd.dddd" format. e double Signed floating point value with "[-]d.dddde[sign]ddd" format. E double Signed floating point value with "[-]d.ddddE[sign]ddd" format. g double "f" or "e", shorter one for output string. G double Same as "g" but 'G' before exponent. c int A character. s string String till the first null character(\0) or limit specified by "precision". n pointer to integer A number of characters output up to this point. p pointer to void Address specified by the argument with the format according to the current memory model.

3) "flag" specification flag Meaning Default ------+------+------Left justification. Right justification. + Sign before a value. Only '-' for a negative value. 0 Padding by '0' till the No padding. minimum width. SPACE Leading space to output value. No leading space. # Prefix "0", "0x" or "0X" No prefix. before non-'0' numeric character for 'o','x' or 'X' format. Forced decimal point for 'e', Decimal point if needed. 'E' or 'f' format. Forced decimal point and Decimal point if needed, no-suppressing trailing '0' suppressing trailing '0'. for 'g' or 'G' format. ------6.13 Read formatted data from standard input.

------

[Name] scanf

[Syntax] #include int scanf( const char *format [, argument]... ) ;

[Arguments] format Format control string. argument Optional arguments.

[Return] Returns a number of fields converted successfully. This may be less than the requested number to "scanf". This does not includes fields which has been read and not converted. Returns EOF if any error is detected in a stream before the first conversion, or the end of file is detected. Return value zero means that no fields have been converted.

[Description] Reads formatted data to arguments from the standard input stream (stdin). "argument" are pointer to variables whose types are same as type specification in "format". Format specification controls decoding input fields. Specify one or more of following characters for format specification. * Whitespace -- space(' '), tab('\t'), newline('\n') Skips whitespace characters in input data till the next non-whitespace character. * Non-whitespace character except a percent sign ('%') Skips non-whitespece character which is same as specified one. If the next character in the standard input (stdin) is not same as specified one, process will be terminated. * Format specification following to a percent sign ('%') Reads input characters, and converts to specified type. Converted value is stored in the variable pointed by the argument. 1) Format specification format

% [*] [width] [{h|l}] type

type : Type of input argument, character, strings or numeric value.

width : Maximum number of characters input from standard input. (positive decimal number) More characters than "width" are not converted, and not stored in the argument. When any whitespace character is detected before reaching to "width", or input characters can not be converted according to specified format, only less characters than "width" are read.

h,l : Object size to be read. 'l' is long version and 'h' is short version.

* : Only decoding of input field is performed, but no data is stored in the variable.

2) "type" field specification.

Char Type of input data Type of argument -----+------+------d Decimal number. Pointer to int. o Octal number. Pointer to int. x Hexadecimal number. Pointer to int. i Octal, decimal or hexadecimal Pointer to int. number u Unsigned decimal number Pointer to unsigned int. U Unsigned decimal number Pointer to unsigned long. e,E Floating point number which is Pointer to float. f composed of one or more g,G sequential decimal number with a sign (+,-) and decimal point (optional), exponent('e' or 'E', optional) and signed integer (optional). c Character. Pointer to char. Even whitespace character can be read. To skip whitespace characters, use "%ls". s String. Pointer to character array whose size if enough for both input field and terminating character (null). n Not read from stream or buffer Pointer to int, in which a number of characters input up to this point is stored. p Value with "xxxx:yyyy" format Pointer to (void _far *). 'x' and 'y' are uppercase hexadecimal number. ------6.14 Print formatted data to memory. ------

[Name] sprintf

[Syntax] #include int sprintf( char *buffer, const char *format [, argument]... ) ;

[Arguments] buffer Buffer in which string is stored. format Format control string. argument Optional arguments.

[Return] Returns number of characters which have been stored in the buffer. (The last null character is not counted.)

[Description] Stores a series of formatted data in a buffer. Each arguments (if exist) are stored with conversion according to the format specification in "format". Formats of "format" are same as ones of "printf". See "printf" for details of "format" and "argument". ------6.15 Read formatted data from memory. ------

[Name] sscanf

[Syntax] #include int sscanf( const char *buffer, const char *format [, argument]... ) ;

[Arguments] buffer Stored data. format Format control string. argument Optional arguments.

[Return] Returns a number of fields converted successfully. This does not includes fields which has been read and not converted. Returns EOF if the end of string is detected. Return value zero means that no fields have been converted.

[Description] Reads formatted data to arguments (if exist) from a buffer. "argument" are pointer to variables whose types are same as type specification in "format". Formats of "format" are same as "scanf". See "scanf" for details of "format" and "argument". ------6.16 Print formatted data to a file using variable arguments. ------

[Name] vfprintf

[Syntax] #include #include int vfprintf( FILE *stream, const char *format, va_list argptr ) ;

[Arguments] stream Pointer to a FILE structure. format Format control string. argptr Pointer to a list of arguments.

[Return] Returns number of characters which have been output. If any error, returns negative value.

[Description] Outputs a series of formatted data to a stream. Each arguments are output with conversion according to the format specification in "format". "argptr" is a pointer of va_list type defined in stdarg.h. It points a list of arguments to be converted and output according to format specifications of "format". Formats of "format" are same as ones of "printf". See "printf" for details of "format" and "argument". This function use the library supplied together with the compiler. For details, see "How to make application program." ------6.17 Print formatted data to standard output using variable arguments.

------

[Name] vprintf

[Syntax] #include #include int vprintf( const char *format, va_list argptr ) ;

[Arguments] format Format control string. argptr Pointer to a list of arguments.

[Return] Returns number of characters which have been output. (The last null character is not counted.) If any error, returns negative value.

[Description] Outputs a series of formatted data to the standard output. Each arguments are output with conversion according to the format specification in "format". "argptr" is a pointer of va_list type defined in stdarg.h. It points a list of arguments to be converted and output according to format specifications of "format". Formats of "format" are same as ones of "printf". See "printf" for details of "format" and "argument". This function use the library supplied together with the compiler. For details, see "How to make application program." ------6.18 Print formatted data to memory using variable arguments. ------

[Name] vsprintf

[Syntax] #include #include int vsprintf( char *buffer, const char *format, va_list argptr ) ;

[Arguments] buffer Buffer in which string is stored. format Format control string. argptr Pointer to a list of arguments.

[Return] Returns number of characters which have been stored. (The last null character is not counted.) If any error, returns negative value.

[Description] Stores a series of formatted data in a buffer pointed "buffer". Each arguments are stored with conversion according to the format specification in "format". "argptr" is a pointer of va_list type defined in stdarg.h. It points a list of arguments to be converted and output according to format specifications of "format". Formats of "format" are same as ones of "printf". See "printf" for details of "format" and "argument". This function use the library supplied together with the compiler. For details, see "How to make application program." ------6.19 Read a character from a stream. ------

[Name] fgetc

[Syntax] #include int fgetc( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] Returns a read character. Returns EOF if any error if any error or the end of file is detected. Use "feof" and "ferror" functions to distinguish an error from EOF.

[Description] Reads a character from a file linked to "stream". A character is returned with conversion to int. A file pointer is incremented to point the next character. This function is same as "getc" function and is not a macro but a function. ------6.20 Read a strings from a stream. ------

[Name] fgets

[Syntax] #include char *fgets( char *string, int n, FILE *stream ) ;

[Arguments] string Buffer in which data is stored. n Buffer size. stream Pointer to a FILE structure.

[Return] Returns "string" if successful. Returns NULL if any error or the end of file is detected. Use "feof" and "ferror" functions to distinguish an error from EOF.

[Description] Reads characters from a file linked to "stream" and stores them in "string". Reading is repeated until newline character('\n') is detected, the end of the stream is detected, or a length of read character become equivalent to "n-1". The result is stored in "string" adding null character('\0'). If "n" is 1, "string" is empty (""). This function is similar to "gets" function, but "gets" replaces a newline character to a null character. ------6.21 Write a character to a stream. ------

[Name] fputc

[Syntax] #include int putc( int c, FILE *stream ) ;

[Arguments] c Character to be written. stream Pointer to a FILE structure.

[Return] Returns a written character. If any error, returns EOF.

[Description] Writes a character specified by "c" to an output stream. This function is similar to "putc" function, buf this is a function, not a macro. ------6.22 Write a string to a stream. ------

[Name] fputs

[Syntax] #include int fputs( const char *string, FILE *stream ) ;

[Arguments] string String to be output. stream Pointer to a FILE structure.

[Return] Returns "non-negative value" if successful. If any error, returns EOF.

[Description] Write "strings" to a stream. The terminating character, null character ('\0'), is not output. ------6.23 Read a character from a stream.

------

[Name] getc

[Syntax] #include int getc( FILE *stream ) ;

[Arguments] stream Current stream.

[Return] Returns a read character. Returns EOF if any error or the end of file is detected. Use "feof" and "ferror" functions to distinguish an error from EOF.

[Description] Reads a character from a file linked to "stream". A file pointer is incremented to point the next character. This function is same as "fgetc" function and is not a function but a macro. ------6.24 Read a character from standard input.

------

[Name] getchar

[Syntax] #include int getchar( void ) ;

[Arguments] ------

[Return] Returns a character read from the standard input. Returns EOF if any error or the end of file is detected. Use "feof" and "ferror" functions to distinguish an error from EOF.

[Description] Reads a character from the standard input. This is same as "getc" function. This function is same as "_fgetchar" function but is a macro. ------6.25 Read a line string from standard input.

------

[Name] gets

[Syntax] #include char *gets( char *buffer ) ;

[Arguments] buffer Pointer to a buffer in which input characters are stored.

[Return] Returns address of a buffer specified in argument. Returns NULL if any error or the end of file is detected. Use "feof" and "ferror" functions to distinguish an error from EOF.

[Description] Reads a line from the standard input stream (stdin) and stores it in "buffer". A line is composed of all characters until the first newline character('\n'). A newline character is replaced with a null character('\0'). This function is similar to "fgets" function, buf "fgets" doesn't replace a newline character. ------6.26 Write a character to a stream.

------

[Name] putc

[Syntax] #include int putc( int c, FILE *stream ) ;

[Arguments] c Character to be written. stream Pointer to a FILE structure.

[Return] Returns a written character. If any error, returns EOF.

[Description] Writes a character "c" to an output stream. Any integer value whatever can be specified, but the only lower 8 bits are written. ------6.27 Write a character to standard output.

------

[Name] putchar

[Syntax] #include int putchar( int c ) ;

[Arguments] c Character to be written.

[Return] Returns a written character. If any error, returns EOF.

[Description] Writes a character "c" to the standard output (stdout). This is same as "putc( c, stdout )". ------6.28 Write a string to standard output.

------

[Name] puts

[Syntax] #include int puts( const char *string ) ;

[Arguments] string String to be written.

[Return] Returns "non-positive value" if successful. If any error, returns EOF.

[Description] Writes "string" to the standard output (stdout). The last character of the string, null character('\0'), is replaced with a newline character('\n'). ------6.29 Put a character into a steam. ------

[Name] ungetc

[Syntax] #include int ungetc( int c, FILE *stream ) ;

[Arguments] c Character to be pushed. stream Pointer to a FILE structure.

[Return] Returns a character "c" if successful. Returns EOF if nothing has been read from the stream or the specified character has not be able to pushed into the stream.

[Description] Pushes a character "c" into the stream and clears the end of file indicator. The stream must be opened with "Read mode". The next reading from the stream is processed from "c". If "c" is EOF, it is ignored. The pushed character into the stream will be cleared befer it is read from the stream by calling "fflush", "fseek", "fsetpos" or "rewind" functions. The file position indicator is not changed by this function. If "ungetc" function is used for any text stream, the file pointer is undefined until all pushed characters are read or cleared. If "ungetc" function is used for any binary stream, the file point indicator is set to the previous position. In the case that the value of the file point indicator was zero before calling this function, the value after calling is not warranted. When "ungetc" function is calling twice continuously without any reading, the result is unstable. After calling of "fscanf" function, "ungetc" function will be unsuccessful unless one more reading procedure. (Because "fscanf" function calls "ungetc" function itself.) ------6.30 Read data from a stream. ------

[Name] fread

[Syntax] #include size_t fread( void *buffer, size_t size, size_t count, FILE *stream ) ;

[Arguments] buffer Pointer to a data buffer. size Item size in byte. count Maximum number of item to be read. stream Pointer to a FILE structure.

[Return] Returns number of items which has been read actually. If this value is less than "count", any error or the end of file before reading "count" times might be detected. If any error, the file pointer is undefined. The value read partially is undefined. Use "feof" and "ferror" functions to distinguish an error from EOF. If "size" or "count" is zero, returns zero and doesn't change contents of buffer.

[Description] Reads "count" elements of "size" bytes item from an input stream, and stores into "buffer". The file pointer linked to "stream" (if exists) is incremented by bytes number which has been read actually. If the specified stream is opened with text mode, a pair of carriage return and line feed (CR+LF) is replaced with a line feed character (LF). This conversion doesn't affect the file pointer and the return value. ------6.31 Write data to a stream. ------

[Name] fwrite

[Syntax] #include size_t fwrite( void *buffer, size_t size, size_t count, FILE *stream ) ;

[Arguments] buffer Pointer to a data buffer. size Item size in byte. count Maximum number of item to be written. stream Pointer to a FILE structure.

[Return] Returns number of items which has been written actually. If this value is less than "count", any error might be detected. If any error, the file pointer is undefined.

[Description] Writes "count" elements of "size" bytes item from "buffer" to a output stream. The file pointer linked to "stream" (if exists) is incremented by bytes number which has been written actually. If the specified stream is opened with text mode, a line feed character(LF) is replaced with a pair of carriage return and line feed (CR+LF). This conversion doesn't affect the return value. ------6.32 Get the current file position of a stream. ------

[Name] fgetpos

[Syntax] #include int fgetpos( FILE *stream, fpos_t *pos ) ;

[Arguments] stream Pointer to a FILE structure. pos Pointer to a position indicator to be stored.

[Return] Returns zero if successful. If not, returns non-zero value and sets an one of following values, which are defined in stdio.h, in a global variable "errno". Symbol Meaning ------+------EBADF File handle linked to the specified stream is invalid, or cannot be accessed. EINVAL Specified stream is invalid.

[Description] Gets a file position indicator of the specified stream, and stores it in the buffer pointed by "pos". It is able to restore the pointer of the stream at calling "fgetpos" function by "fsetpos" function using an information stored in "pos". Data format of "pos" is internal one, it is used only by "fgetpos" and "fsetpos" functions. ------6.33 Move the current file pointer. ------

[Name] fseek

[Syntax] #include int fseek( FILE *streem, long offset, int orign ) ;

[Arguments] stream Pointer to a FILE structure. offset Offset from origin in byte. orign Origin position.

[Return] Returns zero if successful. If not, returns non-zero value. For non- seekable devices, returns unstable value.

[Description] Moves a file pointer (if exists) linked to the stream to "offset" bytes position from "orign". The following operations to the stream are performed at this new position. It is possible to both read and write as the next operation to the streams which are opened with updating mode. It is possible to move the pointer to any arbitrary position, also beyond the end of file. Calling this function clears the end of file indicator. "orign" is one of the following constants which are defined in stdio.h. Symbol Meaning ------+------SEEK_CUR Current position. SEEK_END End of file. SEEK_SET Beginning of file. ------6.34 Set the current file position of stream. ------

[Name] fsetpos

[Syntax] #include int fsetpos( FILE *stream, fpos_t *pos ) ;

[Arguments] stream Pointer to a FILE structure. pos Pointer to a position indicator to be stored.

[Return] Returns zero if successful. If not, returns non-zero value and sets an one of following values, which are defined in stdio.h, in a global variable "errno". Symbol Meaning ------+------EBADF File handle linked to the specified stream is invalid, or cannot be accessed. EINVAL Specified stream is invalid.

[Description] Restores a file position indicator of the specified stream to "pos" which has been gotten by the previous "fgetpos" function. This function clears the end of file indicator and cancels the result of "ungetc" function to the stream. Data format of "pos" is internal one, it is used only by "fgetpos" and "fsetpos" functions. ------6.35 Get the current file pointer. ------

[Name] ftell

[Syntax] #include long ftell( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] Returns the current file pointer. If any error, returns -1L and sets an one of following values, which are defined in stdio.h, in a global variable "errno".

Symbol Meaning ------+------EBADF File handle linked to the specified stream is invalid, or cannot be accessed. EINVAL Specified stream is invalid. For non-seekable devices or not opened files, returns unstable value.

[Description] Gets the current file pointer linked to the stream. This value is a offset from the beginning of stream. A file pointer of a stream which is opened with text mode may not coincide with the physical offset, because a pair of carriage return and line feed (CR+LF) is replaced with a line feed character(LF) in text mode. The current file position of the file which has been opened with appending mode is not the next writing position but the last reading/writing operation position. For example, if the last operation to the file which has been opened with appending mode is reading, the file position is not the one in which the next writing operation will be done but the next reading operation. In case that any reading/writing operations have not been done to for appending mode file, the current file position is the beginning of file. ------6.36 Rewind the current file pointer to the top of file. ------

[Name] rewind

[Syntax] #include void rewind( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] ------

[Description] Rewind a file pointer linked to the stream to the beginning of file. "rewind" function clears an error indicator of the stream, but "fseek" doesn't. "rewind" is equivalent to the following "fseek" except above.

(void) fseek ( *stream, 0L, SEEK_SET ) ; Both "rewind" and "fseek" functions clear the end of file indicator. "fseek" function returns a value whether a pointer movement has been done successfully or not, but "rewind" doesn't. It is possible to clear the keyboard buffer by calling "rewind" function to the standard input stream (stdin) linked to the keyboard by default. ------6.37 Reset error indicator of a stream. ------

[Name] clearerr

[Syntax] #include void clearerr( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] ------

[Description] Rests the error indicator and the end of file indicator. The error indicator is not cleared automatically. If once the error indicator of specified stream is set, operations to the stream return the error code until calling one of "clearerr", "fseek", "fsetpos" and "rewind". ------6.38 Test for end-of-file. ------

[Name] feof

[Syntax] #include int feof( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] Returns non-zero value if any input operations have been done beyond the end of file, or zero if not. This function doesn't return any error code.

[Description] Tests whether reaching to the end of stream or not. Any operations after once reaching to the end of steam return the end of file indicator until the stream is closed or one of "clearerr", "fseek", "fsetpos" and "rewind" is called. ------6.39 Test for error on stream. ------

[Name] ferror

[Syntax] #include int ferror( FILE *stream ) ;

[Arguments] stream Pointer to a FILE structure.

[Return] Returns zero if no error on the stream, otherwise non-zero value.

[Description] Test whether any read/write error occurs on a file linked to the stream. If once any error has been occurred, the error indicator of the stream is still ON until the stream is closed or one of "clearerr" and "rewind" functions is called. ------6.40 Print error message.

------

[Name] perror

[Syntax] #include void perror( const char *string ) ;

[Arguments] string Error message to be displayed.

[Return] ------

[Description] Displays an error message to the standard error output (stderr). "string" is displayed first, then a colon (':') and a system error message about the library call which has been occurred the latest error, and last a newline is output. If "string" is NULL pointer or a pointer to null string, only system error message is displayed. A error code is stored in a global variable "errno" defined in errno.h. A system error message is read from "sys_errlist", an array of messages sorted by error code. "perror" function uses "errno" as a index of "sys_errlist" to display an error message. "sys_nerr" variable is the maximum element number of "sys_errlist" array. It is necessary to call "perror" function just after library error to display exactly. Otherwise, the following library calls may overwrite "errno". Values which are stored in "errno" at error are original ones of C Executor. These are not compatible with any PCs (MS-DOS machines, etc.) and may be changed in the future. So, programming that "errno" is handling is not recommended because it may not works correctly in the future. 7. General utilities ( stdlib.h )

------7.1 Convert string to int value. ------

[Name] atoi

[Syntax] #include int atoi( const char *nptr ) ;

[Arguments] nptr Pointer to a string.

[Return] Returns a converted value of int type.

[Description] Converts a strings pointed by "nptr" to integer value. Format of strings is as follows. (whitespaces)(+,-)numeric_characters ------7.2 Convert string to long value. ------

[Name] atol

[Syntax] #include long atol( const char *nptr ) ;

[Arguments] nptr Pointer to a string.

[Return] Returns a converted value of long type.

[Description] Converts a strings pointed by "nptr" to long integer value. Format of strings is as follows. (whitespaces)(+,-)numeric_characters ------7.3 Convert string to long value. ------

[Name] strtol

[Syntax] #include long strtol( const char *nptr, char **endptr, int base ) ;

[Arguments] nptr Pointer to a string. endptr Pointer which points the position where reading is stopped. base Base number.

[Return] Returns a converted value of long type. If overflow, returns LONG_MAX or LONG_MIN and sets ERANGE in a global variable "errno".

[Description] Converts a string pointed by "nptr" to long integer value using "base" as a base number of conversion. Format of strings is as follows. (whitespaces)(+,-)(0)(x,X)(numeric_characters) A pointer which points the position where reading is stopped is stored in "endptr". If "endptr" is NULL, nothing is stored. If a base number is between 2 and 36, conversion is performed using it. If a base number is zero, the top characters decide a base number as follows. if (0)+(0 - 7) then octal else if (0)+(x or X) then hexadecimal else if (1 - 9) then decimal ------7.4 Convert string to unsigned long value. ------

[Name] strtoul

[Syntax] #include unsigned long strtoul( const char *nptr, char **endptr, int base ) ;

[Arguments] nptr Pointer to a string. endptr Pointer which points the position where reading is stopped. base Base number.

[Return] Returns a converted value of unsigned long type. If overflow, returns ULONG_MAX and sets ERANGE in a global variable "errno".

[Description] Converts a string pointed by "nptr" to unsigned long integer value using "base" as a base number of conversion. Format of strings is as follows. (whitespaces)(+,-)(0)(x,X)(numeric_characters) A pointer which points the position where reading is stopped is stored in "endptr". If "endptr" is NULL, nothing is stored. If a base number is between 2 and 36, conversion is performed using it. If a base number is zero, the top characters decide a base number as follows. if (0)+(0 - 7) then octal else if (0)+(x or X) then hexadecimal else if (1 - 9) then decimal ------7.5 Generate pseudo-random number. ------

[Name] rand

[Syntax] #include int rand( void ) ;

[Arguments] ------

[Return] Returns a pseudo random number.

[Description] Returns a pseudo random number between 0 and 32767. "srand" function initializes a series of random number. ------7.6 Seed pseudo-random number generator. ------

[Name] srand

[Syntax] #include void srand( unsigned int seed ) ;

[Arguments] seed Number of new series.

[Return] ------

[Description] Initializes a series of random number generated by "rand" function. ------7.7 Allocate memory block initialized by 0. ------

[Name] calloc

[Syntax] #include void *calloc( size_t num, size_t size ) ;

[Arguments] num Number of elements. size Byte size of element.

[Return] Returns pointer to the allocated space. To get other type pointer than (void *), cast the return value. If insufficient memory, returns NULL.

[Description] Allocates a memory block initialized by zero. That memory block is composed of "num" elements whose size is "size" bytes. Each element is initialized by zero. Test always the return value even if requested memory size is small. ------7.8 Free memory block. ------

[Name] free

[Syntax] #include void free( void *memblock ) ;

[Arguments] memblock Memory block already allocated. If NULL, it is ignored.

[Return] ------

[Description] Frees allocated memory block. "memblock" is a memory block which was already allocated by "calloc", "malloc" or "realloc" function. Byte size to be freed is one which was specified at memory allocation. Deallocated memory block will be used for the next memory allocations. If any invalid pointer is specified, any error may occur in the future allocations. "Invalid pointer" is one which was set without correct allocations. ------7.9 Allocate memory block. ------

[Name] malloc

[Syntax] #include void *malloc( size_t size ) ;

[Arguments] size Byte size to be allocated.

[Return] Returns a void pointer to the allocated memory block. A return value can align with any object type. To get other type pointer than (void *), cast the return value. If insufficient memory, returns NULL.

[Description] Allocates a memory block whose size is "size" bytes at least. More free space than "size" bytes is used for allocation because of a alignment and management information. Test always the return value even if requested memory size is small. ------7.10 Reallocate memory block. ------

[Name] realloc

[Syntax] #include void *realloc( void *memblock, size_t size ) ;

[Arguments] memblock Memory block already allocated. size Byte size to be allocated.

[Return] Returns a void pointer to the reallocated memory block. A return value can align with any object type. To get other type pointer than (void *), cast the return value. If "size" is zero and "memblock" is not NULL, the current block is freed and the return value is NULL. If insufficient memory for reallocation, the current block is kept and the return value is NULL.

[Description] Reallocates the memory block. This changes size of already allocated memory block. If a new block is placed in the other position, contents in the original block is kept. If "memblock" is NULL, "realloc" function works as same as "malloc" function, allocates a new block of "size" bytes. If "size" is not NULL, it must be a pointer which was returned by "calloc", "malloc" or "realloc" function before. If any invalid pointer is specified, any errors may occur by incorrect allocation. ------7.11 Perform binary search. ------

[Name] bsearch

[Syntax] #include void *bsearch( const void *key, const void *base, size_t nmemb, size_t size, int (*compar)( const void *, const void *) ) ;

[Arguments] key Data to be searched. base Pointer to the top of the array. nmemb Element number of the array. size Size of an element of the array. compar Pointer to the user definition function which compares two elements.

[Return] Returns a pointer to the matching element. If not found, returns NULL.

[Description] Searches the specified data in the specified array. The array must be already sorted. "bsearch" function calls "compar" function for searching. The return value of "compar" function must follow the following rule. Return Comparison result ------+------less than 0 1st arg. < 2nd arg. equal to 0 1st arg. = 2nd arg. greater than 0 1st arg. > 2nd arg. ------7.12 Perform quick sort. ------

[Name] qsort

[Syntax] #include void qsort( const void *base, size_t nmemb, size_t size, int (*compar)( const void *, const void *) ) ;

[Arguments] base Pointer to the top of the array (its order will be changed by sorting.) nmemb Element number of the array. size Size of an element of the array. compar Pointer to the user definition function which compares two elements.

[Return] ------

[Description] Performs quick sorting of the specified array. "qsort" function calls "compar" function for searching. The return value of "compar" function must follow the following rule. Return Comparison result ------+------less than 0 1st arg. < 2nd arg. equal to 0 1st arg. = 2nd arg. greater than 0 1st arg. > 2nd arg. ------7.13 Get absolute value. ------

[Name] abs

[Syntax] #include int abs( int j ) ;

[Arguments] j Value which is converted to absolute.

[Return] Returns the absolute value of "j".

[Description] Returns the absolute value of integer "j". ------7.14 Get quotient and remainder. ------

[Name] div

[Syntax] #include struct div_t { int quot ; int rem ; } *div( int numer, int denum ) ;

[Arguments] numer Dividend. denum Divisor.

[Return] Returns a structure "div_t".

[Description] Divides integer value "number" by integer value "denum", and returns the quotient and remander. Zero value as "denum" causes a system error. Check values before calling this. ------7.15 Get absolute value. ------

[Name] labs

[Syntax] #include long labs( long j ) ;

[Arguments] j Value which is converted to absolute.

[Return] Returns the absolute value of "j".

[Description] Returns the absolute value of long integer "j". ------7.16 Get quotient and remainder. ------

[Name] ldiv

[Syntax] #include struct ldiv_t { long quot ; long rem ; } *ldiv( long numer, long denum ) ;

[Arguments] numer Dividend. denum Divisor.

[Return] Returns a structure "ldiv_t".

[Description] Divides long integer value "number" by long integer value "denum", and returns the quotient and remander. Zero value as "denum" causes a system error. Check values before calling this. ------7.17 Convert string to double value. ------

[Name] atof

[Syntax] #include double atof( const char *nptr ) ;

[Arguments] nptr Pointer to a string.

[Return] Returns a converted value of double type.

[Description] Converts a strings pointed by "nptr" to double type value. Format of strings is as follows.

(whitespaces)(+,-)num(.num)((d,D,e,E )(+,-)num) num: numeric_characters ------7.18 Convert string to double value. ------

[Name] strtod

[Syntax] #include double strtod( const char *nptr, char **endptr ) ;

[Arguments] nptr Pointer to a string. endptr Pointer which points the position where reading is stopped.

[Return] Returns a converted value of double type. If overflow, returns +/-HUGE_VAL. If underflow, returns 0. In both case, sets ERANGE in a global variable "errno".

[Description] Converts a string pointed by "nptr" to double type value. Format of strings is as follows. (whitespaces)(+,-)num(.num)((d,D,e,E )(+,-)num) num: numeric_characters A pointer which points the position where reading is stopped is stored in "endptr". If "endptr" is NULL, nothing is stored. 8. String handling ( string.h )

------8.1 Copy a memory block. ------

[Name] memcpy

[Syntax] #include void *memcpy( void *s1, const void *s2, size_t n ) ;

[Arguments] s1 Pointer to the destination. s2 Pointer to the source. n Byte count.

[Return] Returns a pointer as same as "s1".

[Description] Copies "n" byte data from the location specified by "s2" to the location specified by "s1". If the source and the destination are overlapped, the result is undefined. In this case, use "memmove" function. ------8.2 Move a memory block. ------

[Name] memmove

[Syntax] #include void *memmove( void *s1, void *s2, size_t n ) ;

[Arguments] s1 Pointer to the destination. s2 Pointer to the source. n Byte count.

[Return] Returns a pointer as same as "s1".

[Description] Moves "n" byte data from the location specified by "s2" to the location specified by "s1". The memory block is copied correctly even if the source and the destination are overlapped. ------8.3 Copy a string. ------

[Name] strcpy

[Syntax] #include char *strcpy( char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to the destination. s2 Pointer to the source.

[Return] Returns a pointer as same as "s1".

[Description] Copies a string pointed by "s2" to the location pointed by "s1". If the source and the destination are overlapped, the result is undefined. ------8.4 Copy a string. ------

[Name] strncpy

[Syntax] #include char *strncpy( char *s1, const char *s2, size_t n ) ;

[Arguments] s1 Pointer to the destination. s2 Pointer to the source. n Character count.

[Return] Returns a pointer as same as "s1".

[Description] Copies a string of "n" characters pointed by "s2" to the location pointed by "s1". If the length of "s2" string is longer than "n", a null character is not added to the copied string. If the length of "s2" is shorter than "n", null characters are added to the copied string until "n" bytes in total. If the source and the destination are overlapped, the result is undefined. ------8.5 Concatenate a string. ------

[Name] strcat

[Syntax] #include char *strcat( char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to the destination string. s2 Pointer to the string to be concatenated.

[Return] Returns a pointer as same as "s1".

[Description] Concatenates a strings pointed by "s2" to the last of a string pointed by "s1". A null character is added at last. ------8.6 Concatenate a string. ------

[Name] strncat

[Syntax] #include char *strncat( char *s1, const char *s2, size_t n ) ;

[Arguments] s1 Pointer to the destination string. s2 Pointer to the string to be concatenated. n Character count to be concatenated.

[Return] Returns a pointer as same as "s1".

[Description] Concatenates a string of "n" characters pointed by "s2" to the last of a string pointed by "s1". In the case of both the length of "s2" string is longer and shorter than "n", a null character is added to the copied string. This returns a pointer which is specified as "s1". ------8.7 Compare two memory blocks. ------

[Name] memcmp

[Syntax] #include int memcmp( const void *s1, const void *s2, size_t n ) ;

[Arguments] s1 Pointer to a memory block to be compared. s2 Pointer to a memory block to be compared. n Byte count to be compared.

[Return] Returns the comparison result.

Return Comparison result ------+------< 0 s1 < s2 = 0 s1 = s2 > 0 s1 > s2

[Description] Compare "n" byte data in the location pointed by "s1" with one by "s2". ------8.8 Compare two strings. ------

[Name] strcmp

[Syntax] #include int strcmp( const char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to a string to be compared. s2 Pointer to a string to be compared.

[Return] Returns the comparison result. Return Comparison result ------+------< 0 s1 < s2 = 0 s1 = s2 > 0 s1 > s2

[Description] Compares a string pointed by "s1" with one by "s2". ------8.9 Compare two strings. ------

[Name] strncmp

[Syntax] #include int strncmp( const char *s1, const char *s2, size_t n ) ;

[Arguments] s1 Pointer to a string to be compared. s2 Pointer to a string to be compared. n Character count to be compared.

[Return] Returns the comparison result.

Return Comparison result ------+------< 0 s1 < s2 = 0 s1 = s2 > 0 s1 > s2

[Description] Compares "n" characters of a string pointed by "s1" with one by "s2". ------8.10 Find a character in a memory block. ------

[Name] memchr

[Syntax] #include void *memchr( const void *s, int c, size_t n ) ;

[Arguments] s Pointer to a memory block in which data is searched. c Data to be searched. n Character count to be searched.

[Return] Returns a pointer to the first matching data. If not found, returns NULL.

[Description] Searches "c" in "n" bytes of the memory block specified by "s", and returns the location of the first matching data. "c" is converted to "unsigned char". ------8.11 Find a character in a string. ------

[Name] strchr

[Syntax] #include char *strchr( const char *s, int c ) ;

[Arguments] s Pointer to a string in which a character is searched. c Character to be searched.

[Return] Returns a pointer to the first matching location. If not found, returns NULL.

[Description] Searches "c" in a string pointed by "s", and returns the location of the first matching character. "c" is converted to "char". ------8.12 Get string length which doesn't include a character. ------

[Name] strcspn

[Syntax] #include size_t strcspn( const char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to a string. s2 Pointer to a string.

[Return] Returns length from the top of "s1" to the part in which any characters of "s2" are not contained.

[Description] Returns length from the top of string "s1" to the part of "s1" in which any characters included in "s2" are not contained. ------8.13 Find a character position in a string. ------

[Name] strpbrk

[Syntax] #include char *strpbrk( const char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to a string. s2 Pointer to a string.

[Return] Returns a pointer to the first position matching to the one of characters included in string "s2". If not matching character, returns NULL.

[Description] Searches one of characters included in string "s2" from the top of the string "s1", and returns the first matching position. ------8.14 Find the last character in a string. ------

[Name] strrchr

[Syntax] #include char *strrchr( const char *s, int c ) ;

[Arguments] s Pointer to a string in which a character is searched. c Character to be searched.

[Return] Returns a pointer to the last matching location. If not found, returns NULL.

[Description] Searches "c" in a string pointed by "s", and returns the location of the last matching character. "c" is converted to "char". ------8.15 Get string length composed by specified character. ------

[Name] strspn

[Syntax] #include size_t strspn( const char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to a string. s2 Pointer to a string.

[Return] Returns length from the top of "s1" to the part in which one of characters of "s2" is contained.

[Description] Returns length from the top of string "s1" to the part of "s1" in which one of characters included in "s2" is contained. ------8.16 Find a string in a string. ------

[Name] strstr

[Syntax] #include char *strstr( const char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to a string. s2 Pointer to a string.

[Return] Returns a pointer to the first matching location in the string "s1". If not found, returns NULL.

[Description] Searches a string "s1" in a string "s1", and returns the pointer to the first matching location. ------8.17 Get a token. ------

[Name] strtok

[Syntax] #include char *strtok( char *s1, const char *s2 ) ;

[Arguments] s1 Pointer to a string. (is changed by processing) s2 Pointer to a string.

[Return] Returns a pointer to the token. The token is a string terminated by a null character. If no token, returns NULL.

[Description] Divide a string "s1" into tokens using each characters of a string "s2" as delimiters. At the first call, "strtok" searches the first token, and returns a pointer to it. If the first character of the string is any token, "strtok" ignores it. At the following calls, specify NULL as the argument "s1". Note that "strtok" function changes a string "s1". ------8.18 Fill data in a memory block. ------

[Name] memset

[Syntax] #include void *memset( void *s, int c, size_t n ) ;

[Arguments] s Pointer to a memory block in where "c" is filled. c Data to be filled. n Byte count.

[Return] Returns a pointer as same as "s".

[Description] Fills "c" in the "n" byte space from "s". ------8.19 Get string length. ------

[Name] strlen

[Syntax] #include size_t strlen( const char *s ) ;

[Arguments] s Pointer to a string.

[Return] Returns length of string "s".

[Description] Returns length of string "s". 9. Date and time ( time.h )

------9.1 Get the current time. ------

[Name] clock

[Syntax] #include clock_t clock( void ) ;

[Arguments] ------

[Return] Returns the current system time counter.

[Description] Returns the value of the current system time counter. The system time counter is the accumulated count from the system start-up which is counted up every 8 msec. ------9.2 Convert local time to calender time. ------

[Name] mktime

[Syntax] #include time_t mktime( struct tm *timeptr ) ;

[Arguments] timeptr Pointer to a structure "tm".

[Return] Returns a calender tim.

[Description] Converts the local time data pointed by *timeptr to a calender time. The specified structure "tm" is converted to the standard setting. ------9.3 Get the current time. ------

[Name] time

[Syntax] #include time_t time( time_t *timer ) ;

[Arguments] timer Pointer to a time.

[Return] Returns the current time.

[Description] Returns the current time as the accumulated second from 1/1/1970 00:00:00. If "timer" is not NULL, also stores the current time in "*timer". The time returned by this function is read from the calender clock of the CNC device. If the calender clock is not set correctly, -1L is returned. ------9.4 Convert time to string. ------

[Name] asctime

[Syntax] #include char *asctime( const struct tm *timeptr ) ;

[Arguments] timeptr Pointer to a structure "tm".

[Return] Returns a pointer to a converted string.

[Description] Converts a time data pointed by "timeptr" to a string. The format of string is as follows. "Sun Jan 01 00:00:00 1992\n" | | | | | | | | | | | | | | | +- Newline | | | | | | +---- Year | | | | | +------Second | | | | +------Minute | | | +------Hour | | +------Date | +------Month +------Day Stored buffer for a converted string is the same static buffer as "ctime" function. ------9.5 Convert time to string. ------

[Name] ctime

[Syntax] #include char *ctime( const time_t *timer ) ;

[Arguments] timer Pointer to a tiemr.

[Return] Returns a pointer to a converted string.

[Description] Converts a time data pointed by "timer" to a string as the local time. The format of string is as follows. "Sun Jan 01 00:00:00 1992\n" | | | | | | | | | | | | | | | +- Newline | | | | | | +---- Year | | | | | +------Second | | | | +------Minute | | | +------Hour | | +------Date | +------Month +------Day "ctime( timer )" is equivalent to "asctime( localtime( timer ) )". Stored buffer for a converted string is the same static buffer as "asctime" function. ------9.6 Convert time to Greenwich mean time. ------

[Name] gmtime

[Syntax] #include struct tm *gmtime( const time_t *timer ) ;

[Arguments] timer Pointer to a timer.

[Return] Returns a pointer to a converted structure "tm".

[Description] Converts a timer pointed by "*timer" to a structure "tm" which represents the Greenwich Mean Time. The second from 1/1/1970 00:00:00 is stored in "*timer". This value is usually the return value of "time" function. The static buffer for the structure "tm" is shared by "localtime" function. ------9.7 Convert time to local time. ------

[Name] localtime

[Syntax] #include struct tm *localtime( const time_t *timer ) ;

[Arguments] timer Pointer to a timer.

[Return] Returns a pointer to a converted structure "tm".

[Description] Converts a timer pointed by "*timer" to a structure "tm" which represents the local time. The second from 1/1/1970 00:00:00 is stored in "*timer". This value is usually the return value of "time" function. The static buffer for the structure "tm" is shared by "gmtime" function. ------9.8 Compute the difference between the two times. ------

[Name] difftime

[Syntax] #include double difftime( time_t time1, time_t time2 ) ;

[Arguments] time_1 Beginning time. time_2 Ending time.

[Return] Returns elapsed time in second between "time2" through "time1".

[Description] Calculates the difference of time by subtracting "time1" from "time2". 3.2 MS-C extended C standard library ======

Lists of Functions ~~~~~~~~~~~~~~~~~~

------Name Function ------_chdrive Change the current drive. _dos_findfirst Find the first file whose attributes match the specified ones. _dos_findnext Find the next file whose attributes match the specified ones. _dos_getdiskfree Get disk informations. _expand Change a memory block size. _fcalloc Allocate an array initialized by 0 in memory. _fexpand Change a memory block size. _ffree Free a memory block. _fmalloc Allocate a memory block. _fmemchr Find a character in a memory block. _fmemcmp Compare two memory blocks. _fmemcpy Copy a memory block. _fmemicmp Compare two memory blocks ignoring cases. _fmemmove Move a memory block. _fmemset Fill a memory block with a character. _fmsize Get memory block size in heap. _frealloc Reallocate memory block. _fstrcat Concatenate a string. _fstrchr Find a character in a string. _fstrcmp Compare two strings. _fstrcpy Copy a string. _fstrcspn Get string length which doesn't include a character. _fstricmp Compare two strings ignoring cases. _fstrlen Get string length. _fstrlwr Convert string to lowercase. _fstrncat Concatenate a string. _fstrncmp Compare two strings. _fstrncpy Copy a string. _fstrnicmp Compare two strings ignoring cases. _fstrnset Fill a string with a character. _fstrpbrk Find a character position in a string. _fstrrchr Find the last character in a string. _fstrrev Reverse characters in a string. _fstrset Fill a string with a character. _fstrspn Get string length composed by specified character. _fstrstr Find a string in a string. _fstrtok Get a token. _fstrupr Convert string to uppercase. _getdrive Get the current drive. ------Name Function ------_lrotl Rotate an unsigned long left. _lrotr Rotate an unsigned long right. _msize Get memory block size in heap. _rotl Rotate unsigned int left. _rotr Rotate unsigned int right. _tolower Convert to lowercase. _toupper Convert to uppercase. alloca Allocate a memory block in stack. cabs Calculate the absolute value of complex number. chdir Change the current directory. close Close a file. creat Create a file. ecvt Convert double value to string. eof Test the end of file. fcvt Convert floating point value to string. gcvt Convert floating point value and store it in a buffer. getch Get a character from the console. getcwd Get the current directory. hypot Calculate the square root of the sum of two squares. isascii Test for ASCII character. itoa Convert an int value to a string. kbhit Check inputting status of keyboard. lseek Move the current file pointer. ltoa Convert a long value to a string. memicmp Compare two memory blocks ignoring cases. mkdir Create a new directory. open Open a file. read Read data from a file. rmdir Delete a directory. stackavail Get available stack size. strcmpi Compare two strings ignoring cases. stricmp Compare two strings ignoring cases. strlwr Convert string to lowercase. strnicmp Compare two strings ignoring cases. strnset Fill a string with a character. strrev Reverse characters in a string. strset Fill a string with a character. strupr Convert string to uppercase. swab Swap two bytes. tell Get the current position of a file. toascii Convert to a ASCII character. ultoa Convert an unsigned long value to a string. write Write data to a file. btom Count characters. chkctype Determine what the character type of the character of interest is. hantozen Convert a 1-byte character to the corresponding 2-byte character. isalkana Determine whether the character of interest is a half-size alphabetic or katakana character. isalnmkana Determine whether the character of interest is a half-size alphanumeric or katakana character. ------Name Function ------isgrkana Determine whether the character of interest is a printable ASCII character (except a half-size space). iskana Determine whether the character of interest is a printable half-size kana character (except a half-size space). iskanji Determine whether the character of interest is byte 1 of a 2-byte character. iskanji2 Determine whether the character of interest is byte 2 of a 2-byte character. iskmoji Determine whether the character of interest is a half-size katakana character. iskpun Determine whether the character of interest is a half-size kana symbol. ispnkana Determine whether the character of interest is a half-size symbol. isprkana Determine whether the character of interest is a printable character. jisalpha Determine whether the character of interest is a full-size alphabetic character. jisdigit Determine whether the character of interest is a full-size numeric character. jishira Determine whether the character of interest is a full-size hiragana character. jiskata Determine whether the character of interest is a full-size katakana character. jiskigou Determine whether the character of interest is a full-size symbol. jisl0 Determine whether the character of interest is a JIS non-kanji character. jisl1 Determine whether the character of interest is a JIS level 1 kanji character. jisl2 Determine whether the character of interest is a JIS level 2 kanji character. jislower Determine whether the character of interest is a full-size lowercase alphabetic character. jisprint Determine whether the character of interest is a printable character. jisspace Determine whether the character of interest is a full-size space. jistojms Convert a JIS kanji code to the corresponding shifted JIS kanji code. jisupper Determine whether the character of interest is a full-size uppercase alphabetic character. jiszen Determine whether the character of interest is a 2-byte character. jmstojis Convert a shifted JIS kanji code to the corresponding JIS kanji code. jtohira Convert a full-size katakana character to the corresponding full-size hiragana character. jtokata Convert a full-size hiragana character to the corresponding full-size katakana character. jtolower Convert a full-size uppercase alphabetic character to the corresponding full-size lowercase alphabetic character. jtoupper Convert a full-size lowercase alphabetic character to the corresponding full-size uppercase alphabetic character. mtob Determine how many bytes are in a character string. nthctype Determine what the character type of a character in a character string is. zentohan Convert a 2-byte character to the corresponding 1-byte character. ------Refer the function reference of MS-C for detail. "getch" and "kbhit" functions are available in the Main task. The other functions are available in the Main, the Alarm and the Communication tasks. 3.3 Graphic library ======

Usage of graphic functions ~~~~~~~~~~~~~~~~~~~~~~~~~~

1. Kinds of the graphic display device.

C Executor for FS30i supports the following graphic display device. (Refer also "36crt.man".)

(1) VGA Graphic.

This is the display device that is equipped with FS30i. This name is derived from the display control LSI (VGA compatible accelerator chip for PC) used for them. The following 4 display modes are supported.

A. 640x400 dots, 16 colors for each dot, overlapped with the character screen (80-column x 25-line). B. 640x400 dots, 256 colors for each dot, not overlapped with the character screen. C. 640x480 dots, 16 colors for each dot, overlapped with the character screen (80-column x 30-line). D. 640x480 dots, 256 colors for each dot, not overlapped with the character screen. The application program can specify the graphic mode by calling "_setvideomode" function.

2. Kinds of the graphic functions. C Library provides the following two kinds of the graphic functions. (1) MS-C compatible graphic functions These are the compatible functions with the graphic functions included in the MS-C Library. (2) C Executor original graphic functions These are the original graphic functions for C Executor. 3. Open and close graphics.

Call the crt_opengr function before calling of the other graphic functions in the user application. Call the crt_closegr function after a series of graphic drawings. The flow of the processing is as follows.

: if ( crt_opengr() ) { /* open graphics */ /* initialize graphic screen */ _setvideomode( _98RESSCOLOR ) ; : } : : /* graphic drawings */ : crt_closegr() ; /* close graphic */ :

The graphic drawings are not done without execution of the crt_opengr function. ( _GRNOOUTPUT status will be returned.) The screen switching is inhibited during opening graphics. It is enabled to switch the screen by the execution of the crt_setswt( CRT_SWT_GREN ) function before opening graphics, however, the graphics is closed by the screen switching during opening graphics and graphic drawings are not done until the crt_opengr function will be called again even if graphic functions are called. The screen switching request during opening graphics (such as the screen selection by MDI key) is being pending state until the graphics will be closed, and the pending screen switching will be performed when the crt_closegr function is called. * Refer "36crt.man" about crt_opengr, crt_closegr and crt_setswt functions.

4. Multi-window display. The multi-window displaying is not available for graphics. The graphic screen is always displayed on the full screen even if the multi-windows of character are being displayed. Lists of MS-C compatible functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C Executor supports the following MS-C compatible graphic functions.

------Name Function ------1. _arc Draw an arc or an elliptic arc. 2. _clearscreen Clear screen. 3. _ellipse Draw a circle or an ellipse. 4. _floodfill Paint the closed region. 5. _getactivepage Get the current active page number. 6. _getarcinfo Get the information of the previous arc or pie. 7. _getbkcolor Get the current back ground color. 8. _getcolor Get the current fore ground color. 9. _getcurrentpositionGet the current position in the view coordinate. 10. _getfillmask Get the current fill mask pattern. 11. _getfontinfo Get the current font information. 12. _getgtextextent Get the text extent by pixel unit. 13. _getgtextvector Get the output vector of text. 14. _getimage Get screen image. 15. _getkanji Get the font pattern of Kanji character. 16. _getlinestyle Get the current line style. 17. _getphyscoord Convert view coordinate into physical. 18. _getpixel Get color number the pixel. 19. _gettextposition Get the current output position of text. 20. _gettextwindow Get the text window border. 21. _getvideoconfig Get the graphic configuration. 22. _getviewcoord Convert physical coordinate into view. 23. _getvisualpage Get the current visual page number. 24. _getwritemode Get the current writing mode. 25. _grstatus Get the return status of graphic function. 26. _imagesize Get image buffer size. 27. _kanjisize Get font pattern size of Kanji character. 28. _lineto Draw a line. 29. _moveto Move the current graphic output position. 30. _outgtext Draw a text string using the current font. 31. _outmem Draw a text string in a memory. 32. _outtext Output a text string on the current position. 33. _pie Draw a pie figure. 34. _polygon Draw a polygon. 35. _putimage Put image data on the screen. 36. _rectangle Draw a rectangle. 37. _registerfonts Register font file. 38. _remapallpalette Map colors into all color palette. 39. _remappalette Map a color into a color palette. 40. _setactivepage Set the current active page number. 41. _setbkcolor Set the current back ground color. 42. _setcliprgn Set the clipping region. 43. _setcolor Set the current fore ground color. 44. _setfillmask Set the current fill mask pattern. 45. _setfont Set the current font. 46. _setgtextvector Set the current output vector of text. 47. _setlinestyle Set the current line style. 48. _setpixel Draw a pixel. ------Name Function ------49. _settextposition Set the current output position of text. 50. _settextrows Set the text row number. 51. _settextwindow Set the text window. 52. _setvideomode Set the screen video mode. 53. _setvideomoderows Set the screen video mode and text row number. 54. _setvieworg Set the origin of the view port. 55. _setviewport Set the clipping region and the view coordinate. 56. _setvisualpage Set the current visual page number. 57. _setwritemode Set the current writing mode. 58. _unregisterfonts Delete registered font file. 59. _wrapon Enable/disable line wrapping. ------Function Reference ~~~~~~~~~~~~~~~~~~

In the following section, the differences from the graphic functions of MS-C are mainly explained. Refer the function reference manual of MS-C for the details of each functions. The concrete behaviours of each functions which are not clearly mentioned in the reference manual of MS-C are described in "" part of "[Compatibility]" section.

------1. Draw an arc or an elliptic arc.

------

[Name] _arc

[Syntax] #include short _arc( short rsx, short rsy, short rex, short rey, short vsx, short vsy, short vex, short vey ) ;

[Description] Draws an arc or an elliptic arc.

[Compatibility] (1) The following status is not returned by "_grstatus" function after the execution of this function. The output is clipped by view port. : _GRCLIPPED In this case, the same graphic status is return as _GRNOOUTPUT, and the return value of this function is always "0". (Could not draw normally) (2) There may be the difference from specified rectangle by the drawing precision of this function.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Executed in text mode : _GRNOTINPROPERMODE Invalid parameters : _GRINVALIDPARAMETER Not drawn in clipping region : _GRNOOUTPUT ------2. Clear screen.

------

[Name] _clearscreen

[Syntax] #include void _clearscreen( short area ) ;

[Description] Clears specified region and paint it by the current back ground color.

[Compatibility]

(1) "_GWINDOW" is not supported for screen specification because MS-C graphic functions for window are not supported. ------3. Draw a circle or an ellipse.

------

[Name] _ellipse

[Syntax] #include short _ellipse( short fill, short rsx, short rsy, short rex, short rey ) ;

[Description] Draws a circle or an ellipse.

[Compatibility] (1) The following status is not returned by "_grstatus" function after the execution of this function.

The output is clipped by view port. : _GRCLIPPED In this case, the same graphic status is return as _GRNOOUTPUT, and the return value of this function is always "0". (Could not draw normally) However, the right value is not returned in case of the _GFILLINTERIOR attribute is specified. (2) The logical operation of "_setwritemode" is not effective to this function in MS-C, but effective in C Executor. Therefore, the outline (border line) may not be drawn by specified logical color in case that _GFILLINTERIOR is specified and _GPSET is not specified in this function. (3) There may be the difference from specified rectangle by the drawing precision of this function. (4) The painting operation may not be done correctly in case that _GFILLINTERIOR is specfied in this function. (1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function.

Executed successfully : _GROK Executed in text mode : _GRNOTINPROPERMODE Invalid parameters : _GRINVALIDPARAMETER Not painted due to insufficient memory : _GRINSUFFICIENTMEMORY Not drawn in clipping region : _GRNOOUTPUT ------4. Paint the closed region.

------

[Name] _floodfill

[Syntax] #include short _floodfill( short sx, short sy, short boundary ) ;

[Description] Paints the region, where is enclosed by specified border color, by the current fill mask pattern.

[Compatibility] (1) The error status is not returned in case that the start point is specified out of clipping region.

(2) The painting may not be execute correctly in case that the same color region as the current color exists in the enclosed region. ------5. Get the current active page number.

------

[Name] _getactivepage

[Syntax] #include short _getactivepage( void ) ;

[Description] Gets the page number of the plane to be drawn.

[Compatibility] This function is compatible with the "_getactivepage" function of MS-C. ------6. Get the information of the previous arc or pie.

------

[Name] _getarcinfo

[Syntax] #include short _getarcinfo( struct _xycoord *start, struct _xycoord *end, struct _xycoord *fillpoint ) ;

[Description] Gets the view port coordinates of the arc or pie which has been drawn just previously, and gets the start coordinate to paint a pie.

[Compatibility]

(1) This function gets the actual drawing start and end coordinates.

(2) The painting start coordinate may be different from what MS-C calculates because the calculation method is different between C-EXE and MS-C.

(1) The start point to paint a pie is calculated by supposing the closed region of the arc which is drawn by the start and end points as same as MS-C. ------7. Get the current back ground color.

------

[Name] _getbkcolor

[Syntax] #include long _getbkcolor( void ) ;

[Description] Gets the current back ground color.

[Compatibility]

(1) In MS-C, the actual behaviour of this function is not corresponding to the explanation in the reference manual. In C Executor, the value of palette 0 or index is returned according to the explanation of the manual.

(2) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed in text mode : _GRNOTINPROPERMODE

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK ------8. Get the current fore ground color.

------

[Name] _getcolor

[Syntax] #include short _getcolor( void ) ;

[Description] Gets the palette number of the current fore ground color.

[Compatibility] This function is compatible with the "_getcolor" function of MS-C. ------9. Get the current position in the view coordinate.

------

[Name] _getcurrentposition

[Syntax] #include struct _xycoord _getcurrentposition( void ) ;

[Description] Gets the current position in the view coordinate.

[Compatibility] This function is compatible with the "_getcurrentposition" function of MS-C. ------10. Get the current fill mask pattern.

------

[Name] _getfillmask

[Syntax] #include unsigned char *_getfillmask( unsigned char *mask ) ;

[Description] Gets the current fill mask pattern.

[Compatibility]

(1) In C Executor, "_setfillmask" sets the fill mask pattern as the default status when the mask data is "full(-1)" for the painting performance. Therefore, this function may return NULL as the return value if any fill mask pattern is registered. ------11. Get the current font information.

------

[Name] _getfontinfo

[Syntax] #include short _getfontinfo( struct _fontinfo *fontbuffer ) ;

[Description] Gets the current font information and stores it in the buffer.

[Compatibility]

(1) Font name. This function returns the font name of ANK character set. When Kanji character set is defined, this returns "standard".

(2) Font filename. This function returns the font name. ------12. Get the text extent by pixel unit.

------

[Name] _getgtextextent

[Syntax] #include short _getgtextextent( unsigned char *text ) ;

[Description] Gets the extent of the specified font by pixel unit on the current font information

[Compatibility] This function is compatible with the "_getgtextextent" function of MS-C. ------13. Get the output vector of text.

------

[Name] _getgtextvector

[Syntax] #include struct _xycoord _getgtextvector( void ) ;

[Description] Gets the output vector of the font text.

[Compatibility] This function is compatible with the "_getgtextvector" function of MS-C. ------14. Get screen image.

------

[Name] _getimage

[Syntax] #include void _getimage( short rsx, short rsy, short rex, short rey, char *image ) ;

[Description] Gets the screen image and stores it in memory.

[Compatibility] (1) The maximum image size is 64K bytes because "huge" data is unavailable in C Executor.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Could not store the image : _GRERROR Executed in text mode : _GRNOTINPROPERMODE The left-top and the right-bottom : _GRPARAMETERALTERED coordinates are exchanged. ------15. Get the font pattern of Kanji character.

------

[Name] _getkanji

[Syntax] #include short _getkanji( unsigned short code, unsigned char *image ) ;

[Description] Gets the font pattern of the specified Kanji character.

[Compatibility] The character pattern format of MS-C for PC-9800 series and for PC-AT are different each other. This function adopts the PC-9800 format. The storing order of the character pattern array is as follows.

76543210 76543210 ...... # ...#.... .##..### ######.. ...#...# ...#...... ## #####... .##...#. .#..#...... #..## #####...... #...... #..## #####...... #.... .#...... #.### ######.. ..#..... #.#...... #....# ...#.... .##..##. ....##...... The left-half is stored 1st, then the right-half. Binary data stored actually. 0x10,0x10, 0x00,0x01,0x67,0x11,0x03,0x62,0x13,0x00, 0x13,0x10,0x17,0x20,0x21,0x66,0x00,0x00, 0x00,0x10,0xfc,0x10,0xf8,0x48,0xf8,0x40, 0xf8,0x40,0xfc,0xa0,0x10,0x0c,0x00,0x00 [Remarks] Use "crt_reguserchar" function to register the font pattern. ------16. Get the current line style.

------

[Name] _getlinestyle

[Syntax] #include unsigned short _getlinestyle( void ) ;

[Description] Gets the current line style.

[Compatibility] This function is compatible with the "_getlinestyle" function of MS-C. ------17. Convert view coordinate into physical.

------

[Name] _getphyscoord

[Syntax] #include struct _xycoord _getphyscoord( short x, short y ) ;

[Description] Converts the view coordinate into the physical coordinate.

[Compatibility] This function is compatible with the "_getphyscoord" function of MS-C. ------18. Get color number the pixel.

------

[Name] _getpixel

[Syntax] #include short _getpixel( short x, short y ) ;

[Description] Gets the color number of the specified pixel.

[Compatibility] This function is compatible with the "_getpixel" function of MS-C. ------19. Get the current output position of text.

------

[Name] _gettextposition

[Syntax] #include struct _rccoord _gettextposition( void ) ;

[Description] Gets the current output position of the text.

[Compatibility] This function is compatible with the "_gettextposition" function of MS-C. ------20. Get the text window border.

------

[Name] _gettextwindow

[Syntax] #include void _gettextwindow( short *r1, short *c1, short *r2, short *c2 ) ;

[Description] Gets the window border of the current text window.

[Compatibility] This function is compatible with the "_gettextwindow" function of MS-C. ------21. Get the graphic configuration.

------

[Name] _getvideoconfig

[Syntax] #include struct videoconfig *_getvideoconfig( struct videoconfig *config ) ;

[Description] Gets the information of the hardware about the graphic environment.

[Compatibility] (1) The installation status of VRAM for analog mode. _98EGA(4000H) is set as fixed value for PC-98's video mode. _VGA(0008H) is set as fixed value for the VGA Graphic and PC-AT's video mode. ------22. Convert physical coordinate into view.

------

[Name] _getviewcoord

[Syntax] #include struct _xycoord _getviewcoord( short x, short y ) ;

[Description] Converts the physical coordinate into the view coordinate.

[Compatibility] This function is compatible with the "_getviewcoord" function of MS-C. ------23. Get the current visual page number.

------

[Name] _getvisualpage

[Syntax] #include short _getvisualpage( void ) ;

[Description] Gets the page number of the currently displayed page.

[Compatibility] This function is compatible with the "_getvisualpage" function of MS-C. ------24. Get the current writing mode.

------

[Name] _getwritemode

[Syntax] #include short _getwritemode( void ) ;

[Description] Gets the current logical writing mode.

[Compatibility] This function is compatible with the "_getwritemode" function of MS-C. ------25. Get the return status of graphic function.

------

[Name] _grstatus

[Syntax] #include short _grstatus( void ) ;

[Description] Gets the status of the graphic function which has been executed just before.

[Compatibility] This function is compatible with the "_grstatus" function of MS-C. ------26. Get image buffer size.

------

[Name] _imagesize

[Syntax] #include long _imagesize( short rsx, short rsy, short rex, short rey ) ;

[Description] Returns the required buffer size for storing the specified image data by byte unit.

[Compatibility] This function is compatible with the "_imagesize" function of MS-C. ------27. Get font pattern size of Kanji character.

------

[Name] _kanjisize

[Syntax] #include short _kanjisize( short code ) ;

[Description] Returns the required buffer size for storing the specified font pattern by byte unit.

[Compatibility] This function is compatible with the "_kanjisize" function of MS-C. ------28. Draw a line.

------

[Name] _lineto

[Syntax] #include short _lineto( short x, short y ) ;

[Description] Draws a line from the current pixel cursor to the specified coordinate.

[Compatibility] (1) The following status is not returned by "_grstatus" function after the execution of this function.

The output is clipped by view port. : _GRCLIPPED In this case, the same graphic status is return as _GRNOOUTPUT, and the return value of this function is always "0". (Could not draw normally)

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Executed in text mode : _GRNOTINPROPERMODE Not drawn in clipping region : _GRNOOUTPUT ------29. Move the current graphic output position.

------

[Name] _moveto

[Syntax] #include struct xycoord _moveto( short x, short y ) ;

[Description] Moves the current graphic output position to the specified coordinate.

[Compatibility] This function is compatible with the "_moveto" function of MS-C. ------30. Draw a text string using the current font.

------

[Name] _outgtext

[Syntax] #include void _outgtext( unsigned char *text ) ;

[Description] Draws a text string on the specified pixel position of the screen using the current font.

[Compatibility] This function is compatible with the "_outgtext" function of MS-C. ------31. Draw a text string in a memory.

------

[Name] _outmem

[Syntax] #include void _outmem( char *text, short length ) ;

[Description] Draws a text string of the specified length stored in the specified memory buffer.

[Compatibility] (1) The text string is displayed using text character. The graphic output is not used.

(2) The control code for only '\n' is processed in the text window. The other contorl code such as '\t' is not processed. (3) Nothing is done in case of graphic mode. ------32. Output a text string on the current position.

------

[Name] _outtext

[Syntax] #include void _outtext( char *text ) ;

[Description] Outputs a text string on the current text position.

[Compatibility]

(1) The text string is displayed using text character. The graphic output is not used. (2) The control code for only '\n' is processed in the text window. The other contorl code such as '\t' is not processed. (3) Nothing is done in case of graphic mode. ------33. Draw a pie figure.

------

[Name] _pie

[Syntax] #include short _pie( short fill, short rsx, short rsy, short rex, short rey, short vsx, short vsy, short vex, short vey ) ;

[Description] Draws a pie figure.

[Compatibility] (1) The following status is not returned by "_grstatus" function after the execution of this function.

The output is clipped by view port. : _GRCLIPPED In this case, the same graphic status is return as _GRNOOUTPUT, and the return value of this function is always "0". (Could not draw normally) However, the right value is not returned in case of the _GFILLINTERIOR attribute is specified. (2) The logical operation of "_setwritemode" is not effective to this function in MS-C, but effective in C Executor. Therefore, the outline (border line) may not be drawn by specified logical color in case that _GFILLINTERIOR is specified and _GPSET is not specified in this function. (3) There may be the difference from specified rectangle by the drawing precision of this function.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Executed in text mode : _GRNOTINPROPERMODE Invalid parameters : _GRINVALIDPARAMETER Not painted due to insufficient memory : _GRINSUFFICIENTMEMORY Not drawn in clipping region : _GRNOOUTPUT ------34. Draw a polygon.

------

[Name] _polygon

[Syntax] #include short _polygon( short fill, struct xycoord *points, short numpoints ) ;

[Description] Draws a polygon or paints it.

[Compatibility] (1) The following status is not returned by "_grstatus" function after the execution of this function.

The output is clipped by view port. : _GRCLIPPED In this case, the same graphic status is return as _GRNOOUTPUT, and the return value of this function is always "0". (Could not draw normally) However, the right value is not returned in case of the _GFILLINTERIOR attribute is specified. (2) The maximum number of apexes which is available in this function is 1024. (3) The painting operation is not performed even if _GFILLINTERIOR is specified in this function.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Executed in text mode : _GRNOTINPROPERMODE Invalid parameters : _GRINVALIDPARAMETER Not painted due to insufficient memory : _GRINSUFFICIENTMEMORY Not drawn in clipping region : _GRNOOUTPUT ------35. Put image data on the screen.

------

[Name] _putimage

[Syntax] #include void _putimage( short sx, short sy, char *image, short action ) ;

[Description] Reads image data from the memory and draws it on the screen.

[Compatibility]

(1) The following status is not returned by "_grstatus" function after the execution of this function. The output is clipped by view port. : _GRCLIPPED

In this case, the same graphic status is return as _GRNOOUTPUT, and the return value of this function is always "0". (Could not draw normally) (2) If a part of the specified graphic image protrudes out of the clipping region, this function draws only image data in the clipping region.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Executed in text mode : _GRNOTINPROPERMODE Invalid parameters : _GRINVALIDPARAMETER Not executed due to insufficient memory : _GRINSUFFICIENTMEMORY Not drawn in clipping region : _GRNOOUTPUT ------36. Draw a rectangle.

------

[Name] _rectangle

[Syntax] #include short _rectangle( short fill, short rsx, short rsy, short rex, short rey ) ;

[Description] Draws a rectangle or paints it.

[Compatibility] (1) The following status is not returned by "_grstatus" function after the execution of this function.

The output is clipped by view port. : _GRCLIPPED In this case, the same graphic status is return as _GRNOOUTPUT, and the return value of this function is always "0". (Could not draw normally) However, the right value is not returned in case of the _GFILLINTERIOR attribute is specified. (2) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. The left-top and the right-bottom : _GRPARAMETERALTERED coordinates are exchanged.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Executed in text mode : _GRNOTINPROPERMODE Invalid parameters : _GRINVALIDPARAMETER Not painted due to insufficient memory : _GRINSUFFICIENTMEMORY Not drawn in clipping region : _GRNOOUTPUT ------37. Register font file.

------

[Name] _registerfonts

[Syntax] #include short _registerfonts( unsigned char *pathname ) ;

[Description] Registers font file and initializes the font library.

[Compatibility]

(1) This function doesn't check the specified file pathname. Therefore, the return value of the "_grstatus" function is always "_GROK". The return value of this function is always "1".

(2) This function doesn't actually register the font file.

(1) It is required to call this function before outputting text strings using "_outgtext" function. If this function has not been called, "_outgtext" output nothing. ------38. Map colors into all color palette.

------

[Name] _remapallpalette

[Syntax] #include short _remapallpalette( long *colors ) ;

[Description] Changes color values of all color palettes.

[Compatibility]

(1) In MS-C, the actual behaviour of this function is not corresponding to the explanation in the reference manual. In C Executor, this function returns "0" for successfully execution according to the explanation of the manual. "Abnormal ended" never occured. This function sets the suitable number of the color palettes provided on the current video mode.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK

[Remarks] When the video mode is "_98RES16COLOR(101)", the number of the color palette is 256 in C Executor, but this function changes only 16 palettes for compatibility with MS-C. ------39. Map a color into a color palette.

------

[Name] _remappalette

[Syntax] #include long _remappalette( short index, long color ) ;

[Description] Changes color value of the specified color palette.

[Compatibility]

(1) In MS-C, the actual behaviour of this function is not corresponding to the explanation in the reference manual. In C Executor, this function returns the color value according to the explanation of the manual when palette #0 is changed by setting of background color.

(2) In MS-C, the return value for successfully execution is always previos set color value regardless of the current video mode, but this function always returns the color value just before execution of this function in C Executor. That is, this function doesn't return 0 but the initial setting value for the 1st calling.

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK Invalid palette number : _GRINVALIDPARAMETER ------40. Set the current active page number.

------

[Name] _setactivepage

[Syntax] #include short _setactivepage( short page ) ;

[Description] Sets the graphic plane to be drawn.

[Compatibility] This function is compatible with the "_setactivepage" function of MS-C. ------41. Set the current back ground color.

------

[Name] _setbkcolor

[Syntax] #include long _setbkcolor( long color ) ;

[Description] Sets the current back ground color.

[Compatibility]

(1) In MS-C, the actual behaviour of this function is not corresponding to the explanation in the reference manual. In C Executor, the value of palette 0 or index is returned according to the explanation of the manual.

(2) The following status is not returned by "_grstatus" function after the execution of this function. _GRPARAMETERALTERED

(1) The following graphic statuses are returned by the "_grstatus" function after the execution of this function. Executed successfully : _GROK ------42. Set the clipping region.

------

[Name] _setcliprgn

[Syntax] #include void _setcliprgn( short rsx, short rsy, short rex, short rey ) ;

[Description] Sets the clipping region for the graphic output.

[Compatibility] This function is compatible with the "_setcliprgn" function of MS-C. ------43. Set the current fore ground color.

------

[Name] _setcolor

[Syntax] #include short _setcolor( short color ) ;

[Description] Sets the color which is corresponding to the specified palette number as the current color.

[Compatibility] This function is compatible with the "_setcolor" function of MS-C. ------44. Set the current fill mask pattern.

------

[Name] _setfillmask

[Syntax] #include void _setfillmask( unsigned char *mask ) ;

[Description] Sets the current fill mask pattern.

[Compatibility]

(1) In C Executor, this function sets the fill mask pattern as the default status when the mask data is "full(-1)" for the painting performance. ------45. Set the current font.

------

[Name] _setfont

[Syntax] #include short _setfont( unsigned char *options ) ;

[Description] Sets the current font for "_outgtext" function.

[Compatibility]

(1) Only option "t" (Set fontname) is supported.

(2) Specify the typename placed in single quotation marks ('') after the option "t". The available typenames are as follows. ------Typename Character set ------standard ANK character set (Standard) graph1 ANK character set (Graphic 1) graph2 ANK character set (Graphic 2) graph3 ANK character set (Graphic 3) large ANK character set (Large character) micro ANK character set (Small character) fanuc Kanji character set (FANUC Kanji set) (3) The return code is always "1". ------46. Set the current output vector of text.

------

[Name] _setgtextvector

[Syntax] #include struct _xycoord _setgtextvector( short x, short y ) ;

[Description] Sets the current output vector of the font text.

[Compatibility]

(1) In MS-C, it is possible to specify such as 45[deg](1,1), but impossible in C Executor. "_GRERROR" is returned by "_grstatus" function for the invalid setting values which are not described in the reference manual.

The available output directions are as follows. Only "sign" of value has a significance. ------( x, y ) Output direction ------( 0, 0 ) Not changed. ( 1, 0 ) Horizontal. (default) ( 0, 1 ) Rotated 90[deg] to CCW. (-1, 0 ) Rotated 180[deg]. ( 0,-1 ) Rotated 247[deg] to CCW. ------47. Set the current line style.

------

[Name] _setlinestyle

[Syntax] #include void _setlinestyle( unsigned short mask ) ;

[Description] Sets the current line style.

[Compatibility] This function is compatible with the "_setlinestyle" function of MS-C. ------48. Draw a pixel.

------

[Name] _setpixel

[Syntax] #include short _setpixel( short x, short y ) ;

[Description] Draws a pixel in specified position by the current color.

[Compatibility] This function is compatible with the "_setpixel" function of MS-C. ------49. Set the current output position of text.

------

[Name] _settextposition

[Syntax] #include struct _rccoord _settextposition( short row, short column ) ;

[Description] Move the current position for outputting text.

[Compatibility] This function is compatible with the "_settextposition" function of MS-C. ------50. Set the text row number.

------

[Name] _settextrows

[Syntax] #include short _settextrows( short rows ) ;

[Description] Sets the text row number.

[Compatibility]

(1) The maximum line number of each video mode is set for every specification.

(1) The maximum line number of the video mode is set by specifying "_MAXTEXTROWS(-1)". (2) "_grstatus" function returns "_GRINVALIDPARAMETER" if "rows" is negative. (3) "_grstatus" function returns "_GRPARAMETERALTERED" if the correct parameter is specified or the current video mode is not text mode. ------51. Set the text window.

------

[Name] _settextwindow

[Syntax] #include void _settextwindow( short r1, short c1, short r2, short c2 ) ;

[Description] Sets the current text window.

[Compatibility]

(1) It is impossible to scroll the contents of the text window.

[Remarks] The "crt_setmode" function makes the current text window ineffective. ------52. Set the screen video mode.

------

[Name] _setvideomode

[Syntax] #include short _setvideomode( short mode ) ;

[Description] Selects the display mode of the screen.

[Compatibility]

(1) Specify one of the following video modes. When any mode including parentheses is specified, this function returns "0" (error), but the initialization of graphic screen is done correctly. (In this case, the "_grstatus()" function returns "_GRMODENOTSUPPORTED".) VGA Graphic ------Mode Size(Text) Palette (Color mode) ------_98RESS16COLOR 640x400(80x25) 16 colors (PC-98) _98RESS8COLOR (_98RESSCOLOR) ------_98RES16COLOR 640x400 256 colors (PC-98) _98RES8COLOR (_98RESCOLOR) ------_VRES16COLOR 640x480(80x30) 16 colors (PC-AT) _VRES16EXCOLOR ------_VRES256COLOR 640x480 256 colors (PC-AT) ------_98TEXT80 Text mode(80x25) 16 colors _TEXTC80 ------This function sets the following modes for "_DEFAULTMODE", "_MAXCOLORMODE" or "_MAXRESMODE". ------Mode VGA Graphic ------_DEFAULTMODE _98TEXT80,_TEXTC80 _MAXCOLORMODE _VRES256COLOR _MAXRESMODE _VRES16COLOR ------(2) Use "_CEXERES16COLOR" mode for arbitrary plane size and text mode. Symbol "_CEXERES16COLOR" is definded in "graph.h".

For the setting of this mode, the function syntax is changed as follows.

#include #include short _setvideomode( _CEXERES16COLOR, short origin, short height, short TXmode ) ;

origin The origin of the graphic plane in Y direction. height The origin of the graphic plane in X direction. TXmode The text mode.

Specify one of following mode for the text mode. CRT_MODE_V25_0 80-column x 25-line (starting line: 1) CRT_MODE_V25_1 80-column x 25-line (starting line: 2) CRT_MODE_V25_2 80-column x 25-line (starting line: 3) CRT_MODE_V25_3 80-column x 25-line (starting line: 4) CRT_MODE_V25_4 80-column x 25-line (starting line: 5) CRT_MODE_V25_5 80-column x 25-line (starting line: 6) CRT_MODE_V30 80-column x 30-line These text mode symbols are defined in "crt.h". "_CEXERES16COLOR" mode is similar to "_VRES16COLOR" mode except the variable display size. (3) If non-supported mode is specified, "_GRMODENOTSUPPORTED" is returned by the "_grstatus" function. This is originally the return value when the analog video mode is specified without analog VRAM system. (4) The cursor current position is initialized and moved to the home position after the execution of this function.

If the text screen mode (column or line number in the screen) is changed by this function, the text screen environment is initialized (as same as "crt_setmode" does), and all setting about text screen are set as initial state. Set the text screen environment (cursor display mode, character set, etc.) if necessary.

[Remarks] Use "crt_setmode" function or "_setvideomode( _CEXRES16COLOR,.. )" to change the text mode. ------53. Set the screen video mode and text row number.

------

[Name] _setvideomoderows

[Syntax] #include short _setvideomoderows( short mode, short rows ) ;

[Description] Sets the video mode for the text operation and sets the text row number.

[Compatibility] (1) The details of the video mode are different from MS-C's. Refer "_setvideomode" function for more information. "_CEXERES16COLOR" mode is not allowed in this function.

(2) The text row number is always set as the maximum line number of the specified video mode even if any "rows" is specified. (3) If non-supported mode is specified, "_GRMODENOTSUPPORTED" is returned by the "_grstatus" function. This is originally the return value when the analog video mode is specified without analog VRAM system. (4) The cursor current position is initialized and moved to the home position after the execution of this function.

[Remarks] Use "crt_setmode" function to change the text mdoe. ------54. Set the origin of the view port.

------

[Name] _setvieworg

[Syntax] #include struct xycoord _setvieworg( short x, short y ) ;

[Description] Moves the origin of the view port to the specified physical position.

[Compatibility] This function is compatible with the "_setvieworg" function of MS-C. ------55. Set the clipping region and the view coordinate.

------

[Name] _setviewport

[Syntax] #include void _setviewport( short rsx, short rsy, short rex, short rey ) ;

[Description] Restricts to the graphic output in the specified region on the screen and sets the origin of the viewport coordinate on its left-upper corner.

[Compatibility] This function is compatible with the "_setviewport" function of MS-C. ------56. Set the current visual page number.

------

[Name] _setvisualpage

[Syntax] #include short _setvisualpage( short page ) ;

[Description] Set the page number of the currently displayed page.

[Compatibility] This function is compatible with the "_setvisualpage" function of MS-C. ------57. Set the current writing mode.

------

[Name] _setwritemode

[Syntax] #include short _setwritemode( short action ) ;

[Description] Sets the current logical writing mode.

[Compatibility]

(1) The effectivity of the logical writing mode is different between PC-98's MS-C and PC-AT's. In C Executor, the effectivity of the logical writing mode is as follows.

( x: effective o: ineffective blank: N/A ) ------Name Function Drawing Painting ------_setpixel Draw a pixel. x _arc Draw an arc or an elliptic arc. x _lineto Draw a line. x _ellipse Draw a circle or an ellipse. x o _pie Draw a pie figure. x o _polygon Draw a polygon. x _rectangle Draw a rectangle. x x _floodfill Paint the closed region. o ------58. Delete registered font file.

------

[Name] _unregisterfonts

[Syntax] #include void _unregisterfonts( void ) ;

[Description] Delete registered font file and free the font library memory.

[Compatibility]

(1) This function doesn't actually delete font file.

(1) "_outgtext" function outputs nothing after calling this function. "_registerfonts" function must be called to output text string by "_outgtext" function again. ------59. Enable/disable line wrapping.

------

[Name] _wrapon

[Syntax] #include short _wrapon( short option ) ;

[Description] Enable or disable wrapping of the text line.

[Compatibility] This function is compatible with the "_wrapon" function of MS-C. MS-C graphic function compatibility list ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

"x" mark: Available Blank: NOT available C-Card : Character-card

------Name Function VGA C-Card ------+----+------_arc Draw an arc or an elliptic arc. x _clearscreen Clear screen. x _displaycursor Enable/disable the cursor. _ellipse Draw a circle or an ellipse. x _floodfill Paint the closed region. x _getactivepage Get the current active page number. x _getarcinfo Get the information of the previous x arc or pie. _getbkcolor Get the current back ground color. x _getcolor Get the current fore ground color. x _getcurrentposition Get the current position in the view x coordinate. _getfillmask Get the current fill mask pattern. x _getfontinfo Get the current font information. x _getgtextextent Get the text extent by pixel unit. x _getgtextvector Get the output vector of text. x _getimage Get screen image. x _getkanji Get the font pattern of Kanji character. x _getlinestyle Get the current line style. x _getphyscoord Convert view coordinate into physical. x _getpixel Get color number the pixel. x _gettextcolor Get the current text color. _gettextcursor Get the current cursor attribute. _gettextposition Get the current output position of text. x _gettextwindow Get the text window border. x _getvideoconfig Get the graphic configuration. x _getviewcoord Convert physical coordinate into view. x _getvisualpage Get the current visual page number. x _getwritemode Get the current writing mode. x _grstatus Get the return status of graphic x function. _imagesize Get image buffer size. x _kanjisize Get font pattern size of Kanji character. x _lineto Draw a line. x _moveto Move the current graphic output position. x _outgtext Draw a text string using the current font. x _outmem Draw a text string in a memory. x _outtext Output a text string on the current x position. _pie Draw a pie figure. x _polygon Draw a polygon. x _putimage Put image data on the screen. x _rectangle Draw a rectangle. x _registerfonts Register font file. x _remapallpalette Map colors into all color palette. x _remappalette Map a color into a color palette. x _scrolltextwindow Scroll the contents in the text window. _setactivepage Set the current active page number. x _setbkcolor Set the current back ground color. x _setcliprgn Set the clipping region. x ------Name Function VGA C-Card ------+----+------_setcolor Set the current fore ground color. x _setfillmask Set the current fill mask pattern. x _setfont Set the current font. x _setgtextvector Set the current output vector of text. x _setlinestyle Set the current line style. x _setpixel Draw a pixel. x _settextcolor Set the current text color. _settextcursor Set the current cursor attribute. _settextposition Set the current output position of text. x _settextrows Set the text row number. x _settextwindow Set the text window. x _setvideomode Set the screen video mode. x _setvideomoderows Set the screen video mode and text row x number. _setvieworg Set the origin of the view port. x _setviewport Set the clipping region and the view x coordinate. _setvisualpage Set the current visual page number. x _setwritemode Set the current writing mode. x _unregisterfonts Delete registered font file. x _wrapon Enable/disable line wrapping. x ------Lists of C Executor original graphic functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

C Executor graphic library supports the following original graphic functions in addition to MS-C compatible functions.

------Name Function ------1. gr_displaychar Draw a standard size character. 2. gr_displayfourlargeDraw a quad size character. 3. gr_displaysixlarge Draw a hex size character. 4. _putpattern Put monochrome image data. 5. _getpattern Get monochrome image data. 6. gr_dispstr Draw a standard size string. 7. gr_disp6str Draw a hex size string. 8. gr_bitblt Copy image data. 9. gr_disp4str Draw a quad size string. 10. gr_displaysmlchar Draw a small size character. 11. gr_dispsstr Draw a small size string. 12. gr_displayfchar Draw a FANUC character. 13. gr_dispfstr Draw a FANUC character string. 14. gr_disp9ifchar Draw 9-inch font character. 15. gr_disp9ifstr Draw 9-inch font character string. 16. mmc_line_b Draw a line between specified two points. 17. mmc_polyline Draw a polyline. 18. mmc_circle_b Draw a circle. 19. mmc_ellipse_b Draw an ellipse. 20. mmc_pie_b Draw a pie figure. 21. mmc_arc_b Draw an arc. 22. mmc_gettext Get character in the specified area. 23. mmc_puttext Put character data on memory to text screen. 24. mmc_textsize Get required byte size for getting character. ------Function Reference ~~~~~~~~~~~~~~~~~~

------1. Draw a standard size character.

------

[Name] gr_displaychar

[Syntax] #include void gr_displaychar( int code, short cx, short cy, short fg, short bg ) ;

[Arguments] code Character code to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws the specified character whose size is same as the text's one (i.e. 8 x 16 dots, 16 x 16 dots for Kanji character) on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. When specifying a 2-byte character code with the argument code, store the first byte in the upper byte. When drawing, for example, (SHIFT-JIS code 8ABF), specify as follows. gr_displaychar (0x8ABF, ...) ------2. Draw a quad size character.

------

[Name] gr_displayfourlarge

[Syntax] #include void gr_displayfourlarge( int code, short cx, short cy, short fg, short bg ) ;

[Arguments] code Character code to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws the specified character whose dot matrix is 16 x 32 dots on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. This function can't draw 2-byte characters such as Japanese Kanji characters. It can draw only half-size charac- ters whose codes are 0x20 to 0x7F. ------3. Draw a hex size character.

------

[Name] gr_displaysixlarge

[Syntax] #include void gr_displaysixlarge( int code, short cx, short cy, short fg, short bg ) ;

[Arguments] code Character code to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws the specified hex size character whose dot matrix is 24 x 32 dots on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. This function can draw only 'SPACE', '0'-'9', 'A'-'Z', '.' and '-'. ------4. Put monochrome image data.

------

[Name] _putpattern

[Syntax] #include void _putpattern( short x, short y, void *image, short action, short fg, short bg ) ;

[Arguments] x, y Coordinate of the left-upper corner at where the monochrome image is put. image Buffer in where monochrome image is stored. action Logical writing mode. fg Foreground color. bg Background color.

[Return] ------

[Description] Puts the monochrome image pattern stored in "image" in the rectangle regtion whose left-upper corner is "x,y" on the graphic screen. Specify the logical writing mode, monochrome image data in buffer and image data on the screen are operated according to this command, in "action". The logical writing mode is defined in "graph.h". Specify the character color and the background color using palette index number. Only image data is drawn if -32768 (0x8000) is specified as the background color. The image buffer size must be specified by word (2-byte) unit. The buffer size (for monochrome image data) is calculated by the next equation. Size(byte) = ([WIDTH]+15)/16*2*[HEIGHT]+4 The maximum imaga size that is available for this function is 4K bytes. [Example]

The following monochrome image data (19x8 dots) is drawn. The leading 2-word data in the buffer are the height and the width of the image pattern data.

+---- 19 dots -----+ | | fedcba9876543210 765 0 ...... -+ 1 .####..####..#.. .#. | 2 .#...#.#...#.##. ##. | 3 .#...#.#...#.#.# .#. | 8 dots 4 .####..####..#.. .#. | 5 .#..#..#.....#.. .#. | 6 .#...#.#.....#.. .#. | 7 ...... -+

The following program draws the above monochrome image data. #include #define Blue 1 #define White 7 unsigned short image_rpm[18] = { 0x0013,0x0008 /* 19 x 8 Dot */ ,0x0000,0x0000 ,0x79e4,0x4000 ,0x4516,0xc000 ,0x4515,0x4000 ,0x79e4,0x4000 ,0x4904,0x4000 ,0x4504,0x4000 ,0x0000,0x0000 } ; void example( short x, short y ) { char *image ; image = (char *)&image_rpm[0] ; _putpattern( x, y, image, _GPSET, Blue, White ) ; return ; } ------5. Get monochrome image data.

------

[Name] _getpattern

[Syntax] #include void _getpattern( short rsx, short rsy, short rex, short rey, void *image, short color ) ;

[Arguments] rsx, rsy, Coordinate of the rectangle region from wher the rex, rey monochrome image data is got. image Buffer in where the monochrome image data is stored. color Color to be searched.

[Return] ------

[Description] Gets the monochrome image data, whose color is same as the specified color palette index number, in the specified rectangle region. And stores it in the "image". The buffer size muse be enough big to store the image data. The buffer size is calculated by the next equation. Size(byte) = ([WIDTH]+15)/16*2*[HEIGHT]+4 The maximum imaga size that is available for this function is 4K bytes. [Example] The following program displays a cursor.

#include #include void example( short rsx, short rsy, short ch_num, short OldColor, short ForColor, short BakColor ) { char *image ; long image_size ; short w, h ;

w = ch_num*8 ; h = 16 ;

image_size = ( w+15 ) / 16 * 2 * h + 4 ; if ( image_size > 4096L ) return ;

image = malloc( (short)image_size ) ; if ( image == NULL ) return ; _getpattern( rsx, rsy, rsx+w-1, rsy+h-1, image, OldColor ) ; _putpattern( rsx, rsy, image, _GPSET, ForColor, BakColor ) ;

free( image ) ; return ; } ------6. Draw a standard size string.

------

[Name] gr_dispstr

[Syntax] #include void gr_dispstr( char *str, short cx, short cy, short fg, short bg ) ;

[Arguments] str Character string to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws character string (also Kanji character is available) on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. ------7. Draw a hex size string.

------

[Name] gr_disp6str

[Syntax] #include void gr_disp6str( char *str, short cx, short cy, short fg, short bg ) ;

[Arguments] str Character string to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws large-size character (24x32 dots) string on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. This function can draw only 'SPACE', '0'-'9', 'A'-'Z', '.' and '-'. ------8. Copy image data.

------

[Name] gr_bitblt

[Syntax] #include void gr_bitblt( short rsx, short rsy, short rex, short rey, short cx, short cy ) ;

[Arguments] rsx, rsy, Coordinate of the source rectangle. rex, rey cx, cy Destination (upper-left) coordinate.

[Return] ------

[Description] Copys the image data in the specified rectangle region to the specified destination on the screen. ------9. Draw a quad size string.

------

[Name] gr_disp4str

[Syntax] #include void gr_disp4str( char *str, short cx, short cy, short fg, short bg ) ;

[Arguments] str Character string to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws quad-size (16x32 dots) character string on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. This function can't draw 2-byte characters such as Japanese Kanji characters. It can draw only half-size charac- ters whose codes are 0x20 to 0x7F. ------10. Draw a small size character.

------

[Name] gr_displaysmlchar

[Syntax] #include void gr_displaysmlchar( int code, short cx, short cy, short fg, short bg ) ;

[Arguments] code Character code to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws small size (8x8 dots) character on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. This function draws only characters whose codes are 0x20 - 0x5F. If lowercase character is specified, the converted uppercase character is drawn instead. Dot size of drawn character is as follows. Display mode Dot size Note ------+------+------80-column x 25-line(*1) 8 x 8 14" type (*1) 25-line - 30-line ------11. Draw a small size string.

------

[Name] gr_dispsstr

[Syntax] #include void gr_dispsstr( char *str, short cx, short cy, short fg, short bg ) ;

[Arguments] str Character string to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws small size (8x8 dots) character string on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. This function draws only characters whose codes are 0x20 - 0x5F. If lowercase character is specified, the converted uppercase character is drawn instead. Dot size of drawn character is as follows. Display mode Dot size Note ------+------+------80-column x 25-line(*1) 8 x 8 (*1) 25-line - 30-line ------12. Draw a FANUC character.

------

[Name] gr_displayfchar

[Syntax] #include void gr_displayfchar( unsigned int code, short cx, short cy, short fg, short bg ) ;

[Arguments] code Character code to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws a character which is specified by FANUC character code on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. ------13. Draw a FANUC character string.

------

[Name] gr_dispfstr

[Syntax] #include void gr_dispfstr( unsigned int *code, unsigned int len, short cx, short cy, short fg, short bg ) ;

[Arguments] code Array of FANUC character code (0x0000 - 0xFFFF). len Length of character string. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws a character string which is specified by FANUC character code on the graphic screen. Store FANUC code (16-bit) of drawn character in each element of the array "code". Store character length in "len". Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color. ------14. Draw 9-inch font character.

------

[Name] gr_disp9ifchar

[Syntax] #include void gr_disp9ifchar( int code, short cx, short cy, short fg, short bg) ;

[Arguments] code Character code to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws 9-inch font character (16x25 dots or 32x25 dots for Kanji character) on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color.

[Remarks] Specified character is drawn using FANUC character-generator and FANUC Kanji-set. ------15. Draw 9-inch font character string.

------

[Name] gr_disp9ifstr

[Syntax] #include void gr_disp9ifstr( unsigned char *str, short cx, short cy, short fg, short bg) ;

[Arguments] str Character string to be drawn. cx, cy Coordinate of the left-upper corner at where the character is drawn. fg Character color. bg Background color.

[Return] ------

[Description] Draws character string (also Kanji character is available) on the graphic screen. Specify the character color and the background color using palette index number. Only character is drawn if -32768 (0x8000) is specified as the background color.

[Remarks] Specified character is drawn using FANUC character-generator and FANUC Kanji-set. ------16. Draw a line between specified two points.

------

[Name] mmc_line_b

[Syntax] #include short mmc_line_b( short x1, short y1, short x2, short y2 ) ;

[Arguments] x1, y1 View port coordinates of line start point. x2, y2 View port coordinates of line end point.

[Return] Returns non-0 value if successful, or 0 if any error.

[Description] Draws a line between specified two points. ------17. Draw a polyline.

------

[Name] mmc_polyline

[Syntax] #include void mmc_polyline( const struct _xycoord *points, short numpoints ) ;

[Arguments] points Array of view port coordinates of apexes. numpoints Number of apexes of polyline.

[Return] ------

[Description] Draws a polyline. ------18. Draw a circle.

------

[Name] mmc_circle_b

[Syntax] #include short mmc_circle_b( short control, short xc, short yc, short r ) ;

[Arguments] control Control flag. xc, yc View port coordinates of the circle center. r Radius.

[Return] Returns non-0 value if successful, or 0 if any error.

[Description] Draws a circle.

Specify one of the following symbols for "Control flag". Symbol Purpose ------+------_GFILLINTERIOR Fills inside of the object with the current fill mask pattern. _GBORDER Draws only border line, not fills inside. ------19. Draw an ellipse.

------

[Name] mmc_ellipse_b

[Syntax] #include short mmc_ellipse_b( short control, short xc, short yc, short xr, short yr ) ;

[Arguments] control Control flag. xc, yc View port coordinate of the ellipse center. xr X-directional radius. yr Y-directional radius.

[Return] Returns non-0 value if successful, or 0 if any error.

[Description] Draws an ellipse. Specify one of the following symbols for "Control flag". Symbol Purpose ------+------_GFILLINTERIOR Fills inside of the object with the current fill mask pattern. _GBORDER Draws only border line, not fills inside. ------20. Draw a pie figure.

------

[Name] mmc_pie_b

[Syntax] #include short mmc_pie_b( short control, short xc, short yc, short xr, short yr, short d1, short d2 ) ;

[Arguments] control Control flag. xc, yc View port coordinate of the circle center. xr X-directional radius. yr Y-directional radius. d1 Angle of drawing start point (-3600..3600 [0.1 deg]) d2 Angle of drawing end point (-3600..3600 [0.1 deg])

[Return] Returns non-0 value if successful, or 0 if any error.

[Description] Draws a pie figure. Specify one of the following symbols for "Control flag". Symbol Purpose ------+------_GFILLINTERIOR Fills inside of the object with the current fill mask pattern. _GBORDER Draws only border line, not fills inside. "Angles" are specified as follows. Unit of angles is 0.1 degree. "Start angle" <= "End angle". Allowed range to command is -3600..3600 (-360[deg]..360[deg]). The origin of angle is + direction of X axis. Angle increases counter clock wise. (Y) (Y) | | | | 90[deg]|<-----+ -270[deg]|<-----+ | | | | | |0[deg] | |-360[deg] ------+------(X) ------+------(X) 180[deg]| | 360[deg] -180[deg]| | 0[deg] | | | | +----->|270[deg] +----->|-90[deg] | | | | Pie figure is drawn counter clock wise (CCW) from the start point to the end point. When the start point is same as the end point, pie figure is not drawn but only a line which connects the circle center and start/end point is drawn. ------21. Draw an arc.

------

[Name] mmc_arc_b

[Syntax] #include short mmc_arc_b( short xc, short yc, short xr, short yr, short d1, short d2 ) ;

[Arguments] xc, yc View port coordinate of the circle center. xr X-directional radius. yr Y-directional radius. d1 Angle of drawing start point (-3600..3600 [0.1 deg]) d2 Angle of drawing end point (-3600..3600 [0.1 deg])

[Return] Returns non-0 value if successful, or 0 if any error.

[Description] Draws an arc. "Angles" are specified as follows. Unit of angles is 0.1 degree. "Start angle" <= "End angle". Allowed range to command is -3600..3600 (-360[deg]..360[deg]). The origin of angle is + direction of X axis. Angle increases counter clock wise. (Y) (Y) | | | | 90[deg]|<-----+ -270[deg]|<-----+ | | | | | |0[deg] | |-360[deg] ------+------(X) ------+------(X) 180[deg]| | 360[deg] -180[deg]| | 0[deg] | | | | +----->|270[deg] +----->|-90[deg] | | | |

Arc is drawn counter clock wise (CCW) from the start point to the end point. When the start point is same as the end point, arc is not drawn but only a pixel is drawn at the start/end point. ------22. Get character in the specified area.

------

[Name] mmc_gettext

[Syntax] #include short mmc_gettext( short x1, short y1, short x2, short y2, _MCHRBUF *chr_buf ) ;

[Arguments] x1,y1,x2,y2 Screen area (left-upper, right-lower) chr_buf Buffer memory in where data are stored.

[Return] 0 Successful. -1 Warning. (Out of screen) 2 Error. (No work memory) [Description] Reads characters in the specified screen area to the memory.

Specify screen area to read as left-upper point of screen (Home position) is (1,1). The first character is read at the start point (left-upper position), and continuously reads rightward, jumps to the next line at the right end, the last character is read at the right- lower position. The required byte size to read is calculated by "mmc_textsize()" function. Character code and attribute are stored by internal format. The structure of output buffer is as follows.

+------+ 0 | Column size | ------+ 2 | Line size | +------+ 4 | 1st character - code | --+ +------+ +--- data for one character 6 | 1st character - attribute | --+ +------+ : +------+ m | n-th character - code | +------+ m+2 | n-th character - attribute | +------+

If the specified area overruns the screen like below, SPACE character and WHITE attribute is stored in the overruned region and "Warning" is returned as result. +------+ |(1,1) | | | | screen | | | specified area | +------+ | |(x1,y1) |//////////| | | |//////////| | | |//////////| | | (80,30)|//////////| +------|------+//////////| |///////////////////////////| |////////////////////(x2,y2)| +------+ If the start position is at the right-half of double-sized character, only lower byte of the character code is read. If the end position is at the left-half of double-sized character, only upper byte of the character code is read. In these case, operation is done successfully. ------23. Put character data on memory to text screen.

------

[Name] mmc_puttext

[Syntax] #include short mmc_puttext( short x, short y, _MCHRBUF *chr_buf ) ;

[Arguments] x, y Start position to write. chr_buf Buffer memory in where data are stored.

[Return] 0 Successful. -1 Warning. (Out of screen) 2 Error. (No work memory)

[Description] Writes characters stored on memory to the text screen. This function writes character data on memory which has been read by "mmc_gettext()" function. Specify screen area to write as left-upper point of screen (Home position) is (1,1). If the specified area overruns the screen, the overruned region is not written. ------24. Get required byte size for getting character.

------

[Name] mmc_textsize

[Syntax] #include short mmc_textsize( short x1, short y1, short x2, short y2 ) ;

[Arguments] x1,y1,x2,y2 Screen area (left-upper, right-lower)

[Return] Required byte size to read the specified area.

[Description] Returns the required byte size to read the specified area. The required byte size is calculated by the following formula.

Byte size = (Column size * Line size) * 4 + 4 [byte] Column size = x2 - x1 + 1 Line size = y2 - y1 + 1 (Example) For reading whole screen (80 x 30). (80 * 30) * 4 + 4 = 9604 byte 3.4 CNC/PMC window library ======

Lists of Functions ~~~~~~~~~~~~~~~~~~

1. CNC window library

------Name Function ------1.1 cnc_sysinfo Read CNC system information. 1.2 cnc_dwnstart Start output of NC program to be registered. 1.3 cnc_download Output NC program to be registered. 1.4 cnc_dwnend Stop output NC program to be registered. 1.5 cnc_vrfstart Start output NC program to be compared. 1.6 cnc_verify Output NC program to be compared. 1.7 cnc_vrfend Stop output NC program to be compared. 1.8 cnc_dncstart Start output NC program to be executed. 1.9 cnc_dnc Output NC program to be executed. 1.10 cnc_dncend Stop output NC program to be executed. 1.11 cnc_upstart Start input NC program. 1.12 cnc_upload Input NC program. 1.13 cnc_upend Stop input NC program. 1.14 cnc_search Search specified program. 1.15 cnc_delall Delete all programs. 1.16 cnc_delete Delete specified program. 1.17 cnc_rdprogdir Read program directory. 1.18 cnc_rdproginfo Read program information. 1.19 cnc_rdprgnum Read program number in executing. 1.20 cnc_rdseqnum Read sequence number in executing. 1.21 cnc_actf Read actual feed rate of controlled axes. 1.22 cnc_acts Read actual spindle speed. 1.23 cnc_absolute Read absolute position. 1.24 cnc_machine Read machine position. 1.25 cnc_relative Read relative position. 1.26 cnc_distance Read distance to go. 1.27 cnc_skip Read skipped position. 1.28 cnc_srvdelay Read servo delay amount. 1.29 cnc_accdecdly Read acceleration/deceleration delay amount. 1.30 cnc_rddynamic Read dynamic data. 1.31 cnc_statinfo Read CNC status information. 1.32 cnc_alarm Read alarm status. 1.33 cnc_rdalminfo Read alarm information. 1.34 cnc_rdtofs Read tool offset amount. 1.35 cnc_wrtofs Write tool offset amount. 1.36 cnc_rdtofsr Read tool offset amount (range specified). 1.37 cnc_wrtofsr Write tool offset amount (range specified). 1.38 cnc_rdzofs Read work origin offset. 1.39 cnc_wrzofs Write work origin offset. 1.40 cnc_rdzofsr Read work origin offset (range specified). 1.41 cnc_wrzofsr Write work origin offset (range specified). ------Name Function ------1.42 cnc_rdparam Read parameter. 1.43 cnc_wrparam Write parameter. 1.44 cnc_rdparar Read parameters (range specified). 1.45 cnc_wrparas Write parameters (multiple output). 1.46 cnc_rdset Read setting parameter. 1.47 cnc_wrset Write setting parameter. 1.48 cnc_rdsetr Read setting parameters (range specified). 1.49 cnc_wrsets Write setting parameters (multiple output). 1.50 cnc_rdpitchr Read pitch error compensation data (range specified). 1.51 cnc_wrpitchr Write pitch error compensation data (range specified). 1.52 cnc_rdmacro Read custom macro variable. 1.53 cnc_wrmacro Write custom macro variable. 1.54 cnc_rdmacror Read custom macro variables (range specified). 1.55 cnc_wrmacror Write custom macro variables (range specified). 1.56 cnc_rdpmacro Read P-code macro variable. 1.57 cnc_wrpmacro Write P-code macro variable. 1.58 cnc_rdpmacror Read P-code macro variables (range specified). 1.59 cnc_wrpmacror Write P-code macro variables (range specified). 1.60 cnc_modal Read modal data. 1.61 cnc_diagnoss Read diagnostics data. 1.62 cnc_diagnosr Read diagnostics data (range specified). 1.63 cnc_adcnv Read A/D conversion data. 1.64 cnc_rdopmsg Read operator's message. 1.65 cnc_setpath Set path index (multi-path system). 1.66 cnc_getpath Get path index (multi-path system). 1.67 cnc_settimer Set calendar timer of CNC. 1.68 cnc_rdspload Read load information of serial spindle. 1.69 cnc_rdexecprog Read executing program. 1.70 cnc_rdmovrlap Read manual handle override amount. ------

2. PMC window library ------Name Function ------2.1 pmc_rdpmcrng Read arbitrary PMC data (range specified). 2.2 pmc_wrpmcrng Write arbitrary PMC data (range specified). 2.3 pmc_rdpcmsg Read PMC message. ------Function Reference ~~~~~~~~~~~~~~~~~~

1. CNC window library

------1.1 Read CNC system information. ------

[Name] cnc_sysinfo

[Syntax] #include #include short cnc_sysinfo( struct odbsys *buf ) ; struct odbsys { int dummy[2] ; /* Not used. */ char cnc_type[2] ; /* Kind of CNC (ASCII string). */ char mt_type[2] ; /* Kind of M/T/TT (ASCII string). */ char series[4] ; /* Series number (ASCII string). */ char version[4] ; /* Version number (ASCII string). */ char axes[2] ; /* Amount of controllable axes */ } ; /* (ASCII string). */

[Arguments] buf Buffer in which system information is stored.

[Return] EW_OK( 0) Successful.

[Description] Reads system information such as kind of CNC (for example, "30" as series name), kind of CNC system such as Machining(M) or Turning(T), series and version number of CNC system software in ROM and an amount of controllable axes. Use this function to confirm compatibility of CNC's system software and PMC's software or to get an amount of controllable axes before reading axis coordinate data such as absolute, machine or skipped position.

Note that a null character ('\x00') is not added at the end of each strings. [Example] The following informations are gotten by execution of this function on FS30 (G001-01) system with 4 servo axes.

buf.cnc_type = "30" buf.mt_type = " M" buf.series = "G001" buf.version = "0001" buf.axes = "4 " ------1.2 Start output of NC program to be registered. ------

[Name] cnc_dwnstart

[Syntax] #include #include short cnc_dwnstart( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_PROT( 7) Tape memory of CNC is protected. EW_BUSY(-1) Start command for output of NC program to be registered has been rejected. This code is returned if any of the following conditions exists when this command is executed. - The CNC is performing other command processing (downloading, collating, uploading, or program number list reading). - Background editing is in progress or the MDI mode has been entered. - A P/S 000 or P/S 101 alarm condition has occurred.

[Description] Requests CNC to start registering of NC program (downloading).

[Example] See example of "Output NC program to be registered(cnc_download)". ------1.3 Output NC program to be registered. ------

[Name] cnc_download

[Syntax] #include #include short cnc_download( char *data, short number ) ;

[Arguments] data NC program data (ASCII string). number Character number of NC program data (1 - 256).

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for registering NC program has not been completed, or no start-up command has been commanded. EW_LENGTH( 2) Incorrect character number "number". EW_DATA( 5) Incorrect NC program data. This code is returned under one of following conditions. - The same program number is already registered. - A character which is unavailable for NC program is detected. - When TV check is effective, a block which includes odd characters (including 'LF' at the end of the block) is detected. - No more programs can be registered because there is no space for them. EW_OVRFLOW( 8) No more NC program can be stored because tape memory of CNC is full.

[Description] Outputs NC program to be registered to CNC. NC program output is a string of ASCII code characters. "Start output of NC program to be registered(cnc_dwnstart)" must be called before outputting NC program to be registered to CNC, and "Stop output NC program to be registered(cnc_dwnend)" after outputting. If any program whose program number is same as newly registering NC program's is already registered in CNC, one of following procedure will be done according to CNC parameter No.3201#1 REP. REP = "0" Return code "5" will be returned, and the new program will be not registered. REP = "1" The new program will be registered with deleting already registered one, i.e., the new program will replace the old one. (Caution) It is impossible to write a program over a program that has been selected. To replace a program that has been selected with another program, delete the selected program or select a different program, and then register the new program. NC program format ~~~~~~~~~~~~~~~~~ NC program to be registered to CNC is a string composed of ASCII characters as following format.

LF Oxxxx LF Block1 LF Block2 LF ... LF Mxx LF %

LF 0x0A ('\n'). Oxxxx Program number. Mxx M code at the end of the program (M02,M30, etc.).

'LF' must be placed at the top of the whole program, and '%' at the end. Data before 'LF' at the top are ignored. Address 'O' and program number must be placed in the program to be registered. For example, to register a program such as

O1234 ; G1 F0.3 W10. ; M30 ; % send a following string using cnc_download function. "\nO1234\nG1F0.3W10.\nM30\n%"

The string data can be sent by multiple cnc_download functions. For above example, the program can be sent block by block like this. "\n" "O1234\n" "G1F0.3W10.\n" "M30\n" "%" And more, it is possible to send one block by multiple cnc_download functions. It is possible also to send multiple programs continuously as follows. "\n" "O1234\nG1F0.3W10.\nM30\n" "O5678\nM3S1200\nT11\nG0X10.Z0\nM30\n" "%" There is one buffer (256 bytes) between CNC and C library. It is used as a ring. Buffer size = 256 bytes +------+ +-->| 1st output | 2nd output | ... | | --+ | +------+ | | | +------+ When any data can not be output because registration process has not been completed (i.e. the buffer is full), the C library waits until it can be output. ERROR 5 and 8 may be returned late because NC program is sent to CNC via buffers. That is, the return code of an output process may be one of it several times before. Moreover, return codes of several output before the last one may be returned by "Stop output NC program to be registered(cnc_dwnend)". [Example] The following program registers the next NC program to CNC.

O1234 ; M3 S1200 ; G0 Z0 ; G0 X0 Y0 ; G1 F500 X120. Y-30. ; M30 ;

#include #include short example( void ) { char *prg[] = { "\n", "O1234\n", "M3 S1200\n", "G0 Z0\n", "G0 X0 Y0\n", "G1 F500 X120. Y-30.\n", "M30\n", "%" } ; short ret, idx ; ret = cnc_dwnstart() ; if ( ret ) return ( ret ) ; for ( idx = 0 ; idx < sizeof(prg)/sizeof(char *) ; idx++ ) { ret = cnc_download( prg[idx], strlen( prg[idx] ) ) ; if ( ret ) { cnc_dwnend() ; return ( ret ) ; } } ret = cnc_dwnend() ; return ( ret ) ; } ------1.4 Stop output NC program to be registered. ------

[Name] cnc_dwnend

[Syntax] #include #include short cnc_dwnend( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for registering NC program has not been completed, or no start-up command has been commanded. EW_DATA( 5) Incorrect NC program data in previous output. This code is returned under one of following conditions. - The same program number is already registered. - A character which is unavailable for NC program is detected. - When TV check is effective, a block which includes odd characters (including 'LF' at the end of the block) is detected. - No more programs can be registered because there is no space for them. EW_OVRFLOW( 8) NC programs which have been output previously could not registered because tape memory of CNC is full.

[Description] Notices the end of NC program registration to CNC. '%' must be output as NC program data before calling this function. 5 or 8 which has been issued during processing of "Output NC program to be registered" may be returned. This function doesn't return until the registration process of CNC is completed. The registration process is completed even if the return code is not "0".

[Example] See example of "Output NC program to be registered(cnc_download)". ------1.5 Start output NC program to be compared. ------

[Name] cnc_vrfstart

[Syntax] #include #include short cnc_vrfstart( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_BUSY(-1) Start command for output of NC program to be compared has been rejected. This code is returned if any of the following conditions

exists when this command is executed. - The CNC is performing other command processing (downloading, collating, uploading, or program number list reading). - Background editing is in progress or the MDI mode has been entered. - A P/S 000 or P/S 101 alarm condition has occurred.

[Description] Requests CNC to start comparing of NC program. It is possible to compare already registered NC program in CNC and a program which is output by the application program.

[Example] See example of "Output NC program to be compared(cnc_verify)". ------1.6 Output NC program to be compared. ------

[Name] cnc_verify

[Syntax] #include #include short cnc_verify( char *data, int number ) ;

[Arguments] data NC program data (ASCII string). number Character number of NC program data (1 - 256).

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for comparing NC program has not been completed, or no start-up command has been commanded. EW_LENGTH( 2) Incorrect character number "number". EW_DATA( 5) Incorrect NC program data. This code is returned under one of following conditions. - Any difference has been detected during comparing process. - A CNC-side program to be compared has been selected in foreground processing. - A character which is unavailable for NC program is detected. - When TV check is effective, a block which includes odd characters (including 'LF' at the end of the block) is detected.

[Description] Outputs NC program to be compared with already registered one to CNC. NC program output is a string of ASCII code characters. "Start output of NC program to be compared(cnc_vrfstart)" must be called before outputting NC program to be compared to CNC, and "Stop output NC program to be compared(cnc_vrfend)" after outputting. Format of NC program to be compared is same as one of "Output NC program to be registered(cnc_download)" Refer description of "cnc_download" function for format of output data, etc. There is one buffer (256 bytes) between CNC and C library. It is used as a ring.

Buffer size = 256 bytes +------+ +-->| 1st output | 2nd output | ... | | --+ | +------+ | | | +------+

When any data can not be output because comparing process has not been completed (i.e. the buffer is full), the C library waits until it can be output. EW_DATA may be returned late because NC program is sent to CNC via buffers. That is, the return code of an output process may be one of it several times before. Moreover, return codes of several output before the last one may be returned by "Stop output NC program to be compared(cnc_vrfend)".

[Example] The following program compares the next NC program and "O1234" which is already registered in CNC.

O1234 ; M3 S1200 ; G0 Z0 ; G0 X0 Y0 ; G1 F500 X120. Y-30. ; M30 ; #include #include short example( void ) { char *prg[] = { "\n", "O1234\n", "M3 S1200\n", "G0 Z0\n", "G0 X0 Y0\n", "G1 F500 X120. Y-30.\n", "M30\n", "%" } ; short ret, idx ; ret = cnc_vrfstart() ; if ( ret ) return ( ret ) ; for ( idx = 0 ; idx < sizeof(prg)/sizeof(char *) ; idx++ ) { ret = cnc_verify( prg[idx], strlen( prg[idx] ) ) ; if ( ret ) { cnc_vrfend() ; return ( ret ) ; } } ret = cnc_vrfend() ; return ( ret ) ; } ------1.7 Stop output NC program to be compared. ------

[Name] cnc_vrfend

[Syntax] #include #include short cnc_vrfend( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for comparing NC program has not been completed, or no start-up command has been commanded. EW_DATA( 5) The previously output NC program data is incorrect. This code is returned under one of following conditions. - Any difference has been detected during comparing process. - A CNC-side program to be compared has been selected in foreground processing. - A character which is unavailable for NC program is detected. - When TV check is effective, a block which includes odd characters (including 'LF' at the end of the block) is detected.

[Description] Notices the end of comparison of NC program to CNC. '%' must be output as NC program data before calling this function. 5 or 8 which has been issued during processing of "Output NC program to be compared" may be returned. This function doesn't return until the comparing process of CNC is completed. The comparing process is completed even if the return code is not "0".

[Example] See example of "Output NC program to be compared(cnc_verify)". ------1.8 Start output NC program to be executed. ------

[Name] cnc_dncstart

[Syntax] #include #include short cnc_dncstart( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_BUSY(-1) Start command for output of NC program to be executed has been rejected. This code is returned under one of following conditions.

- CNC is executing other requested command (downloading,

comparing, uploading or reading program directory). - Any alarms are set. - CNC is executing the other program. [Description] It is possible to get CNC software to run a NC program (NC command data), which is made by the application program, directly (DNC operation). This is DNC operation, which is ordinarily executed via RS-232C, via CNC window from C language application. The application program requests CNC to start DNC operation by this function.

In addition to calling functions about DNC operation by the application program, it is necessary for executing DNC operation to operate signals by the LADDER software of PMC. Execute the following steps.

(1) Set CNC's mode as MEM mode. [LADDER]

(2) Set the DMMC signal (G42#7) to "1". [LADDER]

(3) Execute "cnc_dncstart" function. [C application]

(4) Start automatic operation by operating "ST" signal(G7#2) "0"->"1"->"0". [LADDER] (5) Send NC commands by "cnc_dnc" function. [C application] (6) Execute "cnc_dncend" function after sending all NC commands. [C application] (7) Reset CNC when the program is completed (i.e., the M-code which means the end of the program is detected.) [LADDER] (8) Reset the DMMC signal to "0". [LADDER] The CNC software goes on waiting NC commands sent by "cnc_dnc" function from starting of DNC operation. To stop the operation in this state, reset the CNC.

[Example] See example of "Output NC program to be executed(cnc_dnc)". ------1.9 Output NC program to be executed. ------

[Name] cnc_dnc

[Syntax] #include #include short cnc_dnc( char *data, short number ) ;

[Arguments] data NC program data (ASCII string). number Character number of NC program data (1 - 256).

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for executing NC program has not been completed, or no start-up command has been commanded. EW_LENGTH( 2) Incorrect character number "number". EW_DATA( 5) Incorrect NC program data. EW_RESET(-2) The CNC has been reset. In this case, stop outputting of NC command data to be executed and perform the end operation of outputting of NC command.

[Description] Outputs NC command data to be directly executed to CNC (for DNC operation). NC command data output is a string of ASCII code characters. "Start output NC program to be executed(cnc_dncstart)" must be called and cycle start must be performed before outputting NC command data to be executed to CNC. To execute the cnc_dncstart function, select the MEM mode and turn on the DMMC signal . "Stop output NC program to be executed(cnc_dncend)" must be called after outputting. Format of NC command data to be executed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NC command data to be executed to CNC is a string composed of ASCII characters as following format.

LF Oxxxx LF Block1 LF Block2 LF ... LF Mxx LF % LF NC command1 LF NC command2 LF ... LF Mxx LF %

LF 0x0A ('\n'). Mxx M code at the end of the DNC operation (M02, M30,etc.).

'LF' must be placed at the top of the whole NC commands, and '%' at the end. 'LF's are added after each NC commands. For example, to execute commands such as

M3 S2000 ; T14 ; G0 X10. ; G0 Z-5. ; M30 ; send a following string using cnc_dnc function. cnc_dnc( "\nM3S2000\nT14\nG0X10.\nG0Z-5.\nM30\n%", 32 ) ;

The string data can be sent by multiple cnc_dnc functions. For above example, the commands can be sent block by block like this. cnc_dnc( "\n", 1 ) ; cnc_dnc( "M3S2000\n", 8 ) ; cnc_dnc( "T14\n", 4 ) ; cnc_dnc( "G0X10.\n", 7 ) ; cnc_dnc( "G0Z-5.\n", 7 ) ; cnc_dnc( "M30\n", 4 ) ; cnc_dnc( "%", 1 ) ; There is one buffer (256 bytes) between CNC and C library. It is used as a ring.

Buffer size = 256 bytes +------+ +-->| 1st output | 2nd output | ... | | --+ | +------+ | | | +------+

When any data can not be output because operating process has not been completed (i.e. the buffer is full), the C library waits until it can be output. EW_DATA may be returned late because NC program is sent to CNC via buffers. That is, the return code of an output process may be one of it several times before. Moreover, return codes of several output before the last one may be returned by "Stop output NC program to be executed(cnc_dncend)".

The DNC operation is intended to execute NC commands simply block by block. For this reason, it cannot be used to execute commands which require that two or more blocks of commands be loaded for execution, as with multiple repetitive canned cycles used for lathes, or commands which reference a block other than those they belong to, as with macro branch instructions. If it is necessary to execute a command which requires that information about two or more blocks be loaded for execution, take the following steps.

(1) Program the multiple-block NC command using macro program format. (2) Store the above program in the tape memory of CNC unit. (It is possible to store compiled code of program in ROM using Macro Compiler.) (3) Execute macro-call command (such as M98) to execute registerd macro program in DNC operation. (It is possible to call registered macro program in the memory for DNC operation.) [Example] The following program executes the next NC commands by DNC operation.

M3 S1500 ; G28 U0 W0 ; T0101 ; G0 X35. Z-10. ; M30 ;

#include #include short example( void ) { char *prg[] = { "\n", "M3S1500\n", "G28U0W0\n", "T0101\n", "G0X35.Z-10.\n", "M30\n", "%" } ; short ret, idx ; ret = cnc_dncstart() ; if ( ret ) return ( ret ) ; for ( idx = 0 ; idx < sizeof(prg)/sizeof(char *) ; idx++ ) { ret = cnc_dnc( prg[idx], strlen( prg[idx] ) ) ; if ( ret ) break ; } if ( ret ) cnc_dncend() ; else ret = cnc_dncend() ; return ( ret ) ; } In the real DNC operation, it is necessary to operate some signals by the LADDER software. So, any communication processes with the LADDER software are added in above example program. ------1.10 Stop output NC program to be executed. ------

[Name] cnc_dncend

[Syntax] #include #include short cnc_dncend( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for executing NC program has not been completed, or no start-up command has been commanded. EW_DATA( 5) Incorrect NC program data. EW_RESET(-2) The CNC has been reset.

[Description] Notices the end of DNC operation to CNC. '%' must be output as NC command data before calling this function. Execute this stopping command after the CNC's operation has been completed and reset. If this command is executed during CNC is operating, the function-call waits until the end of operation and resetting. Check "OP" signal(F000#7) to find whether CNC has been reset or not. When "OP" signal is "0", CNC is has been reset. EW_DATA which has been issued during processing of "Output NC program to be executed" may be returned. The return value of this function is usually "-2" because CNC is reset at the end of DNC operation.

[Example] See example of "Output NC program to be executed(cnc_dnc)". ------1.11 Start input NC program. ------

[Name] cnc_upstart

[Syntax] #include #include short cnc_upstart( long number ) ;

[Arguments] number Program number.

[Return] EW_OK( 0) Successful. EW_DATA( 5) The specified NC program is not registered in CNC. EW_PROT( 7) Tape memory of CNC is protected. EW_BUSY(-1) Start command for input of NC program to be uploaded has been rejected. This code is returned under one of following conditions. - CNC is executing other requested command (downloading, comparing, uploading or reading program directory). - An NC program is running (automatic operation signal OP is on). - Background editing is in progress or the MDI mode has been selected. - A P/S 000 or P/S 101 alarm condition has occurred.

[Description] Requests CNC to start reading of NC program (uploading). Specify the program number of NC program to be uploaded in "number" with binary format.

[Example] See example of "Input NC program(cnc_upload)". ------1.12 Input NC program. ------

[Name] cnc_upload

[Syntax] #include #include short cnc_upload( struct odbup *buf, short *number ) ;

struct odbup { short dummy[2] ; /* Not used. */ char data[N] ; /* NC program data (ASCII string). */ } ; /* N: max 256 */

[Arguments] buf Buffer in which NC program data are stored. number Size of the above buffer, amount of characters included in input NC command data characters.

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for reading NC program has not been completed, or no start-up command has been commanded. EW_LENGTH( 2) Incorrect buffer size "number".

[Description] Inputs contents of NC program specified by "cnc_upstart" function from CNC. NC program data input is a string of ASCII code characters. "Start input NC program(cnc_upstart)" must be called before uploading NC program from CNC, and "Stop input NC program(cnc_upend)" after uploading. Specify a buffer whose maximum size is 256 bytes, and the minimum size is 3 bytes. This buffer size can be either shorter or longer than the NC program. If the NC program is longer than the buffer, this function is called multiple times. Store the buffer size in "number" before calling this function. The real length of read NC program will be stored in "number".

When any data can not be input because transfer process has not been completed (i.e. the buffer is empty), the C library waits until any data are written in the buffer Format of input data ~~~~~~~~~~~~~~~~~~~~ NC program which is read from CNC is a string composed of ASCII characters as following format.

% LF Oxxxx LF Block1 LF Block2 LF ... LF Mxx LF %

LF 0x0A ('\n'). Oxxxx Program number. Mxx M code at the end of the program (M02,M30, etc.).

A null character ('\x00') is not added at the end of each strings stored in the buffer. The last character of read NC program is '%'. Only '%' can be read by attempting to read more data beyond this last '%'. For example, when you read the following NC program using this function,

O1234 ; G1 F0.3 W10. ; M30 ; % you will get the following strings.

In case of fully large buffer. 1st time "%\nO1234\nG1F0.3W10.\nM30\n%" (24 chars) 2nd and after "%" (1 char) And in case that the buffer size is less than 24 bytes, you will get the following strings. In case that the buffer size is 10 bytes. 1st time "%\nO1234\nG1" (10 characters) 2nd time "F0.3W10.\nM" (10 characters) 3rd time "30\n%" (4 characters) 4th and after "%" (1 character) [Example] The following program reads the specified NC program registered in CNC, and displays its contents on the screen.

#include #include #include #define BUFSIZE 40

/* prgnum is NC program number to be read. */ short example( long prgnum ) { char buf[BUFSIZE+4] ; short ret, number ; ret = cnc_upstart( prgnum ) ; if ( ret ) return ( ret ) ; for (;;) { number = BUFSIZE - 1 ; ret = cnc_upload( (struct odbup *)(&buf), &number ) ; if ( ret ) { cnc_upend() ; return ( ret ) ; } buf[4+number] = '\x00' ; printf( "%s", &buf[4] ) ; if ( buf[4+number-1] == '%' ) break ; } putchar( '\n' ) ; ret = cnc_upend() ; return ( ret ) ; } ------1.13 Stop input NC program. ------

[Name] cnc_upend

[Syntax] #include #include short cnc_upend( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_FUNC( 1) The start-up procedure of CNC for reading NC program has not been completed, or no start-up command has been commanded.

[Description] Notices the end of NC program uploading to CNC. Confirm that a '%' character is added at the end of the input NC program before calling this function. The uploading process is completed in CNC even if the return code is not "0".

[Example] See example of "Input NC program(cnc_upload)". ------1.14 Search specified program. ------

[Name] cnc_search

[Syntax] #include #include short cnc_search( long number ) ;

[Arguments] number Program number.

[Return] EW_OK( 0) Successful. EW_DATA( 5) The specified NC program is not registered in CNC. EW_PROT( 7) Tape memory of CNC is protected. EW_BUSY(-1) The program search command was rejected. This code is returned if any of the following conditions exists when this command is executed. - The CNC is performing other window command processing (downloading, collating, uploading, or program number list reading). - In the EDIT or memory mode, the automatic operation signal OP is on. - In the EDIT or memory mode, a P/S 000 or P/S 101 alarm condition has occurred.

[Description] Searches the NC program already registered in CNC. This function is used to select one NC program before memory operation is executed in CNC. Foreground search is preformed for EDIT or MEM mode and background search (only checks whether the specified program exists or not.) for the other mode. Specify the program number of NC program to be searched in "number" with binary format. [Example] The following program searches the program whose program number is same as specified one, and displays the result.

#include #include #include

/* num is program number to be searched. */ void example( long num ) { short ret ; ret = cnc_search( num ) ; switch ( ret ) { case 0: printf( "PROGRAM O%d has been searched.\n", num ) ; break ; case 5: printf( "PROGRAM O%d doesn't exist.\n", num ) ; break ; case 7: printf( "PROTECTED.\n" ) ; break ; case -1: printf( "REJECTED.\n" ) ; break ; } } ------1.15 Delete all programs. ------

[Name] cnc_delall

[Syntax] #include #include short cnc_delall( void ) ;

[Arguments] ------

[Return] EW_OK( 0) Successful. EW_PROT( 7) Tape memory of CNC is protected, or the target program is protected. EW_BUSY(-1) In the CNC, the all-program delete command was rejected.

This code is returned if any of the following conditions

exists when this command is executed. - The CNC is performing other window command processing (downloading, collating, uploading, or program number list reading). - An NC program is running (automatic operation signal OP is on). - A P/S 000, P/S 101, or BP/S alarm condition has occurred. [Description] Deletes all NC programs registered in CNC. Even the selected program in foreground editing is deleted by this function. But when any automatic operation is being executed, program deletion is not performed. [Example] The following program deletes all programs and displays the result.

#include #include #include void example( void ) { short ret ; ret = cnc_delall() ; switch ( ret ) { case 0: printf( "ALL PROGRAMS has been deleted.\n", num ) ; break ; case 7: printf( "PROTECTED.\n" ) ; break ; case -1: printf( "REJECTED.\n" ) ; break ; } } ------1.16 Delete specified program. ------

[Name] cnc_delete

[Syntax] #include #include short cnc_delete( long number ) ;

[Arguments] number Program number.

[Return] EW_OK( 0) Successful. EW_DATA( 5) The specified NC program is not registered in CNC. EW_PROT( 7) Tape memory of CNC is protected, or the target program is protected. EW_BUSY(-1) In the CNC, the specified-program delete command was rejected. This code is returned if any of the following conditions

exists when this command is executed. - The CNC is performing other window command processing (downloading, collating, uploading, or program number list reading). - An NC program is running (automatic operation signal OP is on). - A P/S 000, P/S 101, or BP/S alarm condition has occurred.

[Description] Deletes the specified NC program registered in CNC. If the specified program is used for the current automatic operation, it can't be deleted. Specify the program number of NC program to be deleted in "number" with binary format. [Example] The following program deletes the program whose program number is same as specified one, and displays the result.

#include #include #include

/* num is program number to be deleted. */ void example( long num ) { short ret ; ret = cnc_delete( num ) ; switch ( ret ) { case 0: printf( "PROGRAM O%d has been deleted.\n", num ) ; break ; case 5: printf( "PROGRAM O%d doesn't exist.\n", num ) ; break ; case 7: printf( "PROTECTED.\n" ) ; break ; case -1: printf( "REJECTED.\n" ) ; break ; } } ------1.17 Read program directory. ------

[Name] cnc_rdprogdir

[Syntax] #include #include short cnc_rdprogdir( short type, long datano_s, long datano_e, short length, struct prgdir *buf ) ;

struct prgdir { char prg_data[N] ; /* Contents of directory (ASCII */ } ; /* string). N: max 256 */

[Arguments] type Format of program list (0,1,2). datano_s Start program number to be read. datano_e End program number to be read. length Size of the following buffer for the program directory. buf Buffer in which the program directory list is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect buffer size "length". EW_NUMBER( 3) The specified type is invalid. EW_DATA( 5) The specified program number is invalid. EW-BUSY(-1) In the CNC, read processing for program number list data was rejected. This code is returned if any of the following conditions exists when this command is executed. - The CNC is performing other command processing (downloading, collating, uploading, or program number list reading). - Background editing is in progress or the MDI mode has been entered. - A P/S 000 or P/S 101 alarm condition has occurred. EW_RESET(-2) The CNC was reset. Even in this case, the CNC completes program number list reading normally. [Description] Reads the list of program numbers (program directory) of all NC programs registered in CNC.

Program numbers, comments and character numbers of programs included in specified program number range are read with ASCII string format. Specify the start program number to be read in "datano_s" and the end one in "datano_e". Store "datano_s=1" and "datano_e"=9999 to read all programs. Specify the format of program list in "type".

type Format of list ------+------0 Only program number. 1 Program number and comment. 2 Program number, comment and character number

If the size of the buffer in which the program list is stored is insufficient, only informations whose total size is same or less than the buffer size is stored.

Format of input data ~~~~~~~~~~~~~~~~~~~~ The program directory list which is read from CNC is a string composed of ASCII characters as following format.

type=0 Oxxxx Oxxxx ... % type=1 % LF Oxxxx (COMMENT) LF Oxxxx (COMMENT) LF ... LF % type=2 Oxxxx (COMMENT) CHAR_NUMBER Oxxxx (COMMENT) CHAR_NUMBER ... % LF 0x0A ('\n') Oxxxx Program number. This is a ASCII string without the leading '0' of numeric part sorted in numeric order. ("O1" - "O9999") CHAR_NUMBER Character number of the program. This is a ASCII string without the leading '0'. The number is raised to 80-character unit. COMMENT The comment which is written just after the program number is stored. The maximum character number of the comment body is 48. (50 for the body and the before and the behind parentheses.) Only beginning 48 characters are stored for the comment which is longer than 48 characters. If the program has no comment, only parentheses ("()") are stored. For all cases, when no program is registered or there is no program in the specified range, only '%' is stored. A null character ('\x00') is not added at the end of each strings stored in the buffer. For example, when the next programs are registered in CNC, the result of this function, in case that datano_s=1 and datano_e=9999, is as follows.

Program number (COMMENT) Character number ------+------O0012 (TEST) ; 420 O0200 (WORK1) ; 352 O0201 ; 537 O9001 (SUB-PRO1) ; 781

type Contents to be read. ------+------0 "O12O200O201O9001%" 1 "%\nO12(TEST)\nO200(WORK1)\nO201()\nO9001(SUB-PRO1)\n%" 2 "O12(TEST)420O200(WORK1)352O201()537O9001(SUB-PRO1)781%"

If the buffer size is less than 15 bytes, the result is as follows.

type Contents to be read. ------+------0 "O12O200O201O900" 1 "%\nO12(TEST)\nO20" 2 "O12(TEST)420O20"

[Example] The following program reads the registration information of NC program included specified by the arguments, and displays program number list. #include #include #include #include #define BUFSIZE 256 /* start/end specify program number range. */ short example( long start, long end ) { char buf[BUFSIZE] ; short ret, idx ; memset( buf, '\x00', BUFSIZE ) ; ret = cnc_rdprogdir( 0, start, end, BUFSIZE-1, (struct prgdir *)(&buf) ) ; if ( ret ) { printf( "ERROR: %d\n", ret ) ; return ( ret ) ; } for ( idx = 0 ; idx < strlen( buf ) ; idx++ ) { if ( buf[idx] == 'O' ) putchar( '\n' ) ; putchar( buf[idx] ) ; } putchar( '\n' ) ; } ------1.18 Read program information. ------

[Name] cnc_rdproginfo

[Syntax] #include #include short cnc_rdproginfo( short type, short length, struct odbnc *buf ) ;

struct odbnc { union { struct { short reg_prg ; /* Amount of registered programs. */ short unreg_prg ;/* Amount of available programs.*/ long used_mem ; /* Character size of used memory.*/ long unused_mem ;/* Character size of unused */ } bin ; /* memory. */ char asc[31] ; /* Buffer for ASCII string format. */ } u ; } ;

[Arguments] type Data type ( =0(binary), 1(ASCII) ). length Data block length ( =16(binary), 35(ASCII) ). buf Buffer in which the program information is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect data type "type".

[Description] Reads the management data of NC programs already registered in CNC. The management data of NC program are Amount of registered programs, Amount of available programs, Character number of used memory, Character number of unused memory. This function returns these data with binary format or ASCII string format. These informations are same as ones which are displayed in PROGRAM/LIB screen (in EDIT mode) of CNC. Specify arguments as follows for each formats. Format type length ------+------+------binary 0 16 ASCII 1 35 Format of input data ~~~~~~~~~~~~~~~~~~~~ - type=0 Each data are stored in each members of the structure with binary format.

- type=1 ASCII strings are stored in "buf.u.asc" with following format.

% LF d1 LF d2 LF d3 LF d4 LF %

LF 0x0A ('\n'). d1 Amount of registered programs. d2 Amount of available programs. d3 Character number of used memory. d4 Character number of unused memory. d1 - d4 are ASCII strings without the leading '0'.

[Example] The following program reads the management data of NC program, and displays them. #include #include #include void example( void ) { struct odbnc buf ; short ret ; ret = cnc_rdproginfo( 0, 16, &buf ) ; if ( ret ) printf( "ERROR: %d\n", ret ) ; else { printf( "Registered program number = %d\n", buf.u.bin.reg_prg ) ; printf( "Registerable program number = %d\n", buf.u.bin.unreg_prg ) ; printf( "Used memory = %ld\n", buf.u.bin.used_mem ) ; printf( "Free memory = %ld\n", buf.u.bin.unused_mem ) ; } } ------1.19 Read program number in executing. ------

[Name] cnc_rdprgnum

[Syntax] #include #include short cnc_rdprgnum( struct odbpro *buf ) ;

struct odbpro { short dummy[2] ; /* Not used. */ long data ; /* Program number in executing. */ long mdata ; /* Program number of the main program. */ } ;

[Arguments] buf Buffer in which program numbers are stored.

[Return] EW_OK( 0) Successful.

[Description] Reads program number of the program which is being currently executed in CNC. If that program is a sub-program, the program number of the main program of it is also read. The program number which can be read is one of the root program. If the program in executing is not a sub-program, the main program number is set as 0. This function is used for management of NC programs in CNC by the application program, etc. The program numbers are stored in "buf.data" and 'buf.mdata" with unsigned binary format. [Example] The next program displays "CURRENT(O9876) MAIN(O1234)" while the block "O9876/N210" of the following NC program is being executed.

#include #include #include void example( void ) { struct odbpro buf ; cnc_rdprgnum( &buf ) ; printf( "CURRENT(O%d) MAIN(O%d)\n", buf.data, buf.mdata ) ; }

O1234 ; O5678 ; O9876 ; N10 M98 P5678 ; N110 M98 P9876 ; N210 M45 ; N20 M30 ; N120 M99 ; N220 M99 ; ------1.20 Read sequence number in executing. ------

[Name] cnc_rdseqnum

[Syntax] #include #include short cnc_rdseqnum( struct odbact *buf ) ;

struct odbact { short dummy[2] ; /* Not used. */ long data ; /* Sequence number in executing. */ } ;

[Arguments] buf Buffer in which sequence number is stored.

[Return] EW_OK( 0) Successful. EW_BUSY(-1) It was impossible to read the sequence number of an NC program being executed because the CNC was updating that sequence number.

[Description] Reads the sequence number of the NC program which is being currently executed in CNC. If the NC program has no sequence numbers in its all blocks, the sequence number of the last executed block is read. This function is used for watch the block being executed or the current process by the application program, or only displaying the current sequence number. The sequence number is stored in "buf.data" with unsigned binary format. [Example] The following program displays "CURRENT N30" while the block "O1234/N30" of the following NC program is being executed.

#include #include #include void example( void ) { struct odbact buf ; cnc_rdseqnum( &buf ) ; printf( "CURRENT N%ld\n", buf.data ) ; }

O1234 ; N10 M3 S1500 ; N20 T12 ; N30 G0 X110. ; N40 ... ------1.21 Read actual feed rate of controlled axes. ------

[Name] cnc_actf

[Syntax] #include #include short cnc_actf( struct odbact *buf ) ;

struct odbact { short dummy[2] ; /* Not used. */ long data ; /* Actual feed rate (F). */ } ;

[Arguments] buf Buffer in which the actual feed rate (F) is stored.

[Return] EW_OK( 0) Successful. EW_BUSY(-1) It was impossible to read the actual feed rate of a controlled axis because the CNC was updating that actual feed rate.

[Description] Reads the actual feed rate of the controlled axes of CNC. This actual feed rate is a composite feed rate. Therefore, in case that only basic axes, such as X, Y, or Z-axis, are being moved, the accurate feed rate can be read. But if any additional axes to the basic axes, such as the rotary 4th axis or the parallel axes, are being moved, the actual feed rate to be read is the composite one of all moving axes is read. This function is used for display the actual feed rate of the controlled axes of CNC by the application program, etc. The actual feed rate data is stored in "buf.data" with unsigned binary format. The unit of the actual feed rate is as follows. mm input 1 [mm/min] inch input 0.01 [inch/min]

Even when a lathe is rotating in the feed-per-revolution mode, movement is measured in "per-minute" units. [Example] The message "CURRENT F=1200" is displayed if the following program is executed while the O1234/N20 block in the following NC program is being executed (on the assumption that the lathe is running in the metric input mode).

#include #include #include void example( void ) { struct odbact buf ; cnc_actf( &buf ) ; printf( "CURRENT F=%ld\n", buf.data ) ; }

O1234 ; N10 G98 F1200 ; N20 G1 U10. W200. N30 ... ------1.22 Read actual spindle speed. ------

[Name] cnc_acts

[Syntax] #include #include short cnc_acts( struct odbact *buf ) ;

struct odbact { short dummy[2] ; /* Not used. */ long data ; /* Actual spindle speed. */ } ;

[Arguments] buf Buffer in which the actual spindle speed is stored.

[Return] EW_OK( 0) Successful.

[Description] Reads the actual rotational speed of the spindle connected to CNC. The actual spindle speed data is stored in "buf.data" with unsigned binary format.

[Example] The following program displays "CURRENT S=2470" while the actual rotational speed of the main spindle is 2470. #include #include #include void example( void ) { struct odbact buf ; cnc_acts( &buf ) ; printf( "CURRENT S=%ld\n", buf.data ) ; } ------1.23 Read absolute position. ------

[Name] cnc_absolute

[Syntax] #include #include short cnc_absolute( short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short dummy ; /* Not used. */ short type ; /* Axis number. */ long data[N] ; /* Absolute position data of */ } ; /* controlled axis. */ /* N is a maximum controlled axis number.*/

[Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ). length Data block length ( =4+4*(Number of axes for which data is to be read) ). buf Buffer in which the absolute position data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read the absolute position data for a controlled axis because the CNC was updating that absolute position data. [Description] Reads the absolute position data of the controlled axis of CNC.

This absolute position data is identical to that in the absolute coordinate system displayed on the current position display screen of the CNC.

This function is used for displaying the absolute positions of the controlled axes of CNC by the application program, etc.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

The absolute position data is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The absolute position data of specified axis is stored in "buf.data[0]" in case of reading one axis's data.

The unit of the absolute position data is as follows.

IS-B IS-C ------+------+------Linear axis(mm input) 0.001 [mm] 0.0001 [mm] Linear axis(inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program displays 1: 120005 2: -50119 3: 80 while the absolute position data for each axes are The 1st axis 120.005 The 2nd axis -50.119 The 3rd axis 0.080 in 3-axis system. (in case of "mm input" and "IS-B".) #include #include #include void example( void ) { struct iodbaxis buf ; cnc_absolute( -1, 4+4*3, &buf ) ; printf( "1:%8ld\n2:%8ld\n3:%8ld\n", buf.data[0], buf.data[1], buf.data[2] ) ; } ------1.24 Read machine position. ------

[Name] cnc_machine

[Syntax] #include #include short cnc_machine( short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short dummy ; /* Not used. */ short type ; /* Axis number. */ long data[N] ; /* Machine position data of */ } ; /* controlled axis. */ /* N is a maximum controlled axis number.*/

[Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ). length Data block length ( =4+4*(Number of axes for which data is to be read) ). buf Buffer in which the machine position data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read the machine position data for a controlled axis because the CNC was updating that machine position data. [Description] Reads the machine position data of the controlled axis of CNC.

This machine position data is identical to that in the machine coordinate system displayed on the current position display screen of the CNC.

This function is used for displaying the machine positions of the controlled axes of CNC by the application program, etc.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

The machine position data is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The machine position data of specified axis is stored in "buf.data[0]" in case of reading one axis's data.

The unit of the machine position data is as follows.

IS-B IS-C ------+------+------Linear axis(mm output) 0.001 [mm] 0.0001 [mm] Linear axis(inch output)0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program displays "MACHINE 2: -265593" while the machine position data of the 2nd axis is -26.5593. (in case of "inch output" and "IS-B".) #include #include #include void example( void ) { struct iodbaxis buf ; cnc_machine( 2, 4+4*1, &buf ) ; printf( "MACHINE 2:%8ld\n", buf.data[0] ) ; } ------1.25 Read relative position. ------

[Name] cnc_relative

[Syntax] #include #include short cnc_relative( short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short dummy ; /* Not used. */ short type ; /* Axis number. */ long data[N] ; /* Relative position data of */ } ; /* controlled axis. */ /* N is a maximum controlled axis number.*/

[Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ).

length Data block length ( =4+4*(Number of axes for which data is to be read) ). buf Buffer in which the relative position data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read the relative position data for a controlled axis because the CNC was updating that relative position data. [Description] Reads the relative position data of the controlled axis of CNC.

This relative position data is identical to that in the relative coordinate system displayed on the current position display screen of the CNC.

This function is used for displaying the relative positions of the controlled axes of CNC by the application program, etc.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

The relative position data is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The relative position data of specified axis is stored in "buf.data[0]" in case of reading one axis's data.

The unit of the relative position data is as follows.

IS-B IS-C ------+------+------Linear axis(mm input) 0.001 [mm] 0.0001 [mm] Linear axis(inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program displays "RELATIVE 4: 900051" while the relative position data of the 4th axis(rotation axis) is 90.0051. (in case of "IS-C".) #include #include #include void example( void ) { struct iodbaxis buf ; cnc_relative( 4, 4+4*1, &buf ) ; printf( "RELATIVE 4:%8ld\n", buf.data[0] ) ; } ------1.26 Read distance to go. ------

[Name] cnc_distance

[Syntax] #include #include short cnc_distance( short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short dummy ; /* Not used. */ short type ; /* Axis number. */ long data[N] ; /* Amount of distance to go of */ } ; /* controlled axis. */ /* N is a maximum controlled axis number.*/

[Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ). length Data block length ( =4+4*(Number of axes for which data is to be read) ). buf Buffer in which the amounts of distance to go are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read data about the distance-yet-to-go of a controlled axis because the CNC was updating that data.

[Description] Reads the amount of distance to go of the controlled axis of CNC. This amount of distance to go is same as one which is displayed on the current position screen of CNC. This function is used for displaying the amount of distance to go of the controlled axes of CNC by the application program, etc. Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis". The amount of distance to go is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The amount of distance to go of specified axis is stored in "buf.data[0]" in case of reading one axis's data. ------1.27 Read skipped position. ------

[Name] cnc_skip

[Syntax] #include #include short cnc_skip( short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short dummy ; /* Not used. */ short type ; /* Axis number. */ long data[N] ; /* Skipped position data of */ } ; /* controlled axis. */ /* N is a maximum controlled axis number.*/

[Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ).

length Data block length ( =4+4*(Number of axes for which data is to be read) ). buf Buffer in which the skipped position data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read data about a skipped position for a controlled axis because the CNC was updating that data. [Description] Reads the absolute position data of the controlled axis at the position where the machine has stopped by "ON" of the skip signal during the CNC was executing the skip command (G31) block.

It is possible to make the application program which tool length measurement by the application program. The application program can take a tool length measurement and so on by reading the skipped position of the controlled axis of CNC.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

The skipped position data is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The skipped position data of specified axis is stored in "buf.data[0]" in case of reading one axis's data.

The skipped position of the axis which has not been completed skip operation is undefined. The unit of the skipped position data is as follows. IS-B IS-C ------+------+------Linear axis(mm input) 0.001 [mm] 0.0001 [mm] Linear axis(inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program displays the skipped position of the 1st and 2nd axes. #include #include #include void example( void ) { struct iodbaxis buf ; unsigned int idx ; cnc_skip( 1, 4+4*1, &buf ) ; printf( "SKIP 1:%8ld\n", buf.data[0] ) ; cnc_skip( 2, 4+4*1, &buf ) ; printf( "SKIP 2:%8ld\n", buf.data[0] ) ; } ------1.28 Read servo delay amount. ------

[Name] cnc_srvdelay

[Syntax] #include #include short cnc_srvdelay( short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short dummy ; /* Not used. */ hort type ; /* Axis number. */ long data[N] ; /* Servo delay amount of */ } ; /* controlled axis. */ /* N is a maximum controlled axis number.*/

[Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ).

length Data block length ( =4+4*(Number of axes for which data is to be read) ). buf Buffer in which the servo delay amounts are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read the servo delay amount for a controlled axis because the CNC was updating that servo delay amount.

[Description] Reads the difference between the commanded position and the actual servo position of the CNC's controlled axis, i.e. the servo delay amount. Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis". The servo delay amount is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The servo delay amount of specified axis is stored in "buf.data[0]" in case of reading one axis's data. The unit of the servo delay amount is detection unit. [Example] The following program displays the servo delay amount of all axes (amount of axes = MAX).

#include #include #include void example( void ) { struct iodbaxis buf ; unsigned int idx ; cnc_srvdelay( -1, 4+4*MAX, &buf ) ; for ( idx = 0 ; idx < MAX ; idx++ ) printf( "%u:%8ld\n", idx, buf.data[idx] ) ; } ------1.29 Read acceleration/deceleration delay amount. ------

[Name] cnc_accdecdly

[Syntax] #include #include short cnc_accdecdly( short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short dummy ; /* Not used. */ short type ; /* Axis number. */ long data[N] ; /* Acceleration/deceleration delay */ } ; /* amount of controlled axis. */ /* N is a maximum controlled axis number.*/

[Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ).

length Data block length ( =4+4*(Number of axes for which data is to be read) ). buf Buffer in which the acceleration/deceleration delay amounts are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read the acceleration/deceleration delay amount for a controlled axis because the CNC was updating that acceleration/deceleration delay amount. [Description] Reads the difference between the position commanded by the program and the one processed by acceleration/deceleration procedure of the CNC's controlled axis, i.e. the acceleration/deceleration delay amount.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

The acceleration/deceleration delay amount is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The acceleration/deceleration delay amount of specified axis is stored in "buf.data[0]" in case of reading one axis's data.

The unit of the acceleration/deceleration delay amount is as follows.

IS-B IS-C ------+------+------Linear axis(mm output) 0.001 [mm] 0.0001 [mm] Linear axis(inch output)0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program displays the acceleration/deceleration delay amount of all axes (amount of axes = MAX).

#include #include #include void example( void ) { struct iodbaxis buf ; unsigned int idx ; cnc_accdecdly( -1, 4+4*MAX, &buf ) ; for ( idx = 0 ; idx < MAX ; idx++ ) printf( "%u:%8ld\n", idx, buf.data[idx] ) ; } ------1.30 Read dynamic data. ------

[Name] cnc_rddynamic

[Syntax] #include #include short cnc_rddynamic( short axis, short length, struct odbdy *buf ) ;

struct odbdy { short dummy ; /* Not used. */ short axis ; /* Axis number. */ short alarm ; /* Alarm status. */ long prgnum ; /* Program number in executing. */ long prgmnum ; /* Program number of the main prog. */ long seqnum ; /* Sequence number. */ long actf ; /* Actual feed rate. */ long acts ; /* Actual spindle speed. */ union { struct { long absolute[32] ; /* Absolute position */ /* data of controlled*/ /* axis. */ long machine[32] ; /* Machine position */ /* data of controlled*/ /* axis. */ long relative[32] ; /* Relative position */ /* data of controlled*/ /* axis. */ long distance[32] ; /* Amount of distance*/ /* to go of */ /* controlled axis. */ } faxis ; /* For all axes. */ struct { long absolute ; /* Absolute position */ /* data of controlled*/ /* axis. */ long machine ; /* Machine position */ /* data of controlled*/ /* axis. */ long relative ; /* Relative position */ /* data of controlled*/ /* axis. */ long distance ; /* Amount of distance*/ /* to go of */ /* controlled axis. */ } oaxis ; /* For one axis. */ } pos ; } ; [Arguments] axis Axis number ( =(1,..,amount of controlled axes),or -1 ).

(This is effective to only data who have axis attribute.) length Data block length ( =22+4*4*(Number of axes for which data is to be read) ). buf Buffer in which the dynamic data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_BUSY(-1) It was impossible to read dynamic data because the CNC was updating part of that data.

[Description] Reads various data which are changing every second while NC program is executing at the same time.

This function is used for getting data to display the current position screen or the monitoring screen, etc.

This function reads the following data. Function used for reading Data individually ------+------Alarm status cnc_alarm Program number in executing cnc_rdprgnum Program number of the main program cnc_rdprgnum Sequence number cnc_rdseqnum Actual feed rate cnc_actf Actual spindle speed cnc_acts Absolute position data of controlled axis cnc_absolute Machine position data of controlled axis cnc_machine Relative position data of controlled axis cnc_relative Amount of distance to go of controlled axis cnc_distance The formats of each data are same as "Function used for reading individually". Refer each functions for formats of data, etc. Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

The array size of each member of odbdy.pos.faxis, which is used to read data related to all axes at a time, is fixed at 32 no matter how high the maximum controlled-axis number is. If the maximum controlled-axis number is lower than 32, no data is stored to the members that correspond to axis Nos. "maximum controlled-axis number + 1" to 32. [Example] The following program reads the dynamic data of all axes (amount of axes = MAX) and displays them on the screen.

#include #include #include void example( void ) { struct odbdy buf ; unsigned int idx ; cnc_rddynamic( -1, sizeof(buf), &buf ) ; printf( "Current program = %d Main program = %d\n", buf.prgnum, buf.prgmnum ) ; printf( "Sequence number = %ld\n", buf.seqnum ) ; printf( "actf = %ld acts = %ld\n", buf.actf, buf.acts ) ; printf( "Alarm status = %d\n", buf.alarm ) ; printf( "AXIS Absolute Relative Machine Distance\n" ) ; printf( "----+------+------+------+------\n" ) ; for ( idx = 0 ; idx < MAX ; idx++ ) printf( " %u %8ld %8ld %8ld %8ld\n", idx, buf.pos.faxis.absolute[idx], buf.pos.faxis.relative[idx], buf.pos.faxis.machine[idx], buf.pos.faxis.distance[idx] ) ; } ------1.31 Read CNC status information. ------

[Name] cnc_statinfo

[Syntax] #include #include short cnc_statinfo( struct odbst *buf ) ;

struct odbst { short dummy[2]; /* Not used */ short aut; /* OPERATION mode selection */ short run; /* Status of automatic operation */ short motion; /* Status of axis movement,dwell */ short mstb; /* Status of M,S,T,B function */ short emergency; /* Status of emergency stop, rest */ short alarm; /* Status of alarm */ short edit; /* Status of program editing */ } ;

[Arguments] buf Buffer in which the status informations are stored.

[Return] EW_OK( 0) Successful.

[Description] Reads the status informations of CNC which are displayed in the bottom of the NC's screen. This function reads the following status informations. (1) Operation mode (aut) Value Display Description ------+------+------0 MDI Manual data input mode 1 MEM Automatic operation mode 2 **** Not used 3 EDIT Memory editing mode 4 HND Manual handle feed mode 5 JOG Jog feed mode 6 TJOG TEACH IN JOG mode 7 THND TEACH IN HANDLE mode 8 INC Manual incremental feed mode 9 REF Manual reference position return mode 10 RMT Automatic operation (part program operation) mode (2) Automatic operation status (run) Value Display Description ------+------+------0 **** Reset 1 STOP Automatic operation stopped 2 HOLD Automatic operation suspended 3 STRT Automatic operation started

(3) Axis moving/dwelling status (motion) Value Display Description ------+------+------0 *** Axis neither moving nor dwelling 1 MTN Axis moving 2 DWL Axis dwelling

(4) M, S, T, or B function status (mstb) Value Display Description ------+------+------0 *** FIN signal not awaited. 1 FIN Auxiliary function being executed (FIN signal awaited) (5) Emergency stop or reset status (emergency) Value Display Description ------+------+------0 Not Neither at emergency stop nor at reset displayed 1 --EMG-- At emergency stop 2 -RESET- At reset (6) Alarm status (alarm) Value Display Description ------+------+------0 *** No alarm/warning 1 ALM Alarm 2 BAT Low battery voltage (7) Program editing status (edit) Value Display Description ------+------+------0 Not Editing not in progress displayed 1 EDIT Editing (such as insertion or updating) in progress 2 SRCH Search in progress 3 OUTPUT Data output in progress 4 INPUT Data input in progress 5 COMPARE Data comparison in progress 6 LSK Label skip at data input 7 OFT Offset input in progress 8 WSFT Work shift amount input in progress 9 RSTR Program restarted (*) Generally, because the CNC continuously performs editing if buf.edit is not 0, control is not passed to an application task. For this reason, an attempt by any application task to read buf.edit only results in 0 being read. ------1.32 Read alarm status. ------

[Name] cnc_alarm

[Syntax] #include #include short cnc_alarm( struct odbapb *buf ) ;

struct odbapb { short dummy[2] ; /* Not used. */ short data ; /* Alarm status. */ } ;

[Arguments] buf Buffer in which the alarm status is stored.

[Return] EW_OK( 0) Successful.

[Description] Reads the alarm status of CNC. This function is used for watching CNC's alarm status, displaying the maintenance information or guidance of how to reset the alarm, etc. The alarm status is stored in each bits of "buf.data" as follows. buf.data bit0 The parameter write switch is on. (SW) bit1 A parameter that requires turning off the power was input. (PW) bit2 I/O error (IO) bit3 Foreground P/S (PS) bit4 Overtravel/external data input error (OT) bit5 Overheat (OH) bit6 Servo alarm (SV) bit7 Data input/output error (SR) bit8 Macro alarm (MC) bit9 Spindle alarm (SP) bit10 OT alarm that will not lead to a PS alarm (DS) bit11 Alarm related to malfunction prevention (IE) bit12 Background P/S (BG) bit13 Synchronization error too high (SN) bit14 Reserved bit15 External alarm message (EX) When any alarm is arising, the correspondent bit of "buf.data" is set as "1". If no alarm, each bit is "0". ------1.33 Read alarm information. ------

[Name] cnc_rdalminfo

[Syntax] #include #include short cnc_rdalminfo( short type, short alm_type, short length, struct alminfo *buf ) ;

struct alminfo { union { struct { struct { long axis ; /* Axis information. */ short alm_no ; /* Alarm number. */ } alm[N] ; /* N is number of messages to be read. */ long data_end ; } alm1 ; struct { struct { long axis ; /* Axis information. */ short alm_no ; /* Alarm number. */ short msg_len ; /* Message length. */ char alm_msg[32] ; /* Alarm message. */ } alm[N] ; /* N is number of messages to be read. */ long data_end ; }alm2 ; } u ; } ;

[Arguments] type Data format ( =0(without message), 1(with message) ). alm_type Kind of alarm ( =0,..,31 ). length Data block length ( =4+6*N(without message), 4+40*N(with message) ). buf Buffer in which the alarm information is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect data format type "type". EW_DATA( 5) Incorrect kind of alarm "alm_type". [Description] Reads the detail informations of currently arising CNC alarms.

This function is used for displaying the alarm numbers or messages of the currently arising alarms by the application program, etc.

Specify the kind of alarm to be read in "alm_type".

alm_type Kind of alarm ------+------0 The parameter write switch is on. (SW) 1 A parameter that requires turning off the power was input. (PW) 2 I/O error (IO) 3 Foreground P/S (PS) 4 Overtravel/external data input error (OT) 5 Overheat (OH) 6 Servo alarm (SV) 7 Data input/output error (SR) 8 Macro alarm (MC) 9 Spindle alarm (SP) 10 OT alarm that will not lead to a PS alarm (DS) 11 Alarm related to malfunction prevention (IE) 12 Background P/S (BG) 13 Synchronization error too high (SN) 14 Reserved 15 External alarm message (EX) 16 External alarm message (EX2) 17 External alarm message (EX3) 18 External alarm message (EX4) 19 PMC error (PC) 20 Not used : 31 Not used Specify data format in "type". type Contents of read data ------+------0 Axis information and alarm number 1 Axis information, alarm number and alarm message

Format of input data ~~~~~~~~~~~~~~~~~~~~ - type = 0 +------+ | Axis information 1 | <-- buf.u.alm1.alm[0].axis |------| | Alarm number 1 | <-- buf.u.alm1.alm[0].alm_no |------| : |------| | Axis information n | |------| | Alarm number n | |------| | 0xFFFF (End of data) | +------+ Maximum value of n is N. - type = 1 +------+ | Axis information 1 | <-- buf.u.alm2.alm[0].axis |------| | Alarm number 1 | <-- buf.u.alm2.alm[0].alm_no |------| | Message length 1 | <-- buf.u.alm2.alm[0].msg_len |------| | Alarm message 1 | <-- buf.u.alm2.alm[0].alm_msg |------| : |------| | Axis information n | |------| | Alarm number n | |------| | Message length n | |------| | Alarm message n | |------| | 0xFFFF (End of data) | +------+ Maximum value of n is N.

"Axis information" indicates axes in which any alarm is arising by each bits. bit0 The 1st axis. bit1 The 2nd axis. : : bit31 The 32nd axis. "1" of each bit indicates any alarm is arising the corresponding axis. When all bits are "0", the alarm is not axis-type one but any ordinary one. When the same alarm is arising for the multiple axes, the corresponding multiple bits of the axis information are set as "1". "Alarm number" is the alarm number (binary format). "Message length" is a length of the alarm message. A value between 0 and 32 is stored with binary format. "Alarm message" the alarm message. It is ASCII string which is same as one displayed in the CNC's alarm screen. 2-byte characters such as Japanese Kanji character are represented using SHIFT-JIS code. A null character ('\x00') is added at the end of the string only when the string length is less than or equal to 32 bytes. A blank character is stored in the message of any axis-type alarm instead of the axis name character. The application program must store the suitable axis-name character in it.

When no alarms which belong to specified kind arise, only "End of data" is stored. This function can't read the alarm mesages (numbers 1000 to 1999) issued by PMC. ------1.34 Read tool offset amount. ------

[Name] cnc_rdtofs

[Syntax] #include #include short cnc_rdtofs( short number, short type, short length, struct odbtool *buf ) ;

struct odbtool { short datano ; /* Offset number. */ short type ; /* Offset type. */ long data ; /* Offset data. */ } ;

[Arguments] number Offset number. type Offset type. length Data block length ( =8 ). buf Buffer in which the offset amount is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect offset number "number". (This return code is returned in case that any value except 1,..,(maximum number of offset) was specified in offset number "number". EW_ATTRIB( 4) Incorrect offset type "type". EW_NOOPT( 6) There are no additional tool offset options required for the specified offset number to be read. Related options (M Series) - Number of tool compensation values (32)/64/99/200/400/499/999 sets - Tool compensation memory (A)/B/C Related options (T Series) - Number of tool compensation values (32)/64/99/200/400/499/999 sets - Tool-nose radius compensation - Tool geometry compensation and wear compensation - Y-axis offset Marked item by "()" is the basic function. EW_BUSY(-1) It has been failed to read tool offset amount because the other application program has already started writing tool offset amount. [Description] Reads the tool offset amount stored in the CNC.

Tool wear/geometry offset amounts and cutter radius/tool length offset amounts, etc. can be read.

This function is used for the automatic programming function by the application program, for example, which reads the required cutter radius offset amount for calculation of cutter radius compensation by the automatic programming function. Also, this is used for maintenance of CNC as follows. Saves tool offset amounts stored in CNC to the application's memory, Clears CNC's memory, Restores them.

Specify the kind of offset amount to be read in "type".

Machining Center Series

type Kind of offset amount ------+------0 Cutter radius compensation/wear offset amount 1 Cutter radius compensation/geometry offset amount 2 Tool length compensation/wear offset amount 3 Tool length compensation/geometry offset amount Specify "0" in case without distinctions of cutter radius/tool length and wear/geometry.

Lathe Series type Kind of offset amount ------+------0 X-axis wear offset amount 1 X-axis geometry offset amount 2 Z-axis wear offset amount 3 Z-axis geometry offset amount 4 Tool-nose radius wear offset amount 5 Tool-nose radius geometry offset amount 6 Virtual tool tip direction 7 Virtual tool tip direction 8 Y-axis wear offset amount 9 Y-axis geometry offset amount If there is no tool geometry compensation option, specify a wear compensation option. The offset amount is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The unit of offset amount is as follows. IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg] [Example] The following program reads the wear offset amount for an axis related to each specified tool number. (Lathe series)

#include #include #include

/* tidx is tool index. */ void example( short tidx ) { struct odbtool buf ; short ret ; ret = cnc_rdtofs( tidx, 0, 8, &buf ) ; if ( !ret ) printf( "X(%d) = %ld\n", tidx, buf.data ) ; ret = cnc_rdtofs( tidx, 2, 8, &buf ) ; if ( !ret ) printf( "Z(%d) = %ld\n", tidx, buf.data ) ; ret = cnc_rdtofs( tidx, 8, 8, &buf ) ; if ( !ret ) printf( "Y(%d) = %ld\n", tidx, buf.data ) ; } ------1.35 Write tool offset amount. ------

[Name] cnc_wrtofs

[Syntax] #include #include short cnc_wrtofs( short number, short type, short length, long data ) ;

[Arguments] number Offset number. type Offset type. length Data block length ( =8 ). data Offset data.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect offset number "number". (This return code is returned in case that any value except 1,..,(maximum number of offset) was specified in offset number "number". EW_ATTRIB( 4) Incorrect offset type "type". EW_NOOPT( 6) There are no additional tool offset options required for the specified offset number to be written. (See "Read tool offset amount(cnc_rdtofs)" for details.) EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Alters the tool offset amount stored in the CNC.

Tool wear/geometry offset amounts and cutter radius/tool length offset amounts, etc. can be written in.

This function is used for the preparation of machining or the tool offset measurement by the application program, to write the result of those processing into the CNC's memory. Also, this is used for restoring the tool offset amounts which are already saved into the application's memory, etc.

Specify the kind of offset amount to be written in "type".

Machining Center Series

type Kind of offset amount ------+------0 Cutter radius compensation/wear offset amount 1 Cutter radius compensation/geometry offset amount 2 Tool length compensation/wear offset amount 3 Tool length compensation/geometry offset amount Specify "0" in case without distinctions of cutter radius/tool length and wear/geometry.

Lathe Series type Kind of offset amount ------+------0 X-axis wear offset amount 1 X-axis geometry offset amount 2 Z-axis wear offset amount 3 Z-axis geometry offset amount 4 Tool-nose radius wear offset amount 5 Tool-nose radius geometry offset amount 6 Virtual tool tip direction 7 Virtual tool tip direction 8 Y-axis wear offset amount 9 Y-axis geometry offset amount If there is no tool geometry compensation option, specify a wear compensation option. Store the offset amount in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The unit of offset amount is as follows. IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg] [Example] The following program rewrites an offset amount having a specified number. (Machining center series)

#include #include

/* tidx is tool index. */ /* offset is new offset value. */ short example( short tidx, long offset ) { short ret ; ret = cnc_wrtofs( tidx, 0, 8, offset ) ; return ( ret ) ;

} ------1.36 Read tool offset amount (range specified). ------

[Name] cnc_rdtofsr

[Syntax] #include #include short cnc_rdtofsr( short s_number, short type, short e_number, short length, struct iodbto *buf ) ;

struct iodbto { short datano_s ; /* Start offset number. */ short type ; /* Offset type. */ short datano_e ; /* End offset number. */ union { long m_ofs[N] ; /* M Series individual. */ long m_ofs_a[N] ; /* M Series Memory A all. */ long m_ofs_b[2*N] ; /* M Series Memory B all. */ long m_ofs_c[4*N] ; /* M Series Memory C all. */ short t_tip[N] ; /* T Series individual, */ /* direction of imaginary */ /* tool nose. */ long t_ofs[N] ; /* T Series individual. */ struct { short tip ; long data[4] ; } t_ofs_a[N] ; /* T Series Memory A all. */ struct { short tip ; long data[8] ; } t_ofs_b[N] ; /* T Series Memory B all. */ } u ; } ; /* N is number of the offset amounts to be read. */

[Arguments] s_number Start offset number. type Offset type. e_number End offset number. length Data block length. buf Buffer in which the offset amounts are stored. [Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect offset number "s_number" or "e_number". (This return code is returned in case that any value except 1,..,(maximum number of offset) was specified in offset number "s_number" or "e_number". EW_ATTRIB( 4) Incorrect offset type "type". EW_NOOPT( 6) There are no additional tool offset options required for the specified offset number to be read. (See "Read tool offset amount(cnc_rdtofs)" for details.) EW_BUSY(-1) It was impossible to read a tool offset amount because a command from another application program to write the tool offset amount was already being executed.

[Description] Reads the tool offset amount stored in the CNC within the specified range.

Specify the start offset number in "s_number" and the end one in "e_number". Specify the kind of offset amount to be read in "type". The combinations of the value specified in "type", the data block length "length", the kind of offset amount to be read and the member where the result is stored in are as follows.

Machining Center Series/Tool offset Memory A type length Attribute Offset type Member to be stored in ------+------+------+------+------0 6+4*N individual Tool offset buf.u.m_ofs[i] ------+------+------+------+------1 6+4*N all Tool offset buf.u.m_ofs_a[i] Machining Center Series/Tool offset Memory B type length Attribute Offset type Member to be stored in ------+------+------+------+------0 6+4*N individual Tool geometry offset buf.u.m_ofs[i] 1 6+4*N individual Tool wear offset buf.u.m_ofs[i] ------+------+------+------+------2 6+8*N all Tool geometry offset buf.u.m_ofs_b[8*i+0] Tool wear offset buf.u.m_ofs_b[8*i+4] Machining Center Series/Tool offset Memory C type length Attribute Offset type Member to be stored in ------+------+------+------+------0 6+4*N individual Tool length/geometry buf.u.m_ofs[i] 1 6+4*N individual Tool length/wear buf.u.m_ofs[i] 2 6+4*N individual Cutter radius/geometry buf.u.m_ofs[i] 3 6+4*N individual Cutter radius/wear buf.u.m_ofs[i] ------+------+------+------+------3 6+16*N all Tool length/geometry buf.u.m_ofs_c[16*i+0] Tool length/wear buf.u.m_ofs_c[16*i+4] Cutter radius/geometry buf.u.m_ofs_c[16*i+8] Cutter radius/wear buf.u.m_ofs_c[16*i+12] Lathe Series/Tool offset Memory A type length Attribute Offset type Member to be stored in ------+------+------+------+------0 6+2*N individual Virtual tool tip direction buf.u.t_tip[i] 1 6+4*N individual X-axis offset amount buf.u.t_ofs[i] 2 6+4*N individual Y-axis offset amount buf.u.t_ofs[i] 3 6+4*N individual Z-axis offset amount buf.u.t_ofs[i] 4 6+4*N individual Tool-nose radius offset amount buf.u.t_ofs[i] ------+------+------+------+------1 6+18*N all Virtual tool tip direction buf.u.t_ofs_a[i].tip X-axis offset amount buf.u.t_ofs_a[i].data[0] Y-axis offset amount buf.u.t_ofs_a[i].data[1] Z-axis offset amount buf.u.t_ofs_a[i].data[2] Tool-nose radius offset amount buf.u.t_ofs_a[i].data[3]

Lathe Series/Tool offset Memory B type length Attribute Offset type Member to be stored in ------+------+------+------+------0 6+2*N individual Virtual tool tip direction buf.u.t_tip[i] 1 6+4*N individual X-axis geometry offset amount buf.u.t_ofs[i] 2 6+4*N individual Y-axis geometry offset amount buf.u.t_ofs[i] 3 6+4*N individual Z-axis geometry offset amount buf.u.t_ofs[i] 4 6+4*N individual Tool-nose radius geometry offset amount buf.u.t_ofs[i] 5 6+4*N individual X-axis wear offset amount buf.u.t_ofs[i] 6 6+4*N individual Y-axis wear offset amount buf.u.t_ofs[i] 7 6+4*N individual Z-axis wear offset amount buf.u.t_ofs[i] 8 6+4*N individual Tool-nose radius wear offset amount buf.u.t_ofs[i] ------+------+------+------+------2 6+34*N all Virtual tool tip direction buf.u.t_ofs_b[i].tip X-axis geometry offset amount buf.u.t_ofs_b[i].data[0] Y-axis geometry offset amount buf.u.t_ofs_b[i].data[1] Z-axis geometry offset amount buf.u.t_ofs_b[i].data[2] Tool-nose radius geometry offset amount buf.u.t_ofs_b[i].data[3] X-axis wear offset amount buf.u.t_ofs_b[i].data[4] Y-axis wear offset amount buf.u.t_ofs_b[i].data[5] Z-axis wear offset amount buf.u.t_ofs_b[i].data[6] Tool-nose radius wear offset amount buf.u.t_ofs_b[i].data[7] N is number of offset to be read, i = 0,..,(N-1).

The offset amounts are stored in "buf.u.xxx[i]" with signed binary format. (The negative value is represented as 2's complement.) The unit of offset amount is as follows.

IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program reads and displays the tool offset amounts for all

tools on a lathe (memory B/64 sets).

#include #include #include #include #define MAXTOOL 64 short example( void ) { struct iodbto *buf ; short ret, idx ; buf = (struct iodbto *)malloc( 6+34*MAXTOOL ) ; ret = cnc_rdtofsr( 1, -2, MAXTOOL, 6+34*MAXTOOL, buf ) ; if ( !ret ) { printf( "No X:wear Z:wear Y:wear X:geom " "Z:geom Y:geom R:wear R:geom T\n" ) ; printf( "---+------+------+------+------+" "------+------+------+------+-\n" ) ; for ( idx = 0 ; idx < MAXTOOL ; idx++ ) { printf( "%02d%8ld%8ld%8ld%8ld%8ld%8ld%8ld%8ld%2d\n", idx, buf->u.t_ofs_b[idx].data[4], buf->u.t_ofs_b[idx].data[5], buf->u.t_ofs_b[idx].data[6], buf->u.t_ofs_b[idx].data[0], buf->u.t_ofs_b[idx].data[1], buf->u.t_ofs_b[idx].data[2], buf->u.t_ofs_b[idx].data[7], buf->u.t_ofs_b[idx].data[3], buf->u.t_ofs_b[idx].tip ) ; } } free( buf ) ; return ( ret ) ; } ------1.37 Write tool offset amount (range specified). ------

[Name] cnc_wrtofsr

[Syntax] #include #include short cnc_wrtofsr( short length, struct iodbto *buf ) ;

struct iodbto { short datano_s ; /* Start offset number. */ short type ; /* Offset type. */ short datano_e ; /* End offset number. */ union { long m_ofs[N] ; /* M Series individual. */ long m_ofs_a[N] ; /* M Series Memory A all. */ long m_ofs_b[2*N] ; /* M Series Memory B all. */ long m_ofs_c[4*N] ; /* M Series Memory C all. */ short t_tip[N] ; /* T Series individual, */ /* direction of imaginary */ /* tool nose. */ long t_ofs[N] ; /* T Series individual. */ struct { short tip ; long data[4] ; } t_ofs_a[N] ; /* T Series Memory A all. */ struct { short tip ; long data[8] ; } t_ofs_b[N] ; /* T Series Memory B all. */ } u ; } ; /* N is number of the offset amounts to be read. */

[Arguments] length Data block length. buf Buffer in which the offset amounts are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect offset number "buf.datano_s" or "buf.datano_e". (This return code is returned in case that any value except 1,..,(maximum number of offset) was specified in offset number "s_number" or "e_number". EW_ATTRIB( 4) Incorrect offset type "buf.type". EW_NOOPT( 6) There are no additional tool offset options required for the specified offset number to be written. (See "Read tool offset amount(cnc_rdtofs)" for details.) EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Alters the tool offset amount stored in the CNC within the specified range.

Specify the start offset number in "buf.datano_s" and the end one in "buf.datano_e". Specify the kind of offset amount to be read in "type". The combinations of the value specified in "type", the data block length "length", the kind of offset amount to be read and the member where the result is stored in are same as "Read tool offset amount(range specified)(cnc_rdtofsr)". Refer description of it.

Store the offset amount in "buf.u.xxx[i]" with signed binary format. (The negative value is represented as 2's complement.)

The unit of offset amount is as follows.

IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program stores all tool offset amounts of Machining-Series(Memory A/64 sets).

#include #include #include #include #define MAXTOOL 64 /* offset is array of new offset value. */ short example( long *offset ) { struct iodbto *buf ; short ret ; buf = (struct iodbto *)malloc( 6+4*MAXTOOL ) ; buf->datano_s = 1 ; buf->datano_e = MAXTOOL ; buf->type = -1 ; memcpy( &(buf->u.m_ofs_a[0]), offset, 4*MAXTOOL ) ; ret = cnc_wrtofsr( 6+4*MAXTOOL, buf ) ; free( buf ) ; return ( ret ) ; } ------1.38 Read work origin offset. ------

[Name] cnc_rdzofs

[Syntax] #include #include short cnc_rdzofs( short number, short axis, short length, struct iodbaxis *buf ) ;

struct iodbaxis { short datano ; /* Offset number. */ short type ; /* Axis number. */ long data[N] ; /* Offset data. */ } ; /* N is the amount of controlled axes. */ Maximum controlled-axis number 32

[Arguments] number Offset number ( 0, 1,..,6, 7,..,306 ). axis Axis number ( =(1,..,amount of controlled axes),or -1 ).

length Data block length ( =4+4*(amount of axes to be read)). buf Buffer in which the offset amount is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect of offset number "number". (Any data other than 0,..,6 or 7,..,306 has been specified.) EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_NOOPT( 6) There are no required options. The related options; - Work coordinate system ( G54 to G59 ) - Work coordinate system 48 sets ( G54.1P1-P48 ) - Work coordinate system 300 sets ( G54.1P1-P300 ) - Controlled axis expansion EW_BUSY(-1) It was impossible to read a work origin offset because a command from another application program to write the work origin offset was already being executed. [Description] Reads the work origin offset amount stored in the CNC.

In the CNC, a work origin offset amount is provided for each controlled axis (the first to 32nd controlled axes). The work origin offset amount

can be read either for individual axes separately or for all axes at a time. If there is no controlled axis expansion option, however, it is impossible to read a work origin offset amount for additional axes.

This function is used for maintenance of CNC as follows, etc. Saves work origin offset amounts stored in CNC to the application's memory, Clears CNC's memory, Restores them.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

Specify one of following value as offset number in "number".

number Kind of work origin offset amount ------+------0 External work origin offset amount 1,..,6 Work origin offset amount of G54 through G59 7,..,306 Work origin offset amount of G54.1P1 through G54.1P300

The work origin offset amount is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The work origin offset amount of specified axis is stored in "buf.data[0]" in case of reading one axis's data. The unit of the work origin offset amount is as follows. IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program displays the work origin offset amounts of the specified number for all axes ( MAX (amount of axes = 32) ). #include #include #include /* ofs is offset number to be displayed. */ void example( short ofs ) { struct iodbaxis buf ; unsigned int idx ; cnc_rdzofs( ofs, -1, 4+4*MAX, &buf ) ; for ( idx = 0 ; idx < MAX ; idx++ ) printf( "%u:%8ld\n", idx, buf.data[idx] ) ; } ------1.39 Write work origin offset. ------

[Name] cnc_wrzofs

[Syntax] #include #include short cnc_wrzofs( short length, struct iodbaxis *buf ) ;

struct iodbaxis { short datano ; /* Offset number. */ short type ; /* Axis number. */ long data[N] ; /* Offset data. */ } ; /* N is the amount of controlled axes. */ Maximum controlled-axis number 32

[Arguments] length Data block length ( =4+4*(amount of axes to be read)). buf Buffer in which the offset amount is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect of offset number "number". (Any data other than 0,..,6 or 7,..,306 has been specified.) EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_NOOPT( 6) There are no required options. (See "Read work origin offset(cnc_rdzofs)" for details.) EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Alters the work origin offset amount stored in the CNC.

In the CNC, a work origin offset amount is provided for each controlled axis (the first to 32nd controlled axes). The work origin offset amount

can be rewritten either for individual axes separately or for all axes at a time. If there is no controlled axis expansion option, however, it is impossible to rewrite the work origin offset amount for additional axes.

This function is used for adjustment of the workpiece position using the work origin offset by the application program, to write the result of those processing into the CNC's memory. Also, this is used for restoring the work origin offset amounts which are already saved into the application's memory, etc.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "buf.type".

Specify one of following value as offset number in "buf.datano".

datano Kind of work origin offset amount ------+------0 External work origin offset amount 1,..,6 Work origin offset amount of G54 through G59 7,..,306 Work origin offset amount of G54.1P1 through G54.1P300 Store the work origin offset amount in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) Store the work origin offset amount of specified axis in "buf.data[0]" in case of altering one axis's data. The unit of the work origin offset amount is as follows. IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg] [Example] The following program alters the work origin offset amount of the specified offset number and axis number.

#include #include

/* ofs is offset number to be altered. */ /* axis is the axis number, offset is new offset value. */ short example( short ofs, short axis, long offset ) { struct iodbaxis buf ; short ret ; buf.datano = ofs ; buf.type = axis ; buf.data[0] = offset ; ret = cnc_wrzofs( 4+4*1, &buf ) ; return ( ret ) ; } ------1.40 Read work origin offset (range specified). ------

[Name] cnc_rdzofsr

[Syntax] #include #include short cnc_rdzofsr( short s_number, short axis, short e_number, short length, struct iodbzo *buf ) ;

struct iodbzo { short datano_s ; /* Start offset number. */ short type ; /* Axis number. */ short datano_e ; /* End offset number. */ long data[32*M] ; /* Offset data. */ } ; /* M is number of work origin */ /* offset amounts to be read. */

[Arguments] s_number Start offset number ( 0, 1,..,6, 7,..,306 ). axis Axis number ( =(1,..,amount of controlled axes),or -1 ).

e_number End offset number length Data block length ( =6+4*(amount of axes to be read)* (number of offset to be read) ). buf Buffer in which the offset amounts are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect of offset number "s_number" or "e_number". (Any data other than 0,..,6 or 7,..,306 has been specified.) EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_NOOPT( 6) There are no required options. (See "Read work origin offset(cnc_rdzofs)" for details.) EW_BUSY(-1) It was impossible to read a work origin offset amount because a command from another application program to write the work origin offset amount was already being executed. [Description] Reads the work origin offset amount stored in the CNC within the specified range.

In the CNC, a work origin offset amount is provided for each controlled axis (the first to 32nd controlled axes). The work origin offset amount

can be read either for individual axes separately or for all axes at a time. If there is no controlled axis expansion option, however, it is impossible to read a work origin offset amount for additional axes.

Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "axis".

Specify one of following value as start/end offset number in "s_number"/"e_number".

number Kind of work origin offset amount ------+------0 External work origin offset amount 1,..,6 Work origin offset amount of G54 through G59 7,..,306 Work origin offset amount of G54.1P1 through G54.1P300

The work origin offset amount is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The storing order is as follows. Reading for one axis Member Work origin offset ------+------buf.data[0] Start number buf.data[1] Start number+1 : : buf.data[M-1] End number Reading for all axes Member Work origin offset ------+------buf.data[0] The 1st axis of start number : : buf.data[N-1] The Nth axis of start number : : buf.data[31] The 32nd axis of start number buf.data[32] The 1st axis of (start number+1) : : buf.data[32+(N-1)] The Nth axis of (start number+1) : : buf.data[63] The 32nd axis of (start number+1) : : buf.data[32*(M-1)] The 1st axis of end number : : buf.data[32+M+N-33] The Nth axis of end number : : buf.data[32*M-1] The 32nd axis of end number N is the amount of axis and M is the number of offset to be read. If the maximum controlled-axis number is lower than 32, no data is stored to the members that correspond to axis Nos. "maximum controlled-axis number + 1" to 32. The unit of the work origin offset amount is as follows.

IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

[Example] The following program reads and displays the work origin offset amounts of G54 to G59 for all the axes (up to 32 axes).

#include #include #include #include short example( void ) { struct iodbzo *buf ; short ret, idx1, idx2 ; buf = (struct iodbzo *)malloc( 6+4*32*6 ) ; ret = cnc_rdzofsr( 1, -1, 6, 6+4*32*6, buf ) ; if ( !ret ) { for ( idx1 = 0 ; idx1 < 6 ; idx1++ ) { printf( "G%d", idx1+54 ) ; for ( idx2 = 0 ; idx2 < MAX ; idx2++ ) printf( " %8ld", buf->data[idx1*32+idx2] ) ; putchar( '\n' ) ; } } free( buf ) ; return ( ret ) ; } ------1.41 Write work origin offset (range specified). ------

[Name] cnc_wrzofsr

[Syntax] #include #include short cnc_wrzofsr( short length, struct iodbzo *buf ) ;

struct iodbzo { short datano_s ; /* Start offset number. */ short type ; /* Axis number. */ short datano_e ; /* End offset number. */ long data[32*M] ; /* Offset data. */ } ; /* M is number of work origin */ /* offset amounts to be written. */

[Arguments] length Data block length ( =6+4*(amount of axes to be read)* (number of offset to be written) ). buf Buffer in which the offset amounts are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect of offset number "datano_s" or "datano_e". (Any data other than 0,..,6 or 7,..,306 has been specified.) EW_ATTRIB( 4) Incorrect axis number "type". Any data other than -1 or (1,..,amount of controlled axes) has been specified. EW_NOOPT( 6) There are no required options. (See "Read work origin offset(cnc_rdzofs)" for details.) EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended.

[Description] Alters the work origin offset amount stored in the CNC within the specified range.

The work origin offset amounts are provided for all controlled axes (the 1st axis,..,the 32nd axis) of the CNC. It is possible to alter one offset amount for each axis or the whole for all axes at the same time. However, in case of no controlled axes expansion option, the work origin offset amounts for the additional axes can't be altered. Specify one of (1,..,amount of controlled axes) for each axis or -1 for all axes as axis number in "buf.type". Specify one of following value as start/end offset number in "buf.datano_s"/"buf.datano_e".

datano Kind of work origin offset amount ------+------0 External work origin offset amount 1,..,6 Work origin offset amount of G54 through G59 7,..,306Work origin offset amount of G54.1P1 through G54.1P300

Store the work origin offset amount in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The storing order is as follows.

Writing for one axis

Member Work origin offset ------+------buf.data[0] Start number buf.data[1] Start number+1 : : buf.data[M-1] End number Writing for all axes Member Work origin offset ------+------buf.data[0] The 1st axis of start number : : buf.data[N-1] The Nth axis of start number : : buf.data[31] The 32nd axis of start number buf.data[32] The 1st axis of (start number+1) : : buf.data[32+(N-1)] The Nth axis of (start number+1) : : buf.data[63] The 32nd axis of (start number+1) : : buf.data[32*(M-1)] The 1st axis of end number : : buf.data[32*M+N-33] The Nth axis of end number : : buf.data[32*M-1] The 32nd axis of end number N is the amount of axis and M is the number of offset to be written. In case that the amount of controlled axes is less than 32, no data are stored in the members corresponding with the axes No. (amount of controlled axes + 1),..,32.

The unit of the work origin offset amount is as follows. IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg] [Example] The following program alters the work origin offset amount of G54 through G59 for the specified axis.

#include #include #include

/* axis is axis index to be altered. */ /* offset is array of new offset value. */ short example( short axis, long *offset ) { struct iodbzo buf ; short ret ; buf.datano_s = 1 ; buf.datano_e = 6 ; buf.type = axis ; memcpy( &buf.data[0], offset, 4*6 ) ; ret = cnc_wrzofsr( 6+4*1*6, &buf ) ; return ( ret ) ; } ------1.42 Read parameter. ------

[Name] cnc_rdparam

[Syntax] #include #include short cnc_rdparam( short number, short axis, short length, struct iodbpsd *buf ) ;

typedef struct realprm { /* real parameter */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsd { short datano; /* parameter number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte parameter */ short idata; /* word parameter */ long ldata; /* 2-word parameter */ REALPRM rdata; /* real parameter */ char cdatas[MAX_AXIS]; /*bit/byte parameter with axis*/ short idatas[MAX_AXIS]; /* word parameter with axis */ long ldatas[MAX_AXIS]; /* 2-word parameter with axis */ REALPRM rdatas[MAX_AXIS]; /* real parameter with axis */ } u; } ; MAX_AXIS 32

[Arguments] number Parameter number. axis Axis number ( =(1,..,amount of controlled axes), or -1, 0 ). length Data block length ( =4+(byte size of the parameter)* (MAX_AXIS) ) buf Buffer in which the parameter is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect parameter number "number". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. [Description] Reads the parameter data stored in the CNC.

This function is used for reading the various settings of CNC to execute any processes which are equivalent to CNC's by the application program, etc.

The attribute of CNC parameter depends on the type and axis, and it is different for each parameter.

Parameter type Meaning Byte size ------+------+------Bit parameter Every bits have each definition. 1 Bit parameter with axis Every bits have each definition. 1 (each axis) Byte parameter 1-byte data is stored. 1 Byte parameter with axis 1-byte data is stored.(each axis) 1 Word parameter 2-byte data is stored. 2 Word parameter with axis 2-byte data is stored.(each axis) 2 2-Word parameter 4-byte data is stored. 4 2-Word parameter with axis 4-byte data is stored.(each axis) 4 Real parameter 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real parameter with axis 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to read any bit parameter bit by bit. 8 bits(i.e. 1 byte) which belong to the same parameter number are read at the same time. Refer "PARAMETER MANUAL" of CNC for details of each parameters. Specify the parameter number in "number" with binary format. Specify one of following values corresponding with each parameter as axis number in "axis". axis Parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter The parameter data of none axis type parameter or the axis type parameter data which was read for one specified axis is stored in "buf.u.cdata/idata/ldata/rdata". The axis type parameters which were read for all axes are stored in "buf.u.cdatas/idatas/ldatas/rdatas". The data format depends on each parameter. The format of Byte/Word/ 2-Word parameter is generally signed binary. [Example] The following program reads axis names of all controlled axes and displays them.

#include #include #include #include void example( void ) { struct iodbpsd buf ; short ret, idx ; ret = cnc_rdparam( 1020, -1, 4+10, &buf ) ; /* standard 10axes */ for ( idx = 0 ; idx < axno ; idx++ ) { printf( "#%d", idx+1 ) ; if ( buf.u.cdatas[idx] == 0 ) printf( "\033[7m%c\033[27m\n", idx+'1' ) ; else printf( "%c\n", buf.u.cdatas[idx] ) ; } } ------1.43 Write parameter. ------

[Name] cnc_wrparam

[Syntax] #include #include short cnc_wrparam( short length, struct iodbpsd *buf ) ;

typedef struct realprm { /* real parameter */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsd { short datano; /* parameter number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte parameter */ short idata; /* word parameter */ long ldata; /* 2-word parameter */ REALPRM rdata; /* real parameter */ char cdatas[MAX_AXIS]; /*bit/byte parameter with axis*/ short idatas[MAX_AXIS]; /* word parameter with axis */ long ldatas[MAX_AXIS]; /* 2-word parameter with axis */ REALPRM rdatas[MAX_AXIS]; /* real parameter with axis */ } u; } ; MAX_AXIS 32

[Arguments] length Data block length ( =4+(byte size of the parameter)* (MAX_AXIS) ) buf Buffer in which the parameter is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect parameter number "datano". EW_ATTRIB( 4) Incorrect axis number "type". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. EW_PROT( 7 ) Write operation is prohibited. [Description] Alters the parameter data stored in the CNC.

This function is used for changing the various settings of CNC by the application program, etc.

Even if "PARAMETER WRITE" is "DISABLE" in setting data, it is possible to alter CNC's parameter data.

The attribute of CNC parameter depends on the type and axis, and it is different for each parameter. It is as follows, and can be got by cnc_rdparainfo() function.

Parameter type Meaning Byte size ------+------+------Bit parameter Every bits have each definition. 1 Bit parameter with axis Every bits have each definition. 1 (each axis) Byte parameter 1-byte data is stored. 1 Byte parameter with axis 1-byte data is stored.(each axis) 1 Word parameter 2-byte data is stored. 2 Word parameter with axis 2-byte data is stored.(each axis) 2 2-Word parameter 4-byte data is stored. 4 2-Word parameter with axis 4-byte data is stored.(each axis) 4 Real parameter 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real parameter with axis 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to write any bit parameter bit by bit. 8 bits(i.e. 1 byte) which belong to the same parameter number are written at the same time. PW000 alarm :"PLEASE TURN OFF POWER" may be issued when some specific parameters are written. Refer "PARAMETER MANUAL" of CNC for details of each parameters. Specify the parameter number in "buf.datano" with binary format. Specify one of following values corresponding with each parameter as axis number in "buf.type". buf.type Parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter Store the parameter data of none axis type parameter or the axis type parameter data which will be written for one specified axis in "buf.u.cdata/idata/ldata/rdata". Store the axis type parameters which will be written for all axes in "buf.u.cdatas/idatas/ldatas/rdatas". The data format depends on each parameter. The format of Byte/Word/ 2-Word parameter is generally signed binary. [Example] The following program rewrites the stroke limit setting for a specified axis.

#include #include

/* axis is axis index. */ /* plus and minus are plus and minus position of stroke limit. */ short example( short axis, logn plus, long minus ) { struct iodbpsd buf ; short ret ; buf.datano = 1320 ; buf.type = axis ; buf.u.ldata = plus ; ret = cnc_wrparam( 4+4*1, &buf ) ; if ( ret ) return ( ret ) ; buf.datano = 1321 ; buf.type = axis ; buf.u.ldata = minus ; ret = cnc_wrparam( 4+4*1, &buf ) ; return ( ret ) ; } ------1.44 Read parameters (range specified). ------

[Name] cnc_rdparar

[Syntax] #include #include short cnc_rdparar( short s_number, short axis, short e_number, short length, struct iodbpsdr *buf ) ;

typedef struct realprm { /* real parameter */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsdr { short datano; /* parameter number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte parameter */ short idata; /* word parameter */ long ldata; /* 2-word parameter */ REALPRM rdata; /* real parameter */ char cdatas[MAX_AXIS]; /*bit/byte parameter with axis*/ short idatas[MAX_AXIS]; /* word parameter with axis */ long ldatas[MAX_AXIS]; /* 2-word parameter with axis */ REALPRM rdatas[MAX_AXIS]; /* real parameter with axis */ } u; } ; MAX_AXIS 32

[Arguments] s_number Start parameter number. axis Axis number ( =(1,..,amount of controlled axes), or -1, 0 ). e_number End parameter number. length Data block length ( = Sum of [4+(byte size of the parameter)*(MAX_AXIS)] ) buf Buffer in which the parameters are stored. [Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect parameter number "s_number" or "e_number". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified.

[Description] Reads the parameter data stored in the CNC within the specified range.

The attribute of CNC parameter depends on the type and axis, and it is different for each parameter.

Parameter type Meaning Byte size ------+------+------Bit parameter Every bits have each definition. 1 Bit parameter with axis Every bits have each definition. 1 (each axis) Byte parameter 1-byte data is stored. 1 Byte parameter with axis 1-byte data is stored.(each axis) 1 Word parameter 2-byte data is stored. 2 Word parameter with axis 2-byte data is stored.(each axis) 2 2-Word parameter 4-byte data is stored. 4 2-Word parameter with axis 4-byte data is stored.(each axis) 4 Real parameter 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real parameter with axis 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to read any bit parameter bit by bit. 8 bits(i.e. 1 byte) which belong to the same parameter number are read at the same time. Refer "PARAMETER MANUAL" of CNC for details of each parameters. Specify the start parameter number in "s_number" and the end one in "e_number" with binary format. The new parameter will may be added according to updating CNC software, addition of the new functions, etc. If the new parameters will be added within reading range, ERROR 2 ( Incorrect data block length) will be returned or the application program will not work correctly. To avoid these mistakes, specify the continuous numbers of existing parameters as the reading range. Specify one of following values corresponding with each parameter as axis number in "axis".

axis Parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter

Any values are allowed for "axis" to read none axis type parameters. In case that any axis type parameter exists in the specified range, error will be returned by specifying "axis=0".

The read parameters are stored in "buf" in following order.

+------+ | Parameter number 1 | <-- buf[0].datano |------| | Type 1 | <-- buf[0].type |------| | Data 1 | <-- buf[0].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas |------| : |------| | Parameter number n | <-- buf[n].datano |------| | Type n | <-- buf[n].type |------| | Data n | <-- buf[n].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas +------+ "Type" includes both parameter type in the upper byte and axis type in the lower byte. Type (upper byte) Parameter type ------+------0 Bit 1 Byte 2 Word 3 2-Word Axis type (lower byte) Parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter The parameter data is stored in "Data". The parameter data of none axis type parameter or the axis type parameter data which was read for one specified axis is stored in "buf[i].u.cdata/idata/ldata/rdata". The axis type parameters which were read for all axes are stored in "buf[i].u.cdatas/idatas/ldatas/ rdatas" in axis number order. The array size of each members of "iodbpsdr.u.cdatas/idatas/ldatas/rdatas" which is used for reading all axes's data is always MAX_AXIS regardless of the amount of controlled axes. In case that the amount of controlled axes is less than MAX_AXIS, no data are stored in the members corresponding with the axes No. (amount of controlled axes + 1),..,MAX_AXIS. Each buf[i] is suffixed with dummy data so that the total data size is a multiple of 4-bytes. The data format depends on each parameter. The format of Byte/Word/2-Word parameter is generally signed binary. [Example] The following program reads parameters in a specified range for a specified axis and displays them on the screen.

#include #include #include #include

/* start/end are start/end number to be read, axis is axis number. */ short example( short start, short end, short axis ) { struct odbsys info ; struct iodbpsdr *buf, *ptr ; short ret, idx1, idx2, axno, inc ; cnc_sysinfo( &info ) ; axno = atoi( info.axes ) ; buf = (struct iodbpsdr *)calloc( 1, 1000 ) ; ret = cnc_rdparar( start, axis, end, 1000, buf ) ; ptr = buf ; if ( !ret ) { for ( idx1 = start ; idx1 <= end ; idx1++ ) { if ( ( idx1 != 0 ) && ( ptr->datano == 0 ) ) break ; printf( "No.%05d ", ptr->datano ) ; switch ( ptr->type >> 8 ) { case 0: printf( "BIT " ) ; break ; case 1: printf( "BYTE" ) ; break ; case 2: printf( "WORD" ) ; break ; case 3: printf( "2WRD" ) ; break ; } switch ( ptr->type & 0xff ) { case 0xff : for ( idx2 = 0 ; idx2 < axno ; idx2++ ) { printf( " #%d:", idx2+1 ) ; switch ( ptr->type >> 8 ) { case 0: printf( "0x%02X", (unsigned char)(ptr->u.cdatas[idx2]) ) ; inc = 1 ; break ; case 1: printf( "%d", ptr->u.cdatas[idx2] ) ; inc = 1 ; break ; case 2: printf( "%d", ptr->u.idatas[idx2] ) ; inc = 2 ; break ; case 3: printf( "%ld", ptr->u.ldatas[idx2] ) ; inc = 4 ; break ; } } putchar( '\n' ) ; ptr = (struct iodbpsdr *)(((char *)ptr)+4+8*inc) ; break ; /* to be continued on the next page... */ default : printf( " #%d:", ptr->type & 0xff ) ; case 0 : switch ( ptr->type >> 8 ) { case 0: printf( " 0x%02X\n", (unsigned char)(ptr->u.cdata) ) ; inc = 1+1 ; break ; case 1: printf( " %d\n", ptr->u.cdata ) ; inc = 1+1 ; break ; case 2: printf( " %d\n", ptr->u.idata ) ; inc = 2 ; break ; case 3: printf( " %ld\n", ptr->u.ldata ) ; inc = 4 ; break ; } ptr = (struct iodbpsdr *)(((char *)ptr)+4+inc) ; break ; } } } else printf( "ERROR!(%d)\n", ret ) ; free( buf ) ; return ( ret ) ; } ------1.45 Write parameters (multiple output). ------

[Name] cnc_wrparas

[Syntax] #include #include short cnc_wrparas( short length, struct iodbpsdr *buf ) ;

typedef struct realprm { /* real parameter */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsdr { short datano; /* parameter number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte parameter */ short idata; /* word parameter */ long ldata; /* 2-word parameter */ REALPRM rdata; /* real parameter */ char cdatas[MAX_AXIS]; /*bit/byte parameter with axis*/ short idatas[MAX_AXIS]; /* word parameter with axis */ long ldatas[MAX_AXIS]; /* 2-word parameter with axis */ REALPRM rdatas[MAX_AXIS]; /* real parameter with axis */ } u; } ; MAX_AXIS 32

[Arguments] length Data block length ( = Sum of [4+(byte size of the parameter)*(MAX_AXIS)] ) buf Buffer in which the parameters are stored. [Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect parameter number "buf.datano". EW_ATTRIB( 4) Incorrect axis number "buf.type". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. EW_PROT( 7 ) Write operation is prohibited.

[Description] Alters the multiple parameter data stored in the CNC.

Even if "PARAMETER WRITE" is "DISABLE" in setting data, it is possible to alter CNC's parameter data.

The attribute of CNC parameter depends on the type and axis, and it is different for each parameter. It is as follows, and can be got by cnc_rdparainfo() function.

Parameter type Meaning Byte size ------+------+------Bit parameter Every bits have each definition. 1 Bit parameter with axis Every bits have each definition. 1 (each axis) Byte parameter 1-byte data is stored. 1 Byte parameter with axis 1-byte data is stored.(each axis) 1 Word parameter 2-byte data is stored. 2 Word parameter with axis 2-byte data is stored.(each axis) 2 2-Word parameter 4-byte data is stored. 4 2-Word parameter with axis 4-byte data is stored.(each axis) 4 Real parameter 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real parameter with axis 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to write any bit parameter bit by bit. 8 bits(i.e. 1 byte) which belong to the same parameter number are written at the same time. PW000 alarm :"PLEASE TURN OFF POWER" may be issued when some specific parameters are written. Refer "PARAMETER MANUAL" of CNC for details of each parameters. Store the parameters to be written in "buf" in following order. The data structure is same as "Read parameters(range specified) (cnc_rdparar)".

+------+ | Parameter number 1 | <-- buf[0].datano |------| | Type 1 | <-- buf[0].type |------| | Data 1 | <-- buf[0].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas |------| : |------| | Parameter number n | <-- buf[n].datano |------| | Type n | <-- buf[n].type |------| | Data n | <-- buf[n].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas +------+ Store the parameter number in "Parameter number i"(buf[i].datano) with binary format. Store the parameter type in the upper byte of "Data i"(buf[i].type) and the axis type in the lower byte. Type (upper byte) Parameter type ------+------0 Bit 1 Byte 2 Word 3 2-Word 4 real Axis type (lower byte) Parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter Store the parameter data to be written in "Data i". Store the parameter data of none axis type parameter or the axis type parameter data which will be written for one specified axis in "buf[i].u.cdata/idata/ldata/rdata". Store the axis type parameters which will be written for all axes in "buf[i].u.cdatas/idatas/ldatas/ rdatas" in axis number order. The array size of each members of "iodbpsdr.u.cdatas/idatas/ldatas/ rdatas" which is used for writing all axes's data is always MAX_AXIS regardless of the amount of controlled axes. In case that the amount of controlled axes is less than MAX_AXIS, any data need not to be stored in the members corresponding with the axes No. (amount of controlled axes + 1),..,MAX_AXIS. The data format depends on each parameter. The format of Byte/Word/2-Word/Real parameter is generally signed binary. Each buf[i] is suffixed with dummy data so that the total data size is a multiple of 4-bytes. [Example] The following program specifies that M code Nos. 6080 to 6089 be subjected to a macro call.

#include #include #include

/* mcode is 10 M-code values to be set. */ short example( short *mcode ) { struct iodbpsdr *buf, *ptr ; short ret, idx ; buf = (struct iodbpsdr *)calloc( 1, 1000 ) ; ptr = buf ; for ( idx = 0 ; idx < 10 ; idx++ ) { ptr->datano = 6080 + idx ; ptr->type = 0 ; ptr->u.cdata = mcode[idx] ; ptr = (struct iodbpsdr *)(((char *)ptr)+6) ; } ret = cnc_wrparar( 6*10, buf ) ; free( buf ) ; return ( ret ) ; } ------1.46 Read setting parameter. ------

[Name] cnc_rdset

[Syntax] #include #include short cnc_rdset( short number, short axis, short length, struct iodbpsd *buf ) ;

typedef struct realprm { /* real setting data */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsd { short datano; /* setting data number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte setting data */ short idata; /* word setting data */ long ldata; /* 2-word setting data */ REALPRM rdata; /* real setting data */ char cdatas[MAX_AXIS]; /*bit/byte set. data with axis*/ short idatas[MAX_AXIS]; /* word set. data with axis */ long ldatas[MAX_AXIS]; /* 2-word set. data with axis */ REALPRM rdatas[MAX_AXIS]; /* real set. data with axis */ } u; }; MAX_AXIS 32

[Arguments] number Setting parameter number. axis Axis number ( =(1,..,amount of controlled axes), or -1, 0 ). length Data block length ( =4+(byte size of the setting parameter)*(MAX_AXIS) ) buf Buffer in which the setting parameter is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect setting parameter number "number". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. [Description] Reads the setting parameter stored in the CNC.

This function is used for getting the information of I/O device from the setting parameter to input/output via Reader/Puncher interface of CNC by the application program, etc.

The attribute of setting data depends on the type and axis, and it is different for each setting data.

Setting data type Meaning Byte size ------+------+------Bit setting data Every bits have each definition. 1 Bit setting data with axis Every bits have each definition. 1 (each axis) Byte setting data 1-byte data is stored. 1 Byte setting data with axis 1-byte data is stored.(each axis) 1 Word setting data 2-byte data is stored. 2 Word setting data with axis 2-byte data is stored.(each axis) 2 2-Word setting data 4-byte data is stored. 4 2-Word setting data with ax.4-byte data is stored.(each axis) 4 Real setting data 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real setting data with ax. 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to read any bit setting data bit by bit. 8 bits(i.e. 1 byte) which belong to the same setting data number are read at the same time. Refer "PARAMETER MANUAL" of CNC for details of each setting parameter. Specify the setting parameter number in "number" with binary format. Specify one of following values corresponding with each setting parameter as axis number in "axis". axis Setting parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter The setting parameter of none axis type setting parameter or the axis type setting parameter which was read for one specified axis is stored in "buf.u.cdata/idata/ldata/rdata". The axis type setting parameter which were read for all axes are stored in "buf.u.cdatas/idatas/ldatas/ rdatas". The data format depends on each setting parameter. The format of Byte/Word/2-Word/Real setting parameter is generally signed binary. [Example] The following program changes the input unit to inch.

#include #include void example( void ) { struct iodbpsd buf ; cnc_rdset( 0, 0, 4+1*1, &buf ) ; *buf.u.cdata |= 0x04 ; cnc_wrset( 4+1*1, &buf ) ; } ------1.47 Write setting parameter. ------

[Name] cnc_wrset

[Syntax] #include #include short cnc_wrset( short length, struct iodbpsd *buf ) ;

typedef struct realprm { /* real setting data */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsd { short datano; /* setting data number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte setting data */ short idata; /* word setting data */ long ldata; /* 2-word setting data */ REALPRM rdata; /* real setting data */ char cdatas[MAX_AXIS]; /*bit/byte set. data with axis*/ short idatas[MAX_AXIS]; /* word set. data with axis */ long ldatas[MAX_AXIS]; /* 2-word set. data with axis */ REALPRM rdatas[MAX_AXIS]; /* real set. data with axis */ } u; } ; MAX_AXIS 32

[Arguments] length Data block length ( =4+(byte size of the setting parameter)*(MAX_AXIS) ) buf Buffer in which the setting parameter is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect setting parameter number "datano". EW_ATTRIB( 4) Incorrect axis number "type". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. [Description] Alters the setting parameter stored in the CNC.

Even if "PARAMETER WRITE" is "DISABLE" in setting parameter, it is possible to alter CNC's setting parameter.

This function is used for changing the setting of I/O device by the application program, etc.

The attribute of setting data depends on the type and axis, and it is different for each setting data. It is as follows, and can be got by cnc_rdsetinfo() function.

Setting data type Meaning Byte size ------+------+------Bit setting data Every bits have each definition. 1 Bit setting data with axis Every bits have each definition. 1 (each axis) Byte setting data 1-byte data is stored. 1 Byte setting data with axis 1-byte data is stored.(each axis) 1 Word setting data 2-byte data is stored. 2 Word setting data with axis 2-byte data is stored.(each axis) 2 2-Word setting data 4-byte data is stored. 4 2-Word setting data with ax.4-byte data is stored.(each axis) 4 Real setting data 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real setting data with ax. 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to write any bit setting data bit by bit. 8 bits(i.e. 1 byte) which belong to the same setting data number are written at the same time. Refer "PARAMETER MANUAL" of CNC for details of each setting parameters. Specify the setting parameter number in "buf.datano" with binary format. Specify one of following values corresponding with each setting parameter as axis number in "buf.type". buf.type Setting parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter

Store the setting parameter data of none axis type setting parameter or the axis type setting parameter data which will be written for one specified axis in "buf.u.cdata/idata/ldata/rdata". Store the axis type setting parameters which will be written for all axes in "buf.u.cdatas/idatas/ldatas/rdatas". The data format depends on each setting parameter. The format of Byte/Word/2-Word/Real setting parameter is generally signed binary.

[Example] See [Example] in "Read setting parameter (cnc_rdset)." ------1.48 Read setting parameters (range specified). ------

[Name] cnc_rdsetr

[Syntax] #include #include short cnc_rdsetr( short s_number, short axis, short e_number, short length, struct iodbpsdr *buf ) ;

typedef struct realprm { /* real setting data */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsdr { short datano; /* setting data number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte setting data */ short idata; /* word setting data */ long ldata; /* 2-word setting data */ REALPRM rdata; /* real setting data */ char cdatas[MAX_AXIS]; /*bit/byte set. data with axis*/ short idatas[MAX_AXIS]; /* word set. data with axis */ long ldatas[MAX_AXIS]; /* 2-word set. data with axis */ REALPRM rdatas[MAX_AXIS]; /* real set. data with axis */ } u; } ; MAX_AXIS 32

[Arguments] s_number Start setting parameter number. axis Axis number ( =(1,..,amount of controlled axes), or -1, 0 ). e_number End setting parameter number. length Data block length ( = Sum of [4+(byte size of the setting parameter)*(MAX_AXIS)] ) buf Buffer in which the setting parameters are stored. [Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect setting parameter number "s_number" or "e_number". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified.

[Description] Reads the setting parameter data stored in the CNC within the specified range.

The attribute of setting data depends on the type and axis, and it is different for each setting data.

Setting data type Meaning Byte size ------+------+------Bit setting data Every bits have each definition. 1 Bit setting data with axis Every bits have each definition. 1 (each axis) Byte setting data 1-byte data is stored. 1 Byte setting data with axis 1-byte data is stored.(each axis) 1 Word setting data 2-byte data is stored. 2 Word setting data with axis 2-byte data is stored.(each axis) 2 2-Word setting data 4-byte data is stored. 4 2-Word setting data with ax.4-byte data is stored.(each axis) 4 Real setting data 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real setting data with ax. 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to read any bit setting data bit by bit. 8 bits(i.e. 1 byte) which belong to the same setting data number are read at the same time. Refer "PARAMETER MANUAL" of CNC for details of each setting parameters. Specify the start setting parameter number in "s_number" and the end one in "e_number" with binary format. The new setting parameter will may be added according to updating CNC software, addition of the new functions, etc. If the new setting parameters will be added within reading range, ERROR 2 (Incorrect data block length) will be returned or the application program will not work correctly. To avoid these mistakes, specify the continuous numbers of existing setting parameters as the reading range. Specify one of following values corresponding with each setting parameter as axis number in "axis".

axis Setting parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter

Any values are allowed for "axis" to read none axis type setting parameters. In case that any axis type setting parameter exists in the specified range, error will be returned by specifying "axis=0".

The read setting parameters are stored in "buf" in following order.

+------+ |Setting param. Number 1| <-- buf[0].datano |------| | Type 1 | <-- buf[0].type |------| | Data 1 | <-- buf[0].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas |------| : |------| |Setting param. Number n| <-- buf[n].datano |------| | Type n | <-- buf[n].type |------| | Data n | <-- buf[n].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas +------+ "Type" includes both parameter type in the upper byte and axis type in the lower byte. Type (upper byte) Parameter type ------+------0 Bit 1 Byte 2 Word 3 2-Word 3 Real Axis type (lower byte) Parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter The setting parameter data is stored in "Data". The setting parameter data of none axis type setting parameter or the axis type setting parameter data which was read for one specified axis is stored in "buf[i].u.cdata/idata/ldata/rdata". The axis type setting parameters which were read for all axes are stored in "buf[i].u.cdatas/idatas/ldatas/rdatas" in axis number order. The array size of each members of "iodbpsdr.u.cdatas/idatas/ldatas/ rdatas" which is used for reading all axes's data is always MAX_AXIS regardless of the amount of controlled axes. In case that the amount of controlled axes is less than MAX_AXIS, no data are stored in the members corresponding with the axes No. (amount of controlled axes + 1),..,MAX_AXIS. Each buf[i] is suffixed with dummy data so that the total data size is a multiple of 4-bytes.

The data format depends on each setting parameter. The format of Byte/Word/2-Word/Real setting parameter is generally signed binary.

[Example] This function can be used in the same manner as described in "Read parameters (range specified) (cnc_rdparar)." See [Example] in this section. ------1.49 Write setting parameters (multiple output). ------

[Name] cnc_wrsets

[Syntax] #include #include short cnc_wrsets( short length, struct iodbpsdr *buf ) ;

typedef struct realprm { /* real setting data */ long prm_val; /* value of variable */ long dec_val; /* number of places of decimals */ } REALPRM;

struct iodbpsdr { short datano; /* setting data number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte setting data */ short idata; /* word setting data */ long ldata; /* 2-word setting data */ REALPRM rdata; /* real setting data */ char cdatas[MAX_AXIS]; /*bit/byte set. data with axis*/ short idatas[MAX_AXIS]; /* word set. data with axis */ long ldatas[MAX_AXIS]; /* 2-word set. data with axis */ REALPRM rdatas[MAX_AXIS]; /* real set. data with axis */ } u; } ; MAX_AXIS 32

[Arguments] length Data block length ( = Sum of [4+(byte size of the setting parameter)*(MAX_AXIS)] ) buf Buffer in which the setting parameters are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect setting parameter number "buf.datano". EW_ATTRIB( 4) Incorrect axis number "buf.type". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. [Description] Alters the multiple setting parameter data stored in the CNC.

Even if "PARAMETER WRITE" is "DISABLE" in setting data, it is possible to alter CNC's setting parameter data.

The attribute of setting data depends on the type and axis, and it is different for each setting data. It is as follows, and can be got by cnc_rdsetinfo() function.

Setting data type Meaning Byte size ------+------+------Bit setting data Every bits have each definition. 1 Bit setting data with axis Every bits have each definition. 1 (each axis) Byte setting data 1-byte data is stored. 1 Byte setting data with axis 1-byte data is stored.(each axis) 1 Word setting data 2-byte data is stored. 2 Word setting data with axis 2-byte data is stored.(each axis) 2 2-Word setting data 4-byte data is stored. 4 2-Word setting data with ax.4-byte data is stored.(each axis) 4 Real setting data 4-byte data which indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored. Real setting data with ax. 4-byte data whidh indicates value of variable and 4-byte data which indicates number of places of 8 decimals are stored.(each axis) It is impossible to write any bit setting data bit by bit. 8 bits(i.e. 1 byte) which belong to the same setting data number are written at the same time. Refer "PARAMETER MANUAL" of CNC for details of each setting parameters. Store the setting parameters to be written in "buf" in following order. The data structure is same as "Read setting parameters (range specified) (cnc_rdsetr)". +------+ |Setting param. Number 1| <-- buf[0].datano |------| | Type 1 | <-- buf[0].type |------| | Data 1 | <-- buf[0].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas |------| : |------| |Setting param. Number n| <-- buf[n].datano |------| | Type n | <-- buf[n].type |------| | Data n | <-- buf[n].u.cdata/idata/ldata/rdata | | cdatas/idatas/ldatas/rdatas +------+ Store the setting parameter number in "Setting param. Number i" (buf[i].datano) with binary format. Store the setting parameter type in the upper byte of "Data i" (buf[i].type) and the axis type in the lower byte.

Type (upper byte) Parameter type ------+------0 Bit 1 Byte 2 Word 3 2-Word 4 Real

Axis type (lower byte) Parameter type ------+------0 Ordinary (none axis type) parameter -1 All axes data of axis type parameter 1,..,amount of One specified axis data of controlled axis axis type parameter

Store the setting parameter data to be written in "Data i". Store the setting parameter data of none axis type setting parameter or the axis type setting parameter data which will be written for one specified axis in "buf[i].u.cdata/idata/ldata/rdata". Store the axis type setting parameters which will be written for all axes in "buf[i].u.cdatas/idatas/ldatas/rdaats" in axis number order. The array size of each members of "iodbpsdr.u.cdatas/idatas/ldatas/ rdatas" which is used for writing all axes's data is always MAX_AXIS regardless of the amount of controlled axes. In case that the amount of controlled axes is less than MAX_AXIS, any data need not to be stored in the members corresponding with the axes No. (amount of controlled axes + 1),..,MAX_AXIS. The data format depends on each setting parameter. The format of Byte/Word/2-Word/Real setting parameter is generally signed binary. Each buf[i] is suffixed with dummy data so that the total data size is a multiple of 4-bytes.

[Example] This function can be used in the same manner as described in "Write parameters (multiple output) (cnc_wrparas)." See [Example] in this section. ------1.50 Read pitch error compensation data (range specified). ------

[Name] cnc_rdpitchr

[Syntax] #include #include short cnc_rdpitchr( short s_number, short e_number, short length, struct iodbpi *buf ) ;

struct iodbpi { short datano_s ; /* Start pitch error compensation */ /* data number. */ short dummy ; /* Not used. */ short datano_e ; /* End pitch error compensation */ /* data number. */ char data[N] ; /* Pitch error compensation data. */ } ; /* N is the amount of compensation */ /* data to be read. */

[Arguments] s_number Start pitch error compensation number. e_number End pitch error compensation number. length Data block length ( =6+(number of compensation data to be read) ) buf Buffer in which the pitch error compensation data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect pitch error compensation number "s_number" or "e_number".

[Description] Reads the pitch error compensation data stored in the CNC within the specified range. Specify the start pitch error compensation data number in "s_number" and the end one in "e_number" with binary format. The pitch error compensation data are stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) [Example] The following program reads the pitch error compensation data within the specified number range and displays them.

#include #include #include #include

/* start/end are start/end number to be read. */ short example( short start, short end ) { struct iodbpi *buf ; short ret, idx ; buf = (struct iodbpi *)malloc( 1024 ) ; ret = cnc_rdpitchr( start, end, 6+(end-start+1), buf ) ; if ( !ret ) for ( idx = 0 ; idx < end-start+1 ; idx++ ) printf( "#%04d %+d\n", idx+start, buf->data[idx] ) ; free( buf ) ; return ( ret ) ; } ------1.51 Write pitch error compensation data (range specified). ------

[Name] cnc_wrpitchr

[Syntax] #include #include short cnc_wrpitchr( short length, struct iodbpi *buf ) ;

struct iodbpi { short datano_s ; /* Start pitch error compensation */ /* number. */ short dummy ; /* Not used. */ short datano_e ; /* End pitch error compensation */ /* number. */ char data[N] ; /* Pitch error compensation data. */ } ; /* N is number of compensation data */ /* to be written. */

[Arguments] length Data block length ( =6+(number of compensation data to be written) ) buf Buffer in which the pitch error compensation data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect pitch error compensation number "buf.datano_s" or "buf.datano_e". EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended.

[Description] Alters the pitch error compensation data stored in the CNC within the specified range. Specify the start pitch error compensation data number in "buf.datano_s" and the end one in "buf.datano_e" with binary format.

Store the pitch error compensation data "buf.data" with signed binary format. (The negative value is represented as 2's complement.) [Example] The following program alters the pitch error compensation data within the specified number range.

#include #include #include

/* start/end are start/end number to be written. */ /* data is array of value to be written. */ short example( short start, short end, char *data ) { struct iodbpi *buf ; short ret, idx ; buf = (struct iodbpi *)malloc( 1024 ) ; buf->datano_s = start ; buf->datano_e = end ; for ( idx = 0 ; idx < end-start+1 ; idx++ ) buf->data[idx] = data[idx] ; ret = cnc_wrpitchr( 6+(end-start+1), buf ) ; free( buf ) ; return ( ret ) ; } ------1.52 Read custom macro variable. ------

[Name] cnc_rdmacro

[Syntax] #include #include short cnc_rdmacro( short number, short length, struct odbm *buf ) ;

struct odbm { short dummy ; /* Not used. */ short datano ; /* Custom macro variable number. */ long mcr_val ; /* Custom macro variable value. */ short dec_val ; /* Digit number after decimal point.*/ } ;

[Arguments] number Custom macro variable number. length Data block length ( =10 ). buf Buffer in which the custom macro variable data is stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect custom macro variable number "number". EW_DATA( 5) Value of the custom macro variable is out of the limit. EW_NOOPT( 6) There are no required options. The related options; - Custom macro. - Custom macro common variable addition (#100 to #199 and #500 to #999) EW_BUSY(-1) It was impossible to read a custom macro variable because a command from another application program to write the custom macro variable was already being executed. Alternatively, an attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Reads the custom macro variable data stored in the CNC.

This function is used for controlling flow of the machining program of CNC by the application program exchanging data between the custom macro program in CNC and the application program, etc.

Types of custom macro variable are as follows.

(1) Local variables ( #1,..,#33 ) Readable. The local variables which belong to the macro program just being executed when the application program calls this function are read.

(2) Common variables ( #100,..,#149, #500,..,#531 ) Readable. In case that Custom macro common variable 900 sets option is added, #100,..,#199 and #500,..,#999 are available to be read.

(3) System variables ( #1000,.. ) Readable. Refer "USER'S MANUAL" of CNC for details of custom macro variables. Specify the custom macro variable number to be read in "number" with binary format. The variable data is stored in both "buf.mcr_val" and "buf.dec_val".

mcr_val 4-byte singed binary format data. (The negative value is represented as 2's complement.) Variable value converted into integer. dec_val 2-byte signed binary format data. (The negative value is represented as 2's complement.) Digit number after decimal point. The following values are read concretely. Variable data displayed in CNC screen mcr_val dec_val ------+------+------Blank(void) 0 -1 0.000 0 3 0.0000001 1 7 0000.0001 1 4 00000.100 100 3 00001.000 1000 3 00010.000 10000 3 100000.00 10000000 2 99999999. 99999999 0 00123.000 123000 3 -00123.000 -123000 3 [Example] The following program reads the custom macro variable data of specified number and displays it.

#include #include #include #include

/* number is variable number to be read. */ short example( short number ) { struct odbm buf ; char strbuf[11] ; short ret ; ret = cnc_rdmacro( number, 10, &buf ) ; if ( !ret ) { sprintf( &strbuf[1], "%09ld", buf.mcr_val ) ; if ( strbuf[1] == '0' ) strbuf[1] = ' ' ; strncpy( &strbuf[0], &strbuf[1], 9 - buf.dec_val ) ; strbuf[9-buf.dec_val] = '.' ; printf( "%s\n", strbuf ) ; } else printf( "**********\n" ) ; return ( ret ) ; } ------1.53 Write custom macro variable. ------

[Name] cnc_wrmacro

[Syntax] #include #include short cnc_wrmacro( short number, short length, long mcr_val , short dec_val ) ;

[Arguments] number Custom macro variable number. length Data block length ( =10 ). mcr_val Custom macro variable value. dec_val Digit number after decimal point.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect custom macro variable number "number". EW_DATA( 5) Value of the custom macro variable is out of the limit. EW_NOOPT( 6) There are no required options. The related options; - Custom macro. - Custom macro common variable addition (#100 to #199 and #500 to #999) EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended.

[Description] Writes the custom macro variable data in the CNC. This function is used for controlling flow of the machining program of CNC by the application program exchanging data between the custom macro program in CNC and the application program, etc. Types of custom macro variable are as follows. (1) Local variables ( #1,..,#33 ) Writable. The local variables which belong to the macro program just being executed when the application program calls this function are altered. (2) Common variables ( #100,..,#149, #500,..,#531 ) Writable. In case that Custom macro common variable 900 sets option is added, #100,..,#199 and #500,..,#999 are available to be written. (3) System variables ( #1000,.. ) Writable for only changeable variables. Refer "USER'S MANUAL" of CNC for details of custom macro variables.

Specify the custom macro variable number to be written in "number" with binary format.

Specify variable data to be written in both "mcr_val" and "dec_val".

mcr_val 4-byte singed binary format data. (The negative value is represented as 2's complement.) Variable value converted into integer. dec_val 2-byte signed binary format data. (The negative value is represented as 2's complement.) Digit number after decimal point.

The following values are stored concretely. (These are same as format of cnc_rdmacro() function.)

Value to be written mcr_val dec_val ------+------+------void 0 -1 0.000 0 3 0.0000001 1 7 0000.0001 1 4 00000.100 100 3 00001.000 1000 3 00010.000 10000 3 100000.00 10000000 2 99999999. 99999999 0 00123.000 123000 3 -00123.000 -123000 3 When "123." is written, "mcr_val=123000, dec_val=3" isn't only available format like above but also "mcr_val=123, dec_val=0" or "mcr_val=1230, dec_val=1", etc, are available. "void" can be written.

[Example] The following program writes the specified value in the specified custom macro variable. #include #include /* number is variable number to be written. */ /* value is value to be written. */ /* dec is decimal digit number. */ short example( short number, long value, short dec ) { short ret ; ret = cnc_wrmacro( number, 10, value, dec ) ; return ( ret ) ; } ------1.54 Read custom macro variables (range specified). ------

[Name] cnc_rdmacror

[Syntax] #include #include short cnc_rdmacror( short s_number, short e_number, short length, struct iodbmr *buf ) ;

struct iodbmr { short datano_s ; /* Start custom macro variable number.*/ short dummy ; /* Not used. */ short datano_e ; /* End custom macro variable number.*/ struct { long mcr_val ; /* Custom macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } data[N] ; /* N is number of variables to be read. */ } ;

[Arguments] s_number Start custom macro variable number. e_number End custom macro variable number. length Data block length ( =6+6*(number of variables to be read) ) buf Buffer in which the custom macro variable data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect custom macro variable number "datano_s" or "datano_e". EW_DATA( 5) Value of the custom macro variable is out of the limit. EW_NOOPT( 6) There are no required options. The related options; - Custom macro. - Custom macro common variable addition (#100 to #199 and #500 to #999) EW_BUSY(-1) It was impossible to read a custom macro variable because a command from another application program to write the custom macro variable was already being executed. Alternatively, an attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Reads the custom macro variable data stored in the CNC within the specified range.

Types of custom macro variable are as follows.

(1) Local variables ( #1,..,#33 ) Not readable. (Use cnc_rdmacro function.)

(2) Common variables ( #100,..,#149, #500,..,#531 ) Readable. In case that Custom macro common variable 900 sets option is added, #100,..,#199 and #500,..,#999 are available to be read.

(3) System variables ( #1000,.. ) Not readable. (Use cnc_rdmacro function.)

Refer "USER'S MANUAL" of CNC for details of custom macro variables.

Specify the start custom macro variable number in "s_number" and the end one in "e_number" with binary format. The variable data is stored in both "buf.data[i].mcr_val" and "buf.data[i].dec_val".

The formats of "mcr_val" and "dec_val" are same as ones of "Read custom macro variable(cnc_rdmacro)". See description of "cnc_rdmacro". [Example] The following program reads the custom macro variables within the specified range and displays them.

#include #include #include #include #include

/* start/end are start/end variable number to be read. */ short example( short start, short end ) { struct odbmr *buf ; char strbuf[11] ; short ret, idx ; buf = (struct iodbmr *)malloc( 1000 ) ; ret = cnc_rdmacror( start, end, 1000, buf ) ; if ( !ret ) for ( idx = 0 ; idx <= end-start ; idx++ ) { sprintf( &strbuf[1], "%09ld", buf->data[idx].mcr_val ) ; if ( strbuf[1] == '0' ) strbuf[1] = ' ' ; strncpy( &strbuf[0], &strbuf[1], 9 - buf->data[idx].dec_val ) ; strbuf[9-buf->data[idx].dec_val] = '.' ; printf( "#%04d %s\n", start+idx, strbuf ) ; } else printf( "ERROR!(%d)\n", ret ) ; free( buf ) ; return ( ret ) ; } ------1.55 Write custom macro variables (range specified). ------

[Name] cnc_wrmacror

[Syntax] #include #include short cnc_wrmacror( short length, struct iodbmr *buf ) ;

struct iodbmr { short datano_s ; /* Start custom macro variable number. */ short dummy ; /* Not used. */ short datano_e ; /* End custom macro variable number. */ struct { long mcr_val ; /* Custom macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } data[N] ; /* N is number of variables to be written. */ } ;

[Arguments] length Data block length ( =6+6*(number of variables to be written) ) buf Buffer in which the custom macro variable data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect custom macro variable number "datano_s" or "datano_e". EW_DATA( 5) Value of the custom macro variable is out of the limit. EW_NOOPT( 6) There are no required options. The related options; - Custom macro. - Custom macro common variable addition (#100 to #199 and #500 to #999) EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Writes the custom macro variable data stored in the CNC within the specified range.

Types of custom macro variable are as follows.

(1) Local variables ( #1,..,#33 ) Not writable. (Use cnc_wrmacro function.)

(2) Common variables ( #100,..,#149, #500,..,#531 ) Writable. In case that Custom macro common variable 900 sets option is added, #100,..,#199 and #500,..,#999 are available to be written.

(3) System variables ( #1000,.. ) Not writable. (Use cnc_wrmacro function.)

Refer "USER'S MANUAL" of CNC for details of custom macro variables.

Specify the start custom macro variable number in "buf.datano_s" and the end one in "buf.datano_e" with binary format. Store the variable data to be written in both "buf.data[i].mcr_val" and "buf.data[i].dec_val".

The formats of "mcr_val" and "dec_val" are same as ones of "Write custom macro variable(cnc_wrmacro)". See description of "cnc_wrmacro".

[Example] The following program writes the integer values into the custom macro variables within the specified range. #include #include #include /* start is start variable number to be written. */ /* value is array of value to be written. */ /* number is number of variable. */ short example( short start, long *value, short number ) { struct odbmr *buf ; short ret, idx ; buf = (struct iodbmr *)malloc( 6+6*number ) ; buf->datano_s = start ; buf->datano_e = start + number - 1 ; for ( idx = 0 ; idx < number ; idx++ ) { buf->data[idx].mcr_val = value[idx] ; buf->data[idx].dec_val = 0 ; } ret = cnc_wrmacror( 6+6*number, buf ) ; free( buf ) ; return ( ret ) ; } ------1.56 Read P-code macro variable. ------

[Name] cnc_rdpmacro

[Syntax] #include #include short cnc_rdpmacro( long number, struct odbpm *buf ) ;

struct odbpm { long datano ; /* P-code macro variable number. */ short dummy ; /* Not used. */ union { struct { long mcr_val ; /* P-code macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } p6 ; struct { short mcr_val ; /* P-code macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } p2 ; } u ; } ;

[Arguments] number P-code macro variable number. ( >= 10000 ) buf Buffer in which the P-code macro variable data is stored.

[Return] EW_OK( 0) Successful. EW_NUMBER( 3) Incorrect P-code macro variable number "number". EW_DATA( 5) Value of the P-code macro variable is out of the limit. EW_NOOPT( 6) Macro executor option isn't added, or macro module isn't loaded. EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended.

[Description] Reads the macro executor variable (P-code macro variable) data of specified number. This function is used for controlling flow of the machining program of CNC or interactive macro function by the application program exchanging data between the macro executor program in CNC and the application program, etc. Specify the P-code macro variable number to be read in "number" with binary format. The variable data is stored in both "buf.u.p6.mcr_val" and "buf.u.p6.dec_val".

mcr_val 4-byte singed binary format data. (The negative value is represented as 2's complement.) Variable value converted into integer. dec_val 2-byte signed binary format data. (The negative value is represented as 2's complement.) Digit number after decimal point.

The following values are read concretely.

Variable data displayed in CNC screen mcr_val dec_val ------+------+------Blank(void) 0 -1 0.000 0 3 0.0000001 1 7 0000.0001 1 4 00000.100 100 3 00001.000 1000 3 00010.000 10000 3 100000.00 10000000 2 99999999. 99999999 0 00123.000 123000 3 -00123.000 -123000 3

[Example] The following program reads and displays a P code macro variable having a specified number. #include #include #include #include /* number is variable number to be read. */ short example( long number ) { struct odbpm buf ; char strbuf[11] ; short ret ; ret = cnc_rdpmacro( number, &buf ) ; if ( !ret ) { sprintf( &strbuf[1], "%09ld", buf.u.p6.mcr_val ) ; if ( strbuf[1] == '0' ) strbuf[1] = ' ' ; strncpy( &strbuf[0], &strbuf[1], 9 - buf.u.p6.dec_val ) ; strbuf[9-buf.u.p6.dec_val] = '.' ; printf( "%s\n", strbuf ) ; } else printf( "**********\n" ) ; return ( ret ) ; } ------1.57 Write P-code macro variable. ------

[Name] cnc_wrpmacro

[Syntax] #include #include short cnc_wrpmacro( long number, long mcr_val, short dec_val ) ;

[Arguments] number P-code macro variable number. ( >= 10000 ) mcr_val P-code macro variable value. dec_val Digit number after decimal point.

[Return] EW_OK( 0) Successful. EW_NUMBER( 3) Incorrect P-code macro variable number "number". EW_NOOPT( 6) Macro executor option isn't added, or macro module isn't loaded. EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended.

[Description] Writes the macro executor variable (P-code macro variable) data of specified number. This function is used for controlling flow of the machining program of CNC or interactive macro function by the application program exchanging data between the macro executor program in CNC and the application program, etc. Specify the P-code macro variable number to be written in "number" with binary format. Specify variable data to be written in both "mcr_val" and "dec_val". mcr_val 4-byte singed binary format data. (The negative value is represented as 2's complement.) Variable value converted into integer. dec_val 2-byte signed binary format data. (The negative value is represented as 2's complement.) Digit number after decimal point. The following values are stored concretely. (These are same as format of cnc_rdpmacro() function.)

Value to be written mcr_val dec_val ------+------+------void 0 -1 0.000 0 3 0.0000001 1 7 0000.0001 1 4 00000.100 100 3 00001.000 1000 3 00010.000 10000 3 100000.00 10000000 2 99999999. 99999999 0 00123.000 123000 3 -00123.000 -123000 3

When "123." is written, "mcr_val=123000, dec_val=3" isn't only available format like above but also "mcr_val=123, dec_val=0" or "mcr_val=1230, dec_val=1", etc, are available. "void" can be written. Also expanded P-code macro variables (after #20000) which are used as fixed integer are written as floating point variables. The window internal routine converts floating format into fixed integer format. This function can write only P-code macro variables whose number are equal to or more than 10000.

[Example] The following program writes the specified value in the specified P-code macro variable. #include #include /* number is variable number to be written. */ /* value is value to be written. */ /* dec is decimal digit number. */ short example( long number, long value, short dec ) { short ret ; ret = cnc_wrpmacro( number, value, dec ) ; return ( ret ) ; } ------1.58 Read P-code macro variables (range specified). ------

[Name] cnc_rdpmacror

[Syntax] #include #include short cnc_rdpmacror( long s_number, long e_number, short length, struct iodbpr *buf ) ;

struct iodbpr { long datano_s ; /* Start P-code macro variable number. */ short dummy ; /* Not used. */ long datano_e ; /* End P-code macro variable number. */ union { struct { long mcr_val ; /* P-code macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } p6_r ; struct { short mcr_val ; /* P-code macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } p2_r ; } pm_r[N] ; /* N is number of variables to be read. */ } ;

[Arguments] s_number Start P-code macro variable number. e_number End P-code macro variable number. length Data block length ( =10+6*(number of variables to be read) ) buf Buffer in which the P-code macro variable data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect P-code macro variable number "s_number" or "e_number". EW_DATA( 5) Value of the P-code macro variable is out of the limit. EW_NOOPT( 6) Macro executor option isn't added, or macro module isn't loaded. EW_BUSY(-1) It was impossible to read a P code macro variable because the CNC was updating the P code macro variable. [Description] Reads the macro executor variable (P-code macro variable) data within the specified range.

Specify the start P-code macro variable number in "s_number" and the end one in "e_number" with binary format. The variable data is stored in both "buf.pr_m[i].p6_r.mcr_val" and "buf.pr_m[i].p6_r.dec_val".

The formats of "mcr_val" and "dec_val" are same as ones of "Read P-code macro variable(cnc_rdpmacro)". See description of "cnc_rdpmacro".

Also expanded P-code macro variables (after #20000) which are used as fixed integer are read as floating point variables.

This function can read only P-code macro variables whose number are equal to or more than 10000.

"pr_m[i].p2_r.mcr_val" and "pr_m[i].p2_r.dec_val", members of the structure "odbpr", are definition for compatibility with the past specification. These are not used now.

[Example] The following program reads and displays P code macro variables in a specified range. #include #include #include #include #include /* start/end are start/end variable number to be read. */ short example( long start, long end ) { struct iodbpr *buf ; char strbuf[11] ; short length, ret ; long idx ; length = 10 + 6 * ( end - start + 1 ) ; buf = (struct iodbpr *)malloc( length ) ; ret = cnc_rdpmacror( start, end, length, buf ) ; if ( !ret ) for ( idx = 0 ; idx <= end-start ; idx++ ) { sprintf( &strbuf[1], "%09ld", buf->pm_r[idx].p6_r.mcr_val ) ; if ( strbuf[1] == '0' ) strbuf[1] = ' ' ; strncpy( &strbuf[0], &strbuf[1], 9 - buf->pm_r[idx].p6_r.dec_val ) ; strbuf[9-buf->pm_r[idx].p6_r.dec_val] = '.' ; printf( "#%04ld %s\n", start+idx, strbuf ) ; } else printf( "ERROR!(%d)\n", ret ) ; free( buf ) ; return ( ret ) ; } ------1.59 Write P-code macro variables (range specified). ------

[Name] cnc_wrpmacror

[Syntax] #include #include short cnc_wrpmacror( short length, struct iodbpr *buf ) ;

struct iodbpr { long datano_s ; /* Start P-code macro variable number. */ short dummy ; /* Not used. */ long datano_e ; /* End P-code macro variable number. */ union { struct { long mcr_val ; /* P-code macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } p6_r ; struct { short mcr_val ; /* P-code macro variable value. */ short dec_val ; /* Digit number after decimal */ /* point. */ } p2_r ; } pm_r[N] ; /* N is number of variables to be read. */ } ;

[Arguments] length Data block length ( =10+6*(number of variables to be written) ) datano_s Start P-code macro variable number. ( >= 10000 ) datano_e End P-code macro variable number. mcr_val P-code macro variable value. dec_val Digit number after decimal point.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect P-code macro variable number "s_number" or "e_number". EW_NOOPT( 6) Macro executor option isn't added, or macro module isn't loaded. EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Writes the macro executor variable (P-code macro variable) data within the specified range.

Specify the start custom macro variable number in "buf.datano_s" and the end one in "buf.datano_e" with binary format. Store the variable data to be written in both "buf.pm_r[i].p6_r.mcr_val" and "buf.pm_r[i].p6_r.dec_val".

The formats of "mcr_val" and "dec_val" are same as ones of "Write P-code macro variable(cnc_wrpmacro)". See description of "cnc_wrpmacro".

Also expanded P-code macro variables (after #20000) which are used as fixed integer are written as floating point variables. The window internal routine converts floating format into fixed integer format.

This function can write only P-code macro variables whose number are equal to or more than 10000. "pr_m[i].p2_r.mcr_val" and "pr_m[i].p2_r.dec_val", members of the structure "odbpr", are definition for compatibility with the past specification. These are not used now.

[Example] The following program writes the integer values into the P-code macro variables within the specified range. #include #include #include /* start is start variable number to be written. */ /* value is array of value to be written. */ /* number is number of variable. */ short example( long start, long *value, short number ) { struct iodbpr *buf ; short ret ; long idx ; buf = (struct iodbpr *)malloc( 10+6*number ) ; buf->datano_s = start ; buf->datano_e = start + number - 1 ; for ( idx = 0 ; idx < number ; idx++ ) { buf->pm_r[idx].p6_r.mcr_val = value[idx] ; buf->pm_r[idx].p6_r.dec_val = 0 ; } ret = cnc_wrpmacror( 10+6*number, buf ) ; free( buf ) ; return ( ret ) ; } ------1.60 Read modal data. ------

[Name] cnc_modal

[Syntax] #include #include short cnc_modal( short type, short block, struct odbmdl *buf ) ;

struct odbmdl { short datano; /* Kind of modal data. */ short type; /* Objective block. */ union { char g_data; /* Modal data of G code. */ char g_rdata[35]; /* Modal data of G code. */ char g_1shot[4];/* 1 shot Modal data of G code.*/ struct { long aux_data; /* Modal data other than G code.*/ char flag1; /* Flag1. */ char flag2; * Flag2. */ }aux; struct { long aux_data; /* Modal data other than G code.*/ char flag1; /* Flag1. */ char flag2; /* Flag2. */ }raux1[27]; struct { long aux_data; /* Modal data other than G code.*/ char flag1; /* Flag1. */ char flag2; /* Flag2. */ }raux2[MAX_AXIS]; /* MAX_AXIS : Maximum */ }modal; /* controlled-axis number */ };

[Arguments] type Specifies the type of modal data. (Details are described later.) -4 : All one-shot G codes are read at a time. -3 : All axis data except for G codes is read at a time. -2 : All codes other than G codes are read at a time. -1 : All G codes are read at a time. 0 to 20 : GIndividual G codes are read separately. 100 to 126 : Individual codes other than G codes are read separately. 200 to 207 : Axis data except for G codes is read separately. 300 : Individual one-shot G codes are read separately. block Specifies a block for which data is to be read. 0 : Block being currently executed 1 : Next block modal Modal data storage area [Return] EW_OK( 0) Successful. EW_NUMBER( 3) Incorrect kind of data "type". EW_ATTRIB( 4) Incorrect objective block "block". EW_BUSY(-1) It was impossible to read modal information because the

CNC was updating the modal information.

[Description] Reads the modal information of CNC.

The readable modal data are modal G code, M/S/T code or commanded data such as F.

The type of a union for storing modal data varies depending on the type of the modal data. When accessing read results, use a union that matches the data type. (1) Reading modal G code.

The G code group listed below can be specified as the type.

Machining Lathe Series Center Series ------+------+------+------+ G code type g_data G code System A System B System C ------+------+------+------+------+ 0 0 G00 G00 G00 G00 1 G01 G01 G01 G01 2 G02 G02 G02 G02 3 G03 G03 G03 G03 4 G33 G32 G33 G33 5 G75 G90 G77 G20 6 G77 G92 G78 G21 7 G78 G94 G79 G24 9 G79 G34 G34 G34 10 G02.2 11 G03.2 12 G02.3 13 G03.3 14 G06.2 G35 G35 G35 15 G02.4 G36 G36 G36 16 G03.4 17 G06.2 G06.2 G06.2 18 G02.4 G02.4 G02.4 19 G03.4 G03.4 G03.4 20 G02.2 G02.2 G02.2 21 G03.2 G03.2 G03.2 22 G35 G02.3 G02.3 G02.3 23 G36 G03.3 G03.3 G03.3 24 G34 G06.1 G06.1 G06.1 25 G32.2 G32.2 G32.2 ------+------+------+------+------1 0 G17 G97 G97 G97 1 G96 G96 G96 4 G19 8 G18 10 G17.1 ------+------+------+------+------+ 2 0 G90 G90 G90 1 G91 G91 G91 ------+------+------+------+------3 0 G23 G69 G69 G69 1 G22 G68 G68 G68 ------+------+------+------+------4 0 G94 G98 G94 G94 1 G95 G99 G95 G95 2 G93 G93 G93 G93 2 G93.2 G93 G93 G93 ------+------+------+------+------5 0 G20(G70) G20 G20 G70 1 G21(G71) G21 G21 G71 ------+------+------+------+------(Continued on the next page) Machining Lathe Series Center Series ------+------+------+------+ G code type g_data G code System A System B System C ------+------+------+------+------+ 6 0 G40 G40 G40 G40 1 G41 G41 G41 G41 2 G42 G42 G42 G42 3 G41.2 G41.2 G41.2 G41.2 4 G42.2 G42.2 G42.2 G42.2 5 G41.3 G41.3 G41.3 G41.3 6 G41.4 G41.4 G41.4 G41.4 7 G42.4 G42.4 G42.4 G42.4 8 G41.5 G41.5 G41.5 G41.5 9 G42.5 G42.5 G42.5 G42.5 10 G40.3 G40.3 G40.3 ------+------+------+------+------7 0 G49(G49.1) G25 G25 G25 1 G43 G26 G26 G26 2 G44 3 G43.1 4 G43.4 5 G43.5 6 G43.2 7 G43.3 ------+------+------+------+------8 0 G80 G23 G23 G23 1 G81 G22 G22 G22 2 G82 3 G83 4 G84 5 G85 6 G86 7 G87 8 G88 9 G89 10 G73 11 G74 12 G76 13 G84.2 14 G84.3 15 G81.2 ------+------+------+------+------9 0 G98 G80 G80 G80 1 G99 G83 G83 G83 2 G84 G84 G84 3 G85 G85 G85 4 G86 G86 G86 5 G87 G87 G87 6 G88 G88 G88 7 G89 G89 G89 ------+------+------+------+------10 0 G50 G98 G98 1 G51 G99 G99 ------+------+------+------+------(Continued on the next page) Machining Lathe Series Center Series ------+------+------+------+ G code type g_data G code System A System B System C ------+------+------+------+------+ 11 0 G67 G67 G67 G67 1 G66 G66 G66 G66 2 G66.1 G66.1 G66.1 G66.1 ------+------+------+------+------12 0 G97 G49 G49 G49 1 G96 G43 G43 G43 ------+------+------+------+------13 0 G54(G54.1) G54 G54 G54 1 G55 G55 G55 G55 2 G56 G56 G56 G56 3 G57 G57 G57 G57 4 G58 G58 G58 G58 5 G59 G59 G59 G59 ------+------+------+------+------14 0 G64 G64 G64 G64 1 G61 G61 G61 G61 2 G62 G62 G62 G62 3 G63 G63 G63 G63 ------+------+------+------+------15 0 G69 G17 G17 G17 1 G68 2 G68.2 4 G18 G18 G18 8 G19 G19 G19 10 G17.1 G17.1 G17.1 ------+------+------+------+------+ 16 0 G15 G69.1 G69.1 G69.1 1 G16 G68.1 G68.1 G68.1 2 G68.2 G68.2 G68.2 ------+------+------+------+------17 0 G40.1(G150) G50 G50 1 G41.1(G151) G51 G51 2 G42.1(G152) ------+------+------+------+------18 0 G25 1 G26 ------+------+------+------+------19 0 G160 G50.2 G50.2 G50.2 1 G161 G51.2 G51.2 G51.2 ------+------+------+------+------20 0 G13.1(G113) G13.1 G13.1 G13.1 1 G12.1(G112) G12.1 G12.1 G12.1 ------+------+------+------+------The numbers in the g_data column of the above table are stored to bits 0 to 6 of buf.modal.g_data in binary form. Bit 7 of buf.modal.g_data is used to store information about whether this G code is specified in a read target block specified in "block".

7 6 5 4 3 2 1 0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌┼・│ Code in each group │ 1 byte │└─┴─┴─┴─┴─┴─┴─┴─┘ └─┬──→ 0 : The G code is not specified in the current │ block. └──→ 1 : The G code is specified in the current block.

If this function is executed when the N100 block in the following NC program is executed, for example, the result is as listed below.

N090 G18 ; N100 G1 Z100. ; N110 G17 G2 X10. Y-20. R12. ;

type block g_data Modal state ------+------+------+------0 0 0x81 G1 is specified. 0 1 0x82 G2 is specified. 1 0 0x08 G18 mode (no specification) 1 1 0x80 G17 is specified.

To read all types related to the G code at a time, specify -1. The g_data array is set to buf.modal.g_rdata. Data of type 0 to data of type 20 are set, respectively in, in g_rdata[0] to g_rdata[20]. (2) Reading modal data other than B code.

type Address ------+------100 B (2nd auxiliary function) 101 D 102 - (Reserved) 103 F 104 H [M] 105 L 106 M 107 S 108 T 109 R [M] 110 P [M] 111 Q [M] 112 A 113 C 114 I 115 J 116 K 117 N 118 O 119 U 120 V 121 W 122 X 123 Y 124 Z 125 M (2nd M code) 126 M (3rd M code) ------+------200 1st axts 201 2nd axts 202 3rd axts 203 4th axts 204 5th axts 205 6th axts 206 7th axts 207 8th axts ------+------Data of a type indicated [M] is read as modal data for the machining center series and command data for the lathe series. To read data of types 100 to 199 at a time, specify -2. The data is set in the buf.modal.raux1 array. To read data of types 200 to 299 at a type, specify -3. The data is set in the buf.modal.raux2 array. ┌───────────────┐ │ Data │ : 4 bytes ├───────────────┤ ┌─│ FLAG1 │ : 1 byte │ ├───────────────┤ ┌┼─│ FLAG2 │ : 1 byte ││ └───────────────┘ ││ 7 6 5 4 3 2 1 0 ││ ┌─┬─┬─┬─┬─┬─┬─┬─┐ │└→│ │ │ │-│Number of │ │ │ │ │ │ │input digits │ │ └─┴─┴─┴─┴─┴─┴─┴─┘ │ │ │ ├─→ 0 : The data is positive. │ │ │ └─→ 1 : The data is negative. │ │ ├───→ 0 : No decimal point is specified for the data. │ │ └───→ 1 : A decimal point is specified for the data. │ ├─────→ 0 : The data is not specified as the current │ │ block. │ └─────→ 1 : The data is specified as the current block. │ ┌─┬─┬─┬─┬─┬─┬─┬─┐ └─→│Number of digits after │ │the decimal point │ └─┴─┴─┴─┴─┴─┴─┴─┘ * Even if no decimal point is specified, the number of digits after the decimal point may not be 0. * For the command addresses M, S, T, and B, a parameter-specified allowable number of digits is returned as the number of input digits.

M parameter No. 3030: Allowable number of digits for the M code S parameter No. 3031: Allowable number of digits for the S code T parameter No. 3032: Allowable number of digits for the T code B parameter No. 3033: Allowable number of digits for the B code (3) Reading modal data for one-shot G codes

Machining Lathe Series Center Series ------+------+------+------+ G code type g_data G code System A System B System C ------+------+------+------+------+ 300 0 G04 G04 G04 G04 1 G10 G27 G27 G27 2 G28 G28 G28 3 G29 G29 G29 4 G27 G30 G30 G30 5 G28 G50 G92 G92 6 G29 G70 G70 G72 7 G30 G71 G71 G73 8 G38 G72 G72 G74 9 G39 G73 G73 G75 10 G74 G74 G76 11 G75 G75 G77 12 G76 G76 G78 13 G10 G10 G10 14 G92 G37.1 G37.1 G37.1 15 G37 G37 G37 16 G31(G31.1) G31 G31 G31 17 G60 G65 G65 G65 18 G65 19 G05 G05 G05 20 G05 G11 G11 G11 21 G11 G07.1 G07.1 G07.1 22 G52 G52 G52 G52 23 G53 G53 G53 G53 24 G37 G30.1 G30.1 G30.1 25 G07.1(G107) G10.6 G10.6 G10.6 26 G30.1 G50.3 G92.1 G92.1 27 G10.6 G08 G08 G08 28 G72.1 29 G72.2 G39 G39 G39 30 G92.1 G60 G60 G60 31 G08 32 80 81 100 G81.1 G07 G07 G07 101 G09 G09 G09 102 G73.1 G73.1 G73.1 103 G73.2 G73.2 G73.2 104 G05.1 G74.1 G74.1 G74.1 105 G07 106 G31.8 G80.4 G80.4 G80.4 107 G31.9 G81.4 G81.4 G81.4 108 G12.4 G82.4 G82.4 G82.4 109 G13.4 G83.4 G83.4 G83.4 110 G05.4 G84.4 G84.4 G84.4 111 G10.9 G05.1 G05.1 G05.1 112 G31.2 G72.1 G72.1 G72.1 113 G31.3 G72.2 G72.2 G72.2 114 G31.4 G53.1 G53.1 G53.1 ------+------+------+------+ (Continued on the next page) Machining Lathe Series Center Series ------+------+------+------+ G code type g_data G code System A System B System C ------+------+------+------+------+ 116 G91.1 G38 G38 G38 119 G43.6 G43.6 G43.6 120 G50.4 G50.4 G50.4 121 G50.5 G50.5 G50.5 122 G50.6 G50.6 G50.6 123 G51.4 G51.4 G51.4 124 G51.5 G51.5 G51.5 125 G51.6 G91.1 G91.1 126 G28.2 G28.2 G28.2 127 G30.2 G30.2 G30.2 ------+------+------+------+------

The numbers in the g_1shot column of the above table are stored to bits

0 to 6 of buf.modal.g_1shot in binary form. Bit 7 of buf.modal.g_1shot is used to store information about whether this G code is specified in a read target block specified in "block".

7 6 5 4 3 2 1 0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌┼* │ Code in each group │ 1 byte │└─┴─┴─┴─┴─┴─┴─┴─┘ └─┬──→ 0: The G code is not specified in the current │ block. └──→ 1: The G code is specified in the current block. To read data of all types related to one-shot G codes, specify -4. The data of type 300 is set in the buf.modal.g_1shot[0]. ------1.61 Read diagnostics data. ------

[Name] cnc_diagnoss

[Syntax] #include #include short cnc_diagnoss( short number, short axis, short length, struct iodbpsd *buf ) ;

struct iodbpsd { short datano; /* diagnosis number */ short type; /* axis number */ union { char cdata; /* bit/byte diagnosis */ short idata; /* word diagnosis */ long ldata; /* 2-word diagnosis */ char cdatas[N]; /*bit/byte diagnosis with axis*/ short idatas[N]; /* word diagnosis with axis */ long ldatas[N]; /* 2-word diagnosis with axis */ } u ; } ; /* N : max. controlled axes */

[Arguments] number Diagnostic number. axis Axis number ( =(1,..,amount of controlled axes), or -1, 0 ). length Data block length ( =4+(byte size of the diagnostics data)*(amount of axes to be read) ) buf Buffer in which the diagnostics data are stored. [Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect diagnostic number "number". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. EW_NOOPT( 6) An option (such as a remote buffer) required to use data

having a specified diagnose data number has not been added. EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Reads the contents of data displayed in the diagnostics screen of CNC.

The attribute of diagnosis depends on the type and axis, and it is different for each diagnosis.

Diagnosis type Use Byte size ------+------+------Byte type data To display 1-byte data 1 Word type data To display 2-byte data 2 2-word type data To display 4-byte data 4

The data that is displayed in bit form on the CNC diagnostic screen is of byte type. Axis type data can be read either for individual axes separately or for all axes at a time.

Refer "MAINTENANCE MANUAL" of CNC for details of each diagnostics data.

Specify the diagnostic number in "number" with binary format. Specify one of following values corresponding with each diagnostic data as axis number in "axis".

axis Diagnostics data type ------+------0 Ordinary (none axis type) data -1 All axes data of axis type data 1,..,amount of One specified axis data of controlled axis axis type data The diagnostics data of none axis type data or the axis type data which was read for one specified axis is stored in "buf.u.cdata/idata/ldata". The axis type data which were read for all axes are stored in "buf.u.cdatas/idatas/ldatas". The data format depends on each diagnostics data. The format of Byte/Word/2-Word data is generally signed binary. This function reads the "raw" diagnostics data. In case of reading bit data, also the masked bit on the CNC's diagnostics screen can be read without masking. Therefore, there may be difference between the contents of displayed data on the CNC's screen and ones read by this function. Reference ~~~~ Types of diagnostics data displayed on the CNC screen

Diagnosis number Type ------+------000 to 006 Byte 010 to 015 Byte 020 to 025 Byte 030 to 031 Byte 200 to 204 Byte axis 280 Byte axis 300 to 302 2-word axis 380 to 381 Word axis 400 to 402 Byte 408 to 409 Byte 410 to 413 Word 414 to 416 2-word 417 Word 418 2-word 419 Word 420 2-word [Example] The following program reads information about what operation status the CNC is in and displays the information on the screen.

#include #include #include void example( void ) { short dgn_no[] = { 0,1,2,3,4,5,6,10,11,12,13,14,15 } ; char *dgn_msg[] = { "WAITING FOR FIN SIGNAL", "MOTION", "DWELL", "IN-POSITION CHECK", "FEEDRATE OVERRIDE 0%", "INTERLOCK/STARTLOCK", "SPINDLE SPEED ARRIVAL CHECK", "PUNCHING", "READING", "WAITING FOR (UN) CLAMP", "JOG FEEDRATE OVERRIDE 0%", "WAITING FOR RESET. ESP. RRW. OFF", "EXTERNAL PROGRAM NUMBER SEARCH" } ; short idx, count = 0 ; struct iodbpsd buf ; printf( "\033[1;1H<< CNC DIAGNOSTICS >>\n\n" ) ; for ( idx = 0 ; idx < sizeof(dgn_no)/sizeof(short) ; idx++ ) { cnc_diagnoss( dgn_no[idx], 0, 4+1*1, &buf ) ; if ( buf.u.cdata ) { printf( "%03d %s\n", dgn_no[idx], dgn_msg[idx] ) ; count++ ; } } for ( idx = 0 ; idx < 10 - count ; idx++ ) printf( "\033[K\n" ) ; } ------1.62 Read diagnostics data (range specified). ------

[Name] cnc_diagnosr

[Syntax] #include #include short cnc_diagnosr( short s_number, short axis, short e_number, short length, struct iodbpsdr *buf ) ;

struct iodbpsdr { short datano; /* diagnosis number */ short type; /* upper byte:type */ /* lower byte:axis */ union { char cdata; /* bit/byte diagnosis */ short idata; /* word diagnosis */ long ldata; /* 2-word diagnosis */ char cdatas[32]; /*bit/byte diagnosis with axis*/ short idatas[32]; /* word diagnosis with axis */ long ldatas[32; /* 2-word diagnosis with axis */ } u ; } ;

[Arguments] s_number Start diagnostic number. axis Axis number ( =(1,..,amount of controlled axes), or -1, 0 ). e_number End diagnostic number. length Data block length ( = Sum of [4+(byte size of the diagnostics data)*( amount of axes to be read)] ) buf Buffer in which the diagnostics data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect diagnostic number "s_number" or "e_number". EW_ATTRIB( 4) Incorrect axis number "axis". Any data other than -1, 0 or (1,..,amount of controlled axes) has been specified. EW_NOOPT( 6) An option (such as a remote buffer) required to use data having a specified diagnose data number has not been added. EW_BUSY(-1) An attempt was made to execute this command when other window processing of a low-speed type was in progress. Execute the command after the window processing has ended. [Description] Reads the contents of data displayed in the diagnostics screen of CNC within the specified range.

The attribute of diagnosis depends on the type and axis, and it is different for each diagnosis.

Diagnosis type Use Byte size ------+------+------Byte type data To display 1-byte data 1 Word type data To display 2-byte data 2 2-word type data To display 4-byte data 4

The data that is displayed in bit form on the CNC diagnostic screen is of byte type. Axis type data can be read either for individual axes separately or for all axes at a time.

Refer "MAINTENANCE MANUAL" of CNC for details of each diagnostics data. Specify the start diagnostic number in "s_number" and the end one in "e_number" with binary format. The new diagnostics data will may be added according to updating CNC software, addition of the new functions, etc. If the new diagnostics data will be added within reading range, ERROR 2 (Incorrect data block length) will be returned or the application program will not work correctly. To avoid these mistakes, specify the continuous numbers of existing diagnostics data as the reading range. Specify one of following values corresponding with each diagnostic data as axis number in "axis". axis Diagnostics data type ------+------0 Ordinary (none axis type) data -1 All axes data of axis type data 1,..,amount of One specified axis data controlled axis of axis type data Any values are allowed for "axis" to read none axis type diagnostics data. In case that any axis type diagnostics data exists in the specified range, error will be returned by specifying "axis=0". The read diagnostics data are stored in "buf" in following order.

+------+ | Data number 1 | <-- buf[0].datano |------| | Type 1 | <-- buf[0].type |------| | Data 1 | <-- buf[0].u.cdata/idata/ldata/ | | cdatas/idatas/ldatas |------| : |------| | Data number n | <-- buf[n].datano |------| | Type n | <-- buf[n].type |------| | Data n | <-- buf[n].u.cdata/idata/ldata/ | | cdatas/idatas/ldatas +------+

"Type" includes both diagnostics data type in the upper byte and axis type in the lower byte. Type (upper byte) Diagnostics data type ------+------0 Byte 1 Word 2 2-Word Axis type (lower byte) Diagnostics data type ------+------0 Ordinary (none axis type) data -1 All axes data of axis type data 1,..,amount of One specified axis data controlled axis of axis type data The diagnostics data is stored in "Data". The diagnostics data of none axis type data or the axis type data which was read for one specified axis is stored in "buf[i].u.cdata/idata/ldata". The axis type data which were read for all axes are stored in "buf[i].u.cdatas/idatas/ldatas" in axis number order. The array size of each members of "iodbpsdr.u.cdatas/idatas/ldatas" which is used for reading all axes's data is always 32 regardless of the amount of controlled axes. In case that the amount of controlled axes is less than 32, no data are stored in the members corresponding with the axes No. (amount of controlled axes + 1),..,32. Each buf[i] is suffixed with dummy data so that the total data size is a multiple of 4-bytes.

The data format depends on each diagnostics data. The format of Byte/Word/2-Word data is generally signed binary. In case of reading bit data, also the masked bit on the CNC's diagnostics screen can be read without masking. Therefore, there may be difference between the contents of displayed data on the CNC's screen and ones read by this function. [Example] The following program reads diagnose data in a specified range for a specified axis and displays it on the screen.

#include #include #include #include

/* start/end are start/end number to be read. */ /* axis is axis number. */ short example( short start, short end, short axis ) { struct odbsys info ; struct iodbpsdr *buf, *ptr ; short ret, idx1, idx2, axno, inc ; cnc_sysinfo( &info ) ; axno = atoi( info.axes ) ; buf = (struct iodbpsdr *)calloc( 1, 1000 ) ; ret = cnc_diagnosr( start, axis, end, 1000, buf ) ; ptr = buf ; if ( !ret ) { for ( idx1 = start ; idx1 <= end ; idx1++ ) { if ( ( idx1 != 0 ) && ( ptr->datano == 0 ) ) break ; printf( "No.%05d ", ptr->datano ) ; switch ( ptr->type >> 8 ) { case 0: printf( "BYTE" ) ; break ; case 1: printf( "WORD" ) ; break ; case 2: printf( "2WRD" ) ; break ; } switch ( ptr->type & 0xff ) { case 0xff : for ( idx2 = 0 ; idx2 < axno ; idx2++ ) { printf( " #%d:", idx2+1 ) ; switch ( ptr->type >> 8 ) { case 0: printf( "%02X", ptr->u.cdatas[idx2] ) ; inc = 1 ; break ; case 1: printf( "%d", ptr->u.idatas[idx2] ) ; inc = 2 ; break ; case 2: printf( "%ld", ptr->u.ldatas[idx2] ) ; inc = 4 ; break ; } } putchar( '\n' ) ; ptr = (struct iodbpsdr *)(((char *)ptr)+4+8*inc) ; break ; /* to be continued on the next page... */ default : printf( " #%d:", ptr->type & 0xff ) ; case 0: switch ( ptr->type >> 8 ) { case 0: printf( " %02X\n", ptr->u.cdata ) ; inc = 2 ; break ; case 1: printf( " %d\n", ptr->u.idata ) ; inc = 2 ; break ; case 2: printf( " %ld\n", ptr->u.ldata ) ; inc = 4 ; break ; } ptr = (struct iodbpsdr *)(((char *)ptr)+4+inc) ; break ; } } } else printf( "ERROR!(%d)\n", ret ) ; free( buf ) ; return ( ret ) ; } ------1.63 Read A/D conversion data. ------

[Name] cnc_adcnv

[Syntax] #include #include short cnc_adcnv( short inp_type, short av_type, struct odbad *buf ) ;

struct odbad { short datano ; /* Kind of analog voltage. */ short type ; /* Input channel or controlled axis number. */ short data ; /* Voltage data. */ } ;

[Arguments] inp_type Kind of analog voltage ( =0, 2 ). av_type Controlled axis number of CNC. ( 1,..,(amount of controlled axes) ) buf Buffer in which the A/D conversion data is stored.

[Return] EW_OK( 0) Successful. EW_ATTRIB( 4) Incorrect input channel or controlled axis number "av_type". [Description] Reading the load information of the controlled axis of the CNC.

Reads the load current data of the controlled axis of the CNC which is converted into analog voltage via A/D converter.

Specify "2" in "inp_type". Specify the controlled axis number of the CNC whose load information is read in "av_type".

av_type Objective axis ------+------1 Axis connected to connector "JV1" 2 Axis connected to connector "JV2" 3 Axis connected to connector "JV3" 4 Axis connected to connector "JV4" 5 Axis connected to connector "JV5" 6 Axis connected to connector "JV6" 7 Axis connected to connector "JV7" 8 Axis connected to connector "JV8" This axis number is the servo axis number, and may be different from the controlled axis number of the CNC.

The digital value (0,..,+/-6554) which is converted from the load current is stored in "buf.data" with binary format. It is possible to get the load current using this value as following formula. The load current = buf.data * N / 6554 [Apeak] where N takes the following value. Value of parameter No. 2165 Value of N ------+------Less than 20 [Value of parameter No. 2165] Greater than or equal to 20 [Value of parameter No. 2165]/ 10 * 10 (rounded down to the tens digit) ------1.64 Read operator's message. ------

[Name] cnc_rdopmsg

[Syntax] #include #include short cnc_rdopmsg( short type , short length, struct msg *buf ) ;

struct msg { short datano ; /* Operator's message number. */ short type ; /* Kind of operator's message. */ short char_num ; /* Message length. */ char data[N] ; /* Operator's message. */ } ; /* N is maximum length of string. */

[Arguments] type Kind of the operator's message ( =0,1,2,3 ). length Data block length ( =6+(maximum length of string) ) buf Buffer in which the operator's message is stored.

[Return] EW_OK( 0) Successful. EW_ATTRIB( 4) Incorrect kind of the operator's message "type". EW_NOOPT( 6) External message or option of external data input isn't added.

[Description] Reads the contents of the operator's message displayed in the CNC's screen. Be sure to set "0" to "type". The operator's message number (100,..,999 or 2000,..,2099) is stored in "buf.datano" with binary format. When no operator's message is displayed, "-1" is stored. Always "0" is stored in "buf.data". The ASCII strings which terminated by a null character ('\x00') is stored in "buf.data". The length of string stored in "buf.data" is stored in "buf.char_num" with binary format. This function cannot read any of PMC alarm messages 1000 to 1999. [Example] The following program reads the operator's message and displays it.

#include #include #include void example( void ) { struct msg buf ; cnc_rdopmsg( 0, 6+256, &buf ) ; if ( buf.datano != -1 ) printf( "%04d %s\n", buf.datano, buf.data ) ; else printf( "No operator message.\n" ) ; } ------1.65 Set path index (multi-path system). ------

[Name] cnc_setpath

[Syntax] #include #include short cnc_setpath( int path_no ) ;

[Arguments] path_no Path number.

[Return] EW_OK( 0) Successful. EW_PATH(11) Incorrect path number "path_no".

[Description] Selects the path number which is objective path of the CNC window functions in the multi-path system.

All CNC window functions inputs from/outputs to the CNC's path selected by this function. Specify the path number in "path_no" with binary format. path_no Objective path ------+------0 or 1 The 1st path The 1st path is selected during this function has never been called since power-on. [Example] The following program sets up a specified path and processing target path.

#include #include #include

/* path is new path number to be set. */ short example( short path ) { short ret ; ret = cnc_setpath( path ) ; if ( !ret ) printf( "PATH #%d has been set as new target path.\n", path ) ; else printf( "ERROR!(%d)\n", ret ) ; return ( ret ) ; } ------1.66 Get path index (multi-path system). ------

[Name] cnc_getpath

[Syntax] #include #include short cnc_getpath( short *path_no, short *maxpath_no ) ;

[Arguments] path_no Current selected path number. maxpath_no Maximum path number.

[Return] EW_OK( 0) Successful.

[Description] Reads the current selected path number which is the objective path of the CNC window functions.

The current selected path number ("1" or "2") is stored in "path_no" with binary format. The maximum selectable path number is stored in "maxpath_no" with binary format.

[Example] The following program reads and displays information about the current processing target path. #include #include #include void example( void ) { short path, max ; cnc_getpath( &path, &max ) ; printf( "Current target path is PATH #%d (max:%d).\n", path, max ) ; } ------1.67 Set calendar timer of CNC. ------

[Name] cnc_settimer

[Syntax] #include #include short cnc_settimer( struct iodbtimer *buf ) ;

struct iodbtimer { short type ; /* Spec. of date or time. */ short dummy ; /* Not used. */ union { struct { short year ; /* Year. */ short month ; /* Month. */ short date ; /* Date. */ } date ; struct { short hour ; /* Hour. */ short minute ;/* Minute. */ short second ;/* Second. */ } time ; } data ; } ;

[Arguments] buf Buffer in which the date or time data are stored.

[Return] EW_OK( 0) Successful. EW_NUMBER( 3) Incorrect spec. of date or time "buf.type". EW_DATA( 5) Incorrect date or time data. EW_BUSY(-1) Failed to set the data to the calendar timer device. Any hardware may be out of order. [Description] Sets the date or time data to the calendar timer device of the CNC unit.

CNC software and C library read date and time from the calendar timer device of the CNC unit. This function set the date and time data to that calendar timer device.

Specify one of following values in "buf.type". (It is impossible to set both date and time simultaneously.)

buf.type Data to be set ------+------0 Sets date 1 Sets time

Store the date value or time value in each member of "buf.data.date" or "buf.data.time" with binary format as follows.

Member Setting data Range of value ------+------+------buf.data.date.year Year 1987 - 2037 buf.data.date.month Month 1 - 12 buf.data.date.date Date 1 - 31 buf.data.time.hour Hour 0 - 23 buf.data.time.minute Minute 0 - 59 buf.data.time.second Second 0 - 59 That is, the time "00:00:00, Jan. 1, 1987" through "23:59:59, Dec. 31, 2037" can be set. This function doesn't check strictly validity of date format (buf.data.date.*). For example, "Feb. 31" can be set. In this case, "Mar. 3" is read by "time()" function (not a leap year), "Feb. 31" is displayed in the setting scrren of CNC. [Example] The following program sets the calendar/timer with the date and time entered using keys.

#include #include #include short example( void ) { struct iodbtimer buf ; short ret, year, month, date, hour, minute, second ; printf( "Year =" ) ; scanf( "%d", &year ) ; printf( "Month =" ) ; scanf( "%d", &month ) ; printf( "Date =" ) ; scanf( "%d", &date ) ; printf( "Hour =" ) ; scanf( "%d", &hour ) ; printf( "Minute=" ) ; scanf( "%d", &minute ) ; printf( "Second=" ) ; scanf( "%d", &second ) ; buf.type = 0 ; buf.data.date.year = year ; buf.data.date.month = month ; buf.data.date.date = date ; ret = cnc_settimer( &buf ) ; if ( ret == 5 ) printf( "Error while writing DATE.\n" ) ; buf.type = 1 ; buf.data.time.hour = hour ; buf.data.time.minute = minute ; buf.data.time.second = second ; ret = cnc_settimer( &buf ) ; if ( ret == 5 ) printf( "Error while writing TIME.\n" ) ; } ------1.68 Read load information of serial spindle. ------

[Name] cnc_rdspload

[Syntax] #include #include short cnc_rdspload( short sp_no, struct odbspn *buf ) ;

struct odbspn { short datano ; /* Spindle number. */ short type ; /* Not used. */ short data[2] ; /* Spindle load data. */ } ;

[Arguments] sp_no Spindle number. buf Buffer in which the spindle load data are stored.

[Return] EW_OK( 0) Successful. EW_NUMBER( 3) Incorrect spindle number "sp_no". EW_NOOPT( 6) The required option (Spindle serial output) is not added.

[Description] Reads the load information of the serial spindle controlled by the CNC. This function is used for displaying the spindle load information by the application program, etc. Specify one of (1 or 2)(for one specified spindle) or -1 (for all spindles) in "sp_no" as spindle number. The spindle load information is stored in "buf.data" with binary format. In case that 1 or 2 is specified in "sp_no", the spindle load information is stored in data[0]. In case of -1 in "sp_no", data is stored in both data[0] and data[1]. The spindle load ratio (%) can be calculated from this value using the following expression. (This is conversion expression of the spindle load meter value displayed in the CNC screen.)

Load ratio = buf.data / 32767 * (CNC parameter No.3127) [Example] The following program reads information about the load on the first spindle and displays the load ratio on the screen.

#include #include #include short example( void ) { struct iodbpsd prm ; struct odbspn buf ; short ret ; long val ; cnc_rdparam( 4127, 1, 4+2*1, &prm ) ; ret = cnc_rdspload( 1, &buf ) ; if ( !ret ) { val = (long)buf.data[0] * prm.u.idata * 100 / 32767 ; printf( "Current spindle load value is %ld [%]\n", val ) ; } else printf( "ERROR!(%d)\n", ret ) ; return ( ret ) ; } ------1.69 Read executing program. ------

[Name] cnc_rdexecprog

[Syntax] #include short cnc_rdexecprog( unsigned short *length, short *blknum , char *data ) ;

[Arguments] length Size of the buffer for storing executing program, character number of read executing program. blknum Number of buffered blocks. data Buffer in which executing program text is stored (ASCII string).

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect buffer size "length".

[Description] Reads the contents of the NC program followig the currently executing block. This function is used for building the original screen like "Program Check Screen" of CNC, etc. Specify the byte-size of the buffer "data" for the storing executing program in "length". The contents of the currently executing NC program are stored in "data". The character length of read program is stored in "length". The number of buffered block including the current block is stored in "blknum". The typical bufferd block number is as follows. Operation mode Bufferd block number ------+------Normal continuous mode. 2 Normal continuous mode with 3 Tool radius compensation C or Nose-R compensation. Single block mode. 1

The format of the read NC program is the following ASCII string. (Current block) LF (Next block) LF ...... (Last block) LF % For example, while the following NC program is being executed, the next string is got by this function. * Executing NC program. O1234 ; N10 G0 X10. Y20. Z30. ; <-- This function is called when N20 G0 X20. Y30. Z40. ; this block is being executed. N30 G0 X30. Y40. Z50. ; N40 G0 X40. Y50. Z60. ; M30 ; %

* String to be read. "N10G0X10.Y20.Z30.\n" "N20G0X20.Y30.Z40.\n" "N30G0X30.Y40.Z50.\n" "N40G0X40.Y50.Z60.\n" "M30\n" "%"

In this case, 77 is returned in "length". Also 2 is returned in "blknum" during continuous operation. If buffer size is too small, the next string is got. * String to be read by this function (length=40). "N10G0X10.Y20.Z30.\n" "N20G0X20.Y30.Z40.\n" "N30"

In this case, 39 is returned in "length". In case that M-code by which the prgram is rewinded to the top such as M02 or M30 is programmed in the tail of the NC program, the following string is returned while the block of M-code is being executed. "M30\n" <- Executing the last M-code. "O1234\n" <- Leading part of the program. "...." This is caused by the process of CNC. The CNC software rewinds the program when the NC program is read by this function. This function reads the contents of executing program only when the operating mode of CNC is "MEM" or "MDI". When the other mode, "length=0" and "blknum=0" are returned. [Example] The following program displays an NC program being currently executed on the screen.

#include #include #include #include

#define BUFLEN 200 void example( void ) { short ret, blknum ; unsigned short length, idx, lcount, num1, num2 ; char ch, data[BUFLEN] ;

printf( "\033[2J\033[1;1H" ) ; printf( "< cnc_rdexecprog > press [CAN] to exit" ) ; for (;;) { length = BUFLEN ; ret = cnc_rdexecprog( &length, &blknum, data ) ; printf( "\033[2;1Hret=%2d length=%3u blknum=%d\n\n", ret, length, blknum ) ; if ( length ) printf( "\033[33;7m" ) ; lcount = num1 = num2 = 0 ; for ( idx = 0 ; idx < length ; idx++ ) { ch = data[idx] ; if ( ( ch == '\n' ) || ( ch == '%' ) ) { if ( ch == '\n' ) printf( " ;" ) ; else putchar( '%' ) ; printf( "\033[0m\033[K\n" ) ; lcount++ ; if ( lcount < blknum ) printf( "\033[33m" ) ; num1 = num2 = 0 ; } else { if ( ( ( ch >= '0' ) && ( ch <= '9' ) ) || ( ch == '.' ) || ( ch == '#' ) || ( ch == '+' ) || ( ch == '-' ) || ( ch == ']' ) ) num2 = 1 ; else num2 = 0 ; if ( ( num1 == 1 ) && ( num2 == 0 ) ) putchar( ' ' ) ; putchar( ch ) ; num1 = num2 ; } } if ( kbhit() ) { ch = getch() ; if ( ch == MDIKEY_CAN ) break ; } printf( "\033[J" ) ; } } ------1.70 Read manual handle override amount. ------

[Name] cnc_rdmovrlap

[Syntax] #include #include short cnc_rdmovrlap( short axis, short length, struct iodbovl *buf ) ;

struct iodbovl { short datano ; /* Not used. */ short type ; /* Axis number. */ long data[2][32] ; /* Override amount. */ } ;

[Arguments] axis Axis number ( =-1:for only all axes). length Data block length ( =4+4*32*2 ). buf Buffer in which the override amount are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_ATTRIB( 4) Incorrect axis number "axis". EW_NOOPT( 6) There are no required options (Manual handle override).

[Description] Reads the manual handle override amount of the CNC controlled axis. This function is used for displaying the manual handle override amount of the CNC's axis by the application program, etc. Always specify -1 (all axes data) for the axis number in "axis", and 260 (=4+4*32*2) for the data block length in "length". The manual handle override amount is stored in "buf.data" with signed binary format. (The negative value is represented as 2's complement.) The override amounts of the (i+1)th axis both in the input unit and the output unit are stored in each data[0][i] and data[1][i]. The both are the same override amount though their units are different.

The manual override amount is represented in one of the units listed below. data[0][0] - data[0][31] (Input unit) IS-B IS-C ------+------+------Linear axis (metric input) 0.001 [mm] 0.0001 [mm] Linear axis (inch input) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg] data[1][0] - data[1][7] (Output unit) IS-B IS-C ------+------+------Linear axis (metric output) 0.001 [mm] 0.0001 [mm] Linear axis (inch output) 0.0001 [inch] 0.00001 [inch] Rotation axis 0.001 [deg] 0.0001 [deg]

The array size of each members of "iodbovl.data" is always 32 regardless of the amount of controlled axes. In case that the amount of controlled axes is less than 32, no data are stored in the members corresponding with the axes No. (amount of controlled axes + 1),..,32.

[Example] Assume that each axis of a three-axis system has a manual override amount listed below: Input unit Output unit First axis 4.7246 120.005 Second axis -1.9732 -50.119 Third axis 0.0031 0.080 On the assumption stated above, the following program displays the values listed below (on the assumption that the inch input, metric output, and increment system conform to IS-B): 0: 47246 120005 1: -19732 -50119 2: 31 80

#include #include #include void example( void ) { struct iodbovl buf ; short idx; cnc_rdmovrlap ( -1, 260, &buf ) ; for ( idx = 0 ; idx < 3 ; idx ++ ) { printf ( "%d:%8ld %8ld\n", idx, buf.data[0][idx], buf.data[1][idx] ) ; } } 2. PMC window library

------2.1 Read arbitrary PMC data (range specified). ------

[Name] pmc_rdpmcrng

[Syntax] #include #include short pmc_rdpmcrng( short adr_type, short data_type, short s_number, short e_number, short length, struct iodbpmc *buf ) ;

struct iodbpmc { short type_a ; /* Kind of PMC address. */ short type_d ; /* Type of PMC data. */ short datano_s ; /* Start PMC address. */ short datano_e ; /* End PMC address. */ union { char cdata[N] ; /* PMC data (Byte) */ short idata[N] ; /* (Word) */ long ldata[N] ; /* (2-Word) */ } u ; /* N is number of data to be read. */ } ;

[Arguments] adr_type Kind of PMC address. data_type Type of PMC data. s_number Start PMC address. e_number End PMC address. length Data block length ( =8+(byte size of data)*(number of data to be read)). buf Buffer in which the PMC data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect PMC address "s_number" or "e_number". EW_ATTRIB( 4) Incorrect kind of PMC address "adr_type" or type of PMC data "data_type". [Description] Reads the PMC data within the specified address range.

This function is used for exchanging various data between the C application and the PMC ladder software.

Specify the discrimination code corresponding to the PMC address to be read in "adr_type". The discrimination code is either a binary numeric value of 0,..,9 or an alphabetic character such as 'G' or 'R', etc. (described later) Specify the type of PMC data to be read in "data_type" with binary format.

data_type Type of PMC data Byte size ------+------+------0 Byte type 1 1 Word type 2 2 2-Word type 4

Specify the start PMC address in "s_number" and the end one in "e_number" with binary format.

The read data are stored in one of "buf.u.cdata[i]", "buf.u.idata[i]" or "buf.u.ldata[i]" according to its type. The data format is same as the one in the PMC. The data format of Timer (T0000-T0079) is as follows. Timer number Unit ------+------T0000 - T0007 48 [msec] T0008 - T0079 8 [msec] For example, when 800 [msec] is set in T0010, 100 is read by this fucntion.

Example of arguments specification ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (1) Reading "D0100" (Word type data). adr_type 9 or 'D' data_type 1 s_number 100 e_number 101 length 8+2*1 (=10) buf.u.idata[0] Content of "D0100" will be stored. (2) Reading "R0200" through "R0209" (Byte type data). adr_type 5 or 'R' data_type 0 s_number 200 e_number 209 length 8+1*10 (=18) buf.u.cdata[0] Contents of "R0200",..,"R0209" will be stored. ,..,buf.u.cdata[9] The referenceable range of PMC data of FANUC Series 30i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I.D. code Kind of PMC address ------+------0,'G' G (PMC->CNC) 1,'F' F (CNC->PMC) 2,'Y' Y (PMC->Machine) 3,'X' X (Machine->PMC) 4,'A' A (Message request) 5,'R' R (Relay) 6,'T' T (Timer) 7,'K' K (Keep relay) 8,'C' C (Counter) 9,'D' D (Data table)

(Note 1) It is not possible to write to all areas of address 'F' and 'X', and "R9000 to R9099", "R9118 to R9199", and "K0017 to K0019" must not be written. (Note 2) Addresses G1xxx and F1xxx are an I/O area for the second path, and addresses G2xxx and F2xxx, for third path.

[Example] The following program reads and displays the feed rate override value (G0012).

#include #include #include void example( void ) { unsigned short fov ; struct iodbpmc buf ; pmc_rdpmcrng( 'G', 0, 12, 12, 8+1*1, &buf ) ; fov = (unsigned char)~buf.u.cdata[0] ; printf( "Current feedrate override is %u[%].\n", fov ) ; } ------2.2 Write arbitrary PMC data (range specified). ------

[Name] pmc_wrpmcrng

[Syntax] #include #include short pmc_wrpmcrng( short length, struct iodbpmc *buf ) ;

struct iodbpmc { short type_a ; /* Kind of PMC address. */ short type_d ; /* Type of PMC data. */ short datano_s ; /* Start PMC address. */ short datano_e ; /* End PMC address. */ union { char cdata[N] ; /* PMC data (Byte) */ short idata[N] ; /* (Word) */ long ldata[N] ; /* (2-Word) */ } u ; /* N is number of data to be written. */ } ;

[Arguments] length Data block length ( =8+(byte size of data)*(number of data to be written) ). buf Buffer in which the PMC data are stored.

[Return] EW_OK( 0) Successful. EW_LENGTH( 2) Incorrect data block length "length". EW_NUMBER( 3) Incorrect PMC address "buf.datano_s" or "buf.datano_e". EW_ATTRIB( 4) Incorrect kind of PMC address "buf.type_a" or type of PMC data "buf.type_d". [Description] Writes the PMC data within the specified address range.

This function is used for exchanging various data between the C application and the PMC ladder software.

Specify the discrimination code corresponding to the PMC address to be written in "buf.type_a". The discrimination code is either a binary numeric value of 0,..,9 or an alphabetic character such as 'G' or 'R', etc. (See "Read arbitrary PMC data (range specified)(pmc_rdpmcrng)") Specify the type of PMC data to be written in "buf.type_d" with binary format.

data_type Type of PMC data Byte size ------+------+------0 Byte type 1 1 Word type 2 2 2-Word type 4

Specify the start PMC address in "buf.datano_s" and the end one in "buf.datano_e" with binary format. Store the written data in one of "buf.u.cdata[i]", "buf.u.idata[i]" or "buf.u.ldata[i]" according to its type.

The data format is same as the one in the PMC. The data format of Timer (T0000-T0079) is as follows. Timer number Unit ------+------T0000 - T0007 48 [msec] T0008 - T0079 8 [msec] For example, when you want to set 800 [msec] in T0010, specify 100 in this fucntion. It is inhibited to write to the all data of address 'F' and 'X', "R9000",..,"R9099", "R9118",..,"R9199" and "K0017",..,"K0019". (Writing data to address 'F' results in a write occurring to the 'F' area of the CNC rather than that of the PMC.) Refer "The referenceable range of PMC data of FANUC Series 16/18" of "Read arbitrary PMC data (range specified)(pmc_rdpmcrng)" for writable address, etc. (Caution) When this function is used to write PMC data, it does not perform exclusive control for the PMC ladder. When both an application program and PMC ladder are expected to write to the same PMC address, therefore, the application program must perform exclusive control. When writing to a PMC address especially bit by bit, you should avoid allowing both program entities to write simultaneously. This is because the NC and PMC processors operate asynchronously to each other. Example of arguments specification ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (1) Writing 250 to "D0100" (Word type data). buf.type_a 9 or 'D' buf.type_d 1 buf.datano_s 100 buf.datano_e 101 length 8+2*1 (=10) buf.u.idata[0] 250

(2) Writing 0 to every "R0200" through "R0209" (Byte type data). buf.type_a 5 or 'R' buf.type_d 0 buf.datano_s 200 buf.datano_e 209 length 8+1*10 (=18) buf.u.cdata[0] all 0 ,..,buf.u.cdata[9]

[Example] The following program sets the specified bit of a specified internal relay (R) to "1".

#include #include #include /* number is index number of R. */ /* bit is target bit index to be set. */ short example( short number, short bit ) { short ret ; struct iodbpmc buf ; ret = pmc_rdpmcrng( 'R', 0, number, number, 8+1*1, &buf ) ; if ( !ret ) { buf.u.cdata[0] |= ( 1 << bit ) ; ret = pmc_wrpmcrng( 8+1*1, &buf ) ; } return ( ret ) ; } ------2.3 Read PMC message. ------

[Name] pmc_rdpcmsg

[Syntax] #include #include short pmc_rdpcmsg( unsigned short adr_no, unsigned short adr_bit, struct pmcmsg *buf ) ;

struct pmcmsg { unsigned short msg_len ; /* Length of message. */ unsigned char pmc_msg[256] ; /* PMC message string. */ } ;

[Arguments] adr_no PMC address A. ( =0 - 24 ) adr_bit Bit of PMC address A. ( =0 - 7 ) buf Buffer in which PMC message is stored.

[Return] EW_OK( 0) Successful. EW_NUMBER( 3) Incorrect PMC address A. EW_ATTRIB( 4) Incorrect bit of PMC address A. EW_DATA( 5) No message for specified address.

[Description] Reads the specified PMC message data. This function reads the corrsponding message to the specified PMC address A and bit number. Specify the number of address A in "adr_no" with binary format. Specify the bit number 0 - 7 in "adr_bit" with binary format. The PMC message is stored in "buf.pmc_msg". The PMC message is the ASCII string as same as one which is displayed in the CNC's alarm message screen. The 2-byte character such as Japanese Kanji character is stored by Shift-JIS code. A 'null' character ('\x00') is added at the end of the string. The length of the string stored in "buf.pcm_msg" is stored in "buf.msg_len" with binary format. [Example] The following program reads all PMC message character strings and displays them on the screen.

#include #include #include #include void example( void ) { short ret ; unsigned short idx, bit ; struct pmcmsg *buf ; buf = (struct pmcmsg *)malloc( sizeof( struct pmcmsg ) ) ; for ( idx = 0 ; idx <= 24 ; idx++ ) { for ( bit = 0 ; bit <= 7 ; bit++ ) { ret = pmc_rdpcmsg( idx, bit, buf ) ; if ( !ret ) printf( "A%02u.%u \"%s\"\n", idx, bit, buf->pmc_msg ) ; } } free( buf ) ; } 3.5 MDI operation library ======

Library outline ~~~~~~~~~~~~~~~

1. Outline

The application program can control the MDI-KEY using the MDI operation library.

2. MDI key matrix

(1) Structure of matrix

MDI key matrix is a table where the relationship of the MDI key bit matrix which is defined by the hardware specification and the key attributes and the key code is defined. This is referenced to convert the MDI key bit matrix data read from MDI panel into key code for the application program. The MDI Key matrix consists of the key function table which defines key attributes and the key code table which defines key codes. There are both matrix for the user application program and one for CNC software. The relationship of the MDI key bit matrix and the MDI key matrix is as follows.

MDI key bit Function flag Key code matrix table table ------+------+------0th byte 0th bit 0th byte 0th word 1st bit 1st byte 1st word : : : 7th bit 7th byte 7th word : : : n-th byte m-th bit (n*8+m)-th byte (n*8+m)-th word Each words of the key code table include both "Main code" and "Sub code". Upper byte Main code Code generated by pushing individually. Lower byte Sub code Code generated by pushing next to the SHIFT key. It is impossible to push the SHIFT key and any ordinary keys simultaneously. To input sub code, operate as following sequence. Push the SHIFT key, and then release it. Push any ordinary key. (2) Structure of function flag

The function flag is one byte flag which defines attributes of key for every key. This flag defines following items bit by bit.

Bit Symbol definition ------+------+------7 F Enabling/disabling key repeat. (effective when FUNC=0000) 0: Disable key repeat. 1: Enable key repeat. 6 - 5 OUT Destination of key code. (effective when FUNC=0000) 00: Screen selected side. (default setting) 01: Always C application. 10: Always CNC software. 11: Both c application and CNC software. (for only "RESET" key) 4 S Enabling/disabling SHIFT key. (effective when FUNC=0000) 0: Enable SHIFT key. 1: Disable SHIFT key. 3 - 0 FUNC Kind of key. 0000: Ordinary key. 1011: SHIFT key. 1111: Invalid key. Others: Not used. (These are handled as same as ordinary keys.)

(3) Uppercase/Lowercase There is no special key to select uppercase/lowercase of alphabetic character on MDI panel of CNC. Usually, all alphabetic characters are input as uppercase characters. Lowercase characters can be input by the following operation. Operation Input mode ------+------SHIFT + Cursor[UP] Uppercase (default) SHIFT + Cursor[DOWN] Lowercase Call "aux_mdi_contrl" function to enable this operation. aux_mdi_control( MDI_CASE_ON ) Enable changing uppercase/lowercase. aux_mdi_control( MDI_CASE_OFF ) Disable changing uppercase/lowercase. The initial status is "disabled changing uppercase/lowercase". This function is made ineffective by altering MDI key matrix of "Cursor[UP]" or "Cursor[DOWN]". Only uppercase characters are always input to the CNC software regardless of this operation. Also "Key input by application program" described in next section isn't influenced by this operation. 3. Key input by application program

(1) Functions

The application program can send an arbitrary character or string to the key input buffer of the MDI-KEY by calling following functions.

aux_mdi_putc() Output one character. aux_mdi_write() Output a string.

These character and string are received regardless of any operation to the screen or MDI panel.

(2) Arguments

The application program sends a pair of the function flag and the key code to be output to the above functions. The format of the function flag is same as the MDI key matrix. Any arbitrary value is allowed to be specified for key code. Also any key code which isn't registered in the standard key matrix. (It is possible to send a key code as a message from any auxiliary task to the main task.)

(3) Relation to the MDI panel

The key input from the application program is handled more preferentially than one from the MDI panel. Therefore, when any key is input from both the application and the MDI panel simultaneously, the former is given to the software. Usually, inhibit the key input from the MDI panel during inputting key from the application program using following functions. aux_mdi_control( MDI_LOK_PNL ) Disable key input from the MDI panel. aux_mdi_control( MDI_ULK_PNL ) Enable key input from the MDI panel. Only RESET key is accepted during being inhibited key input from the MDI panel. 4. MDI key control in case that both C Executor and Open-CNC or Intelligent Terminal exist.

When one of Open-CNC or Intelligent Terminal is present, MDI key data is processed as follows.

(A) When Open-CNC is present.

MDI operation library of C Library can handle only key information input to C User application. C User application can execute all MDI operation library functions. However, only operations for the key inputting to the user application is effective. It is impossible to operate key inputting information to the CNC software by specifying MAIN_MDI_MATRIX for each function. (No error is issued.)

The Open-CNC application execute the operations for key inputting information to the CNC software and the Open-CNC application software.

(B) When Intelligent Terminal is present. It is impossible to handle key inputting for C User application on the system with Intelligent Terminal. C User application can execute all MDI operation library functions. However, all functions do nothing when they are called. (No error is issued.)

The Intelligent Terminal application execute all of the operations for key inputting information. Lists of Functions ~~~~~~~~~~~~~~~~~~

------Name Function ------1. aux_mdi_getmatrix Get MDI key matrix. 2. aux_mdi_putmatrix Put MDI key matrix. 3. aux_mdi_rstmatrix Reset MDI key matrix. 4. aux_mdi_altmatrix Alter MDI key matrix. 5. aux_mdi_putc Put one character to key input buffer. 6. aux_mdi_write Write block data to key input buffer. 7. aux_mdi_control Test or control key input buffer. 8. aux_mdi_repeat Set key repeating interval time. 9. aux_mdi_getstat Read inputting status of MDI key. 10. aux_mdi_clrbuf Clear input buffer of MDI key. ------

[CAUTION] Use "aux_mdi_getmatrix" and "aux_mdi_putmatrix" functions in case that you must needs them anyway. These functions are very flexible, but very dangerous if you mistake those usage. Function Reference ~~~~~~~~~~~~~~~~~~

------1. Get MDI key matrix. ------

[Name] aux_mdi_getmatrix

[Syntax] #include int aux_mdi_getmatrix( void *matrix_ptr, int matrix_len, int module_id ) ;

[Arguments] matrix_ptr Buffer in which key matrix is stored. matrix_len Byte size of key matrix buffer. module_id Class of matrix.

[Return] 0 Successful. -1 Incorrect byte size of key matrix buffer "matrix_len". Or incorrect class of matrix "module_id".

[Description] Reads the current key matrix (function flag table and key code table) of MDI key, and stores them in the specified buffer. This function is used to read the original key matrix for altering the part of the key matrix. Specify pointer to the matrix buffer area in "matrix_ptr". Specify byte size of key matrix area buffer. Specify one of following matrix class. module_id Matrix class ------+------MAIN_MDI_MATRIX Matrix of CNC software MMC_MDI_MATRIX Matrix of application program Get the required table size of the key matrix before calling this function, and allocate buffer area for reading. ------2. Put MDI key matrix. ------

[Name] aux_mdi_putmatrix

[Syntax] #include int aux_mdi_putmatrix( void *matrix_ptr, int matrix_len, int module_id ) ;

[Arguments] matrix_ptr Buffer in which key matrix is stored. matrix_len Byte size of key matrix buffer. module_id Class of matrix.

[Return] 0 Successful. -1 Incorrect byte size of key matrix buffer "matrix_len". Or incorrect class of matrix "module_id".

[Description] Registers the specified key matrix as the new matrix. This function is used to restore the modified key matrix. Specify pointer to the matrix buffer area in "matrix_ptr". Specify byte size of key matrix area buffer. Specify one of following matrix class. module_id Matrix class ------+------MAIN_MDI_MATRIX Matrix of CNC software MMC_MDI_MATRIX Matrix of application program This function is very dangerous. If there are any mistakes in the specified key matrix, the key inputting process may not work correctly. Take care to use this function. All keys can be customized by this function. But you should not customize the important key for CNC operation such as RESET key. ------3. Reset MDI key matrix. ------

[Name] aux_mdi_rstmatrix

[Syntax] #include int aux_mdi_rstmatrix( int module_id ) ;

[Arguments] module_id Class of matrix.

[Return] 0 Successful. Negative Incorrect class of matrix "module_id".

[Description] Restore the MDI key matrix to the initial (power-on) setting. This function is used to restore te MDI key matrix which is modified by "aux_mdi_putmatrix" function to the initial setting. Specify one of following matrix class. module_id Matrix class ------+------MAIN_MDI_MATRIX Matrix of CNC software MMC_MDI_MATRIX Matrix of application program ------4. Alter MDI key matrix. ------

[Name] aux_mdi_altmatrix

[Syntax] #include int aux_mdi_altmatrix( int module_id, int category, int update ) ;

[Arguments] module_id Class of matrix. category Kind of key to be altered. update New specification.

[Return] 0 Successful (No alteration was applied.). Positive Successful ("Positive" is number of applied alteration.). -1 Incorrect class of matrix "module_id". -2 Incorrect kind of key to be altered "category". -3 Incorrect new specification "update". -4 Incorrect "MDI_SHIFT_xx" specification. -5 Incorrect "MDI_TO_xx" specification. -6 Incorrect "MDI_REPEAT_xx" specification. -7 Attempted to alter the RESET key.

[Description] Alters character code or character attribute which is assigned to the specified MDI key. This function is used to alter character code assigned to the key or to enable automatic key repeating of the cursor key or the page key, etc. Specify one of following matrix class. The specified matrix will be altered. module_id Matrix class ------+------MAIN_MDI_MATRIX Matrix of CNC software MMC_MDI_MATRIX Matrix of application program

(1) Altering character code. Replaces the specified code in the current matrix with the new code. When there are multiple specified codes in the matrix, all codes are replaced. This alteration can't be executed with alteration of character attribute simultaneously. Specify "MDI_ALT_CODE" (altering character code) in "category". Specify updating specification of key in "update".

upper byte of "update" <- current code lower byte of "update" <- new code

The specified key is set as "invalid key" by specifying "NULL(0x00)" as new code.

It is impossible to alter the RESET key.

(2) Altering character attribute.

Alters the attribute of the specified key in the current matrix. This alteration can't be executed with replacement of character code simultaneously.

Specify kind of key to be altered in "category". All keys are classified into the following category by the "main character code". category Kind of key Character code ------+------+------MDI_ALT_ALPH Alphanumeric key 0x20,..,0x7F MDI_ALT_CURS Cursor key 0x88,..,0x8B MDI_ALT_PAGE Page key 0x8E,..,0x8F MDI_ALT_DELE DELETE key 0x08, 0x95 MDI_ALT_INPT INPUT key 0x0D, 0x94 MDI_ALT_REST RESET key 0x90 MDI_ALT_HELP HELP key 0x9A MDI_ALT_FUNC Function key 0xE1,..,0xE7 MDI_ALT_SOFT Soft key 0xF0,..,0xFF The multiple classes can be specified simultaneously in "category". Specify the following control attribute in "update". The multiple attributes can be specified simultaneously. The non-specified attributes is kept as it is. (1) Enable/disable shift function. MDI_SHIFT_OK Enable shift function. MDI_SHIFT_NO Disable shift function. (2) Enable/disable automatic key repeating. MDI_REPEAT_OK Enable automatic key repeating. MDI_REPEAT_NO Disable automatic key repeating. (3) Specify software which can read MDI key. MDI_TO_ETHER Either CNC software or application program according to the current displayed screen. MDI_TO_MMC Application program. MDI_TO_MAIN CNC software. MDI_TO_BOTH Both CNC software and application program. (Note) It is impossible to set the RESET key being inhibited to be read by CNC software. ------5. Put one character to key input buffer. ------

[Name] aux_mdi_putc

[Syntax] #include int aux_mdi_putc( int c ) ;

[Arguments] c Output data.

[Return] 1 Successful. 0 Key input buffer is full.

[Description] Output the specified 1-byte character to the key input buffer. Specify a function flag in the upper byte of "c" and a character code in the lower byte. For example, specify as follows to output 'A'. upper byte <- 0x20 (function flag) lower byte <- 0x41 (character code) This function outputs data to the key input buffer. Check buffer emptiness by calling "aux_mdi_control" function to confirm completion of outputting data from the buffer. ------6. Write block data to key input buffer. ------

[Name] aux_mdi_write

[Syntax] #include int aux_mdi_write( void *buffer, int size ) ;

[Arguments] buffer Buffer in which the output data are stored. size Byte size of output data.

[Return] Positive Successful. (Byte size of actually output data.) This value will be smaller than the specified size in case that there are not enough room for specified size in the key input buffer. 0 Key input buffer is full.

[Description] Output data for specified byte size from the specified buffer to the key input buffer. Store the output data in output order in "buffer". The format of each output data is same as "aux_mdi_putc" function. Specify one character by 2 bytes. (upper byte: function flag, lower byte: character code) This function outputs data to the key input buffer. Check buffer emptiness by calling "aux_mdi_control" function to confirm completion of outputting data from the buffer. ------7. Test or control key input buffer. ------

[Name] aux_mdi_control

[Syntax] #include int aux_mdi_control( int control ) ;

[Arguments] control Control code.

[Return] (1) In case of successful. MDI_CHK_BUF Returns number of data in the buffer. MDI_GET_MTXLEN Returns byte size of MDI key matrix. MDI_CASE_ON Returns the previous status. MDI_CASE_OFF Returns the previous status. MDI_CHK_FKEY Returns the key code of pushed function key. Others Returns "0".

(2) In case of error. Returns "-1" for all instructions.

[Description] Test the key input buffer, or execute specified operation to the key input buffer. Specify one of the following control code in "control". control Operation ------+------MDI_CHK_BUF Returns number of data in the application key input buffer. MDI_CLR_BUF Clears the application key input buffer. MDI_LOK_PNL Locks MDI key input except RESET key. MDI_ULK_PNL Unlocks MDI key input. MDI_GET_MTXLEN Return byte size of the MDI key matrix table. MDI_CASE_ON Enables uppercase/lowercase character input from the MDI panel. MDI_CASE_OFF Disables uppercase/lowercase character input from the MDI panel. MDI_CHK_FKEY If the screen switching was disabled while any user screen was displaying for some reason and any function key was pushed during disabling screen switching, returns key code of that function key. Returns 0 if no function key was pushed while the screen switching was disabled. ------8. Set key repeating interval time. ------

[Name] aux_mdi_repeat

[Syntax] #include int aux_mdi_repeat( int delay, int repeat ) ;

[Arguments] delay Delay time of automatic repeating. repeat Interval time of automatic repeating.

[Return] 0 Successful. -1 Incorrect delay time "delay". -2 Incorrect interval time "repeat".

[Description] Set the delay time and the interval time of automatic key repeating.

Specify one of the following delay times in "delay". delay Delay time ------+------MDI_KEY_DELAY1 256 [msec] (default setting) MDI_KEY_DELAY2 512 [msec] MDI_KEY_DELAY3 768 [msec] MDI_KEY_DELAY4 1024 [msec] Specify the interval time 32 through 1024 [msec] in "repeat" with binary format. The unit of the interval time is "millisecond". Only multiple of "32[msec]" are allowed to set. The default setting value of the interval time is "MDI_KEY_REPEAT" (32[msec]). ------9. Read inputting status of MDI key. ------

[Name] aux_mdi_getstat

[Syntax] #include unsigned int aux_mdi_getstat( void ) ;

[Arguments] ------

[Return] Returns inputting status of MDI key.

[Description] Gets the inputting status of MDI key. Each bits of returned value mean following information.

bit0 SHIFT state. (MDI_ST_SHIFT) 0: Not SHIFT state. 1: SHIFT state. bit1 - bit7 Undefined. bit8 - bit15 Number of characters read in the MDI key input buffer. "SHIFT state" means the following state. Once push [SHIFT] key, and then release it. v <- This period is "SHIFT state". Push any other key. (Sub code is read in this case.) That is, once pushing [SHIFT] key makes "SHIFT state" ON, then, pushing any other key makes "SHIFT state" released. Pushing [SHIFT] key again during "SHIFT state" makes "SHIFT released. It is impossible to input Sub code by pushing any key and [SHIFT] key simultaneously. Bit8 through bit15 of return value indicate a number of characters input from the MDI panel and not read yet by the application program.

This function gets the status of key input buffer while the C Executor's user screen is being displayed. It can't get the status of the key input buffer of the CNC software. [Example] The following program reads a line of alpha-numeric characters from the MDI panel. Inputting operation is completed by inputting [INPUT] key. It displays one of '_' (in normal state) and '^' as cursor.

#include #include #include

#define BUFSIZE 80 unsigned char buf[BUFSIZE] ; void example( void ) { unsigned int idx = 0, stat = 0 ; unsigned char ch ; printf( "\033[>5h_" ) ; for (;;) { if ( kbhit() ) { ch = getch() ; if ( ch == MDIKEY_INPUT ) { buf[idx] = 0x00 ; return ; } else if ( ( ch == MDIKEY_CAN ) && idx ) { buf[--idx] = 0x00 ; printf( "\010 \010\010_" ) ; stat = 0 ; } else if ( isalnum( ch ) && ( idx < BUFSIZE - 1 ) ) { buf[idx++] = ch ; printf( "\010%c_", ch ) ; stat = 0 ; } } else { if ( aux_mdi_getstat() & MDI_ST_SHIFT ){ if ( !( stat & MDI_ST_SHIFT ) ) { printf( "\010^" ) ; stat = MDI_ST_SHIFT ; } } else if ( stat & MDI_ST_SHIFT ) { printf( "\010_" ) ; stat = 0 ; } } } } ------10. Clear input buffer of MDI key. ------

[Name] aux_mdi_clrbuf

[Syntax] #include void aux_mdi_clrbuf( void ) ;

[Arguments] ------

[Return] ------

[Description] Clears input buffer of MDI key. This function clears all characters which are input from MDI panel and not read by the application program yet, and makes "SHIFT state" at the same time. This function makes no effects to the key input buffer of the CNC software. Key code table ~~~~~~~~~~~~~~

The following are the key code table of various keyboard which are supported by C Executor. Lines and columns of "Key bit matrix", "Key function flag table" and "Key code table" are correspond each other in every keyboard.

For example, to get key code and function flag for C application of "X" key in the machining system's full key, search as follows.

(1) Search "X" key in "Key bit matrix". (7th line, 4th column) (2) See the 7th line and 4th column of "Key function flag table" and "Key code table" for C application. (3) You get 0x10 for key function flag and "58 55" for key code. This means that a code 0x58 will be generated by pushing "X" key individually, and 0x55 by pushing SHIFT + "X".

To change this function flag and key code, do as follows.

(1) Get the matrix by "aux_mdi_getmatrix" function. (2) Change the function flag in 0x3D from the top of the matrix and the key code in 0xC8 and 0xC9. (3) Restore the matrix by "aux_mdi_putmatrix" function.

"F0-F9,FL,FR" mean SOFT key.

10-SOFT key type (14inchCRT) [FL] [F0][F1][F2][F3][F4] [F5][F6][F7][F8][F9] [FR] Reading extension MDI keys ~~~~~~~~~~~~~~~~~~~

Setting bit 2 (EKY) of parameter No. 8650 in the NC to 1 causes the key BIOS of the C executor to scan the extension MDI keys. If a user application assigns key codes to the extension of the key matrix, the assigned keys can be read. (If no key code is specified, it is impossible to read the extension keys.)

Key bit matrix 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ Line 0 | | | | | | | | | 1 | | | | | | | | | 2 | | | | | | | | | 3 | | | | | | | | | 4 | | | | | | | | | --> Normally scanned range 5 | | | | | | | | | 6 | | | | | | | | | 7 | | | | | | | | | 8 | | | | | | | | | +---+---+---+---+---+---+---+---+ 9 | | | | | | | | | A | | | | | | | | | --> Extension B | | | | | | | | | +---+---+---+---+---+---+---+---+ Rows A and B are added to the matrix. 1. 30i QWERTY MDI

Key bit matrix bit= 0 1 2 3 4 5 6 7 +------+------+------+------+------+------+------+------+ 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +------+------+------+------+------+------+------+------+ 1 | 8 | 9 | - + | . , | CTRL |DELETE| EOB | ALT | +------+------+------+------+------+------+------+------+ 2 |ALTER |INSERT| ABC |INPUT | HELP |SHIFT | → | ← | +------+------+------+------+------+------+------+------+ 3 |POSITN|PROGRM|OFFSET|SYSTEM|MESSAG|GRAPH |CUSTM1|CUSTM2| +------+------+------+------+------+------+------+------+ 4 | ↓ | ↑ |Page↓|Page↑| F ; | D _ | H " | B / | +------+------+------+------+------+------+------+------+ 5 | FL | F9 | F8 | F7 | AUX | | SKV9 | RESET| +------+------+------+------+------+------+------+------+ 6 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | FR | +------+------+------+------+------+------+------+------+ 7 | O ) | N ? | G : | P \ | X | Y & | Z | Q ! | +------+------+------+------+------+------+------+------+ 8 | I ( | J ' | K [ | R $ | M SP| S ~ | T % | L ] | +------+------+------+------+------+------+------+------+ 9 | A | C < | E # | U * | V > | W @ | TAB | CAN | +------+------+------+------+------+------+------+------+ A | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | +------+------+------+------+------+------+------+------+ B | SKV8 | SKV7 | SKV6 | SKV5 | SKV4 | SKV3 | SKV2 | SKV1 | +------+------+------+------+------+------+------+------+ Key function flag table for CNC +0 +1 +2 +3 +4 +5 +6 +7 ----+------+------+------+------+------+------+------+------00 | 10 10 10 10 10 10 10 10 08 | 10 10 10 10 10 10 10 10 10 | 0D 10 10 10 10 0B 10 10 18 | 10 10 10 10 10 10 10 10 20 | 10 10 10 10 10 10 10 10 28 | 00 00 00 00 10 0F 00 60 30 | 00 00 00 00 00 00 00 00 38 | 10 10 10 10 10 10 10 10 40 | 10 10 10 10 10 10 10 10 48 | 10 10 10 10 10 10 10 10 50 | 0F 0F 0F 0F 0F 0F 0F 0F 58 | 00 00 00 00 00 00 00 00 Key code table for CNC +0 +2 +4 +6 +8 +A +C +E ----+------+------+------+------+------+------+------+------60 | 30 3D 31 82 32 83 33 8C 34 8D 35 A9 36 00 37 00 70 | 38 AA 39 AB 2D 2B 2E 2C 9B 9B 95 95 0A 0A 97 97 80 | 96 99 94 94 9C 9C 98 98 9A 9A 84 85 88 88 89 89 90 | E8 E1 E9 E1 EA E1 EB E1 EC E1 ED E1 EE E1 EF E1 A0 | 8A FB 8B FD 8E 8E 8F 8F 46 3B 44 5F 48 22 42 2F B0 | 00 00 00 00 00 00 00 00 E4 E4 00 00 00 00 90 90 C0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 | 4F 29 4E 3F 47 3A 50 5C 58 00 59 26 5A 00 51 21 E0 | 49 28 4A 27 4B 5B 52 24 4D 20 53 7F 54 25 4C 5D F0 | 41 00 43 3C 45 23 55 2A 56 3E 57 40 09 09 86 87 100 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 110 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Key function flag table for C application +0 +1 +2 +3 +4 +5 +6 +7 ----+------+------+------+------+------+------+------+------00 | 10 10 10 10 10 10 10 10 08 | 10 10 10 10 10 10 10 10 10 | 0D 10 10 10 10 0B 10 10 18 | 10 10 10 10 10 10 10 10 20 | 10 10 10 10 10 10 10 10 28 | 00 00 00 00 10 0F 00 60 30 | 00 00 00 00 00 00 00 00 38 | 10 10 10 10 10 10 10 10 40 | 10 10 10 10 10 10 10 10 48 | 10 10 10 10 10 10 10 10 50 | 0F 0F 0F 0F 0F 0F 0F 0F 58 | 00 00 00 00 00 00 00 00 Key code table for C application +0 +2 +4 +6 +8 +A +C +E ----+------+------+------+------+------+------+------+------60 | 30 3D 31 82 32 83 33 8C 34 8D 35 A9 36 00 37 00 70 | 38 AA 39 AB 2D 2B 2E 2C 9B 9B 95 95 0A 0A 97 97 80 | 96 99 94 94 9C 9C 98 98 9A 9A 84 85 88 88 89 89 90 | E8 E1 E9 E1 EA E1 EB E1 EC E1 ED E1 EE E1 EF E1 A0 | 8A FB 8B FD 8E 8E 8F 8F 46 3B 44 5F 48 22 42 2F B0 | 00 00 00 00 00 00 00 00 E4 E4 00 00 00 00 90 90 C0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 | 4F 29 4E 3F 47 3A 50 5C 58 00 59 26 5A 00 51 21 E0 | 49 28 4A 27 4B 5B 52 24 4D 20 53 7F 54 25 4C 5D F0 | 41 00 43 3C 45 23 55 2A 56 3E 57 40 09 09 86 87 100 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 110 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2. 30i ONG MDI (M series) Key bit matrix bit= 0 1 2 3 4 5 6 7 +------+------+------+------+------+------+------+------+ 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +------+------+------+------+------+------+------+------+ 1 | 8 | 9 | - | ・ | CTRL |DELETE| EOB | ALT | +------+------+------+------+------+------+------+------+ 2 |ALTER |INSERT| ABC |INPUT | HELP |SHIFT | → | ← | +------+------+------+------+------+------+------+------+ 3 |POSITN|PROGRM|OFFSET|SYSTEM|MESSAG|GRAPH |CUSTM1|CUSTM2| +------+------+------+------+------+------+------+------+ 4 | ↓ | ↑ |Page↓|Page↑| F [ | D ] | H & | B SP | +------+------+------+------+------+------+------+------+ 5 | FL | F9 | F8 | F7 | AUX | | SKV9 | RESET| +------+------+------+------+------+------+------+------+ 6 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | FR | +------+------+------+------+------+------+------+------+ 7 | O ( | N ) | G E | P C | X U | Y V | Z W | Q ? | +------+------+------+------+------+------+------+------+ 8 | I , | J A | K @ | R _ | M # | S = | T * | L + | +------+------+------+------+------+------+------+------+ 9 | | | | | | / | TAB | CAN | +------+------+------+------+------+------+------+------+ A | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | +------+------+------+------+------+------+------+------+ B | SKV8 | SKV7 | SKV6 | SKV5 | SKV4 | SKV3 | SKV2 | SKV1 | +------+------+------+------+------+------+------+------+ Key function flag table for CNC +0 +1 +2 +3 +4 +5 +6 +7 ----+------+------+------+------+------+------+------+------00 | 10 10 10 10 10 10 10 10 08 | 10 10 10 10 10 10 10 10 10 | 0D 10 10 10 10 0B 10 10 18 | 10 10 10 10 10 10 10 10 20 | 10 10 10 10 10 10 10 10 28 | 00 00 00 00 10 0F 00 60 30 | 00 00 00 00 00 00 00 00 38 | 10 10 10 10 10 10 10 10 40 | 10 10 10 10 10 10 10 10 48 | 0F 0F 0F 0F 0F 10 10 10 50 | 0F 0F 0F 0F 0F 0F 0F 0F 58 | 00 00 00 00 00 00 00 00 Key code table for CNC +0 +2 +4 +6 +8 +A +C +E ----+------+------+------+------+------+------+------+------60 | 30 00 31 82 32 83 33 8C 34 8D 35 A9 36 00 37 00 70 | 38 AA 39 AB 2D 2D 2E 2E 9B 9B 95 95 0A 0A 97 97 80 | 96 99 94 94 9C 9C 98 98 9A 9A 84 85 88 88 89 89 90 | E8 E1 E9 E1 EA E1 EB E1 EC E1 ED E1 EE E1 EF E1 A0 | 8A FB 8B FD 8E 8E 8F 8F 46 5B 44 5D 48 26 42 20 B0 | 00 00 00 00 00 00 00 00 E4 E4 00 00 00 00 90 90 C0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 | 4F 28 4E 29 47 45 50 43 58 55 59 56 5A 57 51 3F E0 | 49 2C 4A 41 4B 40 52 5F 4D 23 53 3D 54 2A 4C 2B F0 | 00 00 00 00 00 00 00 00 00 00 2F 2F 09 09 86 87 100 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 110 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Key function flag table for C application +0 +1 +2 +3 +4 +5 +6 +7 ----+------+------+------+------+------+------+------+------00 | 10 10 10 10 10 10 10 10 08 | 10 10 10 10 10 10 10 10 10 | 0D 10 10 10 10 0B 10 10 18 | 10 10 10 10 10 10 10 10 20 | 10 10 10 10 10 10 10 10 28 | 00 00 00 00 10 0F 00 60 30 | 00 00 00 00 00 00 00 00 38 | 10 10 10 10 10 10 10 10 40 | 10 10 10 10 10 10 10 10 48 | 0F 0F 0F 0F 0F 10 10 10 50 | 0F 0F 0F 0F 0F 0F 0F 0F 58 | 00 00 00 00 00 00 00 00 Key code table for C application +0 +2 +4 +6 +8 +A +C +E ----+------+------+------+------+------+------+------+------60 | 30 00 31 82 32 83 33 8C 34 8D 35 A9 36 00 37 00 70 | 38 AA 39 AB 2D 2D 2E 2E 9B 9B 95 95 0A 0A 97 97 80 | 96 99 94 94 9C 9C 98 98 9A 9A 84 85 88 88 89 89 90 | E8 E1 E9 E1 EA E1 EB E1 EC E1 ED E1 EE E1 EF E1 A0 | 8A FB 8B FD 8E 8E 8F 8F 46 5B 44 5D 48 26 42 20 B0 | 00 00 00 00 00 00 00 00 E4 E4 00 00 00 00 90 90 C0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 | 4F 28 4E 29 47 45 50 43 58 55 59 56 5A 57 51 3F E0 | 49 2C 4A 41 4B 40 52 5F 4D 23 53 3D 54 2A 4C 2B F0 | 00 00 00 00 00 00 00 00 00 00 2F 2F 09 09 86 87 100 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 110 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3. 30i ONG MDI (T series) Key bit matrix bit= 0 1 2 3 4 5 6 7 +------+------+------+------+------+------+------+------+ 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +------+------+------+------+------+------+------+------+ 1 | 8 | 9 | - | ・ | CTRL |DELETE| EOB | ALT | +------+------+------+------+------+------+------+------+ 2 |ALTER |INSERT| ABC |INPUT | HELP |SHIFT | → | ← | +------+------+------+------+------+------+------+------+ 3 |POSITN|PROGRM|OFFSET|SYSTEM|MESSAG|GRAPH |CUSTM1|CUSTM2| +------+------+------+------+------+------+------+------+ 4 | ↓ | ↑ |Page↓|Page↑| I [ | K ] | R & | F SP | +------+------+------+------+------+------+------+------+ 5 | FL | F9 | F8 | F7 | AUX | | SKV9 | RESET| +------+------+------+------+------+------+------+------+ 6 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | FR | +------+------+------+------+------+------+------+------+ 7 | O ( | N ) | G E | P Q | X A | Z B | C D | Y ? | +------+------+------+------+------+------+------+------+ 8 | U , | W J | H @ | V _ | M # | S = | T * | L + | +------+------+------+------+------+------+------+------+ 9 | | | | | | / | TAB | CAN | +------+------+------+------+------+------+------+------+ A | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | +------+------+------+------+------+------+------+------+ B | SKV8 | SKV7 | SKV6 | SKV5 | SKV4 | SKV3 | SKV2 | SKV1 | +------+------+------+------+------+------+------+------+ Key function flag table for CNC +0 +1 +2 +3 +4 +5 +6 +7 ----+------+------+------+------+------+------+------+------00 | 10 10 10 10 10 10 10 10 08 | 10 10 10 10 10 10 10 10 10 | 0D 10 10 10 10 0B 10 10 18 | 10 10 10 10 10 10 10 10 20 | 10 10 10 10 10 10 10 10 28 | 00 00 00 00 10 0F 00 60 30 | 00 00 00 00 00 00 00 00 38 | 10 10 10 10 10 10 10 10 40 | 10 10 10 10 10 10 10 10 48 | 0F 0F 0F 0F 0F 10 10 10 50 | 0F 0F 0F 0F 0F 0F 0F 0F 58 | 00 00 00 00 00 00 00 00 Key code table for CNC +0 +2 +4 +6 +8 +A +C +E ----+------+------+------+------+------+------+------+------60 | 30 00 31 82 32 83 33 8C 34 8D 35 A9 36 00 37 00 70 | 38 AA 39 AB 2D 2D 2E 2E 9B 9B 95 95 0A 0A 97 97 80 | 96 99 94 94 9C 9C 98 98 9A 9A 84 85 88 88 89 89 90 | E8 E1 E9 E1 EA E1 EB E1 EC E1 ED E1 EE E1 EF E1 A0 | 8A FB 8B FD 8E 8E 8F 8F 49 5B 4B 5D 52 26 46 20 B0 | 00 00 00 00 00 00 00 00 E4 E4 00 00 00 00 90 90 C0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 | 4F 28 4E 29 47 45 50 51 58 41 5A 42 43 44 59 3F E0 | 55 2C 57 4A 48 40 56 5F 4D 23 53 3D 54 2A 4C 2B F0 | 00 00 00 00 00 00 00 00 00 00 2F 2F 09 09 86 87 100 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 110 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Key function flag table for C application +0 +1 +2 +3 +4 +5 +6 +7 ----+------+------+------+------+------+------+------+------00 | 10 10 10 10 10 10 10 10 08 | 10 10 10 10 10 10 10 10 10 | 0D 10 10 10 10 0B 10 10 18 | 10 10 10 10 10 10 10 10 20 | 10 10 10 10 10 10 10 10 28 | 00 00 00 00 10 0F 00 60 30 | 00 00 00 00 00 00 00 00 38 | 10 10 10 10 10 10 10 10 40 | 10 10 10 10 10 10 10 10 48 | 0F 0F 0F 0F 0F 10 10 10 50 | 0F 0F 0F 0F 0F 0F 0F 0F 58 | 00 00 00 00 00 00 00 00 Key code table for C application +0 +2 +4 +6 +8 +A +C +E ----+------+------+------+------+------+------+------+------60 | 30 00 31 82 32 83 33 8C 34 8D 35 A9 36 00 37 00 70 | 38 AA 39 AB 2D 2D 2E 2E 9B 9B 95 95 0A 0A 97 97 80 | 96 99 94 94 9C 9C 98 98 9A 9A 84 85 88 88 89 89 90 | E8 E1 E9 E1 EA E1 EB E1 EC E1 ED E1 EE E1 EF E1 A0 | 8A FB 8B FD 8E 8E 8F 8F 49 5B 4B 5D 52 26 46 20 B0 | 00 00 00 00 00 00 00 00 E4 E4 00 00 00 00 90 90 C0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 | 4F 28 4E 29 47 45 50 51 58 41 5A 42 43 44 59 3F E0 | 55 2C 57 4A 48 40 56 5F 4D 23 53 3D 54 2A 4C 2B F0 | 00 00 00 00 00 00 00 00 00 00 2F 2F 09 09 86 87 100 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 110 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3.6 CRT operation library ======

Supported display device ~~~~~~~~~~~~~~~~~~~~~~~~

C Executor supports the following display devices.

VGA Display Character 80-column x 25-line/half-size (40-column x 25-line/ full-size) x 16-color. 80-column x 30-line/half-size (40-column x 30-line/ full-size) x 16-color. Dot matrix (HxV): 8x16 dots(half-size).

Display device 10.4-inch color LCD, 10.4-inch color LCD(with touch-panel)

All display devices have 12 softkeys under its screen. (Touch-panel works like softkeys on "LCD with touch-panel" device. This is equivalent to 12(10+2)-softkey type.)

+------+ | 80-column | | | | | | | | | | | |25-line (or 30-line) | | | | | | | | | | | | | +------+ [L] [0][1][2][3][4] [5][6][7][8][9] [R] <- 12 softkeys (10+2)

For every display device, it is possible to specify display color on the monochrome display device. In this case, the intensity of character is changed by color specification. Lists of Functions ~~~~~~~~~~~~~~~~~~

1. CRT operation library

------Name Function ------1.1 crt_getcurscrn Get current screen index. 1.2 crt_setuserscrn Register user screen index. 1.3 crt_isnewscrn Test screen switching status. 1.4 crt_gettype Get CRT information. 1.5 crt_setmode Set CRT screen mode. 1.6 crt_cncscrn Switch to CNC screen. 1.7 crt_fchar Output character by FANUC character code. 1.8 crt_setuserskey Customize softkey on CNC screen. 1.9 crt_setswt Set switching method between CNC's screen and user's. 1.10 crt_setscrlarea Set scroll area. 1.11 crt_opengr Open graphic display. 1.12 crt_closegr Close graphic display. 1.13 crt_graphic Enable or disable graphic display. 1.14 crt_readfkey Read the status of function keys. 1.15 crt_2ndcursor Display the secondary cursor. 1.16 crt_settextattr Set attribute of characters on VRAM. 1.17 crt_gettextattr Get attribute of character on VRAM. 1.18 crt_setpalette Set color palette of VGA characters. 1.19 crt_setallpalette Set all color palette of VGA characters. 1.20 crt_getcncpalette Get color palette of CNC screen. 1.21 crt_fstr Output character string by FANUC character code. 1.22 crt_gettextimg Get text data from VRAM. 1.23 crt_puttextimg Put text data into VRAM. 1.24 crt_setgraphpage Select graphic page to use. 1.25 crt_set6chmode Select drawing method of 6x sized character. 1.26 crt_setgsvmode Select saving method of graphic contents. ------2. Multiple window display library

------Name Function ------2.1 win_open Open window. 2.2 win_close Close window. 2.3 win_select Select window. 2.4 win_activate Activate window. 2.5 win_move Move window. 2.6 win_size Alter window size. 2.7 win_full Let active window be full screen size. 2.8 win_window Let active window be window size. 2.9 win_info Get window information. 2.10 win_col Set color of window frame and title string. 2.11 win_hide Hide window. 2.12 win_show Show window. 2.13 win_setttl Set window title string. 2.14 win_setfrm Set window frame line character. 2.15 win_getstat Get window display status. 2.16 win_redraw Redraw windows. ------

3. User definition character library ------Name Function ------3.1 crt_reguserchar Register user character. 3.2 crt_mapuch Map user character. 3.3 crt_getcgpttn Get CG pattern. ------

4. VGA window display library ------Name Function ------4.1 vwin_open Open VGA window. 4.2 vwin_close Close VGA window. 4.3 vwin_select Select VGA window. 4.4 vwin_show Show VGA window. 4.5 vwin_hide Hide VGA window. 4.6 vwin_info Get VGA window information. ------Function Reference ~~~~~~~~~~~~~~~~~~

1. CRT operation library

------1.1 Get current screen index. ------

[Name] crt_getcurscrn

[Syntax] #include int crt_getcurscrn( void ) ;

[Arguments] ------

[Return] Returns the index number of the currently displayed screen.

[Description] Gets the index number of the currently displayed screen. The format of the screen index number is as follows. Upper byte Lower byte ------+------Small Large classification classification Refer the following screen index number list for index numbers of each screens. All available index values are defined in crt.h as "CRT_xxx_xxx". Screen index number of FS30i

Symbol Index number Screen ------+------+------ CRT_POS_ABS 0x0100 ABS CRT_POS_REL 0x0200 REL CRT_POS_ALL 0x0300 ALL CRT_POS_HNDL 0x0400 HNDL CRT_POS_MONI 0x0600 MONITOR CRT_POS_5AX 0x0700 5AXMAN CRT_POS_CEXE 0x3200 C Executor CRT_POS_CEXE2 0x3300 C Executor 2 CRT_POS_CEXE3 0x3400 C Executor 3 CRT_POS_CEXE4 0x3500 C Executor 4 CRT_POS_CEXE5 0x3600 C Executor 5 CRT_PRG_PRG 0x0101 PROG CRT_PRG_LIB 0x0201 FOLDER CRT_PRG_NEXT 0x0301 NEXT CRT_PRG_PCHK 0x0401 CHECK CRT_PRG_REST 0x0601 RSTR CRT_PRG_JOG 0x0701 JOG CRT_PRG_HOST 0x0b01 HOST CRT_PRG_CONHOST 0x0c01 CONECT CRT_PRG_CEXE 0x3201 C Executor CRT_PRG_CEXE2 0x3301 C Executor 2 CRT_PRG_CEXE3 0x3401 C Executor 3 CRT_PRG_CEXE4 0x3501 C Executor 4 CRT_PRG_CEXE5 0x3601 C Executor 5 CRT_OFS_OFS 0x0102 OFFSET CRT_OFS_SETP 0x0202 SETTING CRT_OFS_WORK 0x0302 WORK CRT_OFS_MCR 0x0602 MACRO CRT_OFS_OPR 0x0802 OPR CRT_OFS_TOOLMNG 0x0902 TOOL MANAGER CRT_OFS_YOFS 0x0b02 OFST.2 CRT_OFS_WSFT 0x0c02 W.SHFT CRT_OFS_GEOM2 0x0d02 GEOM.2 CRT_OFS_TLFM 0x0e02 TOOL.F CRT_OFS_MODEM 0x1002 MODEM CRT_OFS_PRELEV 0x1102 PR-LEV CRT_OFS_CHOP 0x1302 CHOP CRT_OFS_CHUCK 0x1502 CHUCK TAIL CRT_OFS_LANG 0x1602 LANG. CRT_OFS_PROTECT 0x1702 PROTECT CRT_OFS_SAFEGUARD 0x1802 GUARD CRT_OFS_CEXE 0x3202 C Executor CRT_OFS_CEXE2 0x3302 C Executor 2 CRT_OFS_CEXE3 0x3402 C Executor 3 CRT_OFS_CEXE4 0x3502 C Executor 4 CRT_OFS_CEXE5 0x3602 C Executor 5 ------+------+------(continued) CRT_SYS_PRM 0x0103 PARAM CRT_SYS_DGN 0x0203 DGNOS CRT_SYS_SRVGUID 0x0303 SERVO GUIDEM CRT_SYS_SYS 0x0403 SYSTEM CRT_SYS_MEM 0x0603 MEMORY CRT_SYS_PIT 0x0703 PITCH CRT_SYS_SVPR 0x0803 SV-PRM CRT_SYS_SPPR 0x0903 SP.SET CRT_SYS_MAINTENANCE 0x0b03 PMC MAINTE CRT_SYS_LADDER 0x0c03 PMC LADDER CRT_SYS_PMCCONFIG 0x0d03 PMC CONFIG CRT_SYS_MTUNE 0x1003 M-TUN CRT_SYS_ALIO 0x1103 ALL IO CRT_SYS_ALIO2 0x1203 ALL IO CRT_SYS_OHIS 0x1303 OPEHIS CRT_SYS_COLOR 0x1503 COLOR CRT_SYS_MAINT 0x1603 MAINTE CRT_SYS_MINFO 0x1703 M-INFO CRT_SYS_WANL 0x1803 W.DGNS CRT_SYS_FSSB 0x1b03 FSSB CRT_SYS_PARAMTUNE 0x1c03 PRMTUN CRT_SYS_EMB_ETH 0x1f03 EMBED PORT CRT_SYS_PCM_ETH 0x2003 PCMCIA LAN CRT_SYS_BOARD_ETH 0x2103 ETHER BOARD CRT_SYS_MAS_PROFI 0x2203 PROFI MASTER CRT_SYS_REMOTEDGN 0x2403 RMTDGN CRT_SYS_MCOD 0x2503 M CODE CRT_SYS_CEXE 0x3203 C Executor CRT_SYS_CEXE2 0x3303 C Executor 2 CRT_SYS_CEXE3 0x3403 C Executor 3 CRT_SYS_CEXE4 0x3503 C Executor 4 CRT_SYS_CEXE5 0x3603 C Executor 5 CRT_MSG_ALM 0x0104 ALARM CRT_MSG_EMSG 0x0204 MSG CRT_MSG_AHIS 0x0304 HISTRY CRT_MSG_MHIS 0x0404 MSGHIS CRT_MSG_EMB_ETHLOG 0x0604 EMBED LOG CRT_MSG_PCM_ETHLOG 0x0704 PCMCIA LOG CRT_MSG_BOARD_ETHLOG 0x0804 BOARD LOG CRT_MSG_CEXE 0x3204 C Executor CRT_MSG_CEXE2 0x3304 C Executor 2 CRT_MSG_CEXE3 0x3404 C Executor 3 CRT_MSG_CEXE4 0x3504 C Executor 4 CRT_MSG_CEXE5 0x3604 C Executor 5 CRT_GRH_PRM 0x0105 PARAMETER CRT_GRH_GRP 0x0205 GRAPH CRT_GRH_CEXE 0x3205 C Executor CRT_GRH_CEXE2 0x3305 C Executor 2 CRT_GRH_CEXE3 0x3405 C Executor 3 CRT_GRH_CEXE4 0x3505 C Executor 4 CRT_GRH_CEXE5 0x3605 C Executor 5 [Example] The following program displays the index number of the current screen.

#include #include void example( void ) { int scrn ; scrn = crt_getcurscrn() ; printf( "Current screen index is %02X-%02X\n", scrn & 0xFF, scrn >> 8 ) ; } ------1.2 Register user screen index.

------

[Name] crt_setuserscrn

[Syntax] #include int crt_setuserscrn( int num, int *scrntbl ) ;

[Arguments] num Number of screen index to be registered. scrntbl Pointer to the user screen index table.

[Return] Returns zero if successful. If any error, returns -1 and sets the following error code in the global variable "errno". EUCRT Number of the screen index "num" is 0 or above 200.

[Description] Registers the screen index numbers of the CNC screens which is replaced by the user application program. The index numbers of the user screens are registered in CNC by calling of this function. Then, the user application will be called by selection of registered screens. Store the screen index numbers in "scrntbl" with the following format. The storing order is arbitrary. Upper byte Lower byte ------+------Small Large classification classification Refer the screen index number list of "Get current screen index (crt_getcurscrn)" for index numbers of each screens. All available index values are defined in crt.h as "CRT_xxx_xxx". At the start time of the application program, no user screen is registered. In this condition, screen switching from the user screen to the CNC's is not allowed because it is impossible to return to the user screen from the CNC screen again if no user screen is registered. So, this function must be called in the beginning of the main task of the user application program. This function doesn't check integrity of the screen index numbers to be registered.

Re-registration of the user screen index numbers by calling of this function again is allowable. In this case, this function must be called under condition that any screen switching is disabled by "crt_setswt" function.

For FS30i, "C Executor screen" is added to each large classification of CNC screens. (CEXE-screen) CEXE-screen is exclusive screen for C Executor. The CNC software doesn't use this screen. By registering this CEXE-screen as user screen using this function, the new user screen is added without replacing any existing CNC screens.

[Example] The following program registers all position screens ([ALL]/[REL]/[ABS]/[MCN]) as user's screen.

#include void example( void ) { int crt_table[] = { CRT_POS_ALL, /* POSITION/ALL */ CRT_POS_REL, /* POSITION/RELATIVE */ CRT_POS_ABS, /* POSITION/ABSOLUTE */ CRT_POS_MCN /* POSITION/MACHINE */ } ; crt_setuserscrn( scrn_tbl_size(crt_table), crt_table ) ; } ------1.3 Test screen switching status. ------

[Name] crt_isnewscrn

[Syntax] #include int crt_isnewscrn( void ) ;

[Arguments] ------

[Return] Returns non-zero value if any screen switching has been done after the last calling this function. If not, returns zero.

[Description] Test whether any screen switching has been done or not.

This function is used to check the new entrance to the user screen by screen switching such as (any user screen) -> (CNC screen) -> (the same user screen). In this case, it is impossible to get screen switching status by only calling "crt_getcurscrn" function.

[Example] The following program displays whether any screen switching has been done or not. #include #include void example( void ) { if ( crt_isnewscrn() ) printf( "Any" ) ; else printf( "No" ) ; printf( " screen switching has been done.\n" ) ; } ------1.4 Get CRT information. ------

[Name] crt_gettype

[Syntax] #include unsigned int crt_gettype( void ) ;

[Arguments] ------

[Return] Returns CRT information.

[Description] Gets the equipped CRT specification and the current display mode. This function is used to get whether CRT is 9 inch or 14 inch, etc.

The following informations are returned on each bits of the return value. bit0 0: 9 inch CRT. 1: 14 inch CRT. (CRT_TYPE_14) (This bit is always set as "1".) bit1 0: 40-column x 16-line. 1: 80-column x 25-line. (CRT_TYPE_80X25) (This bit is always set as "1".) bit2 0: Graphic function is unavailable. 1: Graphic function is available. (CRT_TYPE_GRAPH) (This bit is always set as "1".) bit3 0: Graphic function is not in use. 1: Graphic function is in use. (CRT_TYPE_GAUTH) bit4 Undefined. bit5 0: CRTC Display. 1: VGA Display. (CRT_TYPE_VGA) (This bit is always set as "1".) bit6 0: 80-column x 25-line. 1: 80-column x 30-line. (CRT_TYPE_V30) (This bit is always set as "1".) bit7 0: 16-color mode 1: 256-color mode (CRT_TYPE_VGAMD) bit8 0: 40-column x 16-line. 1: 40-column x 19-line. (CRT_TYPE_V19) (This bit is always set as "0".) bit9 0: 7.2-inch or 8.4-inch LCD. 1: 9-inch CRT. (CRT_TYPE_VCRT) (This bit indicates the kind of display device of 9-inch VGA display. This bit is always set as "0".) bit10 0: Normal display 1: Extended and reduced display (CRT_TYPE_V9MD2) (This bit is always set as "0".) bit11 0: VGA Display 1: Character Card Display bit12-15 Undefined.

[Example] The following program displays information of the current display equipment.

#include #include void example( void ) { unsigned int crt ; crt = crt_gettype() ; printf( "Current screen mode is %s on %sinchCRT with%s " "Graphic device.\n", (crt&CRT_TYPE_80X25)?"80x25":"40x16", (crt&CRT_TYPE_14)?"14":"9", (crt&CRT_TYPE_GRAPH)?"":"out" ) ; } ------1.5 Set CRT screen mode. ------

[Name] crt_setmode

[Syntax] #include int crt_setmode( unsigned int mode ) ;

[Arguments] mode CRT screen mode.

[Return] Returns zero if successful. If any error, returns non-zero value.

[Description] Set the screen mode such as character size and color/monochrome mode. The screen mode is changed into the specified one and the screen is initialized by the successful calling of this function. Specify following values in "mode". CRT_MODE_80X25 80-column x 25-line mode. CRT_MODE_MONO Monochrome mode (without brightness conversion). (This is specified with "CRT_MODE_80X25".) CRT_MODE_V25_0 VGA, 80-column x 25-line(Upper blank:0) mode. CRT_MODE_V25_1 VGA, 80-column x 25-line(Upper blank:1) mode. CRT_MODE_V25_2 VGA, 80-column x 25-line(Upper blank:2) mode. CRT_MODE_V25_3 VGA, 80-column x 25-line(Upper blank:3) mode. CRT_MODE_V25_4 VGA, 80-column x 25-line(Upper blank:4) mode. CRT_MODE_V25_5 VGA, 80-column x 25-line(Upper blank:5) mode. CRT_MODE_V30 VGA, 80-column x 30-line mode. CRT_MODE_CFLAG Specify display action flag. CFLAG_KEISEN Enable replacement JIS-Keisen/98-Keisen with FANUC-Keisen. "Upper blank:n" in VGA Display is,

+------+ +- | Blank of n lines | | |------| | |Start line ^ | -+ | | | | | | | | | | 30 lines | | | | | (19 lines)| | | Display region | | 25 lines | | | | |(16 lines) | | | | | | | | | | | | | | | | | v | -+ +- |------| +------+

It specifies in where the 25-line (or 16-line) region is placed in the whole screen (30-line or 19-line) like above. The available combinations are as follows. CRT_MODE_V25_0 80x25(UB:0), color CRT_MODE_V25_0 + CRT_MODE_MONO 80x25(UB:0), monochrome CRT_MODE_V25_1 80x25(UB:1), color CRT_MODE_V25_1 + CRT_MODE_MONO 80x25(UB:1), monochrome CRT_MODE_V25_2 80x25(UB:2), color CRT_MODE_V25_2 + CRT_MODE_MONO 80x25(UB:2), monochrome CRT_MODE_V25_3 80x25(UB:3), color (default) CRT_MODE_V25_3 + CRT_MODE_MONO 80x25(UB:3), monochrome CRT_MODE_V25_4 80x25(UB:4), color CRT_MODE_V25_4 + CRT_MODE_MONO 80x25(UB:4), monochrome CRT_MODE_V25_5 80x25(UB:5), color CRT_MODE_V25_5 + CRT_MODE_MONO 80x25(UB:5), monochrome CRT_MODE_V30 80x30, color CRT_MODE_V30 + CRT_MODE_MONO 80x30, monochrome CRT_MODE_CFLAG + CFLAG_KEISEN Enable replacement JIS-Keisen/ 98-Keisen with FANUC-Keisen. The color selection by the escape sequences code are ineffective on monochrome mode. Characters are always displayed by WHITE (or the maximum brightness on monochrome display equipment). The console driver is initialized by this function. All setting about CRT are initialized. So re-initialization is required if needed. If this function is called while the graphic grawing are displayed, the graphic drawing contents will be initialized. The condition of graphics is initialized like "Text mode" specified by _setvideomode function. ------1.6 Switch to CNC screen. ------

[Name] crt_cncscrn

[Syntax] #include int crt_cncscrn( int index ) ;

[Arguments] index Index number of the CNC screen to be switched to.

[Return] Returns zero if successful. If not, returns one of following values and sets the same value in the global variable "errno".

ER_CNC_DATA (=5) Incorrect screen index number "index". ER_CNC_OPTION (=6) There are no additional options/board required for the specified screen. ER_CNC_BUSY (=-1) CNC window is busy.

[Description] Changes into the CNC screen which is specified by the application program. Also execution of program is switched from the application task to the CNC task. This is the same operation as switching to CNC screen by pressing of the function keys on MDI panel. The CRT display will be switched into the specified CNC screen by the successful calling of this function. At the same time, the control of software will be switches to the CNC side, and then, the application program is put into sleep state. When the screen will be changed from the CNC side into the user's screen again, the application program will restart from the next instruction to this function call. Specify the screen index numbers in "index" with the following format. Upper byte Lower byte ------+------Small Large classification classification

Refer the screen index number list of "Get current screen index(crt_getcurscrn)" for index numbers of each screens. All available index values are defined in crt.h as "CRT_xxx_xxx". It is possible to switch to any user's screen by specifying the index number of the user screen. [Example] The following program changes into "PROGRAM CHECK" screen if the current mode is "MEM".

#include #include #include void example( void ) { struct odbst stat ; cnc_statinfo( &stat ) ; if ( stat.aut == 1 ) crt_cncscrn( CRT_PRG_PCHK ) ; } ------1.7 Output character by FANUC character code.

------

[Name] crt_fchar

[Syntax] #include int crt_fchar( unsigned int code ) ;

[Arguments] code FANUC character code ( 0x0000 through 0x1fff ), or FANUC character code | 0x8000 (0x8000 through 0x9fff).

[Return] Returns always zero.

[Description] Outputs a character that is included in FANUC character set and is specified by FANUC character code on the current cursor position.

A character which is specified by FANUC character code is displayed on the current cursor position. In case that (FANUC code | 0x8000) is specified, the function works as follows. In case of "ESC (A" mode (JIS Kanji set mode) is specified. Character codes 0x0000 through 0xFFFF can be accepted. This function must display the specified half-size character. In case of other than "ESC (A" mode is specified. Two characters are displayed continuously, the first one is (specified code), and the next one is (specified code + 1). This function works like putchar() function except character code format. That is, displaying a half-size character on the current curosr position with the specified character attribute, and then forwarding a cursor for one character. [Example] The following program displays the specified integer value using bold numeric characters.

#include #include #include void example( unsigned int val ) { int idx ; char buf[6] ; sprintf( buf, "%u", val ) ; for ( idx = 0 ; idx < strlen( buf ) ; idx++ ) crt_fchar( 0x1D20 + buf[idx] - '0' ) ; } ------1.8 Customize softkey on CNC screen.

------

[Name] crt_setuserskey

[Syntax] #include int crt_setuserskey( unsigned int index, unsigned int num, struct user_softkey *skey ) ;

struct user_softkey { unsigned int index ; /* Softkey index number. */ int op ; /* Operation code. */ unsigned int submode ; /* Small classification of */ /* user's screen. */ unsigned int *string ; /* Display string. */ } ;

[Arguments] index Softkey table index number to be customized. num Number of customizing item. skey Customizing data table.

[Return] Returns zero if successful. If any error, returns -1 and sets the following error code in the global variable "errno". EUSKEY Incorrect softkey table index number "index" or softkey index number "skey.index".

[Description] Alters the softkey displayed on the CNC screen as follows, adds new items, by which any user screens are selected, moves the existent items, by which the CNC screens are selected,deletes the existent items. Specify the softkey table index number to be customized in "index". There are the softkey tables for each large classifications of the CNC screen (and more, for each modes in the PROGRAM screen). All available table index values are defined in crt.h as "SKEY_xxxx". Store multiple customizing data in "skey". The customizing data includes the following items.

index Softkey index number to be customized. op Operation code. submode Small classification of the user's screen. string User specified display string. Softkey index number is the sequential number for each softkey tables. For example, the following sequential numbers are assigned to the softkeys on the POSITION screen.

Key Softkey index number ------+------[ ABS ] 1 [ REL ] 2 [ ALL ] 3 [ HNDL ] 4

Available operations are "Deletion", "User specified" and "Moving".

Operation code Action ------+------SKEY_OP_DEL makes the specified softkey ineffective. Blank is displayed for the softkey. SKEY_OP_USER makes the specified softkey effective forcibly. The user specified string is displayed on the screen. The user specified (small classification) screen will be selected by pushing the specified softkey. Other value moves the softkey which is specified by the operation code to the specified position. Specify the small classification number of the screen which is selected by the specified softkey in "submode" when the operation code is "SKEY_OP_USER". "submode" is not referenced when the operation code is "SKEY_OP_DEL" or moving softkey. Specify display string of the softkey in "string" by FANUC code when the operation code is "SKEY_OP_USER". The maximum string length is 12 characters (6 characters x 2-line) . Register the small classification number of the screen which is specified in "submode" as the user's screen using "crt_setuserscrn" function when "SKEY_OP_USER" is specified. Call this function before calling "crt_setuserscrn" function. CNC original softkey table ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following list includes the original softkey display items of FS30i. Softkeys shown in the left side are defined for screen selection in each screens (and each modes). The numbers shown in the right side are the small classification numbers of the screen which is selected by each softkeys.

POSITION [ ABS ][ REL ][ ALL ][ HANDLE ][ ] [ MONITOR ][ 5AXMAN ][ ][ ][ ] [ CEXE ][ CEXE2 ][ CEXE3 ][ CEXE4 ][ CEXE5 ]

[01][02][03][04][ ] [06][07][ ][ ][ ] [50][51][52][53][54]

PROGRAM [ PROG ][ FOLDER ][ NEXT ][ CHECK ][ ] [ RSTR ][ JOG ][ ][ ][ ] [ HOST ][ CONECT ][ ][ ][ ] [ CEXE ][ CEXE2 ][ CEXE3 ][ CEXE4 ][ CEXE5 ] [01][02][03][04][ ] [06][07][ ][ ][ ] [11][12][ ][ ][ ] [50][51][52][53][54] OFFSET/SETTING [ OFFSET ][ SETTING ][ WORK ][ ][ ] [ MACRO ][ ][ OPR ][TOOL MANAGER][ ] [ OFST.2 ][ W.SHFT ][ GEOM.2 ][ TOOL.F ][ ] [ MODEM ][ PR-LEV ][ ][ CHOP ][ ] [ CHUCK TAIL ][ LANG. ][ PROTECT ][ GUARD ][ ] [ CEXE ][ CEXE2 ][ CEXE3 ][ CEXE4 ][ CEXE5 ] [01][02][03][ ][ ] [06][ ][08][09][ ] [11][12][13][14][ ] [16][17][ ][19][ ] [21][22][23][24][ ] [50][51][52][53][54] (continued) SYSTEM [ PARAM ][ DGNOS ][SERVO GUIDEM][ SYSTEM ][ ] [ MEMORY ][ PITCH ][ SV-PRM ][ SP.SET ][ ] [ PMC MAINTE ][ PMC LADDER ][ PMC CONFIG ][ ][ ] [ M-TUN ][ ALL IO ][ ALL IO ][ OPEHIS ][ ] [ COLOR ][ MAINTE ][ M-INFO ][ W.DGNS ][ ] [ ][ FSSB ][ PRMTUN ][ ][ ] [ EMBED PORT ][ PCMCIA LAN ][ETHER BOARD ][PROFI MASTER][ ] [ RMTDGN ][ M CODE ][ ][ ][ ] [ CEXE ][ CEXE2 ][ CEXE3 ][ CEXE4 ][ CEXE5 ]

[01][02][03][04][ ] [06][07][08][09][ ] [11][12][13][ ][ ] [16][17][18][19][ ] [21][22][23][24][ ] [ ][27][28][ ][ ] [31][32][33][34][ ] [36][37][ ][ ][ ] [50][51][52][53][54] MESSAGE [ ALARM ][ MSG ][ HISTRY ][ MSGHIS ][ ] [ EMBED LOG ][ PCMCIA LOG ][ BOARD LOG ][ ][ ] [ CEXE ][ CEXE2 ][ CEXE3 ][ CEXE4 ][ CEXE5 ]

[01][02][03][04][ ] [06][07][08][ ][ ] [50][51][52][53][54] GRAPH [ PARAMETER ][ GRAPH ][ ][ ][ ] [ CEXE ][ CEXE2 ][ CEXE3 ][ CEXE4 ][ CEXE5 ] [01][02][ ][ ][ ] [50][51][52][53][54] How to define display string of the softkey ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The display string of the softkey must be defined by FANUC code when softkey item is customized using this function.

(1) Define array of "int" type(or "unsigned int" type). The total number of elements is 12( 6 characters x 2-line). The exceeded elements are ignored.

(2) Store one code for a character in each "int"-type element. For double-sized character (such as Japanese Kanji character), store the codes for the left-side and the right-side of the character continuously.

(Example 1) Define a string " USER ".

unsigned int skey_user[] = { 0x0020,0x0055,0x0053,0x0045,0x0052,0x0020 /* " USER " */ } ;

(Example 2) Define a string "TOOL# seting"

unsigned int skey_kougu[] = { 0x0054,0x004F,0x004F,0x004C,0x0023,0x0020, /* "TOOL# " */ 0x0073,0x0065,0x0074,0x0069,0x006e,0x0067 /* "seting" */ } ; [Example] This is procedure to customize the softkey of POSITION screen as follows.

Original [ ALL ][ REL ][ ABS ][ MCN ] After customizing [ USER ][ ALL ][ ABS ][ ]

1. Define a string " USER " by FANUC character code.

unsigned int skey_str[] = { 0x0020,0x0055,0x0053,0x0045,0x0052,0x0020, /* " USER " */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020 /* " " */ } ;

2. Define customizing data.

struct user_softkey skey_table[] = { /* Delete [ MCN ] key. */ { 4, SKEY_OP_DEL, 0, NULL }, /* Move [ ALL ] to [ REL ]'s position. */ { 2, 1, 0, NULL }, /* Define new user key at [ ALL ]'s position, the small classification is 3. Register the small classification 3 screen in POS function as user's screen using "crt_setuserscrn" function. */ { 1, SKEY_OP_USER, 3, skey_str } } ; 3. Call "crt_setuserskey" function. crt_setuserskey( SKEY_POSITION, skey_tbl_size(skey_table), skey_table ) ; After customizing, the small classification 3 user's screen is displayed by pushing [ USER ] key, the ordinary all position screen screen by [ ALL ] key, and the absolute position screen by [ ABS ] key.

The above procedures are described in the following program. #include void example( void ) { unsigned int skey_str[] = { 0x0020,0x0055,0x0053,0x0045,0x0052,0x0020, /* " USER " */ 0x0020,0x0020,0x0020,0x0020,0x0020,0x0020 /* " " */ } ; struct user_softkey skey_table[] = { { 4, SKEY_OP_DEL, 0, NULL }, { 2, 1, 0, NULL }, { 1, SKEY_OP_USER, 3, skey_str } } ; crt_setuserskey( SKEY_POSITION, skey_tbl_size(skey_table), skey_table ) ; } ------1.9 Set switching method between CNC's screen and user's. ------

[Name] crt_setswt

[Syntax] #include unsigned int crt_setswt( unsigned int mode ) ;

[Arguments] mode Screen switching mode.

[Return] Returns the old setting value.

[Description] Set switching method such as, disable/enable to switch to the CNC screen from the user's, disable/enable to output video signal at switching to the user screen from the CNC's. Specify the following setting value in each bits of "mode". It is possible to specify the multiple bits simultaneously. bit0 0: Enables switching to the CNC screen from the user's. (default) 1: Disable switching to the CNC screen from the user's. (CRT_SWT_DIS) bit1 0: Video beam is ON at switching to the user screen from the CNC's (default) 1: Video beam is OFF at switching to the user screen from the CNC's. (CRT_SWT_VOFF) bit2 0: Disable switching screen during graphic drawing. (default) 1: Enable switching screen during graphic drawing. (CRT_SWT_GREN) bit3 When any CNC alarm occurred in the CNC screen, the screen is switched to the CNC's alarm screen automatically or not 0: according to the ordinary CNC setting. (Parameter No.3111#7) 1: according to the user screen's setting. (Parameter No.8650#1) (CRT_SWT_ACNC) bit4 The function keys on MDI panel are 0: read by the CNC software. (default) 1: not read by the CNC software. (The CNC software can't switch the screen.) bit5 The automatic graphic beam ON when the screen is switched from the CNC to the user's is 0: not executed. 1: executed. (only when the graphic beam is enabled on the previous user's screen.) (CRT_SWT_GRON) bit6 For VGA Display, the contents of the user screen is saved and restored at the switching screen between the NC's and the user's or not. 0: saved/restored. 1: not saved/restored. (This makes the screen switching fast a little.) (CRT_SWT_NOSV)

Setting by this function goes on being effective until this function will be called newly.

"CRT_SWT_DIS" disables switching to the CNC screen by MDI key operation, so take care of usage of this function. Under condition that "CRT_SWT_DIS" is set, also screen switching by "crt_cncscrn" function is disabled. Under condition that "CRT_SWT_VOFF" is set, nothing is displayed on the screen after screen switching from the CNC screen to the user's until the application program enables video beam output. Output escape sequence "ESC [>9l" to console, or clear whole screen by "ESC [2J" to enable beam output. ("ESC [2J" enables video beam output.) Under condition that "CRT_SWT_MFKY" is set, the screen switching by the function keys is disabled. When this bit is set, the user application must read the status of the function keys using "crt_readfkey" function and switch the screen. This setting is effective on the CNC's screen. During the CNC screen is being displayed, execute reading the function keys and switching the screen in the auxiliary task. When the application program manages the screen switching with setting this bit ON, set CNC parameter No.8650#1 CNA as "1" and manages also screen switching at CNC alarm rising by the application program.

[Example] The following program disables screen switching, executes foo() function and restores the original status again. #include void example( void ) { unsigned int save_mode ; save_mode = crt_setswt( CRT_SWT_DIS ) ; foo() ; crt_setswt( save_mode ) ; } ------1.10 Set scroll area.

------

[Name] crt_setscrlarea

[Syntax] #include int crt_setscrlarea( unsigned int start, unsigned int height ) ;

[Arguments] start Start line of the scroll area (1 - max line). height Height of the scroll area (1 - max line).

"max line" is 30 . (in case of line extended)

[Return] Returns zero if successful. If any error (for example, the scroll area is out of the screen, etc.), returns "1".

[Description] Set the scroll area for automatic scrolling by line-feeding. Only specified scroll area is scrolled by line-feeding by this function. This function doesn't clear the screen, and doesn't change the current cursor position. The whole screen is scroll area on the start-up time. The scroll area which is specified by this function is effective to both automatic scrolling by line-feeding and scroll-up/scroll-down by escape-sequence ("ESC [nL", "ESC [nM").

[Example] The following program sets the scroll area in 2 through 24th line. (The top line and the bottom line are not scrolled.) #include void example( void ) { crt_setscrlarea( 2, 24 ) ; } ------1.11 Open graphic display.

------

[Name] crt_opengr

[Syntax] #include int crt_opengr( void ) ;

[Arguments] ------

[Return] Returns "0" or "1" if successful. If any error (Graphic board is not equipped, or the graphic function option is not set.), returns "-1". The difference between return code "0" and "1" is as follows. 0 The authorization to use graphic display has not been given to another application after the last calling of crt_closegr() function. So, initialization of graphic screen is not required because the state of graphic display on the last calling of crt_closegr() is being kept. 1 The authorization to use graphic display has been given to another application after the last calling of crt_closegr() function. So, initialization of graphic screen is required because the state of graphic display on the last calling of crt_closegr() is not being kept.

[Description] Acquire authorization to use graphic display and become ready for the graphic display.

After successful completion of this function, the authorization of graphic display is given to the C Executor application program and the application program become capable of drawing on the graphic screen. After the execution of this function, screen switching is disabled until crt_closegr() function is executed. Calling crt_setswt(CRT_SWT_GREN) prior to crt_opengr() enables screen switching while graphics display is open. When screen is switched from the user screen to the CNC screen while displaying application graphics, graphic display to the CRT is disabled (BEAM OFF). However, the graphics drawn by the user application program is retained as is, provided no graphic screen is displayed by CNC. When screen is switched back to the user screen, the function crt_opengr() returns the value '0' if graphics is retained. But , to re-display the graphics on the CRT, beam should be made on by the function crt_graphic(). If the "CRT_SWT_GRON" bit is set by the crt_setswt() function, "BEEM ON" is automatically done when returned from the CNC screen to the user screen.

[Example] Following program draws a line defined by two specified end points.

#include #include void example( int x1, int y1, int x2, int y2 ) { int ret ; ret = crt_opengr() ; if ( ret == -1 ) return ; if ( ret ) _setvideomode( 81 ) ; _moveto( x1, y1 ) ; _lineto( x2, y2 ) ; crt_closegr() ; } ------1.12 Close graphic display.

------

[Name] crt_closegr

[Syntax] #include void crt_closegr( void ) ;

[Arguments] ------

[Return] ------

[Description] Stop using graphic display and become ready to release authorization for graphic display.

By calling this function, access to the graphic display function from the user application program is disabled, and no user graphics display can be done until the crt_opengr() function is called again. This function, at the same time, enables screen switching, and the screen switching which has been suspended during open graphic display mode is executed after the execution of this function.. This function does not always release authorization for graphic display at it's execution. If there are no other application programs requiring authorization for graphic display when this function is called, this function only prepares for releasing the authorization of graphic display.

[Example] Refer to the example of "Open graphic display (crt_opengr)". ------1.13 Enable or disable graphic display. ------

[Name] crt_graphic

[Syntax] #include int crt_graphic( int mode ) ;

[Arguments] mode Specify graphic output ON or OFF.

[Return] Returns zero if successful and returns non zero if any error (graphic function is not ready for use).

[Description] Specify whether to display graphics on the CRT or not (GRAPHIC BEAM ON or OFF).

One of the following should be specified for the "mode". CRT_ON_BEAM Enable graphic display on the CRT. CRT_OFF_BEAM Disable graphic display on the CRT. This function controls whether the graphics drawn by the user application program is displayed on the CRT or not , and has no effect on the display of characters, while BEAM ON/OFF command by using the escape sequences, "ESC [>9l"/"ESC [>9h", affects both graphics and characters. Graphics can be drawn even while the display of the graphics to the CRT is disabled. The default state of the "GRAPHIC BEAM" right after the graphic screen is initialized (i.e. when returned from the "_setvideomode" function) is "ON". Screen switching from the user screen to the CNC screen automatically turns the "GRAPHIC BEAM" off. After switching the screen to the user's again, turn the "GRAPHIC BEAM" on by this function to get graphic display on the CRT. [Example] Following program tests the current screen, and turns the "GRAPHIC BEAM" on if it is POSITION display screen. Turns the "GRAPHIC BEAM" off if else.

#include void example( void ) { int scrn ; scrn = crt_getcurscrn() ; if ( ( scrn & 0xFF ) == ( CRT_POS_ABS & 0xFF ) ) crt_graphic( CRT_ON_BEAM ) ; else crt_graphic( CRT_OFF_BEAM ) ; } ------1.14 Read the status of function keys. ------

[Name] crt_readfkey

[Syntax] #include int crt_readfkey( void ) ;

[Arguments] ------

[Return] Returns zero if no function keys are depressed or CRT_SWT_MFKY bit of the "crt_setswt" function is set to "0". When CRT_SWT_MFKY bit is set to "1", keycode for the function key being depressed is returned. Keycodes are shown below.

KEY SYMBOL CODE ------+------+------POSITION MDIKEY_POS 0xE8 PROGRAM MDIKEY_PROG 0xE9 OFFSET/SETTING MDIKEY_OFFSET 0xEA SYSTEM MDIKEY_SYSTEM 0xEB MESSAGE MDIKEY_MESSAGE 0xEC GRAPH MDIKEY_GRAPH 0xED CUSTOM MDIKEY_CUSTOM 0xEE CUSTOM2 MDIKEY_CUSTOM2 0xEF

[Description] This function reads the status of the function keys on the MDI panel, and is used by the user application program to switch screens according to the status of the function keys. If function key is depressed, corresponding keycode is read and returned. When reading the status of the function keys, set "CRT_SWT_MFKY" bit of the crt_setswt() function to "1". This disables the ordinary screen switching caused by the function keys. User application program reads the status of the function keys by means of this function and switch the screens by using crt_cncscrn() function. [Example] Following is a sample program which, when a function key is pressed, switches the screen to the corresponding CNC screen.(Execute as auxiliary task)

#include #include void main( void ) { unsigned int idx, fkey, newscrn, curscrn, savescrn[8] ;

for ( idx = 0 ; idx < 8 ; idx++) savescrn[idx] = idx ; /* initialize savescrn[8] */

for (;;) { os_wait_tim( 5 ) ; /* run every 40msec */ curscrn = crt_getcurscrn() ; /* get current screen index */ /* number */ savescrn[curscrn % 0x100] = curscrn ; /* save index including small classification */ if ( fkey = crt_readfkey() ) { /* if function key is pressed */ /* restore previous small classification number */ newscrn = savescrn[fkey - MDIKEY_POS] ; if ( newscrn != curscrn ) { crt_cncscrn( newscrn ) ; crt_setswt( CRT_SWT_MFKY ) ; } } } } ------1.15 Display the secondary cursor.

------

[Name] crt_2ndcursor

[Syntax] #include int crt_2ndcursor( unsigned int attrib, unsigned int start, unsigned int end, unsigned int position, unsigned int width ) ;

[Arguments] attrib cursor attribute start cursor start raster end cursor end raster position cursor position width cursor width

[Return] Returns zero if successful and returns "-1" if any error( invalid argument).

[Description] The crt_2ndcursor() sets cursor display ON/OFF or other attributes for the 2nd cursor. The 2nd cursor is a cursor which can freely be controlled by the user application program independent of the usual character cursor. The 2nd cursor is set to OFF(non display) state, after the screen is initialized by crt_swtmode() function or "ESC [2J". Other than these two methods, crt_2ndcursor() is the only means to control ON/OFF of the 2nd cursor. Specify following values for each arguments in binary form. attrib Specify one of the following. CUR2_ON non-blink CUR2_OFF no cursor display CUR2_FBLINK fast blink CUR2_SBLINK slow blink start Specify cursor start raster. end Specify cursor end raster. Cursor start raster and cursor end raster specifies the top and bottom raster position of the cursor respectively. This defines the shape of the cursor,box or underline. position Specify cursor position. To display cursor on the Mth column of the Nth line, specify as (N-1)*(columns per line)+(M-1). (Both line number and column number starts from "1" which corresponds to the top line and the left-most column. Columns are the number of single column character.) width Specify width of the cursor in the unit of single column character width. Allowable maximum width is the number of columns per line. (80) Cursor cannot be displayed across the lines.

Allowable parameter range of each argument

argument ------+------+------start 0 - 15 end 0 - 15 (must satisfy end>=start) position 0 - 2399 width 1 - 80

[Example] Following program modifies the specified lines to be underlined. #include void example( unsigned int line ) { if ( crt_gettype() & CRT_TYPE_80X25 ) crt_2ndcursor( CUR2_ON, 15, 15, (line-1)*80, 80 ) ; else crt_2ndcursor( CUR2_ON, 24, 24, (line-1)*40, 40 ) ; } ------1.16 Set attribute of characters on VRAM.

------

[Name] crt_settextattr

[Syntax] #include int crt_settextattr( unsigned int y1, unsigned int x1, unsigned int y2, unsigned int x2, unsigned int attr, unsigned int op ) ;

[Arguments] y1 Line number of the upper-left position of the attribute setting region. x1 Column number of the upper-left position of the attribte setting region. y2 Line number of the lower-right position of the attribute setting region. x2 Column number of the lower-right position of the attribute setting region. attr Set attribute value. op Logical operation specification.

[Return] Returns zero if successful. If any error (incorrect coordinate spec or incorrect logical operation spec), returns non-zero value.

[Description] Sets the specified attributes to the characters displayed on the screen. This function doesn't change the already displayed character code but changes only its attributes. Specify line and column number of the upper-left and the lower-right position in "y1", "x1" and "y2", "x2". (The upper-left position of the screen is (1st-column, 1st-line).) +------+ |(1,1) Whole screen| | | | +------+ | | |(y1,x1) | | | | | | | | | | | | (y2,x2)| | | +------+ | | Attribute setting region | | | | (ymax,xmax)| +------+ ymax=30, xmax=80

This function changes the attributes of all characters included in the rectangle region specified by y1,x1,y2,x2.

Specify the bit pattern of newly set attributes in "attr" as follows.

15 8 7 0 +------+------+ | 0 0 0 Ib Bb Gb Rb I | B G R r b 0 0 0 | +------+------+ B: Blue r: Reverse G: Green b: Blink R: Red I: Low intensity Bb:Background Blue Gb:Background Green Rb:Background Red Ib:Background Low intensity

The available setting values are as follows. Normal Reverse Blink Reverse+Blink Black 0x0000 0x0010 0x0008 0x0018 Red 0x0020 0x0030 0x0028 0x0038 Green 0x0040 0x0050 0x0048 0x0058 Yellow 0x0060 0x0070 0x0068 0x0078 Blue 0x0080 0x0090 0x0088 0x0098 Magenta 0x00a0 0x00b0 0x00a8 0x00b8 Cyan 0x00c0 0x00d0 0x00c8 0x00d8 White 0x00e0 0x00f0 0x00e8 0x00f8 Actually, 4-bits of "IRGB" and "IbRbGbBb" indicate the palette index number of character and background. Specify the logical operation method of attribute setting in "op".

op Operation Set attributes ------+------+------3 Set attr 2 Set negative ~attr 0 Or Char_attr | attr 1 And Char_attr & attr 4 Xor Char_attr ^ attr [Example] The following program make the top line of the screen "REVERSE" for a moment.

#include void example( void ) { crt_settextattr( 1, 1, 1, 80, 0x0010, 0 ) ; crt_settextattr( 1, 1, 1, 80, ~0x0010, 1 ) ; } ------1.17 Get attribute of character on VRAM.

------

[Name] crt_gettextattr

[Syntax] #include unsigned int crt_gettextattr( unsigned int y, unsigned int x ) ;

[Arguments] y Line position of the character to be got the attribute. x Column position of the character to be got the attribute.

[Return] Returns the attribute of the character at the specified position. If incorrect position specification, returns -1.

[Description] Gets the attribute of the character at the specified position. Specify line and column position of the character to be got the attribute in "y" and "x". (The top-left position of the screen is (1st-column, 1st-line).) The read attribute is returned as the return code of this function. The attribute bits are same as the specification of "crt_settextattr" fucntion. Refer the description of "crt_settextattr" functioin.

[Example] The following program reads the attribute of the character at (3rd-line, 30th-column) of the screen. #include #include void example( void ) { unsigned int attr ; attr = crt_gettextattr( 3, 30 ) ; printf( "attribute is 0x%04X\n", attr ) ; } ------1.18 Set color palette of VGA characters.

------

[Name] crt_setpalette

[Syntax] #include #include int crt_setpalette( unsigned int index, unsigned long color ) ;

[Arguments] index Index of color palette. (0..15,_PAL_COMP,_PAL_RVS) color Color value.

[Return] Returns zero if successful. If any error (incorrect color palette index or not a VGA display device), returns non-zero value.

[Description] Sets the color value to the color palette for character. Specify the color palette index number (0..15) in "index" and the color value in "color". The format of the color value specified in "color" is same as the color value used in a graphic function "_remappalette". (The symbols of the color value defined in the header file "graph.h" such as _98GREEN are available for "color"'s specification.) 32 0 +------+------+------+------+ |00000000|00BBBBBB|00GGGGGG|00RRRRRR| +------+------+------+------+ R Red data (Lower byte) G Green data (2nd byte) B Blue data (3rd byte) Each data mean the intensity of each color in range 0x00 - 0x3F. The larger value means more intensity color. The color values of each palettes are initialized at the application start-up as follows. (System initial values) Palette ESC sequence index Color value Displayed color Char Back ------+------+------+------0 0x00000000 Black 30 40 1 0x0000003F Red 31 41 2 0x00003F00 Green 32 42 3 0x00003F3F Yellow 33 43 4 0x003F0000 Blue 34 44 5 0x003F003F Magenta 35 45 6 0x003F3F00 Cyan 36 46 7 0x003F3F3F White 37 47 8 0x00181818 Gray 1;30 3;40 9 0x000C0C1C Dark Red 1;31 3;41 10 0x000C1C0C Dark Green 1;32 3;42 11 0x000C1C1C Dark Yellow 1;33 3;43 12 0x001C0C0C Dark Blue 1;34 3;44 13 0x001C0C1C Dark Magenta 1;35 3;45 14 0x001C1C0C Dark Cyan 1;36 3;46 15 0x00282828 Dark White 1;37 3;47

While "Without brightness conversion" (CRT_MODE_MONO) is specified by "crt_setmode" function, the palette index 0 is initialized as 0x00000000 and all of the other palettes as 0x003F3F3F. In the above table, for example, output "ESC [43;1;31m" to print dark red characters on the yellow background.

Once "low intensity (dark)" mode is set by "ESC [1m" or "ESC [3m", all of the following color specifications are assumed to be low intensity. For example, printf( "\033[1;31mDARK RED\n" ) ; // Dark Red. printf( "\033[34mDARK BLUE\n" ) ; // Blue. printf( "\033[22;34mBLUE\n" ) ; // Cancel low intensity, // Blue. this displays DARK RED <-- Dark Red. DARK BLUE <-- Dark Blue. BLUE <-- Blue. To dispay normal intensity color after once low intensity mode was specified, cancel low intensity mode positively. (similarly about background color.) For LCD device, the lower 2 bits of each color are masked. That is, 0x00,0x04,0x08,..,0x3C are valid setting value for each color. Even if the application program specifies "1" at the lower 2 bits, the VGA firmware masks them. (In this case, max.4,096 colors are representable.)

The color values set by the C application program are effective to only the C user screen. The other screens such as the CNC's screen are not affected by this setting. Similarly, the color setting in the other screens are not effective to the C user screen. The color palettes used for graphics are different from the palettes for characters, they are not affected by this function's setting. Use "remappalette" or "_remapallpalette" function to set the color palettes for graphics. It is possible to set the priority of the palette of characters and graphics by specifying "_PAL_COMP" in "index". In this case, specify the palette priority in "color".

color Palette priority ------+------CRT_PAL_COMP Composite (default) CRT_PAL_CHAR Character over graphics CRT_PAL_GRPH Graphics over character

"Composite" means that the intensity of each color of character and one of graphic pixel are mixed. (logical OR). For example, in case that

Character color R/G/B = 0x30/0x00/0x20 Graphic color R/G/B = 0x00/0x20/0x38

Composite color R/G/B = 0x30/0x20/0x38 is output on the screen. The displayed colors on the screen are for each setting as follows.

Character Graphics palette index palette index Dot color ------+------+------+------Composite 0 0 Composite color Not 0 0 Composite color 0 Not 0 Composite color Not 0 Not 0 Composite color ------+------+------+------Character 0 0 Graphic color over Graphics Not 0 0 Character color 0 Not 0 Graphic color Not 0 Not 0 Character color ------+------+------+------Graphics 0 0 Character color over Character Not 0 0 Character color 0 Not 0 Graphic color Not 0 Not 0 Graphic color This table indicates that the palette index 0 is the special part for overlapping the character and the graphics. Allocate "Black" to the palette 0 as same as initial value so far as there are no exceptional reasons. It is possible to specify "Normal" or "Reverse" display for the monochrome LCD by specifying "_PAL_RVS" in "index". In this case, specify "Normal"/"Reverse" in "color". color Setting Display(Standard) ------+------+------CRT_PAL_RVS Reverse (default) Black char on white. CRT_PAL_NML Normal White char on black. This setting is effective to only monochrome LCD. It is impossible to change the display condition of CRT or color LCD. This setting is effective to only the C user screen. The other screens (such as the CNC's screens) are not affected by this setting. ------1.19 Set all color palette of VGA characters.

------

[Name] crt_setallpalette

[Syntax] #include #include int crt_setallpalette( unsigned long *colors ) ;

[Arguments] colors Pointer to the color value array.

[Return] Returns zero if successful. If any error (not a VGA display device), returns non-zero value.

[Description] Sets the color values to the all color palette for character.

Store 16 color values in "color". The format of the color value is same as data used in "crt_setpalette" function. This function stores 16 color values to the all 16 color palettes, and set the palette priority as "Composite". This function doesn't affect the color palettes of the other screen and the color palettes of graphics. All palette are set as the system initial values by specifying NULL in "color". The system initial values is listed in the description of "crt_setpalette" function. ------1.20 Get color palette of CNC screen.

------

[Name] crt_getcncpalette

[Syntax] #include int crt_getcncpalette( unsigned long *cnccol ) ;

[Arguments] cnccol Color palette table of CNC screen. (32 elements)

[Return] Returns zero if successful. If any error (one of following cases), returns non-zero value. - Not VGA display device.

[Description] Gets the color palette setting values of the CNC screen.

This function is used to display the user's screen with the same color as the CNC's screen or to get the colors of the base CNC screen by the window task. The color palette values of the CNC screen are stored in "cnccol" as follows cnccol[0] - cnccol[15] Color palette No.0 through 15 for character. cnccol[16] - cnccol[31] Color palette No.0 through 15 for graphics. The format of color value is same as "crt_setpalette" function. The color value got by this function is used in "crt_setallpalette" and "_remapallpalette" function as it is, like this; crt_setallpalette( &cnccol[0] ) ; _remapallpalette( &cnccol[16] ) ; Color palette of the CNC screen both for character and for graphics is set as follows.

Palette index Color ------+------0 Black 1 Red 2 Green 3 Yellow 4 Blue 5 Magenta 6 Cyan 7 White 8 Dark Gray 9 Dark Green 10 Dark Blue 11 Dark Magenta 12 Light Gray 13 Black 14 Dark Cyan 15 Light Gray

Take care of palette index handling when VGA window screen is overlapped on any CNC screen by the window task.

[Example] The following program sets all color palettes as same as the CNC's screen. #include #include void example( void ) { unsigned long cnccol[32] ; if ( !crt_getcncpalette( cnccol ) ) { crt_setallpalette( &cnccol[0] ) ; _remapallpalette( &cnccol[16] ) ; } } ------1.21 Output character string by FANUC character code.

------

[Name] crt_fstr

[Syntax] #include int crt_fstr( unsigned int *code, unsigned int len ) ;

[Arguments] code Array of FANUC character code ( 0x0000 - 0xffff ). len Length of the character string.

[Return] Returns always zero.

[Description] Outputs a character string that is included in FANUC character set and is specified by FANUC character code on the current cursor position. Store "len" of FANUC code (16-bit) for each half-size character in an array "code". Store the character string length in "len". The behavior of this function is equivalent to the following program. (This function is faster to display.) unsigned int i ; for ( i = 0 ; i < len ; i++ ) crt_fchar( code[i] ) ;

[Example] The following program displays an icon of a tester on the current cursor position. #include void example( void ) { static unsigned int tester[] = { 0x1E64, 0x1E65, 0x1E66, 0x1E67 } ;

crt_fstr( tester, sizeof( tester )/sizeof( unsigned int ) ) ; } ------1.22 Get text data from VRAM.

------

[Name] crt_gettextimg

[Syntax] #include int crt_gettextimg( unsigned int y1, unsigned int len x1, unsigned int y2, unsigned int len x2, unsigned long *buf ) ;

[Arguments] y1 Left,upper position of the area from where characters are got. x1 Left,lower position of the area from where characters are got. y2 Right,lower position of the area from where characters are got. x2 Right,upper position of the area from where characters are got. buf Area that characters data are stored.

[Return] Returns zero when terminated normally, not zero when error, i.e. specified coordinates is not correct, is occurred. [Description] Gets character codes, displayed on the screen, with their attribute.

This function is used with the function "crt_puttextimg" to backup or restore the text image on the screen.

y1,x1 is top,left, y2,x2 is bottom,right position of the area from where characters are got as follows. (The top of left side shows raw-1, and column-1.)

+------+ |(1,1) Full screen | | | | +------+ | | |(y1,x1) | | | | | | | | | | | | | | | | (y2,x2)| | | +------+ | | Area for getting character | | | | | | (ymax,xmax)| +------+ ymax=30, xmax=80

All character codes and their attributes, included the rectangular area that is enclosed by (y1,x1)-(y2,x2),can be got. (The characters which are enclosed in above area)*4 bytes area must be reserved as "BUF". The data form, stored in "BUF", is as follows. Upper word Lower word +------+------+ | Attribute | Character code | +------+------+ The character code is FANUC character code, and the type of the attribute is explained the same as that of "crt_settextattr". The position on the memory is corresponding to the position on the screen as follows. Position on the memory Position on the screen ------+------buf+0 y1 , x1 (Top,left) buf+1 y1 , x1+1 : : buf+(x2-x1) y1 , x2 buf+(x2-x1)+1 y1+1 , x1 : : buf+(x2-x1+1)*(y2-y1+1)-1 y2 , x2 (Bottom,right) [Example] The following program backs up and restores the displayed characters of upper 3 rows on the 14 inch screen.

#include #include void example( void ) { unsigned long *buf ;

/* allocate (3-line)*(80-column)*(4-byte) buffer */ buf = (unsigned long *)malloc( 3*80*4 ) ; /* get text image */ crt_gettextimg( 1, 1, 3, 80, buf ) ; ...... (another process) /* restore text image */ crt_puttextimg( 1, 1, 3, 80, buf, 0 ) ; /* free buffer */ free( buf ) ; } ------1.23 Put text data into VRAM.

------

[Name] crt_puttextimg

[Syntax] #include int crt_puttextimg( unsigned int y1, unsigned int len x1, unsigned int y2, unsigned int len x2, unsigned long *buf, unsigned int op ) ;

[Arguments] y1 Left,upper position of the area where characters are put. x1 Left,lower position of the area where characters are put. y2 Right,lower position of the area where characters are put. x2 Right,upper position of the area where characters are put. buf Area that characters data are stored. op The way to put characters or attributes into VRAM.

[Return] Returns zero when terminated normally, not zero when error, i.e. specified coordinates is not correct, is occurred.

[Description] Puts character codes on the screen, with their attribute. This function is used with the function "crt_gettextimg" to back up or restore the text image on the screen. y1,x1 is top,left, y2,x2 is bottom,right position of the area into where characters are put. (The top of left side shows raw-1, and column-1.) This position specification is same as "crt_gettextimg" function. Character codes and their attributes are read out from "buf" where is regarded that the data, got by "crt_gettextimg" function, exist. The data, got by "crt_gettextimg" function, is put on the screen usually but it is also possible to put originally prepared data if they have the same type as the data, got by "crt_gettextimg" function. It is possible to put the data, got by "crt_gettextimg" function, into the different area from where they are got, if the size of the rectangular area is the same. Put data is selected from character codes or attributes or both of them by "op" as follows.

op Put Data ------+------0 Character codes and attributes 1 Character codes 2 Attributes [Example] The following program makes the characters and attributes that are displayed on the specified area to move to right by 3 digit.

#include #include #include void example( unsigned int y1, unsigned int x1, unsigned int y2, unsigned int x2 ) { unsigned long *buf ; unsigned int i ;

buf = (unsigned long *)malloc( (y2-y1+1)*(x2-x1+1)*4 ) ; crt_gettextimg( y1, x1, y2, x2, buf ) ; crt_puttextimg( y1, x1+3, y2, x2+3, buf, 0 ) ; free( buf ) ; /* erase disused characters */ for ( i = y1 ; i <= y2 ; i++ ) printf( "\033[%u;%uH ", i, x1 ) ; } ------1.24 Select graphic page to use.

------

[Name] crt_setgraphpage

[Syntax] #include int crt_setgraphpage( int page ) ;

[Arguments] page Graphic page number to use. (0, 1 or -1)

[Return] Returns zero if successful. If any error (i.e. invalid page number was specified), returns non-zero value.

[Description] Select graphic page to use for graphic drawing.

The graphic system of FS30i has two pages for graphic drawing. "_setactivepage" and "_setvisualpage" functions select graphic page for drawing and displaying. "_setvideomode" function initializes both two pages. This function selects the page that is initialized by "_setvideomode" function. Specify one of 0, 1 and -1 in "page". Each value means as follows. page behavior of "_setvideomode" function ------+------0 initializes only page #0, sets display/draw page=#0 1 initializes only page #1, sets display/draw page=#1 -1 initializes both page #0 and #1 (default), sets display/draw page=#0 When "_setvideomode" function initializes one of page #0 and #1, the contents of the other page are kept. This function affects only behavior of "_setvideomode" function which is called after calling of this function. Even if any value is specified by this function, you can specify an arbitrary page number in "_setactivepage" and "_setvisualpage" function. By calling this function with "page=1", both drawing and displaying pages are set as #1 after calling "_setvideomode" function. With "page=0" or "page=-1", both drawing and displaying page are #0. [Example] The following program draws graphics using only graphic page #1.

#include #include void example( void ) { if ( crt_opengr() == 1 ) { crt_setgraphpage( 1 ) ; _setvideomode( _VRES16COLOR ) ; }

<< Calling graphic function >>

crt_closegr() ; } ------1.25 Select drawing method of 6x sized character.

------

[Name] crt_set6chmode

[Syntax] #include int crt_set6chmode( int mode ) ;

[Arguments] mode Drawing method of 6x sized character. 0: High speed mode 1: Complete mode

[Return] 0 Successful. 1 Invalid value (other than 0 and 1) is specified. 2 Ineffective in the current display mode. [Description] Selects drawing method of 6x sized character.

This function selects the drawing method of 6x sized character that is displayed over "CNC screen display function" application program on PC side of FS300i. Specify one of the followings.

mode = 0 High speed mode (default). This is effective for displaying the frequently updated information such as the current position of NC using 6x sized character. The character is updated without flicker.

mode = 1 Complete mode. Each elements of 6x sized character are individually drawn.

Normally "High speed mode" of the default setting is used. Use "Complete mode" in case of following. * The text window displayed by "win_***" functions overlaps 6x sized characters drawn over the base screen. In this case, any elements of 6x sized character which adjoins the window border may not be drawn correctly. To avoid this, select "Complete mode" by this function.

This setting is not effective for NC side screen. 6x sized character is always drawn by "Complete mode" on NC side screen. Setting by this function is effective to all 6x sized character drawing until terminating the current "CNC screen display function" session. Setting by this function is effective to drawing method of 6x sized character on the text screen by "printf" function etc., not effective to 6x sized character drawing by graphic functions.

[Remarks] This function is available only with the CNC screen display function at the PC side on the FS300i system. ------1.26 Select saving method of graphic contents.

------

[Name] crt_setgsvmode

[Syntax] #include int crt_setgsvmode( unsigned int flag ) ;

[Arguments] flag CRT_GSV_SAVE0 Save contents of page #0. CRT_GSV_SAVE1 Save contents of page #1. CRT_GSV_SAVE01 Save contents of page #0 and #1. CRT_GSV_NOSAVE Not save any contents.

[Return] 0 Successful. 1 Invalid value of "flag". 2 Insufficient memory for graphic contents.

[Description] Selects whether graphic contents are saved or not. Graphic contents drawn by the application program on C-EXE screen will be cleared if the NC software draws any graphics after switching to NC screen. This is due to that the graphic buffer is shared by all soft- wares on the NC equipment. The application program must draw the graphics again after switching the screen. If you select "Save graphic contents" by this function, the graphic contents will be saved and restored every time the screen is switched between NC and C-EXE.

The screen switching procedure executes the following process under selected "Save graphic contents" by this function. * C-EXE -> NC (1) Save contents of text screen. (2) Save contents of graphic page into memory if "crt_opengr()" function has been executed. (3) Save graphic environment.

* NC -> C-EXE (1) Restore contents of text screen. (2) Execute equivalent process to "crt_opengr()". (3) Execute equivalent process to "_setvideomode()". (4) Restore graphic environment. (5) Restore saved contents of graphic page. After this process, the application program can continue to draw any graphics without reconfigure graphic environment. The following memory is required to save contents of graphic page.

16-color mode Approx. 150KB per page. 256-color mode Approx. 300KB per page.

Required memory is allocated when "Save graphic contents" is specified by this function. Memory area is provided from free memory region of DRAM memory allocated for C Executor. Therefore, you must include this graphic data area for calculating DRAM size of C Executor.

After changing graphic drawing mode (16/256-color), this function's setting is ineffective ("Not save graphic contents" is forcibly selected).

Screen switching with saving/restoring graphic data takes more time than ordinary case. Saving/restoring graphic data of one page takes approx. 0.5 ... 1 second

Only graphic contents drawn in the base screen are saved. Graphic contents drawn in the VGA window are not saved.

Saving/restoring graphic contents is not available for FS300i (both "CNC equipment with PC function type" and "Connected via HSSB/ Ethernet type"). 2. Multiple window display library

------2.1 Open window.

------

[Name] win_open

[Syntax] #include whandle win_open( winfo *spec, char *title, int flag ) ;

typedef int whandle ; /* window handle */ typedef struct _winfo { unsigned int posl ; /* window line position */ unsigned int posc ; /* window column position */ unsigned int sizev ; /* window vertical size */ unsigned int sizeh ; /* window horizontal size */ } winfo ;

[Arguments] spec window geometry(position& size) structure title window title string flag window attribute

[Return] Returns window handle if successful. When failed, returns "-1" and sets following error code to the global variable "errno". EW_SPEC Invalid window position or size is specified. EW_MAX Attempted to open a window beyond the limit of maximum number of windows(MAX-WIN).

[Description] Creates new window on the screen. A window of the specified size is created and placed on the screen at the specified position. Values set for each member of the structure "spec" are as follows..

posl line number of the upper left corner of the window ( >=2) (top line of the screen being "1") posc column number of the upper left corner of the window ( >=2) (left-most column of the screen being "1") sizev number of lines of the window ( >=1) sizeh number of columns of the window( >=1) (=number of single byte characters per window)

+------+ | Full screen |<- Line 1 | | | +------+ | | |#<-(posl,posc) ^ window| | | | | | | | | | | | | | | | | | | | sizev | | | | | | | | |<------+------>| | | | sizeh | | | | | | | | | | | | | | | v | | | +------+ | | ^ | | Window frame | | |<- Line N +------+ ^ ^ Column 1 Column M N=30,M=80 Specify window title string by the argument "title". The length of the window title string should be less than 32 single byte characters. (single byte alpha-numeric and Katakana characters, symbols and double byte alpha-numeric, Hirakana, Kanji characters and symbols can be used.) Specify one of the following window attributes by the argument "flag". ( "0" is equivalent to WIN_F_FULL.)

WIN_F_FULL Full screen window WIN_F_FRM0 Frame line style: Normal (Thin line) WIN_F_FRM1 Frame line style: Bold WIN_F_FRM2 Frame line style: White space (When using this mode, specify reverse attribute for frame color by win_col() function.) WIN_F_FRM3 Frame line style: User defined line (define line style by win_setfrm() function) WIN_F_NOFRM Frame-less window: Window size of the frame-less window can be expanded to full screen size, without specifying WIN_F_FUL attribute. A new window is placed over existing windows and both screen output and key input are bound to this window (active window).

When new window is opened, cursor is placed on the upper-left corner (home position) of the window and cursor display attribute is set to non-display state.

While more than one windows are open, access to the screen areas other than window areas is disabled. Generally, full screen should be cleared before opening the first window, or the first window should be full-screen window. When opening windows over the usual screen display, display the base usual screen in the full-screen window. Calling this function at the start of the application program as shown in the following example will do this.

winfo mainwin ; whandle win_main ; mainwin.posl = 2 ; mainwin.posc = 2 ; mainwin.sizev = 23 ; mainwin.sizeh = 78 ; win_main = win_open( &mainwin, "Main Window", WIN_F_FULL ) ; ------2.2 Close window.

------

[Name] win_close

[Syntax] #include int win_close( void ) ;

[Arguments] ------

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_CLOS E no open window

[Description] Close active window. When the last window is closed, screen display returns to the default screen state where no windows are open. Otherwise, the window underneath the closed window become active and whole screen is redrawn. ------2.3 Select window.

------

[Name] win_select

[Syntax] #include int win_select( whandle handle ) ;

[Arguments] handle window handle of the window to be selected

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_NOTOPEN specified window not exist

[Description] Select one of the open windows on the screen for display window. After this function is called and a window is selected, all succeeding screen output is drawn on the selected window. This function does not change the overlapping order of the window. When window is selected by this function, former cursor position of that window is restored. ------2.4 Activate window.

------

[Name] win_activate

[Syntax] #include int win_activate( whandle handle ) ;

[Arguments] handle window handle for the window to be activated

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_NOTOPEN specified window not exist

[Description] Select one of the open windows on the screen for keyboard input. After this function is called, succeeding input from MDI keyboard is valid only while the window is selected for display by win_select(). The window selected by this function is also selected as display window. This function changes the overlapping order of the windows so that the selected window comes on top of other windows. Whole screen is redrawn by this function call. ------2.5 Move window.

------

[Name] win_move

[Syntax] #include int win_move( int dy, int dx ) ;

[Arguments] dy vertical displacement dx horizontal displacement

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_DISP invalid displacement specified

[Description] Move active window . Whole screen is redrawn after the window is moved. Overlapping order does not change. Displacement value which would cause whole or a part of the window to be off the screen cannot be specified. ------2.6 Alter window size.

------

[Name] win_size

[Syntax] #include int win_size( int dy, int dx ) ;

[Arguments] dy vertical expansion/reduction value dx horizontal expansion/reduction value

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno". EW_DISP invalid size value specified

[Description] Change active window size. Window size expansion or reduction takes place so that the bottom or the right side border is moved by the specified value relative to the upper-left corner of the window. The size expansion value which would cause a part of the window to be off the screen cannot be specified. Also the size reduction value which would shrink the window less than the size of 1 line/1 column cannot be specified. After the window size is expanded or reduced, whole screen is redrawn. Win_size() does not change overlapping order of the windows. ------2.7 Let active window be full screen size.

------

[Name] win_full

[Syntax] #include int win_full( void ) ;

[Arguments] ------

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_CHANGE specified window is already in full screen window mode

[Description] Let the size of the active window be full screen size. Full screen window is placed underneath all other open windows. ------2.8 Let active window be window size.

------

[Name] win_window

[Syntax] #include int win_window( void ) ;

[Arguments] ------

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_CHANGE specified window is not a full screen window

[Description] Active full screen window is shrunk to be a normal window. Size and position of the shrunk window is that of original window before being expanded to be full size window. Win_windows() redraws whole screen. ------2.9 Get window information.

------

[Name] win_info

[Syntax] #include int win_info( whandle handle, winfo *spec ) ;

[Arguments] handle window handle of the target window spec pointer to the window geometry(size&position) structure

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_NOTOPEN specified window not exist

[Description] Get the position and size of the specified window. Position and size is set to the corresponding member of the structure "spec". ------2.10 Set color of window frame and title string.

------

[Name] win_col

[Syntax] #include void win_col( int colf, int colt, int colh, int colfa, int colta, int colha ) ;

[Arguments] colf window frame color colt window title color colh window handle color colfa active window frame color colta active window title color colfa active window handle color

[Return] ------[Description] Set color for window frame and window title string.

Specify colors and attribute for each argument as follows.

15 8 7 0 +------+------+ | 0 0 0 Ib Bb Gb Rb I | B G R r b 0 0 0 | +------+------+ B: Blue r: Reverse video G: Green b: Blink R: Red I: Low intensity Bb:Background Blue Gb:Background Green Rb:Background Red Ib:Background Low intensity

Valid color value is as follows.

normal reverse blink reverse+blink Black 0x0000 0x0010 0x0008 0x0018 Red 0x0020 0x0030 0x0028 0x0038 Green 0x0040 0x0050 0x0048 0x0058 Yellow 0x0060 0x0070 0x0068 0x0078 Blue 0x0080 0x0090 0x0088 0x0098 Magenta 0x00a0 0x00b0 0x00a8 0x00b8 Cyan 0x00c0 0x00d0 0x00c8 0x00d8 White 0x00e0 0x00f0 0x00e8 0x00f8 Actually, 4-bits of "IRGB" and "IbRbGbBb" indicate the palette index number of character and background. If "0x000" is specified for the window handle, it will not be displayed.

Colors and attributes set by this function are applied to the window frames, titles or window handles which are displayed after this function call. Colors or attributes of those already displayed when this function is called is not affected. To change them, redraw the window by calling functions to move, change size or hide/show the window. This function affects all windows. ------2.11 Hide window.

------

[Name] win_hide

[Syntax] #include int win_hide( whandle handle ) ;

[Arguments] handle window handle for the window to be hidden

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_NOTOPEN specified window not exist

[Description] Win_hide() hides specified window. Hidden window continues to be invisible until it is shown again by win_show() function. Overlapping order of other windows is not changed. Even while a window is hidden, data can be written in the window by selecting the window by win_select(). Calling this function redraws whole screen. ------2.12 Show window.

------

[Name] win_show

[Syntax] #include int win_show( whandle handle ) ;

[Arguments] handle window handle of the window to be hidden

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_NOTOPEN specified window not exist

[Description] Windows hidden by win_hide() function become visible by this function. Overlapping order of the windows is not changed. Calling this function redraws whole screen. ------2.13 Set window title string.

------

[Name] win_setttl

[Syntax] #include int win_setttl( whandle handle, char *title ) ;

[Arguments] handle window handle of the window whose title string is to be changed title window title string

[Return] Returns zero if successful. When failed, returns "-1" and sets following error code to the global variable "errno".

EW_NOTOPEN specified window not exist

[Description] Change title string for a window. The length of the window title string should be less than 32 single byte characters. (single byte alpha-numeric and Katakana characters, symbols and double byte alpha-numeric, Hirakana, Kanji characters and symbols can be used.) Calling this function redraws whole screen. ------2.14 Set window frame line character.

------

[Name] win_setfrm

[Syntax] #include void win_setfrm( unsigned int *frame ) ;

[Arguments] frame character code array which defines window frame line style

[Return] ------

[Description] Set user defined line style for window frame. Set the FANUC character code for each window frame line to the argument "frame" in the following order(horiz.-0, horiz.-1, vert.-2, vert.-3, upper-left corner-4...... ). [4]-----[0]-----[6] | | | | [2] [3] | | | | [5]-----[1]-----[7] For example, following character cord array is to be specified to set usual frame line. unsigned char waku[] = { 0x01ED,0x01ED,0x01EE,0x01EE, 0x01EC,0x01EA,0x01E6,0x01E8 } ; Window frame lines set by this function are applied to the windows which are opened with WIN_F_FRM3 attribute after this function call. Frame lines of those windows already opened with WIN_F_FRM3 attribute are changed to the specified style when they are redrawn.

The line style set by this function is applied to all windows with WIN_F_FRM3 attribute. ------2.15 Get window display status.

------

[Name] win_getstat

[Syntax] #include void win_getstat( struct winstat *stat ) ;

struct winstat { whandle selected ; /* Window handle of the currently selected window*/ whandle active ; /* Window handle of the currently active window. */ unsigned int numwin ; /* Number of opened window. */ unsigned int winstack[MAX_WIN] ; /* Stacking order of opened windows. */ } ;

[Arguments] stat Windows status information.

[Return] ------

[Description] Gets the current window display status. The window handle the currently selected window and the currently active window are stored in each "stat.selected" and "stat.active". The number of the currently opend windows is stored in "stat.numwin". The number in "stat.numwin" includes the windows hidden by "win_hide" function. The stacking order of the all opened windows is stored in "stat.winstack". The handles of all of the opened windows are stored like this, the window handle of the top window is stored in "winstack[0]", the next in "winstack[1]". For example, three windows are opened now as below. This function returns the following result.

+[1]------+ |Selected | +[2]---| | | | | | | +[3]------+ | | |Active | | +------| | | | | | | | +------| | +------+

stat.selected = 1 stat.active = 3 stat.numwin = 3 stat.winstack[0] = 3 stat.winstack[1] = 1 stat.winstack[2] = 2 (stat.winstack[3] and later are undefined.) When "stat.numwin" = 0, that is, no window is opend, the contents of "selected", "active" and "winstack" are undefined.

[Example] The following program tests if the currently active window is selected or not, then, if not, selects it. #include void example( void ) { struct winstat stat ; win_getstat( &stat ) ; if ( ( numwin != 0 ) && ( stat.selected != stat.active ) ) win_select( stat.active ) ; } ------2.16 Redraw windows.

------

[Name] win_redraw

[Syntax] #include void win_redraw( void ) ;

[Arguments] ------

[Return] ------

[Description] Redraws all opening windows. This function just redraw the opening and displayed window keeping the current window status (open/close, displayed/hidden, overlapping order of windows). This function does nothing when no window is opened. When the screen has been switched from/to NC side and PC side on "CNC screen display function", use function to redraw windows. 3. User defined character library

3-1. scope

User defined character is a character which is defined by machine tool builders. (usually referred to as extended character) C Executor allows the user application program to define and use extended characters. Up to 256 single byte characters can be defined and registered. Arbitrary character code in single byte character set dedicated for user defined characters or in standard JIS Kanji character set can be assigned to the registered extended character.

3-2. Character dot pattern

* Dot pattern size

single byte character 2-byte character

8 dots 16 dots |<------>| |<------>| +------+ - +------+ - | | ^ | | ^ | | | | | | | | | | | | | | | | | | | | |16 dots | | |16 dots | | | | | | | | | | | | | | | | | | | | v | | v +------+ - +------+ - 2-byte character is composed of two consecutive single byte character patterns. * Binary notation

Horizontally aligned 8 bits(dots) are represented by one byte data.

Single byte character 2-byte character

bit order-> #7 #0 #7 #0 #7 #0 +------+ +------+ | byte 1 | | byte 1 | byte 17 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | v | | v | v | | byte 16 | | byte 16 | byte 32 | +------+ +------+

* Example

- Single byte character 'A'

pattern ...... ###... .#...#.. #.....#. #.....#. #.....#. #######. #.....#. #.....#. #.....#...... Binary 0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82, notation 0xFE,0x82,0x82,0x82,0x00,0x00,0x00,0x00 - 2-byte character ("KAN" of Japanese KANJI character)

pattern ...... #...#.... .##..#########.. ...#...#...#...... #######... .##...#..#..#...... #..#######...... #...... #..#######...... #.....#...... #.#########.. ..#.....#.#...... #....#...#.... .##..##.....##......

Binary 0x00,0x01,0x67,0x11,0x03,0x62,0x13,0x00, notation 0x13,0x10,0x17,0x20,0x21,0x66,0x00,0x00, 0x00,0x10,0xFC,0x10,0xF8,0x48,0xF8,0x40, 0xF8,0x40,0xFC,0xA0,0x10,0x0C,0x00,0x00 3-3. Character code

(1) FANUC code

Character codes from 0x4100 to 0x41FF in FANUC code set are reserved for user defined characters and automatically assigned to the user defined character in the order of its registration. In case of 2-byte characters, two consecutive codes are assigned to a 2-byte character, one for left half of the dot pattern and the other for the right half, where the latter code being the former plus one. The registered user defined characters can be accessed and displayed on the screen by using FANUC code.

(2) JIS code

Also, JIS code can be assigned to the registered user defined characters. Available codes are, from 0x20 to 0xDF for single byte characters and from 0x8140 to 0xEFDF shift JIS codes for 2-byte characters.

The above single byte character codes are those in single byte user defined character mode that can be selected by the sequence "ESC (8" .

In case of 2-byte characters, one of the following two methods can be employed. (1) When registering the JIS Kanji characters ,which are not included in the FANUC Kanji character set, as user defined characters. Assuming that the character "TORA" ,not included in the FANUC Kanji character set, is to be displayed on the screen , make dot pattern for the character, register it as an user defined character, and assign the standard shift JIS code for the character "TORA" (0x8CD5) to it. Thus, printing "TORA" by using printf() function as usual will display the character "TORA" on the CNC screen. (2) When registering new characters. When registering new characters which are not included in the standard JIS Kanji character set, any shift JIS code can be assigned to the characters. However, considering future expansion of the FANUC Kanji character set, it is recommended to assign the codes greater than 0xEB9F which are not used in Standard JIS Kanji character set.

3-4. How to register user defined characters (1) Making dot pattern for a character Make dot pattern of the user defined character referring to the section 3.2.

(2) Binary notation of the user defined character After making dot patterns for all user defined characters, describe them in binary notation and store in an unsigned character string. (Example) unsigned char char_pattern[] = { 0x00, 0x03, .... } ; Whole character patterns for all user defined characters to be registered have to be stored in one unsigned character string. User defined characters cannot be registered separately. They can only be registered all characters at one time. Put this character string in the user application program.

(3) Procedures in user application program

Register the user defined characters by using crt_reguserchar() function. And assign JIS codes to the characters by using crt_mapuch() function if necessary. These procedures should be executed before any of the user defined characters are referred to in the user application program. Also, once these procedures are executed, registered character set will never be changed or modified by screen switching command or the like.

3-5. How to use user defined characters

(1) Specifying the character by the FANUC code

Registered user defined characters can be displayed by using crt_fchar() function. The character code given to this function as an argument is the code automatically assigned to the character in the order of its registration (0x4100,..).

(2) Specifying the character by JIS code If JIS code is assigned to the user defined character by using crt_mapuch() function, standard character output functions as putchar(), printf(),etc., can be used to display the character. In the case of single byte character, switch the code set to the single byte user character mode by the sequence "ESC (8" to specify the user character. (Example) printf( "\033(8ABC\033(4" ) ; Display user defined characters assigned to the code 0x41, 0x42 and 0x43. "ESC (4" is the sequence to select standard mode. In the case of 2-byte character, directly output the shift JIS code assigned to the user defined character. (Example) printf( "\x93\xC8\x96\xD8" ) ; (This is Japanese string "TOCHI-GI".) If the dot pattern of the character "TOCHI" is registered as an user defined character and the code 0x93C8, which is the shift JIS code for the standard JIS character "TOCHI",is assigned to the character, the character "TOCHI" can be output to the screen as if it were included in the FANUC Kanji character set.

printf( "\xEB\xA0" ) ; When the code greater than 0xEB9F (0xEBA0 in this case), which is vacant in shift JIS code area, is assigned, directly specify the code. Function reference ~~~~~~~~~~~~~~~~~~

------3.1 Register user character.

------

[Name] crt_reguserchar

[Syntax] #include int crt_reguserchar( unsigned int number, unsigned char *table ) ;

[Arguments] number the number of registered user defined characters in bytes ( 1-- 256) table pointer to the character pattern table

[Return] 0 normal completion 1 invalid number of user defined characters

[Description] Register the character pattern of the user defined character. After the execution of this function, user defined characters will become available for the user application program. Character pattern table must be statically allocated. Such kind of usage that storing the character pattern table in the memory area reserved by the malloc() function, specifying the table as an argument of this function, and after that releasing the memory area by free() function, is not allowed. The character pattern table should be defined as, for example, usual constant data array. This is because the character table is sometimes referred to again internally, when re-registration of the character pattern become necessary inside the library as a result of screen switching. ------3.2 Map user character.

------

[Name] crt_mapuch

[Syntax] #include int crt_mapuch( unsigned int code, unsigned int ucode ) ;

[Arguments] code code to be assigned 0x0020 through 0x00DF for single byte character 0x8140 through 0xEFFF for 2-byte character (limited to those allowed in shift JIS code) ucode FANUC code for the user defined character (0x4100 through 0x41FF)

[Return] 0 normal completion 1 illegal character code assigned

[Description] Assign single byte character code or JIS Kanji code for the user defined character. To put a character on the screen by using the assigned JIS code, select either "ESC (8" mode (single byte mode) or "ESC (B" mode ( 2 bytes mode). This function does not check the validity of the specified character code. Care should be taken not to specify wrong character codes. ------3.3 Get CG pattern.

------

[Name] crt_getcgpttn

[Syntax] #include int crt_getcgpttn( unsigned int code, unsigned char *buf ) ;

[Arguments] code the FANUC code for the character of which the character pattern is to be get buf buffer area where character pattern is stored ( 16 bytes )

[Return] 0 normal completion 1 reading the character pattern is not supported by this version of Hardware

[Description] Read the character pattern data stored in the character generator. This function does not check the validity of the specified character code. Care should be taken not to specify wrong character codes. 3-6. Sample application program

#define UCH_NUM 10 /* number of defined characters( single byte equivalent) */

/* Character pattern */ unsigned char pattern[ UCH_NUM * CHAR_SIZE_14 ] = { 0x00,0x3F,0x02,0x02,0x02,0x3F,0x22,0x22, /* 0x4100 */ 0x22,0x22,0x22,0x3F,0x02,0x02,0x02,0x7F, 0x00,0xFE,0x20,0x20,0x20,0xFE,0x22,0x22, /* 0x4101 */ 0x22,0x22,0x22,0xFE,0x20,0x20,0x20,0xFF, 0x00,0x01,0x3C,0x24,0x24,0x25,0x25,0x25, /* 0x4102 */ 0x25,0x25,0x25,0x25,0x3C,0x00,0x00,0x03, 0x00,0xFE,0x48,0x48,0x48,0xCE,0x02,0x02, /* 0x4103 */ 0x02,0x02,0x02,0xCE,0x48,0x48,0x48,0xFF, 0x10,0x10,0x10,0x7E,0x12,0x12,0x12,0x22, /* 0x4104 */ 0x22,0x24,0x24,0x14,0x08,0x14,0x22,0x41, 0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0xFF, /* 0x4105 */ 0x00,0x10,0x10,0xFE,0x10,0x10,0x10,0xFF, 0x00,0x3E,0x22,0x22,0x24,0x24,0x28,0x24, /* 0x4106 */ 0x22,0x22,0x22,0x22,0x3C,0x20,0x20,0x20, 0x00,0xFF,0x02,0x02,0x02,0xFA,0x8A,0x8A, /* 0x4107 */ 0x8A,0x8A,0x8A,0xFA,0x02,0x02,0x02,0x0E, 0x00,0x00,0x7F,0x00,0x1F,0x10,0x10,0x10, /* 0x4108 */ 0x1F,0x02,0x04,0x1C,0x64,0x04,0x07,0x1C, 0x80,0x80,0xFF,0x00,0xFC,0x04,0x04,0x04, /* 0x4109 */ 0xFC,0x80,0x44,0x48,0x30,0x10,0x8C,0x03, } ;

/* Registering the Character pattern */ crt_reguserchar( UCH_NUM, pattern ) ; /* Assigning character code */ crt_mapuch( 0xEBA0, 0x4100 ) ; /* 2-byte character */ crt_mapuch( 0xEBA1, 0x4102 ) ; /* 2-byte character */ crt_mapuch( 0xEBA2, 0x4104 ) ; /* 2-byte character */ crt_mapuch( 0x41, 0x4106 ) ; /* single byte character */ crt_mapuch( 0x42, 0x4107 ) ; /* single byte character */ crt_mapuch( 0x43, 0x4108 ) ; /* single byte character */ crt_mapuch( 0x44, 0x4109 ) ; /* single byte character */ /* display user defined character */ printf( "\xEB\xA0\xEB\xA1\xEB\xA2" ) ; /* 2-byte character */ printf( "\033(8ABCD\033(4" ) ; /* single byte character */ 4. VGA window display library

Outline of VGA window display ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

"VGA window" is an overlapping window provided by VGA display device. This VGA window has the following features.

* Overlapping on any arbitrary screen such as CNC, PMC and C-EXE screen.

* Both graphics and character overlapping.

* Simultaneous updating of the base screen and VGA window screen.

* Two independent windows.

* Arbitrary size window on arbitrary position. (with a little limitation)

* Coexistence with character windows (which displayed by "win_xxx()" functions). Character window is a part of the base screen for VGA window.

+------+ | Full screen | | | | +------+ | | |VGA window #0 | | | | | | | | +------+ | | |Also VGA win- |VGA window #1 | | | |dow is over- | | | | |lapped on the | | | | |other window. |Both character and | | | | |graphics are over- | | | +------|lapped. | | | | | | | | | | | +------+ | | | | Displaying on the base screen is | | not affected by any VGA window. | +------+

Each two VGA windows have their own screen buffers of character and graphics display It is possible to output to the base screen during displaying VGA windows. Output operation to hidden area of the base screen displays nothing to the real screen but writes to the screen buffer memory. When the VGA window closed, all contents of the base screen, including on the hidden area, are output automatically. VGA window has the following restrictions.

* Color palettes are common with the base screen. So, if any color palette is changed in the base screen or the VGA window, the corresponding color palette of the other screen is changed.

* The control of graphic display enabling/disabling is common with the base screen. So, if the graphic display is disabled in the base screen, the contents of graphics in the VGA window are disabled at the same time.

* VGA window is available on only 16-color mode, unavailable on 256-color mode. While the following modes are specified in "_setvideomode()" function, VGA window is unavailable.

_98RES16COLOR, _98RES8COLOR, _98RESCOLOR ,_VRES256COLOR

* Size and position of VGA window are specified by character size unit.

* VGA window size (colomn x line) is limited as follows.

Total size of all opened windows <= Full screen size

* When the screen mode is changed, all VGA windows are closed auto- matically. * The VGA window cannot be used together with the CNC subscreen/help screen. To use the VGA window, set parameter NSH(No.8654#0)=1 to hide the subscreen/help screen. * If the VGA window is used, it is impossible to use the debug function of the macro compiler/executor. Set parameter DBG(No.8502#3)=0. Using VGA window ~~~~~~~~~~~~~~~~

Usually VGA window is used in the window task. It is possible to only output to VGA window in the window task. VGA window is used in also the main task. In the following section, usages of VGA window is described for each cases.

(A) VGA window display in the window task.

Execute the following procedures to display VGA window in the window task.

(1) Call "vwin_open()" function to open VGA window. "vwin_open()" function doesn't always succeed. Checking the return value of this function is needed.

(2) After successful execution of "vwin_open()" function, it is enabled to output characters to the VGA window. Character display by "printf()" function, etc. is available as same as the ordinary screen.

(3) Call "crt_opengr()" and "_setvideomode()" functions to draw graphics. Specify one of following video mode for "_setvideomode()". _98RESS16COLOR, _98RESS8COLOR, _VRES16COLOR, _VRES16EXCOLOR

After successful execution of "_setvideomode()" function, it is enabled to draw graphics using graphic functions. (4) Call "vwin_close()" function to close the VGA window after required displays. Don't execute both character and graphics output before calling "vwin_open()" function and after calling "vwin_close()" function. Color palettes are common with the base screen. Changing color palette in the VGA window makes changing the same color palette in the base screen, and vice versa. Especially, take care to change and to refer the color palettes in the VGA window on the CNC and the PMC screen. To get the contents of color palettes in the CNC screen, use "crt_getcncpalette()" function. Also enabling/disabling graphic output status is common with the base screen. Graphic output must always be enable in the base screen for graphic drawing in VGA window. Note, however, that if tool path drawing is underway in tool path drawing or background drawing processing or if a tool path that was drawn before has not been erased, enabling graphics drawing causes the tool path to appear on the CNC screen. Once VGA window is opened, it keeps opened until calling "vwin_close()" function by the application program. (except in case of changing screen mode.) Call "vwin_close()" function positively to close the VGA window by the application program. (B) VGA window display in the main task.

The procedures to display VGA window in the main task is basically same as in the window task. There are some differences as follows.

(1) Once "vwin_open()" function is called, all of the following output are displayed in the VGA window. (both character and graphics) After closing all VGA window, output is displayed to the base screen again.

(2) Various settings about display are taken over between the base screen and the VGA window as they are. Generally, it is necessary to re- initialize the display environment after changing display between the base screen and the VGA winodw. Call "_setvideomode()" function after opening the VGA window, "crt_setmode()" and "_setvideomode()" functions after returning the base window from the VGA window.

(3) The opened VGA window is still displayed as it is even if the base screen is changed to another screen (CNC screen, etc.). It is im- possible to control the VGA window on the CNC screen by the main task. So, it is beter to disable screen switching during opening the VGA window.

How to operate VGA window ~~~~~~~~~~~~~~~~~~~~~~~~~

(1) How to resize VGA window. It is impossible to resize the opened VGA window. Close the VGA window by "vwin_close()" function first, then open with new size specification again. (Redrawing is required.)

(2) How to move VGA window. Hide the VGA window by "vwin_hide()" function once, then call "vwin_show()" function with the new position.

(3) How to change overlapping order. Hide the VGA window which you want display on the top by "vwin_hide()" function once, then display it by "vwin_show()" with the same position again. Function Reference ~~~~~~~~~~~~~~~~~~

------4.1 Open VGA window. ------

[Name] vwin_open

[Syntax] #include int vwin_open( unsigned int widx, unsigned int posl, unsigned int posc, unsigned int sizev, unsigned int sizeh ) ;

[Arguments] widx VGA window index. (=0,1) posl Line number of the upper left corner of VGA window. (the top line in the screen = 0) posc Column position of the upper left corner of VGA window. (the left-end column in the screen = 0) sizev Line size of VGA window. (=1 - LMAX) sizeh Column size of VGA window. (=1 - CMAX) LMAX = 30 CMAX = 80

[Return] 0 Successful. Non-0 Error. (one of the following cases) - Incorrect window index (widx). - Specified window has been already opened. - Incorrect position or size of window. - The other software already uses the VGA window.

[Description] Makes a VGA window and displays it on the screen. A VGA window with the specified size is opened and displayed on the screen at the specified position. It is allowed to specify position that a part of the window is put out of the screen. The window created by this function is selected and is put on the other window which is already displayed. After successful execution of this function, the following printing and drawing are output to the window opened by this function until closing this window or the other window is selected. ------4.2 Close VGA window. ------

[Name] vwin_close

[Syntax] #include int vwin_close( unsigned int widx ) ;

[Arguments] widx VGA window index. (=0,1)

[Return] 0 Successful. Non-0 Error. (one of the following cases) - The window specified by "widx" is not opened.

[Description] Closes the opened VGA window.

The contents of characters and graphics in the window are destroyed. If the other VGA window is opened, that window is selected. When all VGA windows are closed in the main task, the base screen (ordinary screen) is selected. ------4.3 Select VGA window. ------

[Name] vwin_select

[Syntax] #include int vwin_select( unsigned int widx ) ;

[Arguments] widx VGA window index. (=0,1)

[Return] 0 Successful. Non-0 Error. (one of the following cases) - The window specified by "widx" is not opened.

[Description] Selects the specified VGA window as the target screen of character and graphics output. After successful execution of this function, the following printing and drawing are output to the window opened by this function until closing this window or the other window is selected. ------4.4 Show VGA window. ------

[Name] vwin_show

[Syntax] #include int vwin_show( unsigned int widx, unsigned int posl, unsigned int posc ) ;

[Arguments] widx VGA window index. (=0,1) posl Line number of the upper left corner of VGA window. (the top line in the screen = 0) posc Column position of the upper left corner of VGA window. (the left-end column in the screen = 0)

[Return] 0 Successful. Non-0 Error. (one of the following cases) - The window specified by "widx" is not opened. - The window specified by "widx" is not hidden window.

[Description] Redisplays the invisible VGA window. The specified VGA window is displayed on the specified position again. To move VGA window on the screen, once hide the window by "vwin_hide" function, then display with a new position by this function again. This function doesn't select the specified VGA window. The VGA window redisplyed by this function is put on the top. ------4.5 Hide VGA window. ------

[Name] vwin_hide

[Syntax] #include int vwin_hide( unsigned int widx ) ;

[Arguments] widx VGA window index. (=0,1)

[Return] 0 Successful. Non-0 Error. (one of the following cases) - The window specified by "widx" is not opened.

[Description] Hides the specified VGA window.

This function makes the opened VGA window invisible with keeping the window's status. It is possible to output characters and graphics to the invisible window. By executing "vwin_show" function to the invisible window, the contents of the window including contents output during being hidden are redisplayed. This function doesn't changes selection status of VGA windows. ------4.6 Get VGA window information. ------

[Name] vwin_info

[Syntax] #include int vwin_info( unsigned int widx, struct vwinfo *buf ) ;

struct vwinfo { unsigned int stat ; /* status */ unsigned int posl ; /* line position */ unsigned int posc ; /* column position */ unsigned int sizev ; /* vertical size */ unsigned int sizeh ; /* horizontal size */ } ;

[Arguments] widx VGA window index. (=0,1) buf Window iformation buffer.

[Return] 0 Successful. Non-0 Error. (one of the following cases) - Incorrect window index (widx).

[Description] Gets the status information of the specified VGA window. The position, size and status of the specified window are stored into "buf". The meanings of each bit of the status flag "buf.stat" are as follows. bit0 VW_OPEN = 0 Not opened. = 1 Opened. bit1 VW_HIDDEN = 0 Visible. = 1 Invisible. (VW_HIDDEN is effective when VW_OPEN=1.) bit2 - bit15 Undefined. 3.7 File Operation Library ======

Using Memory Card ~~~~~~~~~~~~~~~~~

The application program can access a memory card which is inserted in the card slot equipped on the LCD/MDI panel of FS30i as a disk device.

To read/write a memory card, execute the following procedures.

(1) Insert a memory card into the slot.

(2) Mount the memory card as a disk device by the application program. (Call "aux_file_mount" function.)

(3) Open files using "fopen", "fcreate" function, etc. with drive name "B:".

(4) Read/write contents of the memory card using "fgets", "fprintf", "fread", "fwrite", etc. (5) Close the files using "fclose" function. (6) Unmount the memory card. (Call "aux_file_unmount" function.)

(7) Remove the memory card from the slot.

Supported memory card and format ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Supported memory cards are as follows. PCMCIA or JEIDA compatible 256KB, 512KB, 1MB, 2MB, 4MB S-RAM card. ATA compatible memory card. Logical format of a memory card that this library can handle is MS-DOS format used on the generic MS-DOS Personal computers. C library doesn't support formatting function of a memory card. It can read/write only formatted memory cards. Format memory cards using a personal computer with PC card slots or the boot software of FS30i. [Note]

* The drive name to aceess a memory card is "B:". It is fixed.

* The C application program can't access the memory card while the other software (CNC software, etc.) is accessing it.

* The C application program may fail to access the memory card just after insertion the memory card (for a few minutes). ("aux_file_mount" function returns "EAUTHREJ".) The CNC program causes this problem because it always poring the card slot to detect card insertion. In this case, the appli- cation program must retry to access. Lists of Functions ~~~~~~~~~~~~~~~~~~

------Name Function ------1. aux_file_format Format specified drive 2. aux_file_mount Mount memory card. 3. aux_file_unmount Unmount memory card. 4. aux_file_memcinfo Get memory card information. ------Function Reference ~~~~~~~~~~~~~~~~~~

------1. Format specified drive

------

[Name] aux_file_format

[Syntax] #include int aux_file_format( unsigned char drive ) ;

[Arguments] drive Drive name ( ='A' )

[Return] 0 normal completion 9 invalid drive name

[Description] This function formats the drive specified by the argument. Specify the name of the drive to be formatted by the argument "drive". When formatting S-RAM disk, call this function as aux_file_format( 'A' ) ; . When this function is called, whole data stored in the specified drive is lost. ------2. Mount memory card. ------

[Name] aux_file_mount

[Syntax] #include int aux_file_mount( unsigned char drive ) ;

[Arguments] drive Drive name. ( ='B' )

[Return] Returns 0 if successfully mounted the memory card. If failed, returns non-0, and store one of the following values in the global variable "errno". Symbol Meaning ------+------ENOTMOUNT Failed to mount. ENOTINSERT No memory card inserted. EBATVOLDEC Battery voltage is low. ENOTSRAM Not supported card. (Not S-RAM card.) EDRIVENAME Invalid drive name. EAUTHREJ The other software already uses the memory card slot.

[Description] Mounts the memory card. The drive name "drive" is always "B:". After successful execution of this function, input/output functions (such as "fopen", "fread", "remove", "fclose", etc.) are available to use. Don't remove or re-insert the memory card after calling this function. Use "aux_file_memcinfo" function to check whether write-protected or not. [Example] The following program reads character by character from "TESTFILE.DAT" in the memory card and writes them to the stdout.

#include #include int example( void ) { FILE *fp ; signed char ch ; int ret ; unsigned int stat ;

ret = aux_file_mount( 'B' ) ; if ( ret ) { return ( ret ) ; } ret = aux_file_memcinfo( &stat ) ; if ( !ret ) { if ( stat & 0x02 ) { printf( "Write protect. \n" ) ; } } if ( ( fp = fopen( "B:\\TESTFILE.DAT", "r" ) ) != NULL ) { if ( ( ch = fgetc( fp ) ) != EOF ) { if ( ( ch < '\t' ) || ( ch == 0x0B ) || ( ch == 0x0C ) || ( ( ch > '\r' ) && ( ch < ' ' ) ) || ( ch == 0x7F ) || ( (unsigned char)ch == 0x80 ) || ( (unsigned char)ch == 0xA0 ) || ( (unsigned char)ch > 0xFC ) ) { ch = '.' ; } putchar( ch ) ; } fclose( fp ) ; } ret = aux_file_unmount( 'B' ) ; return ( ret ) ; } ------3. Unmount memory card. ------

[Name] aux_file_unmount

[Syntax] #include int aux_file_unmount( unsigned char drive ) ;

[Arguments] drive Drive name. ( ='B' )

[Return] Returns 0 if successfully unmounted the memory card. If failed, returns non-0, and store one of the following values in the global variable "errno". Symbol Meaning ------+------ENOTMOUNT Failed to unmount. ENOTINSERT No memory card inserted. EBATVOLDEC Battery voltage is low. ENOTSRAM Not supported card. (Not S-RAM card.) EDRIVENAME Invalid drive name. EAUTHREJ The other software already uses the memory card slot.

[Description] Unmounts the memory card. The drive name "drive" is always "B:". Call this function to finish accessing the memory card using input/ output functions (such as "fopen", "fread", "remove", "fclose", etc.).

[Example] See example of "Mount memory card (aux_file_mount)". ------4. Get memory card information. ------

[Name] aux_file_memcinfo

[Syntax] #include int aux_file_memcinfo( unsigned int *stat ) ;

[Arguments] stat Buffer in which memory card information is stored.

[Return] Returns 0 if successfully got the memory card information. If failed, returns non-0.

[Description] Reads the status of the memory card.

Call this function after mouting the memory card. (using "aux_file_mount" function.) The contents of "stat" are as follows. bit0 = 0 A memory card is inserted. 1 No memory card is inserted. bit1 = 0 Write enable. 1 Write protect. bit2 = 0 Battery voltage normal. 1 Battery voltage low. bit5,bit4,bit3 Kind of memory card. = 0, 0, 0 SRAM card 0, 0, 1 ATA card bit6 - bit15 Undefined.

[Example] See example of "Mount memory card (aux_file_mount)". 3.8 Serial Library ======

Library outline ~~~~~~~~~~~~~ 1. Outline

Serial Library is a set of general functions which are used to send/receive data to/from devices via RS-232C communication interface. Character or block type data can be handled by these functions.

To utilize communication function with Serial Library, "Reader/Punch Interface A" option has to be equipped in the CNC.

[1] Protocol

start-stop synchronization transmission ( 2 channels max.)

data bits 7 or 8 bits stop bits 1 or 2 bits baud rate 600, 1200, 2400, 4800, 9600 bits /sec parity check none, even, odd flow control none, CS/RS control , DC code control

[2] Data path +------+ | | | application |------+ | | | +------+ | | | | +------+ +------+ | | | -+ | | -+ | | Tx buffer | | | Rx buffer | | Status | | | | | | check +------+ | +------+ | | +------+ +------+ | | | | +------+ | | | | | Serial device |<------+ | | +------+ Application program sends data to the serial device via transmit buffer (Tx buffer) and receives data from the serial device through receive buffer (Rx buffer). Status information is directly read from the serial device. [3] Authorization to access communication channel

Each communication channels have authorization control mechanism independent of each other. Application program has to get authorization to use a channel by calling rs_open() function, before using the serial communication interface. If the channel is already occupied by CNC control program or any other task, that channel can neither be opened by rs_open() nor used. It is allowed for the application program to use two channels at the same time. Also, two channels can be used simultaneously if one is used by application program and the other by CNC control program. But , while CNC control program is using serial interface, generally whole CPU resources are dedicated to the program, so that the execution of the application program will be stopped.

When a communication channel is opened by rs_open(), the state of the signal ER becomes ON to announce external device that the channel is ready for communication. While ER is ON, connecting or detaching the communication cable should not be done so as not to give damage to the hardware.

When a communication channel is closed by rs_close() function, the channel is released and becomes free for other tasks, and the signal ER becomes OFF.

[4] Flow control

Two flow control methods are supported: one uses hardware signals (CS,ER) for handshaking and the other uses DC code for it ( referred to as "hardware flow ctrl" and " DC code flow ctrl" respectively). Following parameters can be selected. Hardware flow ctrl none, bi-directional DC code flow ctrl none, bi-directional, transmit only, receive only Usually one of the following combination is selected. Hardware flow control DC code flow control ------+------+------Flow control yes yes Hardware flow ctrl bi-directional none DC code flow ctrl none bi-directional (Note) When "none" is selected for hardware flow ctrl, RS signal becomes always ON.

When "DC code flow ctrl" is selected, data transmission is controlled by the DC codes as follows. (1) Transmission handshake

Stop or restart sending data, according to the DC code received from destination device. DC1 received : restart sending data is requested DC3 received : stop sending data is requested Received DC code is not passed to the application program. (2) Receiving handshake

DC code is used to request the source device to stop or restart sending data according to the state of receiving buffer.

Send DC1 : request to restart sending data Send DC3 : request to stop sending data

These DC1 or DC3 codes are automatically transmitted by the serial communication driver.

[5] Communication mode

Application program can select one of the three communication modes, "transmit only", "receive only", and "transmit and receive"

(1) Transmit only mode

Only data transmission from application program to external device can take place in this mode. Application program cannot use library functions for receiving data. Data received from external device are ignored except DC codes.

(2) Receive only mode

Only data transmission from external device to application program can take place in this mode. Application program cannot use library functions for sending data. All received data from external devices are passed to application program.

(3) Transmit and receive mode Both data sending and receiving can take place in this mode. Application program can use all serial library functions. Received data code from external device is interpreted as follows in accordance with the selected flow control mode. (a) "DC code flow ctrl" is ON for transmission DC codes included in the receiving data from external device are interpreted as flow control characters and they are not passed to the application program. (b) "DC code flow ctrl" is OFF for transmission Because external device would not send DC codes to the application program for flow control purposes in this mode, all receiving data including DC codes are passed to the application program.

In this mode, care should be taken for the relationship between flow control method and transmitted data. When bi-directional "DC code flow ctrl" is employed, DC codes in transmitted data, if included as data, cannot be discriminated from flow control DC characters. And these data not only are blocked to pass to the application program but cause flow control failure. Moreover, the DC code to announce "send stop/send restart" cannot be sent to the destination, if "send data" is inhibited by the hardware signal. For these reasons, only text data should be transmitted when "DC code flow ctrl" is employed. If hardware signal handshake is employed, there is no restriction in the code of transmitted data. 2. Interface

[1] Connection

CNC Serial device ------+ +------| | SD ------> RD RD <------SD | | RS ------> CS CS <------RS | | ER ------> DR DR <------ER | | CD <------CD | | SG --+------+-- SG FG --+------+-- FG | | ------+ +------

SD : Send data [output]

RD : Receive data [input] RS : Request to send [output] This signal is used for flow control by hardware signal handshake. This signal requests or allows external serial device to send data. The serial communication driver will bring this signal OFF , when receive buffer is full. External device must not send more than 10 characters after RS is OFF. CS : Clear to send [input] This signal is used for flow control by hardware signal handshake. This signal indicates that external serial device is requesting or allowing data to be sent. The serial communication driver sends data while this signal is ON. ER : Data terminal ready [output] This signal announces that the device is ready for operation. The serial communication driver makes this signal ON, when communication channel is successfully opened. If receive buffer overflows, ER is brought OFF to inform data loss to external device. DR : Data set ready [input] This signal indicates that external device is ready for operation. Application program can examine the state of this signal by using status check function, rs_status(). [2] Signal state

Only difference between "hardware flow ctrl" and "no hardware flow ctrl" is that signals CS and DR are deemed always ON if "no hardware flow ctrl" is selected.

(1) After channel is open

hardware flow ctrl no hardware flow ctrl ------+------+------SD RD RS ON <- CS don't care ER ON <- DR ON CD

(2) While sending data hardware flow ctrl no hardware flow ctrl ------+------+------SD send data <- RD RS ON <- CS flow control don't care ER ON <- DR external device status ON CD

(3) While receiving data hardware flow ctrl no hardware flow ctrl ------+------+------SD RD receive data <- RS flow control(*1) ON CS ER error report(*2) <- DR external device status ON CD (*1) RS becomes OFF when receive buffer is full and returns to ON when there are free space in the buffer (*2) ER becomes OFF when receive data overflows the receive buffer. This happens, for example, when data transmission does not stop even if RS is brought OFF to request stopping data transmission. (4) After channel is closed

hardware flow ctrl no hardware flow ctrl ------+------+------SD RD RS OFF <- CS ER OFF <- DR CD List of functions ~~~~~~~~~~~~~~~~~

------Name Function ------1. rs_open Initialize communication channel 2. rs_close Close communication channel 3. rs_putc Put one byte data into transmit buffer 4. rs_getc Get one byte data from receive buffer 5. rs_write Put block of data into transmit buffer 6. rs_read Get block of data from receive buffer 7. rs_buffer Test or clear transmit/receive buffer 8. rs_status Get status of communication buffer and interface 9. rs_wait Wait for communication interface event ------

(Note 1) Even if communication interface is in erroneous state, the serial library functions do not return errors. The functions, rs_putc(), rs_getc(), rs_write(), rs_read() returns error only when inadequate manipulation of send or receive buffer is attempted. To know the state of the communication interface, use the function, rs_status().

(Note 2) The serial library functions do not check the signal, DR. It should be checked by application program if necessary. Function Reference ~~~~~~~~~~~~~~~~~~

------1. Initialize communication channel ------

[Name] rs_open

[Syntax] #include int rs_open( int channel, ser_t *param, char *mode ) ;

struct RS_PACKET { unsigned baud ; /* baud rate */ unsigned stop_bit ; /* stop bit length */ unsigned parity ; /* parity check */ unsigned data_bit ; /* character length */ unsigned hardflow ; /* hardware flow ctrl */ unsigned dc_enable ; /* DC code flow ctrl */ unsigned dc_put ; /* send DC code */ unsigned dc1_code ; /* DC1 code */ unsigned dc2_code ; /* DC2 code */ unsigned dc3_code ; /* DC3 code */ unsigned dc4_code ; /* DC4 code */ } ; typedef struct RS_PACKET ser_t ;

[Argument] channel channel number ( = 1, 2 ) param communication parameter mode communication mode

[Return] Returns zero if successful. If any error, returns non-zero value.

[Description] Specified communication channel is initialized with specified condition and opened for data transmission. Specify channel number, 1 or 2, by the argument "channel". Specify communication conditions in the structure "param".

param->baud baud rate ------+------BAUD_0600 600 bits/sec BAUD_1200 1200 bits/sec BAUD_2400 2400 bits/sec BAUD_4800 4800 bits/sec BAUD_9600 9600 bits/sec

param->stop_bit stop bit length ------+------STOP_1 1 bit STOP_2 2 bits

param->parity parity check ------+------PARITY_N no parity check PARITY_E even parity PARITY_O odd parity param->data_bit character length ------+------DATA_7 7 bits DATA_8 8 bits

param->hardflow hardware flow ctrl ------+------0 no 1 both send and receive 2 send only 3 receive only param->dc_enable DC code flow ctrl ------+------0 no 1 both send and receive 2 send only 3 receive only param->dc_put send DC code ------+------0 no 1 yes If "1" is specified for "dc_put", following DC code is sent to the external device whenever the channel is opened or closed. open mode when open when close ------+------+------receive mode DC1 DC3 send mode DC2 DC4 send/receive mode no DC code transmitted param->dc1_code define DC1 code (usually 0x11 ) param->dc2_code define DC2 code (usually 0x12 ) param->dc3_code define DC3 code (usually 0x13; 0x93: when using ISO code ) param->dc4_code define DC4 code (usually 0x14 )

Specify open mode of the communication interface by the argument "mode".

mode open mode ------+------"r" receive mode "w" send mode "rw" send/receive mode

Every parameter must have it's value specified. If not, correct communication will not be done.

To utilize communication function with Serial Library, "Reader/Punch Interface A" option has to be equipped in the CNC.

If "1" is specified for param->dc_put, DC1 code(for receive mode) or DC2 code (for send mode) is sent via communication channel. ------2. Close communication channel ------

[Name] rs_close

[Syntax] #include int rs_close( int channel ) ;

[Argument] channel channel number ( = 1, 2 )

[Return] Returns zero if successful. If any error, returns non-zero value.

[Description] Stops using specified communication channel. If "1" is specified for param->dc_put of rs_open() function, DC3 code (for receive mode) or DC4 code (for send mode) is sent via communication channel. ------3. Put one byte data into transmit buffer ------

[Name] rs_putc

[Syntax] #include int rs_putc( int c, int channel ) ;

[Argument] c data to be sent channel channel number ( = 1, 2 )

[Return] Returns "1" if successful. Returns zero if transmit buffer is full and has no room to accept new data. Returns "-1" if any error. The error comes from transmit buffer and has nothing to do with the state of communication interface.

[Description] Puts one byte data into the transmit buffer of the specified communication channel. This function outputs data to the transmit buffer. To know if the data is actually transmitted , read the status of the transmit buffer by rs_buffer() function and check the vacancy of the buffer. ------4. Get one byte data from receive buffer ------

[Name] rs_getc

[Syntax] #include int rs_getc( int channel ) ;

[Argument] channel channel number ( = 1, 2 )

[Return] Returns a data read from receive buffer if successful. Returns "-1" if any error occurs or if there is no data in the buffer. The error comes from receive buffer and has nothing to do with the state of communication interface.

[Description] Gets one byte data from the receive buffer of the specified communication channel. ------5. Put block of data into transmit buffer ------

[Name] rs_write

[Syntax] #include int rs_write ( char *buffer, int size, int channel ) ;

[Argument] buffer output data storage area size output data size channel channel number ( = 1, 2 )

[Return] Returns the size of the data output to the transmit buffer if successful. If free space of the transmit buffer is smaller than the specified data size, returned value will be smaller than the specified data size. Returns "-1" if any error. The error comes from the transmit buffer and has nothing to do with the state of communication interface.

[Description] Gets specified bytes of data from the specified buffer area and puts them into the transmit buffer of the specified channel This function outputs data to the transmit buffer. To know if the data is actually transmitted, read the status of the transmit buffer by rs_buffer() function and check the vacancy of the buffer. ------6. Get block of data from receive buffer ------

[Name] rs_read

[Syntax] #include int rs_read ( char *buffer, int size, int channel ) ;

[Argument] buffer input data storage area size input data size channel channel number ( = 1, 2 )

[Return] Returns the number of data bytes read from the receive buffer if successful. If size of the data in the receive buffer is less than specified size, return value will be smaller than specified size. Returns "-1" if any error. This error comes from receive buffer and has nothing to do with the state of communication interface.

[Description] Gets specified bytes of data from the receive buffer of the specified channel and puts them into the specified buffer area. ------7. Test or clear transmit/receive buffer ------

[Name] rs_buffer

[Syntax] #include int rs_buffer( int channel, int cmnd ) ;

[Argument] channel Channel number ( = 1, 2 ) cmnd buffer command

[Return] If successful; RS_GET_BUF_R, RS_GET_BUF_W commands return buffer size, RS_CHK_BUF_R, RS_CHK_BUF_W commands return data size in the buffer RS_CLR_BUF_R, RS_CLR_BUF_W commands return zero. Returns "-1", if any error.

[Description] Tests or clears the specified buffer of the specified channel. Select the communication channel (1 or 2) by the argument "channel". Specify following buffer command in the argument "cmnd". cmnd function ------+------RS_GET_BUF_R return receive buffer size RS_GET_BUF_W return transmit buffer size RS_CHK_BUF_R return data size in receive buffer RS_CHK_BUF_W return data size in transmit buffer RS_CLR_BUF_R clear receive buffer RS_CLR_BUF_W clear transmit buffer ------8. Get status of communication buffer and interface ------

[Name] rs_status

[Syntax] #include int rs_status( int channel ) ;

[Argument] channel channel number ( = 1, 2 )

[Return] Returns status of the communication interface and communication buffers.

bit position Meaning ------+------+------0x8000 transmission stopped (send) 0x4000 ( reserved ) (send) 0x2000 Buffer full (send) 0x1000 ( reserved ) (send) 0x0800 receiving stopped (receive) 0x0400 ( reserved ) (receive) 0x0200 Buffer empty (receive) 0x0100 Buffer overrun (receive) 0x0080 DR ON (LSI) 0x0040 ( reserved ) (LSI) 0x0020 Framing error (LSI) 0x0010 Overrun error (LSI) 0x0008 Parity error (LSI) 0x0004 ( reserved ) (LSI) 0x0002 ( reserved ) (LSI) 0x0001 ( reserved ) (LSI)

[Description] Gets status information of the communication interface and communication buffers of the specified channel. ------9. Wait for communication interface event ------

[Name] rs_wait

[Syntax] #include #include int rs_wait( int channel, int param, int mode, unsigned long time_out ) ;

[Arguments] channel channel number ( = 1, 2 ) param character code or number of characters mode operation mode time_out maximum time to wait

[Return] Returns zero if specified condition is satisfied. Returns "EC_TIMOUT" if time limit set by time_out has elapsed.. When mode = rtx_size, this function returns "rtx_size_ok" if the number of data bytes in the receive buffer is greater than or equal to the specified value. When mode = trx_size, this function returns "trx_size_ok" if the number of data bytes in the transmit buffer is less than or equal to the specified value. Returns the value other than described above if any error.

T[Description] Waits for the specified communication channel to become given state. Specify the number of the channel ( 1 or 2 ) to wait for events. Specify one of the following for the argument "mode". mode operation mode ------+------rtx_size wait for data to be received trx_size wait for data to be sent rtx_code wait for specified character to come According to the operation mode described above, either the number of data characters or a character code should be specified for the argument "param".

mode param ------+------rtx_size number of data characters in the receive buffer trx_size number of data characters in the transmit buffer rtx_code character code The maximum wait time is specified by the argument "time_out". The unit of the wait time is Tick ( 1 Tick = 8 msec). After this function call, the task from which this function is called is switched to the "wait state" until specified condition is satisfied. For this reason, this function especially suits with communication tasks.

This function is used for following purposes.

(1) Wait for transmit completion

ret = rs_wait( channel, param, trx_size, time_out ) ;

This waits for the number of untransmitted characters in the transmit buffer to become less than or equal to the specified value given by "param".

If param = 0, above function call waits for the completion of transmission. This is used to know that whole data is sent to the destination. By setting param as param="Tx buffer size" - "Tx data size", above function call informs that there is enough space in the transmit buffer to accept new data. This is useful for efficient data transmission.

(2) Wait for data to come

ret = rs_wait( channel, param, rtx_size, time_out ) ; This waits for the number of received characters in the receive buffer to become greater than or equal to the specified value given by "param". This is efficient compared to the polling method.

In case of fixed length data communication, specify as param="packet size" to know that a set of data has been received. If it is expected to know that a data of whatever size has been received, specify param as "1".

(3) Wait for specified character ret = rs_wait( channel, param, rtx_code, time_out ) ; This function call waits for the character specified by "param" to arrive. This function is used for the case to know the arrival of the data packet which ends with specific code.

Above wait state finishes when receiving data ,which arrives after rs_wait() is called, matches the character specified by "param". Those data, which have arrived before the execution of this function and are not yet read by the application, are not examined for character matching.

Specifying the maximum wait time by "time_out" avoids application program to hang up when no answer comes back from the external device. There can be some problem in the communication interface when time-out error occurs. In this case, examine the state of the interface by using rs_buffer() function or rs_status() function. 3.9 Task management library ======

Library outline ~~~~~~~~~~~~~~~

Following functions are provided to control execution of the application programs or to manage execution of multiple tasks.

1. Time management 2. Semaphore control 3. Event flag

1. Time management

The time management functions can suspend execution of tasks for specified period of time or can make tasks wait for events with limited wait time option which avoids tasks to become dead-locked. The timer which can be used by the application program is a local timer dedicated for the task. Time unit of the timer is "Tick"(1 Tick = 8 msec).

name function ------+------os_show_tim read timer os_set_tim set timer os_sync_tim suspend execution of task until specified time of timer os_wait_tim suspend execution of task for specified time period * os_set_tim() sets specified value to the timer. This function sets the timer of it's own task, the timer of another task cannot be set. * os_show_tim() reads time value from the timer of current task. * Execution of the current task is suspended by os_sync_tim() until the timer reaches the specified time. ( Absolute wait) * os_wait_tim() function suspends execution of the current task for specified period of time ,like waiting for time-out. ( Relative wait) The time referred to in all task management library functions is based on the software-timer of 8 msec unit. This timer is the basis of the operation of the task management programs. Note that the contents of this timer does not always agree with the actual passage of time. This is because the task management programs are suspended while the CNC task of higher priority is being executed and the timer is not updated during this period. 2. Synchronization of tasks (semaphore management)

The semaphore is used to synchronize or arbitrate execution of tasks. The semaphore consists of semaphore counter and semaphore queue. Suspended tasks which are waiting for the semaphore to be signaled are queued in the semaphore queue, and when the semaphore is signaled the task at the top of the queue is awaked to run. Multiple tasks can share a semaphore.

task synchronization task arbitration ~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ TASK A TASK B TASK A TASK B | : | wait for| | SEM : | get SEM release | Wait---->* : Wait-----> * <---+ | : ^ | | ^ | +-- Wait : +--- Signal | | | : | : Signal----+ +------>| | : | release get |

Following functions are used for semaphore management.

Name Function ------+------os_make_sem create semaphore os_delt_sem delete semaphore os_wait_sem wait until semaphore is signaled os_sign_sem signal semaphore

* The semaphore is used to synchronize or arbitrate execution of tasks. * The semaphore is not exclusively given to a task. ( The system does not register the task which has gotten the semaphore.) So, the semaphore can be signaled by even a task that did not get the semaphore. * os_make_sem() creates the semaphore. Initial value of the semaphore counter represents total number of the tasks which can get semaphore. Waiting for signal ~~~~~~~~~~~~~~~~~~

* os_wait_sem() decrements the semaphore counter, and suspends the execution of the calling task if the value of the semaphore counter is negative.

sem-- ==> decrement semaphore counter if( sem < 0 ) ==> if negative counter value Wait ==> queue the task into the semaphore queue and suspend execution

operation semaphore counter semaphore queue ------+------+------1 none Wait 0 none Wait -1 ==> ----X Wait -2 ==> ----O----X Wait -3 ==> ----O----O----X

Signaling semaphore ~~~~~~~~~~~~~~~~~~~

* os_sign_sem() signals the semaphore. * If there are any suspended tasks, the task at the top of the semaphore queue is awaked to run. sem++ ==> increment semaphore counter if( sem <= 0 ) ==> if counter value is 0 or negative Ready ==> awake the task at the top of the semaphore queue operation semaphore counter semaphore queue ------+------+------3 ==> ----O----O----X Signal -2 ==> ----O----X Signal -1 ==> ----X Signal 0 none Signal 1 none [ Example of task arbitration ]

As an example, here it is assumed that there are three sets of resources which are shared between five tasks. The following example shows a method to manage assignment of these resources among tasks.

+------+ Signal | resources | Task Queue Wait <======| TASK-A | <=== (TASK-D)==(TASK-E)== | TASK-B | | TASK-C | +------+

1) Create semaphore by os_make_sem() and specify "3" , which is the number of available resource set, for the initial value of the semaphore counter.

2) Before using a set of resources , get semaphore by os_wait_sem() function. If resources are not available, the execution of the calling task is suspended. 3) When resources have become unnecessary, release the semaphore by os_sign_sem() function. If there are suspended tasks waiting for semaphore, the task at the top of the queue gets semaphore and awaked from the suspended state.

In the following example, maximum three tasks can have resources assigned, and the execution of the other tasks, for which there are no available resources, are suspended to wait for the release of resources. semaphore TASK-A TASK-B TASK-C TASK-D TASK-E counter value | | | | | 3 Wait SEM | | | | 2 X Wait SEM | | | 1 X X Wait SEM | | 0 X X X Wait SEM | -1 X X X (Wait) Wait SEM -2 X X X (Wait) Signal SEM X X X -1 | Signal SEM X X X 0 | | Signal SEM X X 1 | | | Signal SEM X 2 | | | | Signal SEM 3 | | | | | V V V V V

[Semaphore counter value (semval) and what it represents] initial value : total number of resource sets if semval=+n : n= number of available resource sets if semval=-n : n= number of suspended tasks (n>=0) [Example of task synchronization]

This is a sample case that a task is waiting for another task to complete, and assumes that TASK-A waits for TASK-B and TASK-B waits for TASK-C. This task synchronization can be achieved by using two semaphores.

* Priority of each task is assumed to be A>B>C (C being lowest) in the following example.

TASK-A TASK-B TASK-C SEM-D SEM-E | 0 0 | Wait D ----| -1 | Wait E ----| -1 | TASK-C running | | <-----Signal E 0 TASK-B running | | <----Signal D 0 | TASK-A running | [ Example of inter task communication ]

A method of sending or receiving data between tasks by means of ring buffer ( or circulating buffer) is considered in the following example.

Assume that the TASK-A writes a data into the buffer and the TASK-B reads the data from the buffer. Writing a data into the buffer where a data is remaining unread, or reading the buffer when no data is written, is not allowed.

Above operation is controlled by using two semaphores.

+------+ +------> | SEM C | <------+ | +------+ | | +------+ | | +------> | SEM D | <------+ | | | +------+ | | Wait Signal Wait Signal | | buffer(shared memory) | | +------+ +------+ Read +------+ | TASK A | | | =====> | TASK B | +------+ |------| +------+ | | | | Write |------| +=====> | | +------+ TASK A TASK B SEM C SEM D ------+------+------+------3 0 Wait D -1 Wait C (wait) 2 Write data Signal D 0 Read data Wait C (Ready) 1 Write data Signal D 1 Wait C 0 Write data Signal D 2 Wait C -1 Signal C 0

[semaphore counter value and what it represents] initial value of SEM C = number of entry in the buffer positive value of SEM C = number of available entry positive value of SEM D = number of data written negative value of SEM C = waiting for data to be read negative value of SEM D = waiting for data to be written 3. Synchronizing tasks ( Event flag)

Event flag is used to synchronize execution of tasks. The event flags relating to the specific operation are grouped and it forms an event group. (For example, consider a case that a task detects a signal and notifies that to other tasks.) Maximum 32 flags can be grouped for an event group.

Execution of tasks can be suspended until the state of an event group matches a specific data pattern.

MSB LSB 31 0 +------+------+------+------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------+------+------+------+ | | | +-> flag 1 | : | : | : +------> flag 32

Event group ~~~~~~~~~~~

A signal can wake all of the suspended tasks of which the triggering condition is satisfied. +------+ +------> | event flag | | +------+ signal | waiting for event | | +------+------+ | | | | +------+ +------+ +------+ +------+ | TASK A | | TASK B | | TASK C | | TASK D | +------+ +------+ +------+ +------+ Following functions are used for event flag management.

Name Function ------+------os_make_flg create event flag os_delt_flg delete event flag os_sign_flg signal event flag ( modal type) os_puls_flg signal event flag ( pulse type) os_wait_flg wait for being signaled os_clar_flg clear event flag

(Note) The event flag signaled by modal type signal is memorized in the event flag image. This image is retained until it is cleared by os_clar_flg().

(1) Create event flag os_make_flg() function creates event flag. Initial state of the event flag is OFF.

(2) Wait for being signaled os_wait_flg() sets the wait condition and suspends execution of the calling task. For example, to wait for the event flag 1,2,3 to become ON, specify 0x00000007 for the parameter of os_wait_flg(). (This parameter is referred to as "wait message".) In addition, specify "AND wait" or "OR wait" by the argument of os_wait_flg(). (a) OR wait The execution of the calling task is suspended until at leased one of the flags 1,2 or 3 is signaled. The task is not suspended, if any of the flags 1,2 or 3 in the event flag image is set before the function is called. (This is the case that a flag is signaled by os_sign_flg() before.) Operation ~~~~~~~~~ if( wait message & image == 0 ) Wait ==> wait until "wait massage" is satisfied

image wait message 0..0000XXX 0..0000111 | | +------> AND <------+ | | !=0 0..0XXX -----> NO wait | | ==0 V wait for signal

(b) AND wait

The execution of the calling task is suspended until all three flags 1,2 and 3 are signaled. Flags, set ON in the event flag image before the function is called, are not accounted as flags to be waited.

For example, if flags 1 and 2 are ON in the event flag image, the task waits for only flag 3 to be signaled. If three flags 1,2 and 3 are all ON in the event flag image before the function is called, the calling task is not suspended.

operation ~~~~~~~~~ wait message = ~image & wait message if( wait message != 0 ) Wait ==> wait until "wait massage" is satisfied image wait message 0..0000XXX 0..0000111 NOT | | 1..1111XXX -> AND <------+ | | ==0 0..0XXX -----> NO wait | !=0 V wait for signal (Note) Those flags signaled in the past by os_sign_flg() is memorized in the event flag image. Whether the execution of the task is suspended or not depends on the contents of the event flag image. (3) Signaling the event flag

Functions os_sign_flg() or os_puls_flg() signals the event flag.

For example, to signal the event flag 1,2 and 3 to become ON, specify 0x00000007 for the parameter of os_sign_flg(). (This parameter is referred to as "signal message".)

The suspended tasks which are waiting for the flags, that are specified by this function call, to be signaled are waked.

* os_sign_flg (modal type)

os_sign_flg() memorizes the signaled flags in the event flag image. As a result, subsequent os_wait_flg() function call specifying the signaled flags as "wait message" would not suspend the calling task unless the event flag image is cleared.

* os_puls_flg (pulse type)

os_puls_flg() does not memorize the signaled flags in the event flag image. Accordingly, subsequent 0s_wait_flg() function call specifying the signaled flags as "wait message" will suspend the calling task again.

(a) Signaling the "OR waiting" task operation ~~~~~~~~~ if( signal message & wait message != 0 ) Ready ===> waked signal message wait message 0..0000XXX 0..0000111 | | +-----> AND <------+ | | !=0 0..0XXX -----> waked | | ==0 V suspended (b) Signaling the "AND waiting" task

operation ~~~~~~~~~ wait message = ~signal message & wait message if( wait message == 0 ) Ready ===> waked

signal message wait message 0..0000XXX 0..0000111 NOT | | 1..1111XXX -> AND <------+ | | ==0 0..0XXX -----> waked | !=0 V suspended

(4) Clearing the event flag os_clar_flg() function call clears specified bit of the event flag image. For example, to clear flag 1 ,specify "0x00000001" for the parameter of os_clar_flg(). (This parameter is referred to as "clear message".) operation ~~~~~~~~~ flag image = ~clear message & flag image clear message event flag image 0..0000001 0..0000111 NOT | | 1..1111110 -> AND <-----+ | new event flag image 0..0110 (Note) Clearing the event flag image does not affect the state of suspending tasks. [Transition of flags to be waited and event flag image by signals]

Following example explains the state transition of the flags to be waited and the event flag image when they are signaled by modal type and pulse type signaling functions.

Parameter flags to be event flag Function (message) waited image ------+------+------+------os_wait_flg 11111111 11111110 00000001 (*1) (AND wait) V V os_sign_flg 00000110 -> 11111000 00000111 (*2) V V os_puls_flg 00011000 -> 11100000 00000111 (*3) V V os_clar_flg 00000011 -> 11100000 00000100 (*4) V V os_sign_flg 01100000 -> 10000000 01100100 (*5) V V os_puls_flg 10000000 -> 00000000 01100100 (*6) V wake up from suspended state (*1) - os_wait_flg() specifies to wait for flags 1 to 8 to be all signaled. However, because the flag 1 in the event flag image is already set, flag 1 is not accounted as a flag to be waited for being signaled. (*2) - Signal the flags 2 and 3 by modal type function os_sign_flg(). - Waiting state of the flags 2 and 3 are canceled. - It is registered in the event flag image that flags 2 and 3 are signaled. (*3) - Signal the flags 4 and 5 by pulse type function os_puls_flg(). - Waiting state of the flags 4 and 5 are canceled. - Flags 4 and 5 are not registered in the event flag image. (*4) - Clear flags 1 and 2 in the event flag image. - No change in the flags to be waited. (*5) - Signal the flags 6 and 7 by modal type function os_sign_flg(). - Waiting state of the flags 6 and 7 are canceled. - It is registered in the event flag image that flags 6 and 7 are signaled. (*6) - Signal the flag 8 by pulse type function os_puls_flg(). - Waiting state of the flags 8 is canceled. - Flag 8 is not registered in the event flag image. - Because all the flags from 1 to 8 have been signaled and as a result there are no flags to be waited for being signaled, suspended task wakes up and starts running. Lists of Functions ~~~~~~~~~~~~~~~~~~

------Name Function ------1. os_show_tim read timer 2. os_set_tim set timer 3. os_sync_tim suspend execution of task until specified time of timer 4. os_wait_tim suspend execution of task for specified time period 5. os_make_flg create event flag 6. os_delt_flg delete event flag 7. os_sign_flg signal event flag 8. os_wait_flg wait for being signaled 9. os_clar_flg clear event flag 10. os_puls_flg signal event flag (pulse type) 11. os_make_sem create semaphore 12. os_delt_sem delete semaphore 13. os_sign_sem signal semaphore 14. os_wait_sem wait until semaphore is signaled 15. os_strt_wtsk Start window task ------Function Reference ~~~~~~~~~~~~~~~~~~

------1. Read timer ------

[Name] os_show_tim

[Syntax] #include void os_show_tim( unsigned long *current_timer_value ) ;

[Argument] current_timer_value value read from the timer

[Return] ------

[Description] Reads current value of the timer. The unit of the timer value is Tick while 1 Tick is 8 ms. The time value read by this function is that of local timer dedicated for the calling task. The contents of the timer read by this function does not always agree with the actual passage of time. To read the time of day, use clock() function which is more accurate. ------2. Set timer ------

[Name] os_set_tim

[Syntax] #include void os_set_tim( unsigned long new_timer_value, unsigned long *old_timer_value ) ;

[Argument] new_timer_value new timer value old_timer_value old timer value

[Return] ------

[Description]

This function sets the specified value to the timer. The timer set by this function is the local timer dedicated for the calling task. The contents of the timer read by this function does not always agree with the actual passage of time. To read the time of day, use clock() function which is more accurate. ------3. Suspend execution of task until specified time of timer ------

[Name] os_sync_tim

[Syntax] #include unsigned short os_sync_tim( unsigned long wakeup_time ) ;

[Argument] wakeup_time time to wake up

[Return] 0 successful completion EC_TIMOUT Time Out

[Description] This function suspends the execution of the calling task until timer reaches the specified time value.

This function cannot suspend the execution of tasks other than the calling task. This function does not return error value, zero. When the timer reaches the specified time, returns error value, EC_TIMOUT. Internally, this function suspends execution of the task for a period of time given by subtracting current time from the wakeup_time . (wakeup_time - current time) If wakeup_time is less than current time, the task is not suspended. Before calling this function, current time must be read by os_show_tim() function. The maximum value of the wakeup_time is 7FFFFFFFh which corresponds to 198 days, 20 hours, 11 minutes, 9 seconds, and 180 milli seconds. The unit of the value wakeup_time is Tick (=8 msec). ------4. Suspend execution of task for specified time period ------

[Name] os_wait_tim

[Syntax] #include unsigned short os_wait_tim( unsigned long timeout_value ) ;

[Argument] timeout_value time period to wait

[Return] 0 successful completion EC_TIMOUT Time Out

[Description] Suspends execution of the calling task for the specified time period.

This function cannot suspend the execution of tasks other than the calling task. This function does not return error value, zero. When specified time period is elapsed, returns error value, EC_TIMOUT. The calling task is suspended for the period of "timeout_value" time. The maximum value of the timeout_value is FFFFFFFFh which corresponds to 397 days, 16 hours, 22 minutes, 18 seconds, and 360 milli seconds. The unit of the timeout_value is Tick (=8 msec). ------5. Create event flag ------

[Name] os_make_flg

[Syntax] #include unsigned short os_make_flg( unsigned char event_flag_id ) ;

[Argument] event_flag_id event flag ID

[Return] 0 successful completion EC_FLGID Event-flag ID error EC_EXSTFLG Already existing event-flag

[Description] Creates event group with specified event flag ID .

Event group is composed of 32 event flags. This function must be called before using event flags. ------6. Delete event flag ------

[Name] os_delt_flg

[Syntax] #include unsigned short os_delt_flg( unsigned char event_flag_id ) ;

[Argument] event_flag_id event flag ID

[Return] 0 successful completion EC_FLGID Event-flag ID error EC_NXSTFLG Non-existent event-flag

[Description] This function deletes the event group specified by "event_flag_id".

Error code, "EC_DELFLG", is returned to the tasks that have been waiting for the deleted event flags to be signaled. ------7. Signal event flag ------

[Name] os_sign_flg

[Syntax] #include unsigned short os_sign_flg( unsigned char event_flag_id, unsigned long flag_on_message ) ;

[Argument] event_flag_id event flag ID flag_on_message signal message

[Return] 0 successful completion EC_FLGID Event-flag ID error EC_NXSTFLG Non-existent event-flag

[Description] Signals event flags specified by "event_flag_id" and signal message. Signaled flags are registered in the event flag image. ------8. Wait for being signaled ------

[Name] os_wait_flg

[Syntax] #include unsigned short os_wait_flg( unsigned char event_flag_id, unsigned long wait_message, unsigned short and_or, long wait_limit, unsigned long *return_message ) ;

[Argument] event_flag_id event flag ID wait_message wait message and_or AND -- 0, OR -- 1 wait_limit Set 0. return_message

[Return] 0 successful completion EC_FLGID Event-flag ID error EC_NXSTFLG Non-existent event-flag EC_DELFLG Event-flag was deleted EC_TIMOUT Time out

[Description] Waits for specified signals to be signaled. When the value of the argument "and_or" is AND_W(0), this function suspends the calling task and waits for all the signals specified by wait_message to be signaled. This is referred to as "AND wait" mode. Always, "0" is returned as return_message in this mode.. When the value of the argument "and_or" is OR_W(1), this function suspends the calling task and waits for at least one of the signals specified by wait_message to be signaled. This is referred to as "OR wait" mode. Signaled flag is returned as return_message in this mode.. ------9. Clear event flag ------

[Name] os_clar_flg

[Syntax] #include unsigned short os_clar_flg( unsigned char event_flag_id, unsigned long clear_message ) ;

[Argument] event_flag_id event flag ID clear_message clear message

[Return] 0 successful completion EC_FLGID Event-flag ID error EC_NXSTFLG Non-existent event-flag

[Description] Clears the event flag image. This function clears the flags in the event flag image which are specified by the clear_message.. ------10. Signal event flag (pulse type) ------

[Name] os_puls_flg

[Syntax] #include unsigned short os_puls_flg( unsigned char event_flag_id, unsigned long puls_message ) ;

[Argument] event_flag_id event flag ID puls_message signal message

[Return] 0 successful completion EC_FLGID Event-flag ID error EC_NXSTFLG Non-existent event-flag

[Description] Signals the event flags specified by the puls_message argument. Signaled flags are not registered in the event flag image. ------11. Create semaphore ------

[Name] os_make_sem

[Syntax] #include unsigned short os_make_sem( unsigned char semaphore_id, char initial_value ) ;

[Argument] semaphore_id semaphore ID initial_value initial value of the semaphore counter

[Return] 0 successful completion EC_SEMID Semaphore ID error EC_EXSTSEM Already existing semaphore

[Description] Creates a counter type semaphore. Initial value of the semaphore counter represents the number of resources managed by the semaphore. ------12. Delete semaphore ------

[Name] os_delt_sem

[Syntax] #include unsigned short os_delt_sem( unsigned char semaphore_id ) ;

[Argument] semaphore_id semaphore ID

[Return] 0 successful completion EC_SEMID Semaphore ID error EC_NXSTSEM Non-existent semaphore

[Description] Deletes semaphore.

Error code "EC_DELSEM" is returned to the tasks which have been waiting for the deleted semaphore. ------13. Signal semaphore ------

[Name] os_sign_sem

[Syntax] #include unsigned short os_sign_sem( unsigned char semaphore_id ) ;

[Argument] semaphore_id semaphore ID

[Return] 0 successful completion EC_SEMID Semaphore ID error EC_NXSTSEM Non-existent semaphore EC_SEMOVF Semaphore overflow

[Description] Signals the semaphore specified by the "semaphore_id" argument. This function increments the semaphore counter, and runs the task at the top of the semaphore queue if the value of the semaphore counter becomes less than or equal to zero. ------14. Wait until semaphore is signaled ------

[Name] os_wait_sem

[Syntax] #include unsigned short os_wait_sem( unsigned char semaphore_id, long wait_limit ) ;

[Argument] semaphore_id semaphore ID wait_limit Set 0.

[Return] 0 successful completion EC_SEMID Semaphore ID error EC_NXSTSEM Non-existent semaphore EC_DELSEM Semaphore was deleted EC_TIMOUT Time out EC_SEMUDF Semaphore underflow

[Description] Waits until semaphore is signaled. os_wait_sem() decrements the semaphore counter, and suspends the execution of the calling task if the value of the semaphore counter is negative. ------15. Start window task

------

[Name] os_strt_wtsk

[Syntax] #include unsigned short os_strt_wtsk( unsigned int wghs ) ;

[Argument] wghs Global heap size of the window task in kilo-byte.

[Return] 0 Successful. 0x010C No window task exists. 0x011B Not enough memory to start the window task.

[Description] Starts the window task.

This function starts the window task. Until calling this function, the window task keeps "start pending" status and is not executed. Specify the global heap size for the window task in "wghs". Generally, 100KB is enough size. This function must be called in the main task.

[Example] The following program which is called in the main task starts the window task. #include #include void example( void ) { unsigned short ret ; ret = os_strt_wtsk( 100 ) ; if ( ret ) printf( "ERROR, can't start Window TASK.\n" ) ; else printf( "Window TASK has started.\n" ) ; } 3.10 FCA Library ======

Library outline ~~~~~~~~~~~~~~~

1. Outline

FCA(FANUC CASSETTE ADAPTOR) Library is a library of functions which are used to send or receive data between CNC and FANUC's peripheral devices like FANUC Handy File or FANUC CASSETTE ADAPTOR.

To utilize communication function with FCA Library, "Reader/Punch Interface A" option has to be equipped in the CNC.

[1] Function

Available functions are listed below. Note that actually available functions are limited by the function of the connected peripheral device. For more details refer to the operating manuals for each FCA devices.

Data Transmission : Binary, Text File Handling : Search, Delete or Rename file Directory Handling : Get file name and file size Read Status : Get status of FCA devices

[2] Protocol Following configuration is recommended. Data bits : 8 bits Stop bits : 2 bits Data transmission rate : 2400, 4800(default), 9600 [bits/sec] Parity check : none Flow control : CNC side = Hardware control(for sending) + DC control(for receiving) : FCA side = Protocol B Data code : no conversion [3] How it works

+------+ | | | Application | | | +------+------+ | +------+------+ | | | FCA Library | | | +------+------+ | +------+------+ | | | Serial Library | | | +------+------+ | +------+------+ | | | Serial Device | | | +------+

FCA Library controls serial devices via Serial Library.

[4] FCA mode When the FCA Library Function, fca_setparam(), is called, the serial port is switched to the FCA mode. In this mode, it is recommended not to use standard Serial Library Functions, rs_xxx. Though these functions can be used in the FCA mode, detailed understandings of the FCA devices are required to do that. When a serial port is switched to the FCA mode, the port becomes being under control of the application program and the signal "ER" becomes "ON". In this state, communication cable should not be disconnected or connected to protect devices from hardware damage. By calling the FCA Library Function, fca_bye(), the serial port is returned to the idle state. That is, the port is released from the control of the application program and the signal "ER" becomes "OFF". +------+ +------+ | | | +------+ | | | | | | | | -----fca_setparam()------> | | | | | | FCA mode | | | <------fca_bye()------| | | | | | | | | Idle state | | +------+ | | | | | | ------rs_open()------> | | | | | | <------rs_close()------| | | | General mode | | | | | +------+ +------+

While in FCA mode, other FCA Library Functions, fca_xxx(), can be called. If they are called prior to the fca_setparam() function, the operation of those functions are not guaranteed. One task can put multiple serial ports into FCA mode, but the port actually used is the one which is specified by the last fca_setparam() function called.

[5] Flow control

Though "Protocol B" is the standard protocol, the FCA Library Function does not set the protocol automatically, because protocols other than that can also be set on the FCA devices. Select appropriate protocol according to the setting of the connected device. As to the setting method of the protocol, refer to the General mode function, rs_open().

[6] Communication mode Transmit and receive mode is selected and data can be sent or received at any time when required. List of Functions ~~~~~~~~~~~~~~~~~

------Name Function ------1. fca_setparam Initialize communication line. 2. fca_bye Close communication line. 3. fca_open Open a binary file on FCA device. 4. fca_close Close a binary file. 5. fca_read Read binary data from the file. 6. fca_write Write binary data to the file. 7. fca_fopen Open a text file on FCA device. 8. fca_fclose Close a text device. 9. fca_getc Read a character from the text file. 10. fca_putc Write a character to the text file. 11. fca_delete Delete a file on FCA device. 12. fca_rename Change name of a file on FCA device. 13. fca_readdir Read directory information of FCA device. 14. fca_status Read status information of FCA device. 15. fca_remains Read free space size of a floppy disk. ------

(Note 1) Even when an error occurs in FCA device, FCA functions do not return error status. Function Reference ~~~~~~~~~~~~~~~~~~

------1. Initialize communication line. ------

[Name] fca_setparam

[Syntax] #include int fca_setparam( int channel, ser_t *param ) ;

struct RS_PACKET { unsigned baud ; /* baud rate */ unsigned stop_bit ; /* stop bit length */ unsigned parity ; /* parity check */ unsigned data_bit ; /* character length */ unsigned hardflow ; /* hardware flow ctrl */ unsigned dc_enable ; /* DC code flow ctrl */ unsigned dc_put ; /* send DC code */ unsigned dc1_code ; /* DC1 code */ unsigned dc2_code ; /* DC2 code */ unsigned dc3_code ; /* DC3 code */ unsigned dc4_code ; /* DC4 code */ } ; typedef struct RS_PACKET ser_t ;

[Argument] channel Channel number. ( = 1 or 2 ) param Communication parameter.

[Return] Returns zero if successful. If any error, returns non-zero value.

[Description] Specified communication channel is initialized with specified condition and opened for data transmission. When this function is called, the serial port is switched to the FCA mode. In this mode, it is recommended not to use standard Serial Library functions, rs_xxx. Though these functions can be used in the FCA mode, detailed understandings of the FCA devices are required to do that. When a serial port is switched to the FCA mode, the port becomes being under control of the application program and the signal "ER" becomes "ON". In this state, communication cable should not be disconnected or connected to protect devices from hardware damage. While in FCA mode, other FCA Library Functions, fca_xxx(), can be called. If they are called prior to the fca_setparam() function, the operation of those functions are not guaranteed. By calling fca_bye(), the serial port is returned to the idle state.

For the parameters set in the structure, ser_t, refer to the rs_open function. In case "Protocol B" is used for data transmission, following settings are recommended.

param->baud = BAUD_4800 ; param->stop_bit = STOP_2 ; param->parity = PARITY_N ; param->data_bit = DATA_8 ; param->hardflow = 2 ; param->dc_enable = 3 ; param->dc_put = 0 ; param->dc1_code = 0x11 ; param->dc2_code = 0x12 ; param->dc3_code = 0x93 ; param->dc4_code = 0x14 ;

[Example] Refer to the example in "Read binary data from the file.(fca_read)". ------2. Close communication line. ------

[Name] fca_bye

[Syntax] #include int fca_bye( int channel ) ;

[Argument] channel Channel number. ( = 1, 2 )

[Return] Returns zero if successful. If any error, returns non-zero value.

[Description] This function releases the serial port which has been put in the FCA mode by the fca_setparam() function. Signals "RS" and "ER" of the port is set "OFF".

Call this function in the following cases. 1) When disconnecting FCA devices from the port. 2) When it become unable to recover FCA devices from error state. 3) When you use Serial Library, rs_xxx.

[Example] Refer to the example in "Read binary data from the file.(fca_read)". ------3. Open a binary file on FCA device. ------

[Name] fca_open

[Syntax] #include int fca_open( char *name, int mode ) ;

[Argument] name File name on FCA device. (max. 17 characters) mode Access mode. ( = 0: read, 1: write )

[Return] Returns zero if successful. Returns -1 if any error occurs.

[Description] This function opens a binary file in the FCA device under control.

This function is used in conjunction with fca_close() function. Only functions, fca_read() and fca_write(), can be used in between fca_open() and fca_close() functions. When the character '#' is used for the first character of the argument "name", which passes the file name of the FCA device, it is assumed that file number is designated. Following formats are available. #xxxx ( xxxx is max. 4 digit number ) : xxxxth file #0 : first file #N : next file #E : last file (Note) This function can be used only when the device connected to the port is FANUC Handy File. It cannot be used for FANUC CASSETTE ADAPTOR etc..

[Example] Refer to the example in "Read binary data from the file.(fca_read)". ------4. Close a binary file. ------

[Name] fca_close

[Syntax] #include int fca_close( void ) ;

[Argument] ------

[Return] Returns zero if successful. Returns -1 if any error occurs.

[Description] This function closes the binary file which has been opened by fca_open() function.

This function is used in conjunction with fca_open() function. Only functions, fca_read() and fca_write(), can be used in between fca_open() and fca_close() functions.

(Note) This function can be used only when the device connected to the port is FANUC Handy File. It cannot be used for FANUC CASSETTE ADAPTOR etc..

[Example] Refer to the example in "Read binary data from the file.(fca_read)". ------5. Read binary data from the file. ------

[Name] fca_read

[Syntax] #include int fca_read( char *buffer, unsigned int bytes ) ;

[Argument] buffer Memory area to store read data. bytes Number of data bytes to be read. ( = 1 - 65534 )

[Return] Returns the number of data bytes actually read when successfully completed. Returns -1 if any error occurs.

[Description] When called this function reads data from the binary file opened by the fca_open() function. Because the FCA devices require the size of the transmitted data to exactly match with the size of its unit input/output data block, it can happen, when returned from this function call, that extra null characters ('\0') are added at the end of the data read. When a value smaller than the specified byte count is returned, it should be assumed that the last block of the file is read by that function call.

(Note) This function can be used only when the device connected to the port is FANUC Handy File. It cannot be used for FANUC CASSETTE ADAPTOR etc.. [Example] Following sample program displays the specified file in the FCA device connected to the first channel in binary dump format.

#include #include #include #include #define BUFSIZE 256 int example( void ) { ser_t r_para ; int ret, mode = 0, i, c ; char name[ 18 ], buffer[ BUFSIZE ] ; long count = 0 ; unsigned int bytes = BUFSIZE - 2 ;

r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ; ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return( ret ) ; } printf( " name?(max 17 )\n" ); scanf( "%s" , &name ) ; ret = fca_open ( name, mode ) ; if ( ret ) { printf( "error in fca_open\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } for ( ;; ){ ret = fca_read( buffer, bytes ) ; if ( ret == -1 ) { printf( "error in fca_read\n" ) ; fca_close() ; fca_bye( 1 ) ; return( ret ) ; } for( i = 0 ; i < ret ; i++ ) { c = buffer[ i ] ; c &= 0x00ff ; printf( "%02X", c ) ; count++ ; } if ( ret < bytes ) { printf( "\n" ) ; printf( "ret = %d\n", ret ) ; printf( "bytes = %d\n", bytes ) ; printf( "ret < bytes\n", ret ) ; break ; } } printf( "\n" ) ; printf( "%ld bytes\n", count ) ;

ret = fca_close() ; if ( ret ) { printf( "error in fca_close\n" ) ; fca_bye( 1 ) ; return ( ret ) ; }

ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye\n" ) ; } return ( ret ) ; } ------6. Write binary data to the file. ------

[Name] fca_write

[Syntax] #include int fca_read( char *buffer, unsigned int bytes ) ;

[Argument] buffer Memory area to store write data. bytes Number of data bytes to be written. ( = 1 - 65534 )

[Return] Returns the number of data bytes actually written when successfully completed. Returns -1 if any error occurs.

[Description] This function is called to write data into a binary file opened by the fca_open() function. Because the FCA devices require the size of the transmitted data to exactly match with the size of its unit input/output data block, the data is padded with null characters, '\0', when it is shorter than the unit size. As a result, it can happen that extra null characters, '\0', are added at the end of the destination file.

(Note) This function can be used only when the device connected to the port is FANUC Handy File. It cannot be used for FANUC CASSETTE ADAPTOR etc.. [Example] Following sample program writes the NC part program of specified program number into the device connected to the first channel as a file with specified name.

#include #include #include #include #define BUFSIZE 256 int example( void ) { int ret, number, i, o_num, mode = 1 ; char name[ 18 ], c, buf[BUFSIZE+4] ; ser_t r_para;

r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ; ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return ( ret ) ; } printf( " name?(max 17 )\n" ) ; scanf( "%s", &name ) ; printf( "prog. no?( ex. O1234 -> 1234 )\n" ) ; scanf( "%d" , &o_num ) ; ret = fca_open ( name, mode ) ; if ( ret ) { printf( "error in fca_open\n" ) ; fca_bye ( 1 ) ; return ( ret ) ; } ret = cnc_upstart( o_num ) ; if ( ret ) { printf( "error in cnc_upstart\n" ) ; fca_close() ; fca_bye( 1 ) ; return ( ret ) ; } for (;;) { number = BUFSIZE - 1 ; ret = cnc_upload( (struct odbup *)(&buf), &number ) ; if ( ret ) { printf( "error in cnc_upload\n" ) ; cnc_upend() ; fca_close() ; fca_bye( 1 ) ; return ( ret ) ; } ret = fca_write( &buf[4], number ) ; if ( ret == -1 ) { printf( "error in fca_write\n" ) ; cnc_upend() ; fca_close() ; fca_bye( 1 ) ; return ( ret ) ; } for ( i = 0 ; i < number ; i++ ) { printf( "%c", buf[4+i] ) ; } if ( buf[4+number-1] == '%' ) { printf( "\n" ) ; break ; } } ret = cnc_upend() ; if ( ret ) { printf( "error in cnc_upend\n" ) ; fca_close() ; fca_bye( 1 ) ; return ( ret ) ; } ret = fca_close() ; if ( ret ) { printf( "error in fca_close\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye\n" ) ; } return ( ret ) ; } ------7. Open a text file on FCA device. ------

[Name] fca_fopen

[Syntax] #include int fca_fopen( char *name, char *mode ) ;

[Argument] name File name on FCA device. (max. 17 characters) mode Access mode. ( = "r": read, "w": write )

[Return] Returns zero if successful. Returns -1 if any error occurrs.

[Description] This function opens a text file in the FCA device under control.

This function is used in conjunction with fca_fclose() function. Only functions, fca_getc() and fca_putc(), can be used in between fca_fopen() and fca_fclose() functions. When the character '#' is used for the first character of the argument "name", which passes the file name of the FCA device, it is assumed that file number is designated. Following formats are available. #xxxx ( xxxx is max. 4 digit number ) : xxxxth file #0 : first file #N : next file #E : last file

(Note) When MS-DOS format is used in the FANUC Handy File, this function cannot be used. ISO code and EIA code are the only codes that this function and fca_putc() and fca_getc() functions can handle.

[Example] Refer to the example in "Read a character from the text file. (fca_getc)". ------8. Close a text device. ------

[Name] fca_fclose

[Syntax] #include int fca_fclose( void ) ;

[Argument] ------

[Return] Returns zero if successful. Returns -1 if any error occurrs.

[Description] This function closes the text file which has been opened by fca_open() function.

This function is used in conjunction with fca_fopen() function. Only functions, fca_getc() and fca_putc(), can be used in between fca_fopen() and fca_fclose() functions. (Note) When MS-DOS format is used in the FANUC Handy File, this function cannot be used. ISO code and EIA code are the only codes that this function and fca_putc() and fca_getc() functions can handle.

[Example] Refer to the example in "Read a character from the text file. (fca_getc)". ------9. Read a character from the text file. ------

[Name] fca_getc

[Syntax] #include int fca_getc( void ) ;

[Argument] ------

[Return] Returns the number of characters read when successful. Return -1 if any error occurrs or EOF is detected.

[Description] When called, this function reads one character from the text file opened by the fca_fopen() function.

(Note) When MS-DOS format is used in the FANUC Handy File, this function cannot be used. ISO code and EIA code are the only codes that this function can handle.

[Example] Following sample program reads and displays a file, character by character, from the device connected to the first channel.

#include #include #include #include int example( void ) { ser_t r_para ; int ret ; char name[ 18 ], mode = 'r', c ; r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ;

ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return( ret ) ; }

printf( " name?(max 17 )\n" ) ; scanf( "%s" , &name ) ; ret = fca_fopen( name, &mode ) ; if ( ret ) { printf( "error in fca_fopen\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } while( ( c = fca_getc() ) != EOF ) { if ( c != 0 ) { printf( "%c", c ) ; } } printf( "\n" ) ; ret = fca_fclose() ; if ( ret ) { printf( "error in fca_fclose\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye\n" ) ; } return ( ret ) ; } ------10. Write a character to the text file. ------

[Name] fca_putc

[Syntax] #include int fca_putc( int c ) ;

[Argument] c A character data to be written.

[Return] Returns the written character if successful. Returns -1 if any error occurrs.

[Description] When called, this function writes one character into the text file opened by the fca_fopen() function.

(Note) When MS-DOS format is used in the FANUC Handy File, this function cannot be used. ISO code and EIA code are the only codes that this function can handle. [Example] Following sample program writes the NC part program of specified program number, character by character, into the device connected to the first channel as a file with the specified name.

#include #include #include #include #define BUFSIZE 256 int example( void ) { int ret, number ,i ; int o_num ; char name[ 18 ], mode = 'w', c, buf[BUFSIZE+4] ; ser_t r_para ;

r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ; ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return( ret ) ; } printf( " name?(max 17 )\n" ) ; scanf( "%s", &name ) ; printf( "prog. no?( ex. O1234 -> 1234 )\n" ) ; scanf( "%d", &o_num ) ; ret = fca_fopen( name, &mode ) ; if ( ret ) { printf( "error in fca_fopen\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } ret = cnc_upstart( o_num ) ; if ( ret ) { printf( "error in cnc_upstart\n" ) ; fca_fclose() ; fca_bye( 1 ) ; return ( ret ) ; }

for (;;) { number = BUFSIZE - 1 ; ret = cnc_upload( (struct odbup *)(&buf), &number ) ; if ( ret ) { printf( "error in cnc_upload\n" ) ; cnc_upend() ; fca_fclose() ; fca_bye( 1 ) ; return ( ret ) ; }

for ( i = 0 ; i < number ; i++ ) { ret = fca_putc( buf[4+i] ) ; if ( ret == -1 ){ printf( "error in fca_putc\n" ) ; cnc_upend() ; fca_fclose() ; fca_bye( 1 ) ; return ( ret ) ; } printf( "%c", buf[4+i] ) ; } if ( buf[4+number-1] == '%' ) break ; } printf( "\n" ) ; ret = cnc_upend() ; if ( ret ){ printf( "error in cnc_upend()\n" ) ; fca_fclose() ; fca_bye( 1 ) ; return ( ret ) ; } ret = fca_fclose() ; if ( ret ) { printf( "error in fca_close()\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye()\n" ) ; } return ( ret ) ; } ------11. Delete a file on FCA device. ------

[Name] fca_delete

[Syntax] #include int fca_delete( char *name ) ;

[Argument] name Name of the file to be deleted. (max. 17 characters)

[Return] Returns zero if successful. Returns -1 if any error occurrs.

[Description] This function deletes a file from the FCA device. When the character '#' is used for the first character of the argument "name", which passes the file name of the FCA device, it is assumed that file number is designated. #xxxx ( xxxx is max. 4 digit number ) : xxxxth file

[Example] Following sample program deletes the specified file from the FCA device connected to the first channel.

#include #include #include #include int example( void ) { ser_t r_para ; char name[18], steetas[2] ; int ret, c ; r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ;

ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return ( ret ) ; }

printf( "file name?(max 17 or #xxxx (file no ))\n" ) ; scanf( "%s", &name ) ; ret = fca_delete( name ) ; if ( ret ) { printf( "error in fca_delete\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } ret = fca_status( steetas ) ; if ( ret ) { printf( "error in fca_status\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } c = steetas[ 1 ] ; c &= 0x00ff ; printf( "status is %02X", c ) ; c = steetas[ 0 ] ; c &= 0x00ff ; printf( "%02X\n", c ) ; ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye\n" ) ; } return ( ret ) ; } ------12. Change name of a file on FCA device. ------

[Name] fca_rename

[Syntax] #include int fca_rename( char *oldname, char *newname ) ;

[Argument] oldname Old file name. (max. 17 characters) newname New file name. (max. 17 characters)

[Return] Returns zero if successful. Returns -1 if any error occurrs.

[Description] This function changes the name of the file in the FCA devices.

[Example] Following sample program changes the name of the specified file in the device connected to the first channel.

#include #include #include #include int example( void ) { ser_t r_para ; char oldname[18], newname[18], steetas[2] ; int ret, c ; r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ; ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return ( ret ) ; }

printf( "old name?(max 17 )\n" ) ; ret = scanf( "%s", &oldname ) ; printf( "new name?(max 17 )\n" ) ; ret = scanf( "%s", &newname ) ;

ret = fca_rename( oldname, newname ) ; if ( ret ) { printf( "error in fca_rename\n" ) ; fca_bye( 1 ) ; return ( ret ) ; }

ret = fca_status( steetas ) ; if ( ret ) { printf( "error in fca_status\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } c = steetas[ 1 ] ; c &= 0x00ff ; printf( "status is %02X", c ) ; c = steetas[ 0 ] ; c &= 0x00ff ; printf( "%02X\n", c ) ; ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye\n" ) ; } return ( ret ) ; } ------13. Read directory information of FCA device. ------

[Name] fca_readdir

[Syntax] #include int fca_readdir( fca_dir *buffer, int ndir, int NFILE ) ;

typedef struct { char file_name[18] ;/* file name (max. 17 alpha numeric */ /* characters+null) */ /* first byte:0xFF->not used */ /* :0x00->deleted file */ char file_size[9] ; /* file size(8 digit + null character) */ char wrt_protect ; /* write protect */ /* 'P'-> ON */ /* ' '-> OFF */ char record_code ; /* code */ /* 'B'->Binary */ /* 'E'->EIA */ /* ' '->ISO */ char vol_no[3] ; /*volume number(2 digit+null character)*/ /* ' '->single volume */ char multi_vol ; /* multi volume */ /* ' '->single volume */ /* 'C'->succeeding volume exists */ /* 'L'->last volume */ } fca_dir;

[Argument] buffer Pointer to the buffer which directory information is stored in. ndir Starting file number. NFILE Number of files to read.

[Return] Returns the number of directory information read if successful. Returns -1 if any error occurrs.

[Description] This function acquires the directory information from the FCA devices.

Follow the procedure below, to use this function. (1) Call the function with the argument (buffer,ndir,NFILE) specified as (NULL,1,0). (2) The number of directory information from the "ndir"th file to the last file is given as the return value. Allocate memory area sufficient to store above directory information and specify the pointer to this memory area as the argument "buffer". (3) Call this function again with the number of directory information given in (2) specified as the argument "NFILE".

(Note) When using MS-DOS format on FANUC Handy File, information other than file name and file size are not valid, and file size value differs from the value gotten when read by personal computer.

[Example] Following sample program acquires and displays the directory information of the device connected to the first channel.

#include #include #include #include int example( void ) { ser_t r_para ; int i, n, ret ; fca_dir buf[1] ; r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ; ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return( ret ) ; } ret = fca_readdir( NULL, 1, 0 ) ; if ( ret == -1 ) { printf( "error in fca_readdir 1\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } printf ( "file num = %d\n", ret ) ; printf ( "+--+------+------+-+-+--+-+\n" ) ; n = ret ; for ( i = 0 ; i < n ; i++ ) { ret = fca_readdir( &buf[0], i + 1, 1 ) ; if ( ret == -1 ) { printf( "error in fca_readdir 2\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } else{ printf( " %02d %-17s %-8s %c %c %-2s %c\n" , i+1 , buf[0].file_name , buf[0].file_size , buf[0].wrt_protect , buf[0].record_code , buf[0].vol_no , buf[0].multi_vol ) ; } }

ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye\n" ) ; }

return ( ret ) ; } ------14. Read status information of FCA device. ------

[Name] fca_status

[Syntax] #include int fca_status( char *buffer ) ;

[Argument] buffer Memory area to store status information. (Two bytes are required for this area.)

[Return] Returns zero if successful. Returns -1 if any error occurrs.

[Description] This function reads status information of the FCA devices.

Followings are the contents of the status data. First byte: status information 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+ | SD | 0 | PT | ERROR CODE | +----+----+----+----+----+----+----+----+ | | | +------> 0: write protect OFF | 1: write protect ON +------> 0: completed sending whole data of a file 1: being sending data of a file * For 'ERROR CODE', refer to the ERROR CODE TABLE. The error code corresponding to the latest error is read as "ERROR CODE".

Second byte: type of Floppy Disk 7 6 5 4 3 2 1 0 +----+----+----+----+----+----+----+----+ | - | - | - | C5 | - | C3 | C2 | - | +----+----+----+----+----+----+----+----+ | | | v v v 0 0 1 : single sided double density(1D) 0 1 0 : double sided double density(2D) 1 0 0 : double sided high density (2HD) (Note) It can happen that "ERROR CODE" does not indicate correct error code.

ERROR CODE TABLE

ERROR CODE CAUSE ------+------00000(= 0) no error 00001(= 1) file search error 00010(= 2) (not used) 00011(= 3) (not used) 00100(= 4) (not used) 00101(= 5) (not used) 00110(= 6) (not used) 00111(= 7) record size over 01000(= 8) (not used) 01001(= 9) protocol error 01010(=10) (not used) 01011(=11) (not used) 01100(=12) write protect error 01101(=13) (not used) 01110(=14) (not used) 01111(=15) overrun, flaming error 10000(=16) (not used) 10001(=17) FD hard error 10010(=18) RAM error 10011(=19) ROM sum check error 10100(=20) volume sequence error 10101(=21) format error 10110(=22) label error 10111(=23) door open 11000(=24) (not used) 11001(=25) (not used) 11010(=26) code error 11011(=27) (not used) 11100(=28) file read error 11101(=29) drive not ready 11110(=30) system error 11111(=31) power off error

[Example] Refer to the example in "Delete a file on FCA device.(fca_delete)". ------15. Read free space size of a floppy disk. ------

[Name] fca_remains

[Syntax] #include int fca_remains( long *remains ) ;

[Argument] remains Memory area to store the amount of remaining free space of Floppy Disk.

[Return] Returns zero if successful. Returns -1 if any error occurrs.

[Description] This function reads the amount of remaining free space ( byte count of the free space) in Floppy Disk.

(Note) When using MS-DOS format on FANUC Handy File, file size differs from that given by a personal computer. [Example] Following sample program reads and displays the amount of remaining free Tsapce in the Floppy Disk connected to the first channel.

#include #include #include #include int example( void ) { int ret ; ser_t r_para ; long remains = 0 ;

r_para.baud = BAUD_4800 ; r_para.stop_bit = STOP_2 ; r_para.parity = PARITY_N ; r_para.data_bit = DATA_8 ; r_para.hardflow = 2 ; r_para.dc_enable = 3 ; r_para.dc_put = 0 ; r_para.dc1_code = 0x11 ; r_para.dc2_code = 0x12 ; r_para.dc3_code = 0x93 ; r_para.dc4_code = 0x14 ; ret = fca_setparam( 1, &r_para ) ; if ( ret ) { printf( "error in fca_setparam\n" ) ; return ( ret ) ; } ret = fca_remains( &remains ) ; if ( ret ) { printf( "error in fca_remains\n" ) ; fca_bye( 1 ) ; return ( ret ) ; } printf( " remains = %ld\n", remains ) ; ret = fca_bye( 1 ) ; if ( ret ) { printf( "error in fca_bye\n" ) ; } return ( ret ) ; } 3.11 F-ROM Library ======

Library outline ~~~~~~~~~~~~~~~

Included in the F-ROM Library are the functions which are used to read the data files for the C Executor that are stored in the Flush ROM Module for FS30i (referred to as "F-ROM" hereafter). The data file for the C Executor (referred to as "C Executor data file" hereafter) is the file with the format which can be read by the C Executor applications. There are following three types of C Executor related files which are stored in the F-ROM.

(1) C Executor program file

This type is a conventional C Executor program file.

+------+ | | | | | C Executor program | | | | | +------+

The contents of this file is a C Executor application program which is compiled and converted to the memory card format file.

(2) C Executor program + C Executor data file This type is composed of a C Executor program file and C Executor data files combined together. +------+ | | | | | C Executor program | | | | | +------+ | Data file | | directory entry | +------+ | Data file 1 | +------+ | Data file 2 | +------+ | : | | : | | : | +------+ | Data file n | +------+ A C Executor application program is compiled and converted to the memory card format file. Then, Data files are combined to the C Executor program file by executing "dat2mem.com". When power is applied to the CNC, only program part of this type of file is loaded into D-RAM to run.

(3) C Executor data file

This type is composed of C Executor data files.

+------+ | Data file | | directory entry | +------+ | Data file 1 | +------+ | Data file 2 | | | +------+ | : | | : | | : | | : | | : | +------+ | Data file n | +------+ "dat2mem" combines multiple data files into a file and converts it to Memory_Card format file. The C Executor data file is not loaded into D-RAM in CNC.

As to the procedure to make previous types of Memory_Card files, refer to: Data file to Memory_Card file conversion utility manual (55d2m.man).

[Note] Do not call these library functions while the PMC pages are displayed on the screen. This limitation comes from the F-ROM access arbitration process. This library function can be called in any of the Main/Alarm/ Communication tasks, but they cannot be called in multiple tasks at the same time. List of functions ~~~~~~~~~~~~~~~~~

------Name Function ------1. aux_from_open Open the specified F-ROM file. 2. aux_from_close Close the F-ROM file. 3. aux_from_select Select data in the F-ROM file. 4. aux_from_moveptr Move read pointer. 5. aux_from_read Read data from the F-ROM file. 6. aux_from_getdir Read directory information of a F-ROM file. 7. aux_from_getinfo Read F-ROM file information. 8. aux_from_getc Read a character from the F-ROM file. 9. aux_from_gets Read a line from the F-ROM file. ------Function reference ~~~~~~~~~~~~~~~~~~

------1. Open the specified F-ROM file. ------

[Name] aux_from_open

[Syntax] #include int aux_from_open( char *filename, char *mode ) ;

[Argument] filename Specify the name of the C Executor file in F-ROM to open. mode Specify access mode. Mode should always be read mode, "r".

[Return] Returns zero if successful. Returns non-zero value if any error occurs. Error occurs in the following cases. * When the specified file does not exist. * When the F-ROM file is already opened by aux_from_open() function. * When the F-ROM file is already being accessed by another application.

[Description] This function opens a C Executor file in the F-ROM and makes it ready to be read. The F-ROM file which can be opened by this function is C Executor file only. Following F-ROM file names can be specified. * "CEX x.xM" ( specify either "0.5", "1.0", "2.0", "3.0", "4.0", "5.0", "6.0", for "x.x" ) * "CEX?xxxx" ('?' represents a numeric character from '0' to '9') ("xxxx" represents max. 4 alpha-numeric characters) F-ROM file name has to be specified only by upper case letters. Also, the name should be specified in exactly eight characters. In case a file name is shorter than 8 characters, add space characters (20H) to make it 8 character long. ------2. Close the F-ROM file. ------

[Name] aux_from_close

[Syntax] #include int aux_from_close( void ) ;

[Argument] ------

[Return] Returns zero if successful. Returns non-zero value if any error occurs. Error occurs in the following case. * When no F-ROM file is opened by aux_from_open() function.

[Description] This function closes an opened C Executor file. ------3. Select data in the F-ROM file. ------

[Name] aux_from_select

[Syntax] #include int aux_from_select( char *name ) ;

[Argument] name Specify file name to be selected.

[Return] Returns zero if successful. Returns non-zero value if any error occurs. Error occurs in the following case. * When specified file does not exist.

[Description] This function selects one of the data files in the C Executor data file. File name argument is specified according to the MS-DOS 8.3 format. ------4. Move read pointer. ------

[Name] aux_from_moveptr

[Syntax] #include int aux_from_moveptr( long offset, int origin ) ;

[Argument] offset Byte count from base point. origin Base point, see description.

[Return] Returns zero if successful. Returns non-zero value if any error occurs. Error occurs in the following cases. * When pointer is moved backward beyond top of file * When pointer is moved forward beyond end of file.

[Description] This function moves the position of the read pointer on currently selected file. Pointer can be moved to any position. Specify the base point for move by "origin" as follows. FROM_SEEK_CUR current pointer position FROM_SEEK_END end of file FROM_SEEK_SET top of file Moving pointer forward beyond end of file or backward beyon top of file causes error. ------5. Read data from the F-ROM file. ------

[Name] aux_from_read

[Syntax] #include int aux_from_read( unsigned char *buffer, unsigned int size ) ;

[Argument] buffer Buffer area to store read data. size Size of the data to be read.

[Return] Returns size of the data being read if successful. Returns zero if any error occurs.

[Description] This function reads data from the selected data file and stores the data in the specified buffer area. Before calling this function, a data file, which data is read from, must be selected by aux_from_select() function. ------6. Read directory information of a F-ROM file. ------

[Name] aux_from_getdir

[Syntax] #include int aux_from_getdir( struct infodir *buf, unsigned int *num ) ;

struct infodir { char name[13] ; /* file name */ char reserve_1[3] ; /* reserved(not used) */ unsigned long address ; /* address of the first byte of the file */ unsigned long size ; /* file size */ char reserve_2[8] ; /* reserved(not used) */ } ;

[Argument] buf Area to store directory information. num Area to store the number of directory entry.

[Return] Returns zero if successful, and returns non-zero value if any error occurs.

[Description] This function reads the directory information contained in C Executor data file. When "NULL" is specified for "buf", only the number of directory entry is read and stored in "num". Directory information for one data file occupies 32 bytes. ------7. Read F-ROM file information. ------

[Name] aux_from_getinfo

[Syntax] #include int aux_from_getinfo( char *name ) ;

[Argument] name C Executor file name in the F-ROM.

[Return] Returns following value if successful. CEXEC C Executor program file CEXEC_DATA C Executor program file + C Executor data file C_DATA C Executor data file

Returns -1 if following errors occur: * specified file does not exist, or * specified file is not a C Executor file.

[Description] This function reads information about files stored in the F-ROM. There are following three types of C Executor files which is stored in the F-ROM. This function gives the type of the specified file. (1) C Executor program file This type is a Conventional C Executor program file. (2) C Executor program + C Executor data file Conventional C Executor program file and multiple C Executor data files are combined. (3) C Executor data file Data files for C Executor. "name" specifies the name of the F-ROM file. Following names can be specified as F-ROM file name * "CEX x.xM" ( specify either "0.5", "1.0", "2.0", "3.0", "4.0", "5.0", "6.0", for "x.x" )

* "CEX?Xxxx" ('?' represents a numeric character from '0' to '9') ("xxxx" represents max. 4 alpha-numeric characters) F-ROM file name has to be specified only by upper case letters. Also, the name should be specified in exactly eight characters. In case a file name is shorter than 8 characters, add space characters (20H) to make it 8 character long. ------8. Read a character from the F-ROM file. ------

[Name] aux_from_getc

[Syntax] #include unsigned int aux_from_getc( void ) ;

[Argument] ------

[Return] Return the character being read if successful. Returns 0xFF if any error occurs.

[Description] This function gets one character from selected data file.

This function replaces line termination code, "Carriage Return + Line Feed ( CR + LF)", with single Line Feed character LF. When error occurs or end of file is detected, 0xFF is returned. Before calling this function, a data file, which data is read from, must be selected by aux_from_select() function. ------9. Read a line from the F-ROM file. ------

[Name] aux_from_gets

[Syntax] #include int aux_from_gets( unsigned char *buffer, unsigned int size ) ;

[Argument] buffer Buffer area to store data being read. size Data size to be read.

[Return] Returns zero if successful. Returns -1 if any error occurs.

[Description] This function reads one line of data from the selected data file and stores the data in the specified buffer area.

A line is made up with all characters read before Line Feed character ('\n'). Line Feed character being read is stored in the buffer. A null character ('\0') is added at the end of the line. Reading character continues until Line Feed character ('\n) is encountered, end of file is detected or "size - 1" number of characters are read. This function replaces line termination code, "Carriage Return + Line Feed ( CR + LF)", with single Line Feed character LF. Before calling this function, a data file, which data is read from, must be selected by aux_from_select() function. [Example 1] /* Select a file, TEST02.DAT, read and display 10 bytes of data from the beginning of the file. Then move read pointer 50 bytes ahead of current position, and read and display 50 bytes of data.

Used functions : aux_from_open , aux_from_close , aux_from_select aux_from_read , aux_from_moveptr

*/ void sample1(){

int i, ret ; unsigned char read_buf[SIZE] ; int read_size, offset ;

if ( aux_from_open( "CEX 1.0M", "r" ) ) { printf( "Failed opening file\n" ) ; } else { if ( aux_from_select( "TEST02.DAT" ) ) { printf( "specified file not exist\n" ) ; } else { read_size = 10 ; ret = aux_from_read( read_buf, read_size ) ; if (ret != 0 ) { for ( i=0 ; i

Used functions : aux_from_open , aux_from_close , aux_from_getdir

*/ void sample2() {

int dir_num, ret , i ; typedef infodir *dirarea ; dirarea dir_area ;

printf( "List directory information\n" ) ;

if ( aux_from_open( "CEX 1.0M", "r" ) ) { printf( " Failed opening file\n" ) ; } else { if ( aux_from_getdir( (infodir *)NULL, &dir_num ) ) { printf( "No directory information found\n" ) ; } else { if ( dir_num > 0 ) { printf( " --- directory list --- : %d file[s]\n", dir_num ) ; dir_area =(infodir *)malloc( 32 * (dir_num) ) ; if ( dir_area != 0 ) { if ( aux_from_getdir( dir_area, &dir_num ) ) { printf( "ERROR\n" ) ; } else { while ( dir_num > 0 ) { printf ( "%10s \n", &(dir_area->name) ) ; dir_num-- ; (unsigned int)dir_area += 32 ; } } } else { printf( "Could not allocate memory\n " ) ; } } } aux_from_close() ; } } [Example 3] /* Get information of F-ROM file CEX 1.0M, and display.

Used function : aux_from_getinfo

*/ void sample3() {

int file_type ;

printf( "Showing F-ROM file information\n" ) ; file_type = aux_from_getinfo( "CEX 1.0M" ) ; switch ( file_type ) { case ( CEXEC ) : { printf( "C Executor program \n" ) ; break ; } case ( CEXEC_DATA ) : { printf( "C Executor program + C Executor data file \n" ) ; break ; } case ( C_DATA ) : { printf( "C Executor data file \n" ) ; break ; } default : { printf( "ERROR !! Error code:%x \n", file_type ) ; } } } 3.12 Touch-panel Library ======

Overview of library ~~~~~~~~~~~~~~~~~~~

1. Overview

In case that the display device is "10.4-inch LCD with touch-panel", the C application can read status of the touch-panel. The information to be read is;

Whether touch-panel is pushed or not. The coordinate of the pushed point if pushed.

The CNC option "Touch-panel" is required to use touch-panel library.

2. Touch-panel coordinate

The touch-panel library uses the following X-Y coordinate system whose origin is put at the upper-left point to represent points on the touch-panel.

----> X | +------+ | |(0,0) | v | | Y | | | | | | | | | | | | | | | | | | | (xxxx,yyyy)| +------+

The cooridinate on the touch-panel is represented as (X,Y) format using this coordinate system. (X:horizontal position, Y:vertical position) The whole coordinate range is (X,Y)=(0,0) - (639,479). This coordi- nate corresponds with the C Executor screen as below.

+------+ ----- |(0,0) | ^ +------+ -- | |(0,48) | ^ | | | | | | | | | | | | | | | B A | | | | | | | | | (639,447)| v | +------+ -- | | (639,479)| v +------+ -----

A: 640x480 dots (using whole screen.)

Text mode CRT_MODE_V30 Graphic mode _VRES16COLOR, _VRES16EXCOLOR, _VRES256COLOR The touch-panel coordinate is same as the graphic coordinate (physical coordinate) for both X and Y.

B: 640x400 dots Text mode CRT_MODE_80X25 Graphic mode _98RESS16COLOR, _98RESS8COLOR, _98RESSCOLOR, _98RES16COLOR, _98RES8COLOR, _98RESCOLOR The relation of the touch-panel and the graphic (physical) coordi- nate is as follows. X(touch-panel) = X(graphic) Y(touch-panel) = Y(graphic) + 48

The relationship between touch-panel and graphic coordinate mentioned here establishes while the touch-panel is calibrated correctly. If the touch-panel is not exactly calibrated, there are little differences between display position and touch-panel coordinate.

[Note] The touch-panel can sense only one point at a time. When multiple points are pushed simultaneously, the center point of all pushed points (in consideraton of each pressure) is read. For example, when (100,100) and (200,300) are pushed simultaneously, touch-panel senses that somewhere between (100,100) and (200,300) is pushed. This is caused by the physical specification (analog sensing) of the touch-panel. List of Functions ~~~~~~~~~~~~~~~~~

------Name Function ------1. aux_tpl_read Read the status and (X,Y) coordinate of the touch-panel. ------Function Reference ~~~~~~~~~~~~~~~~~~

------1. Read the status and (X,Y) coordinate of the touch-panel. ------

[Name] aux_tpl_read

[Syntax] #include int aux_tpl_read( struct tpl_xy_coord *buf ) ;

struct tpl_xy_coord { unsigned int tpl_x_coord ; /* X-coordinate */ unsigned int tpl_y_coord ; /* Y-coordinate */ } ;

[Argument] buf X-Y coordinate structure of touch-panel.

[Return] 0x80 - 0x82 Touch-panel is being pushed. 0x00 Touch-panel is not being pushed, or any error occurs.

[Description] Reads the touch-panel status and the coordinate value of the pushed point when touch-panel is pushed. One of 0x80, 0x81 or 0x82 is returned as the return value when the touch-panel is pushed. The difference of these values is as follows. Value Status ------+------0x80 Start pushing. (received HEAD data) 0x81 Keep pushing. (received BODY data) 0x82 End pushing. received TAIL data)

Start pushing End pushing v v +------+ | | ------+ +------^ ^ ^ ^ HEAD BODY BODY ... TAIL The status of touch-panel is not buffered. The status at calling this function by the application program is just returned. So, HEAD, BODY, TAIL are not exactly read as this order according to timing of calling by the application program. Usually it is not needed for the application program to distinguish return values, 0x80, 0x81 and 0x82. It is possible to assume that "Touch-panel is pushed" for all return value 0x80 - 0x82. When the return value of this function changes 0x00 -> 0x8N (N=0,1,2), assume that "start pushing". In the same way, "0x8N -> 0x8N" is "keep pushing" and "0x8N -> 0x00" is "end pushing".

When the touch-panel is pushed, X and Y coordinates of the pushed points are stored in each "buf.tpl_x_coord" and "buf.tpl_y_coord" with binary format.

Touch-panel without calibration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The touch-panel is used under calibrated condition usually. "Calibrated condition" is that the calibration data is set to match the actual pushed poisition with the detected coordinate. By clearing the memory of CNC (SRAM), also the calibration data are cleared and the touch-panel is made no-calibrated condition. The near correct pushed coordinates are read under no-calibrated condition. This function returns the different values from the calibrated condition.

Value Status ------+------0x88 Received HEAD data. 0x89 Received BODY data. 0x8A Received TAIL data. That is, the bit3 of the return value indicates that the no-calibrated coordinate data are received. When "Touch-panel" option doesn't exist in CNC, this function returns "0". [Example] The following program wait until touch-panel is pushed, and displays coordinate of the pushed point.

#include #include void example( void ) { struct tpl_xy_coord buf ; int ret ;

while ( !( ret = aux_tpl_read( &buf ) ) ) ; printf( "Touch panel is pushed at (%u,%u),", buf.tpl_x_coord, buf.tpl_y_coord ) ; printf( " this is " ) ; switch ( ret & ~TPL_NOCAL ) { case TPL_HEAD : printf( "HEAD" ) ; break ; case TPL_BODY : printf( "BODY" ) ; break ; case TPL_TAIL : printf( "TAIL" ) ; break ; } printf( " data.\n" ) ; } 4. Code Tables ======

4.1 Keycode, screen control code ======

4.1.1 Keycode

+----+------+------+------+------+------+------+------+------+ | | 0x | 1x | 2x | 3x | 4x | 5x | 6x | 7x | |----+------+------+------+------+------+------+------+------| | x0 | | | SP | 0 | @ | P | | | | x1 | | | | 1 | A | Q | | | | x2 | | | | 2 | B | R | | | | x3 | | | # | 3 | C | S | | | | x4 | | | | 4 | D | T | | | | x5 | | | | 5 | E | U | | | | x6 | | | & | 6 | F | V | | | | x7 | | | | 7 | G | W | | | | x8 | CAN | | ( | 8 | H | X | | | | x9 | | | ) | 9 | I | Y | | | | xA | EOB | | * | | J | Z | | | | xB | | | + | | K | [ | | | | xC | | | , | | L | | | | | xD |INPUT | | - | = | M | ] | | | | xE | | | . | | N | | | | | xF | | | / | ? | O | | | | +----+------+------+------+------+------+------+------+------+ +----+------+------+------+------+------+------+------+------+ | | 8x | 9x | Ax | Bx | Cx | Dx | Ex | Fx | |----+------+------+------+------+------+------+------+------| | x0 | |RESET | | | | | |F0 | | x1 | | | | | | | |F1 | | x2 | | | | | | | |F2 | | x3 | | | | | | | |F3 | | x4 | |INSERT| | | | | |F4 | | x5 | |DELETE| | | | | |F5 | | x6 | |ALTER | | | | | |F6 | | x7 | | | | | | | |F7 | | x8 |Curs->| | | | | | POS |F8 | | x9 |Curs<-| | | | | | PROG |F9 | | xA |CursDn| HELP | | | | |OFFSET | | | xB |CursUp| | | | | |SYSTEM | | | xC | | | | | | |MESSAG | | | xD | | | | | | |GRAPH | | | xE |PageDn| | | | | |CUSTOM | FR | | xF |PageUp| | | | | |CUSTOM2| FL | +----+------+------+------+------+------+------+------+------+ - Usage : For example, the keycode for the key 'A' is given as "41" (hex) by combining "4x" and "x1". - SP stands for space(white space). - Function keys or screen selection keys, POS .. CUSTOM, usually cannot be read from application program. - Keys F0 .. F9,FR,FL are soft-keys. 4.1.2 Keycode of special keys on MDI panel

(1) Cursor key, Page key

Key Symbol Code ------+------+------CursorRight MDIKEY_CURRIGHT 0x88 CursorLeft MDIKEY_CURLEFT 0x89 CursorDown MDIKEY_CURDOWN 0x8A CursorUp MDIKEY_CURUP 0x8B PageDown MDIKEY_PAGEDN 0x8E PageUp MDIKEY_PAGEUP 0x8F

(2) Editing key

Key Symbol Code ------+------+------[CAN] MDIKEY_CAN 0x08 [EOB] MDIKEY_EOB 0x0A [INPUT] MDIKEY_INPUT 0x0D [INSERT] MDIKEY_INSERT 0x94 [DELETE] MDIKEY_DELETE 0x95 [ALTER] MDIKEY_ALTER 0x96

(3) Other keys Key Symbol Code ------+------+------[RESET] MDIKEY_RESET 0x90 [HELP] MDIKEY_HELP 0x9A

(4) Soft keys [FL] [F0][F1][F2][F3][F4] [F5][F6][F7][F8][F9] [FR] Key Symbol Code ------+------+------[F0] MDIKEY_14_F0 0xF0 [F1] MDIKEY_14_F1 0xF1 [F2] MDIKEY_14_F2 0xF2 [F3] MDIKEY_14_F3 0xF3 [F4] MDIKEY_14_F4 0xF4 [F5] MDIKEY_14_F5 0xF5 [F6] MDIKEY_14_F6 0xF6 [F7] MDIKEY_14_F7 0xF7 [F8] MDIKEY_14_F8 0xF8 [F9] MDIKEY_14_F9 0xF9 [FR] MDIKEY_FR 0xFE [FL] MDIKEY_FL 0xFF (5) Function keys

Key Symbol Code ------+------+------[POS] MDIKEY_POS 0xE8 [PROG] MDIKEY_PROG 0xE9 [OFFSET] MDIKEY_OFFSET 0xEA [SYSTEM] MDIKEY_SYSTEM 0xEB [MESSAGE] MDIKEY_MESSAGE 0xEC [GRAPH] MDIKEY_GRAPH 0xED [CUSTOM] MDIKEY_CUSTOM 0xEE [CUSTOM2] MDIKEY_CUSTOM 0xEF

4.1.3 CRT display control characters

Code Symbol Function ------+------+------0x08 BS Move cursor left one column. 0x09 TAB Move cursor to the next tab stop. (every 8 columns) 0x0A LF Move cursor down one line. 0x0D CR Move cursor to the beginning of the current line. 0x1B ESC Start escape sequence. 0x1E HOME Move cursor to the home position(upper left corner of the screen).

4.1.4 Display control escape sequences (1) Cursor movement Escape sequence Function ------+------ESC [H Move cursor to the home position. ESC [l;cH Move cursor to the c th column of the first line. (upper left corner of the screen is addressed as line 1, column 1) ESC [nA Move cursor up n lines. (move 1 line if n is omitted.) ESC [nB Move cursor down n lines. (move 1 line if n is omitted.) ESC [nC Move cursor right n columns. (move 1 column if n is omitted.) ESC [nD Move cursor left n columns. (move 1 column if n is omitted.) ESC D Move cursor down 1 line. Scroll up one line if cursor is at the bottom line. ESC E Move cursor to the left most column of the next line. Scroll up one line if cursor is at the bottom line. ESC M Move cursor up 1 line. Scroll down one line if cursor is at the top line. ESC [s Save current cursor position. ESC [u Restore cursor to the position saved by "ESC [s". (2) Deleting

Escape sequence Function ------+------ESC [K Delete from current cursor position to end of line. ESC [0K Same as above. ESC [1K Delete from current cursor position to beginning of line. ESC [2K Delete current line. ESC [J Delete from current cursor position to end of screen. ESC [0J Same as above. ESC [1J Delete from current cursor position to beginning of screen. ESC [2J Delete whole screen.

(3) Inserting/Deleting line

Escape sequence Function ------+------ESC [nL Scroll current cursor line and succeeding lines down n lines, insert n blank lines and move cursor to the beginning of the first newly inserted blank line. ESC [nM Delete n lines beginning from current cursor line to downward, scroll up following lines and move cursor to the beginning of the first line of those scrolled up.

(4) Display mode setting Escape sequence Function ------+------ESC [7h Turn on automatic wrapping around. (Default) ESC [?7h Same as above. ESC [7l Turn off automatic wrapping around. ESC [?7l Same as above. ESC [>5l Make cursor visible. (Default) ESC [>5h Make cursor invisible. ESC [>9l Output video signals to CRT. (Default) ESC [>9h Not output video signals to CRT. (5) Character attribute

Escape sequence Function ------+------ESC [0m Restore default attribute. (White, no blinking, no reverse video) ESC [5m Turn on blinking. ESC [7m Turn on reverse video mode. ESC [25m Turn off blinking. ESC [27m Turn off reverse video mode. ESC [30m Black. ESC [31m Red. ESC [32m Green. ESC [33m Yellow. ESC [34m Blue. ESC [35m Magenta. ESC [36m Cyan. ESC [37m White.

For monochrome display device, brightness of each character changes according to color specification as follows. Color Black Red Green Yellow Blue Magenta Cyan White ------+------Brightness Low <------> High

For VGA display device, additional escape sequences are available as follows. Escape sequence Function ------+------ESC [1m Turn on low intensity color. ESC [2m Don't draw background part of character. ESC [3m Turn on low intensity color for background. ESC [21m Draw background part of character. (Default) ESC [22m Turn off low intensity color. ESC [23m Turn off low intensity color for background. ESC [40m Background black. ESC [41m Background red. ESC [42m Background green. ESC [43m Background yellow. ESC [44m Background blue. ESC [45m Background magenta. ESC [46m Background cyan. ESC [47m Background white. On VGA display device, actual displayed colors for each escape sequence are defined by setting of color palettes for character display. The color palettes for character display are changeable by crt_setpalette function. (6) Selecting character set

Escape sequence Function ------+------ESC (1 Select special characters and fragment set of 6x magnified numeric characters. ESC (2 Select fragment set of 6x magnified alphabetic characters. ESC (3 Select graphic character set. ESC (4 Select standard character set. (Default) ESC (6 Select 6x magnified character set. ESC (7 Select European character set (umlaut etc.) ESC (8 Select user defined character set. ESC (A Select JIS Kanji character set (Shift-JIS code). ESC (B Select FANUC Kanji character set (Shift-JIS code). (Default) ESC (C Select FANUC Kanji character set(Shift-FANUC code). ESC (a Select JIS character set (half-size, large font). ESC (b Select JIS character set (half-size, small font). ESC (E Select 9-inch font. ESC (F Select 14-inch font. (Default) 4.2 Displayable characters ======

4.2.1 Single byte characters

(1) Displayable characters

The characters, 20-7F, A0-DF, shown in the following table can be displayed on the screen. | 0123456789ABCDEF -----+------0000 | 0010 | 0020 | !"#$%&'()*+,-./ 0030 | 0123456789:;<=>? 0040 | @ABCDEFGHIJKLMNO NOTE: '\' is not a BACKSLASH, 0050 | PQRSTUVWXYZ[\]^_ but a Japanese YEN mark. 0060 | `abcdefghijklmno '~' is not a TILDE mark, 0070 | pqrstuvwxyz{|}~ but a OVERBAR. 0080 | 0090 | 00A0 | xxxxxxxxxxxxxxx -+ 00B0 | xxxxxxxxxxxxxxxx | This part is Japanese half-size 00C0 | xxxxxxxxxxxxxxxx | character set (KATAKANA). 00D0 | xxxxxxxxxxxxxxxx -+ 00E0 | 00F0 | (Note) Mesh mark is displayed for the character code 7F, and wave mark for A0. Above is the code table for the standard character set. ( "ESC (4" )

(2) Control code Following control codes are supported.

Code Symbol Function ------+------+------08 BS Move cursor left one column. 09 TAB Move cursor to the next tab stop. (every 8 columns) 0A LF Move cursor down one line. 0D CR Move cursor to the beginning of the current line. 1B ESC Start escape sequence. 1E HOME Move cursor to the home position(upper left corner of the screen). 4.2.2 2-byte characters

(1) JIS 1st level character set

Following KANJI characters of JIS 1st level character set are available in C Executor. The characters in parentheses cannot be displayed. If these characters are output, double width space is displayed instead. FANUC original special marks are assigned to 885F through 889D of SJIS code. These special marks are described later.

------CHARACTER TABLE IS NOT LISTED IN THIS FILE. SEE "42CHAR_J.MAN" FOR JAPANESE KANJI CHARACTER SET. ------

(2) JIS 2nd level character set

Only following Kanji characters in JIS 2nd level character set are available for display. If JIS 2nd level Kanji characters other than following are output, double width space is displayed instead. ------CHARACTER TABLE IS NOT LISTED IN THIS FILE. SEE "42CHAR_J.MAN" FOR JAPANESE KANJI CHARACTER SET. ------(3) FANUC special marks

The FANUC special marks which are assigned to JIS 1st level character set code are shown below.

No. SJIS [JIS ] FANUC Character ------+------+------+------01 885F [2F40] 0752 right arrow 02 8860 [2F41] 0754 right-up arrow 03 8861 [2F42] 0756 up arrow 04 8862 [2F43] 0758 left-up arrow 05 8863 [2F44] 075A left arrow 06 8864 [2F45] 075C left-down arrow 07 8865 [2F46] 075E down arrow 08 8866 [2F47] 0760 right-down arrow 09 8867 [2F48] 0762 CW arrow 10 8868 [2F49] 0764 CCW arrow 11 8869 [2F4A] 0766 small arc 12 886A [2F4B] 0768 large arc 13 886B [2F4C] 076A small rectangle 14 886F [2F50] 077C finishing mark 1 15 8870 [2F51] 077E finishing mark 2 16 8871 [2F52] 0780 finishing mark 3 17 8872 [2F53] 0782 finishing mark 4 18 8880 [2F60] 1240 1/1 19 8881 [2F61] 1242 2/2 20 8882 [2F62] 1244 3/3 21 8883 [2F63] 1246 4/4 22 8884 [2F64] 1248 5/5 23 8885 [2F65] 124A 6/6 24 8886 [2F66] 124C 25 8887 [2F67] 124E 26 8888 [2F68] 1250 millimeter (mm) 27 8889 [2F69] 1252 centimeter (cm) 28 888A [2F6A] 1254 kilometer (km) 29 888B [2F6B] 1256 square centimeter (cm^2) 30 888C [2F6C] 1258 square meter (m^2) 31 888D [2F6D] 125A square kilometer (km^2) 32 888E [2F6E] 125C cubic centimeter (cm^3) 33 888F [2F6F] 125E cubic meter (m^3) 34 8890 [2F70] 1260 milligram (mg) 35 8891 [2F71] 1262 kilogram (kg) 36 8892 [2F72] 1264 (cc) 37 8893 [2F73] 1266 deciliter (dl) 38 8894 [2F74] 1268 liter (l) 39 8895 [2F75] 126A kiloliter (kl) 40 8896 [2F76] 126C millisecond (ms) 41 8897 [2F77] 126E microsecond 42 8898 [2F78] 1270 nanosecond (ns) 43 8899 [2F79] 1272 horse power (HP) 44 889A [2F7A] 1274 horse power (ps) 45 889B [2F7B] 1276 hertz (Hz) 46 889C [2F7C] 1278 joint-stock corporation 47 889D [2F7D] 127A copyright ((c)) (4) Describing 2-byte characters in source-codes

The DIAB-SDS compiler does not support Japanese language. If a 2-byte charac- ter whose second byte happens to be 5Ch is included directly in a source file, it is not recognized as correct data.

JIS 1st level character set

------CHARACTER TABLE IS NOT LISTED IN THIS FILE. SEE "42CHAR_J.MAN" FOR JAPANESE KANJI CHARACTER SET. ------

JIS 2nd level character set

------CHARACTER TABLE IS NOT LISTED IN THIS FILE. SEE "42CHAR_J.MAN" FOR JAPANESE KANJI CHARACTER SET. ------4.2.3 Display code for single byte characters

In the following tables, the code of the FANUC characters in each character set selected by the escape sequences, "ESC (x", are shown. . If , for example, 0x20 (space) is output in the "ESC (1" mode, FANUC character of the code 0x00E0 is displayed on the screen.

(1) "ESC (1" Special characters, Fragments of 6x magnified numeric characters

+----+------+------+------+------+------+------+------+------+------+------+ | | 2x | 3x | 4x | 5x | 6x | 7x | Ax | Bx | Cx | Dx | |----+------+------+------+------+------+------+------+------+------+------| | x0 | 00E0 | 00F8 | 0108 | 0118 | 0128 | 0138 | | 0760 | 0770 | 01F0 | | x1 | 00E1 | 00F9 | 0109 | 0119 | 0129 | 0139 | | 0761 | 0771 | 01F1 | | x2 | 00E2 | 00FA | 010A | 011A | 012A | 013A | 0752 | 0762 | 0772 | 01F2 | | x3 | 00E3 | 00FB | 010B | 011B | 012B | 013B | 0753 | 0763 | 0773 | 01F3 | | x4 | 00E4 | 00FC | 010C | 011C | 012C | 01D8 | 0754 | 0764 | 01E4 | 01F4 | | x5 | 00E5 | 00FD | 010D | 011D | 012D | 01D9 | 0755 | 0765 | 01E5 | 01F5 | | x6 | 00E6 | 00FE | 010E | 011E | 012E | 01DA | 0756 | 0766 | 01E6 | 01F6 | | x7 | 00E7 | 00FF | 010F | 011F | 012F | 01DB | 0757 | 0767 | 01E7 | 01F7 | | x8 | 00F0 | 0100 | 0110 | 0120 | 0130 | 01DC | 0758 | 0768 | 01E8 | 01F8 | | x9 | 00F1 | 0101 | 0111 | 0121 | 0131 | 01DD | 0759 | 0769 | 01E9 | 01F9 | | xA | 00F2 | 0102 | 0112 | 0122 | 0132 | 01DE | 075A | 076A | 01EA | 01FA | | xB | 00F3 | 0103 | 0113 | 0123 | 0133 | 01DF | 075B | 076B | 01EB | 01FB | | xC | 00F4 | 0104 | 0114 | 0124 | 0134 | 01E0 | 075C | 076C | 01EC | 01FC | | xD | 00F5 | 0105 | 0115 | 0125 | 0135 | 01E1 | 075D | 076D | 01ED | 01FD | | xE | 00F6 | 0106 | 0116 | 0126 | 0136 | 01E2 | 075E | 076E | 01EE | 01FE | | xF | 00F7 | 0107 | 0117 | 0127 | 0137 | 01E3 | 075F | 076F | 01EF | 01FF | +----+------+------+------+------+------+------+------+------+------+------+

(2) "ESC (2" Fragments of 6x magnified alphabetic characters +----+------+------+------+------+------+------+------+------+------+------+ | | 2x | 3x | 4x | 5x | 6x | 7x | Ax | Bx | Cx | Dx | |----+------+------+------+------+------+------+------+------+------+------| | x0 | 013C | 014C | 015C | 016C | 017C | 018C | 019C | 01AC | 01BC | 01CC | | x1 | 013D | 014D | 015D | 016D | 017D | 018D | 019D | 01AD | 01BD | 01CD | | x2 | 013E | 014E | 015E | 016E | 017E | 018E | 019E | 01AE | 01BE | 01CE | | x3 | 013F | 014F | 015F | 016F | 017F | 018F | 019F | 01AF | 01BF | 01CF | | x4 | 0140 | 0150 | 0160 | 0170 | 0180 | 0190 | 01A0 | 01B0 | 01C0 | 01D0 | | x5 | 0141 | 0151 | 0161 | 0171 | 0181 | 0191 | 01A1 | 01B1 | 01C1 | 01D1 | | x6 | 0142 | 0152 | 0162 | 0172 | 0182 | 0192 | 01A2 | 01B2 | 01C2 | 01D2 | | x7 | 0143 | 0153 | 0163 | 0173 | 0183 | 0193 | 01A3 | 01B3 | 01C3 | 01D3 | | x8 | 0144 | 0154 | 0164 | 0174 | 0184 | 0194 | 01A4 | 01B4 | 01C4 | 01D4 | | x9 | 0145 | 0155 | 0165 | 0175 | 0185 | 0195 | 01A5 | 01B5 | 01C5 | 01D5 | | xA | 0146 | 0156 | 0166 | 0176 | 0186 | 0196 | 01A6 | 01B6 | 01C6 | 01D6 | | xB | 0147 | 0157 | 0167 | 0177 | 0187 | 0197 | 01A7 | 01B7 | 01C7 | 01D7 | | xC | 0148 | 0158 | 0168 | 0178 | 0188 | 0198 | 01A8 | 01B8 | 01C8 | | | xD | 0149 | 0159 | 0169 | 0179 | 0189 | 0199 | 01A9 | 01B9 | 01C9 | | | xE | 014A | 015A | 016A | 017A | 018A | 019A | 01AA | 01BA | 01CA | | | xF | 014B | 015B | 016B | 017B | 018B | 019B | 01AB | 01BB | 01CB | | +----+------+------+------+------+------+------+------+------+------+------+ (3) "ESC (3" Graphic characters

+----+------+------+------+------+------+------+------+------+------+------+ | | 2x | 3x | 4x | 5x | 6x | 7x | Ax | Bx | Cx | Dx | |----+------+------+------+------+------+------+------+------+------+------| | x0 | 1D50 | 1D60 | 1D70 | 1D80 | 1D90 | 1DA0 | 1DB0 | 1DC0 | 1DD0 | 1DE0 | | x1 | 1D51 | 1D61 | 1D71 | 1D81 | 1D91 | 1DA1 | 1DB1 | 1DC1 | 1DD1 | 1DE1 | | x2 | 1D52 | 1D62 | 1D72 | 1D82 | 1D92 | 1DA2 | 1DB2 | 1DC2 | 1DD2 | 1DE2 | | x3 | 1D53 | 1D63 | 1D73 | 1D83 | 1D93 | 1DA3 | 1DB3 | 1DC3 | 1DD3 | 1DE3 | | x4 | 1D54 | 1D64 | 1D74 | 1D84 | 1D94 | 1DA4 | 1DB4 | 1DC4 | 1DD4 | 1DE4 | | x5 | 1D55 | 1D65 | 1D75 | 1D85 | 1D95 | 1DA5 | 1DB5 | 1DC5 | 1DD5 | 1DE5 | | x6 | 1D56 | 1D66 | 1D76 | 1D86 | 1D96 | 1DA6 | 1DB6 | 1DC6 | 1DD6 | 1DE6 | | x7 | 1D57 | 1D67 | 1D77 | 1D87 | 1D97 | 1DA7 | 1DB7 | 1DC7 | 1DD7 | 1DE7 | | x8 | 1D58 | 1D68 | 1D78 | 1D88 | 1D98 | 1DA8 | 1DB8 | 1DC8 | 1DD8 | 1DE8 | | x9 | 1D59 | 1D69 | 1D79 | 1D89 | 1D99 | 1DA9 | 1DB9 | 1DC9 | 1DD9 | 1DE9 | | xA | 1D5A | 1D6A | 1D7A | 1D8A | 1D9A | 1DAA | 1DBA | 1DCA | 1DDA | 1DEA | | xB | 1D5B | 1D6B | 1D7B | 1D8B | 1D9B | 1DAB | 1DBB | 1DCB | 1DDB | 1DEB | | xC | 1D5C | 1D6C | 1D7C | 1D8C | 1D9C | 1DAC | 1DBC | 1DCC | 1DDC | 1DEC | | xD | 1D5D | 1D6D | 1D7D | 1D8D | 1D9D | 1DAD | 1DBD | 1DCD | 1DDD | 1DED | | xE | 1D5E | 1D6E | 1D7E | 1D8E | 1D9E | 1DAE | 1DBE | 1DCE | 1DDE | 1DEE | | xF | 1D5F | 1D6F | 1D7F | 1D8F | 1D9F | 1DAF | 1DBF | 1DCF | 1DDF | 1DEF | +----+------+------+------+------+------+------+------+------+------+------+

(4) "ESC (4" Standard character set

+----+------+------+------+------+------+------+------+------+------+------+ | | 2x | 3x | 4x | 5x | 6x | 7x | Ax | Bx | Cx | Dx | |----+------+------+------+------+------+------+------+------+------+------| | x0 | 0020 | 0030 | 0040 | 0050 | 0F80 | 0F90 | 00A0 | 00B0 | 00C0 | 00D0 | | x1 | 0021 | 0031 | 0041 | 0051 | 0F81 | 0F91 | 00A1 | 00B1 | 00C1 | 00D1 | | x2 | 0022 | 0032 | 0042 | 0052 | 0F82 | 0F92 | 00A2 | 00B2 | 00C2 | 00D2 | | x3 | 0023 | 0033 | 0043 | 0053 | 0F83 | 0F93 | 00A3 | 00B3 | 00C3 | 00D3 | | x4 | 0024 | 0034 | 0044 | 0054 | 0F84 | 0F94 | 00A4 | 00B4 | 00C4 | 00D4 | | x5 | 0025 | 0035 | 0045 | 0055 | 0F85 | 0F95 | 00A5 | 00B5 | 00C5 | 00D5 | | x6 | 0026 | 0036 | 0046 | 0056 | 0F86 | 0F96 | 00A6 | 00B6 | 00C6 | 00D6 | | x7 | 0027 | 0037 | 0047 | 0057 | 0F87 | 0F97 | 00A7 | 00B7 | 00C7 | 00D7 | | x8 | 0028 | 0038 | 0048 | 0058 | 0F88 | 0F98 | 00A8 | 00B8 | 00C8 | 00D8 | | x9 | 0029 | 0039 | 0049 | 0059 | 0F89 | 0F99 | 00A9 | 00B9 | 00C9 | 00D9 | | xA | 002A | 003A | 004A | 005A | 0F8A | 0F9A | 00AA | 00BA | 00CA | 00DA | | xB | 002B | 003B | 004B | 005B | 0F8B | 0F9B | 00AB | 00BB | 00CB | 00DB | | xC | 002C | 003C | 004C | 005C | 0F8C | 0F9C | 00AC | 00BC | 00CC | 00DC | | xD | 002D | 003D | 004D | 005D | 0F8D | 0F9D | 00AD | 00BD | 00CD | 00DD | | xE | 002E | 003E | 004E | 005E | 0F8E | 0F9E | 00AE | 00BE | 00CE | 00DE | | xF | 002F | 003F | 004F | 005F | 0F8F | 0F9F | 00AF | 00BF | 00CF | 00DF | +----+------+------+------+------+------+------+------+------+------+------+ (5) "ESC (6" Fragments of 6x magnified characters

+----+------+------+------+------+------+------+------+------+------+------+ | | 2x | 3x | 4x | 5x | 6x | 7x | Ax | Bx | Cx | Dx | |----+------+------+------+------+------+------+------+------+------+------| | x0 | | 0100 | | 0196 | | | | | | | | x1 | | 0106 | 013C | 019C | | | | | | | | x2 | | 010C | 0142 | 01A2 | | | 1CE0 | | | | | x3 | | 0112 | 0148 | 01A8 | | | 1CE6 | | | | | x4 | | 0118 | 014E | 01AE | | | 1CEC | | | | | x5 | | 011E | 0154 | 01B4 | | | | | | | | x6 | | 0124 | 015A | 01BA | | | | | | | | x7 | | 012A | 0160 | 01C0 | | | | | | | | x8 | | 0130 | 0166 | 01C6 | | | | | | | | x9 | | 0136 | 016C | 01CC | | | | | | | | xA | | | 0172 | 01D2 | | | | | | | | xB | | | 0178 | | | | | | | | | xC | | | 017E | | | | | | | | | xD | 01D8 | | 0184 | | | | | | | | | xE | 01DE | | 018A | | | | | | | | | xF | | | 0190 | | | | | | | | +----+------+------+------+------+------+------+------+------+------+------+ (*) A 6x magnified character is displayed combining 6 consecutive single byte characters, beginning with the code in above table.

(6) "ESC (7" European character set (umlaut , etc.) +----+------+------+------+------+------+------+------+------+------+------+ | | 2x | 3x | 4x | 5x | 6x | 7x | Ax | Bx | Cx | Dx | |----+------+------+------+------+------+------+------+------+------+------| | x0 | 0020 | 0030 | 0040 | 0050 | 0F80 | 0F90 | 0FC0 | 0FD0 | 0FE0 | 0FF0 | | x1 | 0021 | 0031 | 0041 | 0051 | 0F81 | 0F91 | 0FC1 | 0FD1 | 0FE1 | 0FF1 | | x2 | 0022 | 0032 | 0042 | 0052 | 0F82 | 0F92 | 0FC2 | 0FD2 | 0FE2 | 0FF2 | | x3 | 0023 | 0033 | 0043 | 0053 | 0F83 | 0F93 | 0FC3 | 0FD3 | 0FE3 | 0FF3 | | x4 | 0024 | 0034 | 0044 | 0054 | 0F84 | 0F94 | 0FC4 | 0FD4 | 0FE4 | 0FF4 | | x5 | 0025 | 0035 | 0045 | 0055 | 0F85 | 0F95 | 0FC5 | 0FD5 | 0FE5 | 0FF5 | | x6 | 0026 | 0036 | 0046 | 0056 | 0F86 | 0F96 | 0FC6 | 0FD6 | 0FE6 | 0FF6 | | x7 | 0027 | 0037 | 0047 | 0057 | 0F87 | 0F97 | 0FC7 | 0FD7 | 0FE7 | 0FF7 | | x8 | 0028 | 0038 | 0048 | 0058 | 0F88 | 0F98 | 0FC8 | 0FD8 | 0FE8 | 0FF8 | | x9 | 0029 | 0039 | 0049 | 0059 | 0F89 | 0F99 | 0FC9 | 0FD9 | 0FE9 | 0FF9 | | xA | 002A | 003A | 004A | 005A | 0F8A | 0F9A | 0FCA | 0FDA | 0FEA | 0FFA | | xB | 002B | 003B | 004B | 005B | 0F8B | 0F9B | 0FCB | 0FDB | 0FEB | 0FFB | | xC | 002C | 003C | 004C | 005C | 0F8C | 0F9C | 0FCC | 0FDC | 0FEC | 0FFC | | xD | 002D | 003D | 004D | 005D | 0F8D | 0F9D | 0FCD | 0FDD | 0FED | 0FFD | | xE | 002E | 003E | 004E | 005E | 0F8E | 0F9E | 0FCE | 0FDE | 0FEE | 0FFE | | xF | 002F | 003F | 004F | 005F | 0F8F | 0F9F | 0FCF | 0FDF | 0FEF | 0FFF | +----+------+------+------+------+------+------+------+------+------+------+ 4.2.4 Kanji character code

Following two types of codes are used in the application program.

Shift-JIS code selected by "ESC (B" (default) Shift-FANUC code selected by "ESC (C"

In the "ESC (B" mode, application programs can specify Shift-JIS code Kanji characters in character strings, similar to the MS-DOS applications. Shift-JIS code is converted to the FANUC code internally by the library.

In the "ESC (C" mode, specified Kanji character code is converted to the FANUC code according to the following rule. Hangul characters or graphic characters can be displayed in this mode.

code_high -= 0x6B ; if ( code_low >= 0x80 ) code_low -= 0x60 ; else code_low -= 0x40 ; code_low <<= 1 ;

For example, by specifying the code 0x8140, the Hangul character of the FANUC code 0x1600 is displayed on the screen. 5. Other References ======

5.1 Multitasking ======

5.1.1 Task classes

Application programs are composed of three independent task classes.

+- User application program ------+ | +======+ | | | | | | | (A) Main Task | | | | | | | +======+ | | | | +- Auxiliary Task ------+ | | | +======+ +======+ | | | | | (B) Alarm | |(C)Communication | | | | | | Task | | Task | | | | | +======+ +======+ | | | +------+ | +------+ (A) Main task Most tasks, like writing onto the screen, reading keys or up-loading/down-loading CNC data, are classed as this task class. All library functions can be used in this task class. (B) Alarm task Normally, the task of this class runs periodically to watch various status information. (C) Communication task Usually, this task class is used to execute tasks related to the Reader/Punch Interface independent of the main task. But it can also be used for tasks other than communications. Similarly, communication tasks can also be accomplished by the tasks of other task classes. Both the alarm task and the communication task are referred to as auxiliary task. Because these two tasks are executed in the background of the main task, they are also referred to as background task. The main task is executed only while user screens are displayed. The alarm task and the communication task is executed background without any relation to the screen display.

When user application program is composed of only one task, this task should be the main task. (supplement) Each task class corresponds to the macro-program of the Macro Executor as follows.

Macro Executor C Executor ------+------Conversational Macro Main task Auxiliary Macro Alarm task , Communication task Execution Macro none

5.1.2 Difference of each task class

The auxiliary task is limited in available functions compared to the main task.

Main task Alarm task Communication task ------+------+------+------Standard functions x x x Key input x - - Character display x - - Graphic display x - - File I/O x x(*1) x(*1) CNC/PMC window function x x(*2) - Reader/Punch Interface x x(*3) x(*3)

x : can be used - : cannot be used (*1) A file cannot be accessed simultaneously by more than two tasks. File accesses arbitration should be considered by application program. (*2) Simultaneous access with main task will cause busy error. (*3) Accesses to the I/O port should be arbitrated by application program.

5.1.3 Task switching Task switching between the main task and the auxiliary task is executed by calling task management library functions in the application program. To run the auxiliary task periodically, the period is also specified by the application program.

The priority of the task class is as follows. task class priority ------+------Main task low Communication task mid Alarm task high

Auxiliary tasks are executed by interrupting the main task. Task switching from the auxiliary task to the task of lower priority is accomplished by calling functions which wait for certain events to happen. There are following functions which are used for this purpose. Event Function ------+------Time os_sync_tim(), os_wait_tim() Event flag os_wait_flg() Semaphore os_wait_sem() Status of serial port rs_wait()

This type of task management is called "event driven" task management.

+------+ +----- auxiliary task ----+ (run) +- (wait for event)-+

+------+ main task - - - - - (wait) - - - - -+ (run) + - - ^ ^ system start Event happens

5.1.4 Data access between tasks To exchange data between tasks, the inter-task common variable is to be used. The variables defined in the special source files, dramver.c and sramver.c, are located in the inter-task common memory as the common variables. When defining the common variables in the files, dramver.c or sramver.c, specify the attribute "volatile" for the variables in the definition statement.

Memory address space +------+ | common variable (sramver.c) | | |---+ +------+ | | common variable(dramver.c) | +------+ v ^ v ^ v ^ +------+ +------+ +------+ | | | | | | | Main | | Alarm | |Communica-| | task | | task | |tion task | | | | | | | +------+ | | | | | | | | | | | | | | | | +------+ +------+ +------+ | | v ^ v ^ v ^ | CNC control | +------+ | software | | C Executor library(interface) | | | +------+ | | v ^ | | +------+ | | | C Executor library(kernel) | -> | | | | <- | | +------+ +------+ Data cannot be accessed between memory address spaces which are not connected by arrows in above figure. 5.1.5 Task Management

Kind of tasks

(1) CNC task

* CNC interruption tasks Automatic or manual operation, servo control, spindle control, I/O transfer of PMC and execution of the ladder, MDI control, program editing, etc. are realized by these tasks. They are triggered by the timer interruptions and run periodically. There are actually multiple tasks which are waked by the timer interruptions. They are assumed to be single task for simplification in the following explanation.

* CNC display task Displaying of the CNC screen, background editing, CNC window processing, etc. are realized by this task. This task is executed in the idle CPU time which is not used by the CNC interruption tasks.

(2) User task

* Main task Almost all processing of the user application, such as displaying of the user screen, are executed in this task. The TASK1 is the main task.

* Background tasks These tasks are usually waked by various events and they are executed independently of the main task. The TASK2 (the communication task) and the TASK3 (the alarm task) are background tasks. These tasks execute the processing about the related events, then suspend execution to wait for the next event again, and give the CPU to the main task. Both the main task and the background tasks are executed in the idle CPU time which is not used by the CNC interruption tasks. 5.2 File system ======

The File system compatible with MS-DOS is included in C Executor library.

(1) File definition

The entire format is as follows. This supports the layered directories.

[drive name:][\][directory name \...]name[.extension]

The parts enclosed by [] can be omitted.

(2) Drive name

This is a English character (one character) indicating the drive in which files are stored. The available drive in C Executor library is as follows.

Device Drive name Capacity ------+------+------S-RAM disk A: Maximum 59 KBytes (251 KBytes with option) S-RAM card B: 256 KBytes - 2MBytes or ATA compatible flash card The each drive names are fixed.

(3) File name This contains a Drive name indicated by a character and a name by maximum 8 characters and an extension by maximum 3 characters. The drive name and the file name are separated with ':', and the name and the extension are separated with '.'. The Drive name and the extension are options. The File name is changed to one with capital characters and is discerned. The following characters can be used for a File name. ( The 2 bytes characters can not be used.) Alphabetic characters A .. Z Numeric characters 0 .. 9 Special characters $ & # % ' ( ) - @ ^ { } ~ ` ! _

(4) Reserved file name

The following names are reserved for system. CON console device This is used for the input from key board or the output to display unit. NUL null device When this is specified, the objective file is not created. The following names can not be used. AUX..AUX4, COMx, PRN, LPTx, CLOCK, CLOCK$ (5) Wild card

The following Wild card characters can be used for the File name and extension.

? The meaning of any one character * The meaning of any plural characters (contain nulls)

As using Wild card characters, the file can be flexibly specified. But in case of the file specification with '*', the characters after '*' are neglected.

(example 1) "TEST?.C" "TEST1.C" , "TEST2.C" , "TESTA.C" , "TESTB.C" etc. are applied.

(example 2) "TEST*.C" "TEST1.C" , "TEST12.C" , "TESTA.C" , "TESTAB.C" etc. are applied.

(example 3) "TEST*A.C" The character 'A' is neglected and so this example is the same as example 2).

(6) Directory For the file information, names,sizes and update times are registered in the directory. The directory itself is a kind of files and can be layered. The basic directory of layered directories is called "Root directory". The Root directory is automatically created at initializing the device. The directory created below the root one is called "Sub directory". Within the range of the path name length(lower than 64 bytes), the Sub directories are created in so many layers.

(7) Path name The following parts in a file definition is named "Path name". The Path name specifies a definite directory in the layered structure of directories. [\][directory name \...]directory name In the above, "[\]" of the head indicates a Root directory. Next "[directory name \...]" is the stretch of directory names continued until the objective directory. A Path name is need to be within 64 bytes. The separator among directories is normally specified with '\' and '/' may be used for the separator. So the latter is supported too. (8) Practicable number of files for opening simultaneously

The number of files which the application can open simultaneously is fixed 60 as a whole. I/O Control buffers which are used by High level input/output functions(fopen,fclose,fprintf,...) are prepared respectively 15 for each task. At launching of each task, following three standard input/output functions are opened.

stdin console(MDI) input stdout console(CRT) output stderr console(CRT) output

(9) S-RAM disk

The C Executor application can access a S-RAM disk. A S-RAM disk is a file device built on battery back upped RAM of CNC. Set the size by the unit of KByte in parameter No.8662 for the utilization of S-RAM. A S-RAM disk(max 59 KB,251 KB with option) is automatically initialized at power on right after changing the set data in parameter No.8662. And it is possible to initialize it by calling aux_file_format function in the application program.

(10) S-RAM card or ATA flash card

It is available for the application program to access a S-RAM card or ATA flash card which is inserted in the card slot beside LCD display device of FS30i. Refer "3.7 File Operation Library (37file.man)" for usage of memory card. 5.3 Power-on procedure ======

5.3.1 Key operation at power on

On FS30i with C Executor, the special procedure is executed when the power is turned on with pushing the definite MDI keys.

Key pushed at power on Execution ------+------[M] + [0] The System starts up without executing C Executor. The CNC is executed in the same condition as no C Executor installed. This is used for disregarding C Executor function transiently.

[M] + [3] The System application is launched without launching the User application.

(note) * [M]+[0] means that [M] key and [0] key are pushed at one time. [M]+[3] means the same.

* Please continue to push these keys till the normal NC screen or the user screen of C Executor is displayed after power on. 5.4 Parameter setting on CNC ======

Parameters related to C Executor

Descriptions of parameters

Data number #7 #6 #5 #4 #3 #2 #1 #0 +------+ +------+------+------+------+------+------+------+------+ | 8650 | | | | | CKM | | EKY | CNA | RSK | +------+ +------+------+------+------+------+------+------+------+ Data format : Bit type

RSK Specifies whether the key code is transferred to application when a reset key is pushed. 0 : not transferred 1 : transferred

CNA Specifies whether the screen is changed to NC alarm screen when NC alarm is generated during the user screen by C Executor is displayed. 0 : the change whether automatically or not is decided by the value of parameter No.8000#1 NAP. 1 : Do not change without relation of the value of parameter No. 8000#1 NAP.

EKY Expanded parts (9 through 11 lines) of MDI key are 0 : not read. 1 : read. CKM The bit-matrix of MDI key is 0 : not transferred to NC side. 1 : transferred to NC side. Set this bit to 1 only when it is specially need to read directly the bit-matrix in NC side. Set it to 0 normally. (Note) The change of the set data becomes effective after the next power on. Data number Data +------+ +------+ | 8661 | | Size of variable areas | +------+ +------+ Data format : word type Data unit : KByte Data range : 0 through 59 (251)

Specify the size of the static variable areas which can be set by each task. Specify it by the unit of 1 Kbyte. The maximum size is 59 KBytes (251 KBytes in the case with SRAM 256 KB option). And the total value of a SRAM Disk size and this size should not exceed (usable SRAM size -1) KBytes (that is 63 or 255 KBytes).

(Note) When this value is changed, the contents of variable areas and a SRAM Disk are initialized. The change of the set data becomes effective after the next power on.

Data number Data +------+ +------+ | 8662 | | Size of SRAM Disk | +------+ +------+ Data format : word type Data unit : KByte Data range : 4 through 63 (255) Specify the size of a SRAM Disk. Specify it more than 4 KBytes by the unit of 1 KByte. The maximum size is 63 KBytes (255 KBytes in the case with SRAM 256KB option). And the total value of the size of variable area and this size should not exceed (usable SRAM size -1) KBytes (that is to say, 63 or 255 KBytes). (Note) When this value is changed, a SRAM Disk is initialized. The change of the set data becomes effective after the next power on. Data number Data +------+ +------+ | 8663 | | Specification of time zone | +------+ +------+ Data format : 2-word type Data unit : second Data range : -12*3600 through 12*3600

Specify the equation of time from Greenwich time by the unit of second. The value is -9 hours in Japan. (the value is -9*3600=-32400)

(Note) The change of the set data becomes effective after the next power on.

Data number Data +------+ +------+ | 8781 | | DRAM size used in C Executor | +------+ +------+ Data format : Byte type Data unit : 64 KBytes Data range : 12 through 96

Specify the size of a DRAM used in C Executor. And specify the value of more than 768 KBytes by the unit of 64 KBytes. It is regarded as 0 in the case that the value is set out of range. When the value is 0, the C Executor is not implemented. (Note) The usable size is also limited by the RAM size and the assembly of option. 5.5 Dat2mem utility manual ======

------Data file to Memory_Card file conversion utility ------

The "dat2mem.com" is a utility program which converts arbitrary MS-DOS data file to Memory_Card file that is used for CNC. It reads multiple data files to make a Memory_Card file which can be directly loaded into CNC. It can also combine data files with existing Memory_Card file of a C Executor program to make up new Memory_Card file.

(1) C Executor data file

C Executor Library supports functions which make application programs capable of reading data files stored in the F-ROM of CNC controls. The data file of the format which can be read by C Executor applications is referred to as C Executor data file. Multiple MS-DOS data files can be combined and stored in a C Executor data file. C Executor application program can read individual MS-DOS files by specifying its file name. There are following two types of C Executor data file. (1) Data only file

+------+ | Memory_Card file | | header | +------+ | Data file | | directory entry | +------+ | Data file 1 | | | +------+ | Data file 2 | | | +------+ | ... | | | +------+ | Data file n | | | +------+ Multiple MS-DOS data files are combined in this file. F-ROM file identification name for this type of file is "CEXnxxxx" where 'n' is a number from 0 to 9 and "xxxx" is any combination of max. 4 alpha- numeric characters. Ten C Executor data files ( "CEX0xxxx" -- "CEX9xxxx") can be stored in the F-ROM at maximum. Files stored in the F-ROM are identified by using leftmost 4 characters of the identification name. As a result, the files with identification names "CEX1DATA" and "CEX1TEXT" are assumed as the same file. That is, if a file "CEX1TEXT" is written to the F-ROM in which a file "CEX1DATA" is stored, the file "CEX1DATA" is deleted and only the file "CEX1TEXT" remains.

The size of the C Executor data file is calculated by

Memory_Card header size (416 bytes) + directory entry size (16 + number of data files * 32 bytes) + total size of all data files, and the F-ROM memory blocks of 128KB unit is allocated to the file.

In this type of file are general data or machine tool dependent data (system parameters or offset data).

(2) File with C Executor program and data

+------+ | Memory_Card file | | header | +------+ --- | | ^ | C Executor program | | Loaded into DRAM | | | when power ON | | v +------+ --- | Data file | | directory entry | +------+ | Data file 1 | | | +------+ | Data file 2 | | | +------+ | ... | | | +------+ | Data file n | | | +------+

Multiple MS-DOS data files are combined with existing C Executor program file, in this type of file. F-ROM file identification name for this type of file is "CEX xxxM" where "xxx" stands for "1.0", "2.0", etc. Only one file of this type can be stored in F-ROM. It is also not allowed to put both this type of file and a C Executor program file without data file in the F-ROM. The size of this type of file is calculated by

size of existing C Executor program file + directory entry size (16 + number of data file * 32 bytes) + total size of all data files

and the F-ROM memory blocks of 128KB unit is allocated to the file.

This type of file is suited to store the data closely related to the C Executor program, screen data for example.

For both types C Executor data file, C Executor application program opens a C Executor data file by specifying file identification name ,"CEXnxxxx" or "CEX xxxM", then selects and reads one of the data files in it.

In the directory entry, the "8.3 format" file name, data size and origin address in F-ROM file for each MS-DOS files are stored. C Executor application program can read the contents of this directory entry.

There are no specific limitations for the size or type of the MS-DOS data file which is converted by this utility. The contents of the MS-DOS data file is stored in the C Executor data file as it is.

(2) Necessary hardware

* Personal computer executable for Microsoft Windows 2000 or Windows 98 * Free disk space larger than twice of the Memory_Card file size being created.

(3) How to execute Type as follows after prompt. C:\> dat2mem xxx [Enter] "xxx" stands for the name of the Command file mentioned later.

(4) Command file Command file is the file in which names of the related files are written. The format of the Command file is as follows. * A line beginning with semicolon is assumed as a comment line and ignored. * A line with spaces only is ignored. * Only the first word of the line other than above is valid. * Leading space characters(space or tab character) of a line are ignored. * Necessary information are written in the following order. (1) Name of the Memory_Card file being created Specify the name( usually *.mem) of the Memory_Card file to be created. The format of the file name part should be "CEXnxxxx", where 'n' is a number from 0 to 9 and "xxxx" is any combination of max. 4 alpha-numeric characters, "CEX1TOOL.MEM" or "CEX3DOC.MEM" for example. When creating new Memory_Card file by combining data files to the existing C Executor Memory_Card file, arbitrary Memory_Card file name can be specified. Drive name or directory name can be added as necessary.

(2) Name of the existing C Executor Memory_Card file Specify the name ( usually *.mem) of the existing Memory_Card file in which C Executor program is stored. Add drive name or directory name as necessary. It is not necessary to specify this file name, when creating a C Executor data file which is composed of data file only.

(3) Name of the data file Specify the name of the data file to be converted. Add drive name or directory name as necessary. Wild card characters, '*' or '?', can also be specified. When wild card characters are used, all files which match with the specified name are converted. File name cannot contain multi-byte characters or katakana characters. Only single byte alpha-numeric characters cam be used for the file name. Name of the data file may be specified in multiple lines. Maximum of 2000 data files can be combined in a Memory_Card file. [Example 1] Command file which combines all "*.dat" files in the directory "c:\data" and creates "CEX1PARM.MEM".

--<< from the next line >>------;======; DAT2MEM Specification file ;======

;------CEX1PARM.MEM ;------c:\data\*.dat ;------; end of spec file --<< to the previous line >>------

[Example 2] Command file which combines data files, "\work\scrn1.dat", "\work\scrn2.dat" and "\text\msg.txt" , with existing file "cexec.mem" and creates new Memory_Card file "cexec_d.mem". --<< from the next line >>------;======; DAT2MEM Specification file ;======

;------cexec_d.mem ;------cexec.mem ;------\work\scrn1.dat \work\scrn2.dat \text\msg.txt ;------; end of spec file --<< to the previous line >>------(5) Error messages

It can happen that following error messages are displayed.

"insufficient memory" Cannot allocate enough memory to execute the program.

"file open error xxx (??H)" Cannot open the file xxx.

"file create error xxx (??H)" Cannot create the file xxx.

"file read error xxx (??H)" Encountered an error while reading the file xxx.

"file write error xxx (??H)" Encountered an error while writing into the file xxx.

"insufficient disk space for xxx" Lack of free disk space to create the file xxx.

"unexpected EOF xxx, line#??" Detected the end of file when attempted to read the ??th line of the file xxx. This can happen when command file is described incompletely.

"invalid Memory_Card filename xxx" Invalid Memory_Card file name is specified. In case of data only Memory_Card file, the only acceptable file name format is "CEXnxxxx" where 'n' is a number from 0 to 9 and "xxxx" is any combination of alpha-numeric characters. There is no restrictions for the name of the Memory_Card file which contains C Executor program and data. "file xxx not found (??H)" Cannot fine the file xxx. "file searching error xxx (??H)" Encountered an error while searching for the file xxx. "too many input file" Attempted to convert more than 2000data files. "invalid filename xxx" Invalid characters, katakana characters or multi-byte characters, are included in the name of the data file. Files should be named with single-byte alpha- numeric characters only. "not a simple Memory_Card file xxx" Data files are already combined in the specified C Executor Memory_Card file . Specify the Memory_Card file which contains C Executor program file only. 5.6 Conforming O8-digits program number ======

The program numbers are 8 digits in C language Executor for FANUC Series 30i. It is not compatible with the application of the program number 4 digits designed for FANUC Series 16/18. Please change the application referring to "Conforming CNC window library to O8-digits program number option" of the FANUC Series 16/18 C Executor programming manual. 5.7 Window task ======

5.7.1 Overview

C Executor system is composed of 3 tasks, Main task, Alarm task and Communi- cation task. The Window task is fourth additional task to these 3 tasks.

+------+ CNC tasks | CNC Interruption TASKs | +------+ +------+ +------+ +- | Alarm TASK | | | | +------+ | | Aux. tasks | +------+ | | +- | Communication TASK | | Window TASK | +------+ | | +------+ +------+ | | Display tasks | Main TASK | | CNC TASK | | | +------+ +------+ +------+

The window task runs with the tree tasks of C Executor and the CNC's display task simultaneously. This task is like the auxiliary tasks of C Executor, but it can display to the screen unlike them. About displaying screen, the window task is similar to the main task except that the target screen to display is only the VGA windows. So, it is impossible to display without VGA display device. (The execution itself is available even if any display device is equipped.) The window task can't read MDI key unlike the main task. It can read the status of touch-panel. The window task is provided for the following purposes. On the CNC with VGA display device, it opens VGA windows on the screen and controls them, and receives the commands of the operator via input signals of PMC or touch-panel. Such as controling "Software machine control panel" on the screen with touch- panel. It can be applied to the general purposes, but it is most suitable task to the above purpose.

5.7.2 Window task's execution The window task is loaded on the memory with the other tasks in the power- up sequence of CNC. This task is not automatically started. To start the window task, call "os_strt_wtsk()" function by the main task. When this function is executed successfully, the window task starts running simul- taneously with the other 3 tasks and the CNC's display task. 5.7.3 Usage of the window task

The typical processing flow of the window task is as follows.

(1) Start | (2) Initialize | | <------+ | <------+ | | | | (3) Wait the trigger ------+ | to display no trigger | | | | | (4) Open VGA window | | | | <------+ | | | | (5) Display and read commands | | | | | | | | (6) If display end ------+ | | not end | | | (7) Close VGA window | | | +------+

(1) Start The window task starts from "main()" function by calling "os_strt_wtsk()" in the main task. (2) Initialize General initialization such as variable setting,etc. (3) Wait the trigger to display The application program checks whether it should display VGA window or not. There are some conditions for the trigger to start displaying. Input signal from PMC. (using "pmc_rdpmcrng()" function) Status of touch-panel (using "aux_tpl_read()" function) Status of CNC (using "cnc_statinfo()" function,etc.) Notification of the other tasks (notify via DRAM/SRAM common variables) It is possible to always display the VGA window. (4) Open VGA window The application program opens VGA window using "vwin_open()" function. (5) Display and read commands The application program displays to the VGA window. It also receives operator's commands. To receive commands, use the following method; (because the application can't read MDI keys.)

Input signal from PMC. (using "pmc_rdpmcrng()" function) Status of touch-panel (using "aux_tpl_read()" function) Notification of the other tasks (notify via DRAM/SRAM common variables)

(6) If display end The application program detects the trigger to close the VGA window. It checks informations as same as "(3) Wait the trigger to display".

(7) Close VGA window The application program closes the VGA window using "vwin_close()" function.

It is possible to always open VGA windows on the screen rather than the app- lication program opens them on demands. Also it is possible to open the invisible VGA window.

5.7.4 Available functions for the window task The following functions are available for the window task.

(1) ANSI C Standard library All functions which are available for the main task are available. (2) MS-C extended C standard library All functions which are available for the main task are available. (3) Graphic library All functions which are available for the main task are available. The target screen to display is not the ordinary screen but VGA window. (4) CNC/PMC window library All functions which are available for the main task are available. Some functions require exclusive control between the other tasks. (5) MDI operation library Unavailable. (6) CRT operation library All functions which are available for the main task are available. The target screen to display is not the ordinary screen but VGA window. (7) File operation library Unavailable. (8) Serial library Unavailable. (9) Task management library Available except "os_strt_wtsk()". But it is ineffective to send/ receive events with the other tasks. (10) FCA library Unavailable.

(11) F-ROM library Unavailable.

(12) Touch-panel library Available.

(13) Inter-task common variables (DRAM/SRAM) Available.

5.7.5 How to make application program

The procedure to make window task application is mentioned below. Basically, it is same as the ordinary application which is composed of main task, alarm task and communication task.

(1) Making main/alarm/communication tasks. "os_strt_wtsk()" function must be called in the main task. Except this, there is nothing to especially take case. Description of makefile about these tasks is same as usual. (2) Making window task. Make source modules (*.c) which include a "main()" function and other functions called from main() as same as the other tasks. (3) Definition modules of window task in makefile. Define object module names of the window task in the module definition line "TASK4 = " in makefile. (Example) TASK4 = winmain.o wintsk1.o wintsk2.o (4) Compile and link by "nmake" command. (5) Load the created memory card file into the CNC and run it. There is no special parameter setting about window task.

5.7.6 Notes Take case of the followings for using window task. (1) Task structure The task number of the window task is '4'. The window task is called "TASK4". All tasks of whole application including window task are as below.

TASK1 Main task TASK2 Communication task TASK3 Alarm task TASK4 Window task 5.8 Conforming CNC screen display ======

5.8.1 Overview

It is possible to run C Executor on the following equipments on which "CNC screen display" application.

* FS300i (CNC equipment with Personal Computer function)

* FS300i connected via high-speed serial bus with Personal Computer, and FS300i connected via Ethernet with Personal Computer. (using CNC's screen or PC's screen)

The above two CNC equipments are described as "FS300i with PC" and "FS300i with HSSB/Ethernet" (HSSB:High Speed Serial Bus) in this document.

For both CNCs, it is possible to display on the virtual CNC screen displayed on PC's screen by "CNC screen display" application as same as on the ordinary CNC screen. The virtual CNC screen is equivalent to VGA display device. C Exe- cutor application program which runs on the ordinary CNC equipment can also run on these equipments by re-compiling and linking as it is. (Some source codes might be modified.) Some screen display functions are restricted by "CNC screen display" application, and some function's behaviors are different from ordinary specifications on the true CNC. The "CNC screen display" application is abbreviated as "CNCscrnApp" in the following sections of this document. 5.8.2 How do application program run on each equipment

In this section, how each task of the application program runs is described.

(1) FS300i with PC

Status of CNC & PC Status of C-EXE application ------

PC starts | v CNC starts ------> Auxiliary tasks start [1] | | v | "CNCscrnApp" starts ------> Main task starts [2] | | | | | *---> Window task starts | | | [3] | v | | | "CNCscrnApp" ends ------> x - - - - - > x | | .[4] |[5] | | . | v | . | "CNCscrnApp" starts ------> x - - - - - > x | | |[6] |[7] | | | | v | | | "CNCscrnApp" ends ------> x - - - - - > x | | .[4] |[5] | | . | v v v v

[1] Auxiliary tasks start at CNC system start-up time. After started, they run as same as on the ordinary FS30i. Because the main task and the window task don't run until "CNCscrnApp" starts for the first time, auxiliary tasks can't communicate with the main task or the window task. Except this, it is not necessary for auxiliary tasks to take care of whether CNC screen is displayed on PC or not. (Auxiliary tasks may not exist.) [2] The main task starts at the first time "CNCscrnApp" started. After this, it runs as same as on the ordinary FS30i until "CNCscrnApp" closes. Until then, the main task runs during displaying C-EXE screen and it sleeps during displaying CNC's screen. [3] The window task starts when "os_strt_wtsk()" function is called in the main task. After this, the window task goes on running whether CNC's screen is displayed or not. (The window task may not exist.) [4] The main task goes sleeping when "CNCscrnApp" is closed. This status is same as the screen is changed to CNC's screen. If C-EXE appli- cation inhibits screen changing, "CNCscrnApp" can't close itself. The application program should sometimes enable to change the screen. [5] The window task must close already opened VGA windows when "CNCscrn- APP" is terminated. "CNCscrnApp" can't close itself while any VGA windows keep opening. It is possible to test whether "CNCscrnApp" is going closed or not by "crt_pcinfo()" function.

[6] The main task runs again when "CNCscrnApp" is re-opened. CNC's screen is selected when "CNCscrnApp" is re-opened. (That is, the main task is sleeping.) After then, the main task runs actually when C-EXE screen is selected.

[7] The window task re-display VGA windows when "CNCscrnApp" is opened again. It is possible to test whether "CNCscrnApp" is re-opened or not by "crt_pcinfo()" function as same as [5]. (2) FS300i with HSSB/Ethernet

Status of CNC & PC Status of C-EXE application ------

CNC starts ------> Auxiliary tasks start [1] | ------> Main task starts [2] | | | | | *---> Window task starts | CNC side display | | [3] | v | | | "CNCscrnApp" starts ------> x - - - - - > x | | |[4] |[5] | PC side display | | | v | | | "CNCscrnApp" ends ------> x - - - - - > x | | |[6] |[7] | CNC side display | | | v v v v

[1] Auxiliary tasks start at CNC system start-up time. After started, they run as same as on the ordinary FS30i. It is not necessary for auxiliary tasks to take care of whether CNC screen is displayed on PC or not. (Auxiliary tasks may not exist.)

[2] The main task starts after the auxiliary tasks started. It runs as same as on the ordinary FS30i until "CNCscrnApp" is opened on PC. Until then, the main task runs during displaying C-EXE screen and it sleeps during displaying CNC's screen. [3] The window task starts when "os_strt_wtsk()" function is called in the main task. After this, the window task goes on running whether CNC's screen is displayed or not. (The window task may not exist.) [4] When "CNCscrnApp" starts on PC, the main task goes sleeping once. Because CNC's screen must be selected for changing the screen be- tween CNC side and PC side. After starting PC display, by changing the screen to C-EXE the main task runs again and the C-EXE screen is displayed. If C-EXE application inhibits screen changing, changing to PC side screen can't be completed. The application program should sometimes enable to change the screen. [5] The window task should close already opened VGA windows when "CNC- scrnAPP" starts up. VGA windows opened on CNC side screen are still displayed after starting "CNCscrnApp" on PC side. To display VGA windows on PC side screen, once close VGA windows after starting "CNCscrnApp", then open them again. It is possible to test on which of CNC side or PC side the current screen is displayed by "crt_pcinfo()" function. [6] When "CNCscrnApp" is closed on PC and CNC side screen wakes up again, the main task goes sleeping once. Because CNC's screen must be se- lected for changing the screen between CNC side and PC side. After starting CNC side display, by changing the screen to C-EXE the main task runs again and the C-EXE screen is displayed. If C-EXE applica- tion inhibits screen changing, changing to CNC side screen can't be completed. The application program should sometimes enable to change the screen.

[7] The window task must close already opened VGA windows when "CNCscrn- APP" is terminated. "CNCscrnApp" can't close itself while any VGA windows keep opening. It is possible to test whether "CNCscrnApp" is going closed or not by "crt_pcinfo()" function. After changing to CNC side, the window task opens VGA windows again. 5.8.3 Restrictions on specification

In this section, differences from C Executor on the ordinary FS30i are de- scribed. You can regard the specifications which are not listed below as same as on the ordinary FS30i with VGA display device. The following descrip- tions are applied to PC side screen if no special comment. They runs on FS300i with HSSB/Ethernet as same as the ordinary FS30i.

[*] mark which is added to "unavailable ..." etc. means that no error occurs and nothing is done even if the function is used.

(1) It is impossible to start or terminate "CNCscrnApp" while C-EXE app- lication inhibits screen changing. If starting or terminating "CNC- scrnApp" is attempted during screen changing inhibition, the CNC equipment goes hung-up and "CNCscrnApp" can't run newly on PC. To recover this, it is required to restart both CNC equipment and PC.

(2) The screen is initialized by changing screen between CNC side and PC side. At this time, all contents already displayed are cleared. So the application program must redraw the screen.

(3) It is unavailable to access a memory card inserted in a memory card slot of FS300i with PC. An error ("Memory card is not inserted.") occurs if "aux_file_mount( 'B' )" is called.

(4) Overlapping method about text and graphics in 16-color graphics (in which both text and graphics are displayed overlapping each other) is different from the ordinary FS30i. "Composite" mode is not sup- ported. [*] Only "Character over graphics" or "Graphics over charac- ter" can be selected. The default mode if "Character over graphics". crt_setpalette( _PAL_COMP, CRT_PAL_COMP ) unavailable crt_setpalette( _PAL_COMP, CRT_PAL_CHAR ) available(default) crt_setpalette( _PAL_COMP, CRT_PAL_GRPH ) available (5) 256-color graphics is unavailable. [*] The following graphic modes which select 256-color graphics can't be specified in "_setvideomode()" function. _98RES16COLOR, _98RES8COLOR, _98RESCOLOR, _VRES256COLOR (6) Automatic key repeating is always effective for key-input from both PC's keyboard and MDI keyboard while PC side screen is alive. (It is independent of the application program setting.) While CNC side screen is alive on FS300i with HSSB/Ethernet, whether automatic key repeating is effective or not depends on the application program setting. (7) Customizing of MDI key for CNC's screen is unavailable. [*] "aux_mdi_putmatrix()" or "aux_mdi_altmatrix()" functions take no effect to CNC side key matrix. (8) It is impossible to turn ON and OFF back-light of LCD screen by "ESC [>9l" and "ESC [>9h" while PC side screen is alive. [*]

(9) It is impossible to set LCD screen reverse. [*] That is, "crt_setpalette( _PAL_RVS, xxx )" is unavailable.

(10) It is impossible to start or terminate "CNCscrnApp" while VGA windows are opened.

(11) The main task and the window task don't run until "CNCscrnApp" starts first time after system-power-on on FS300i with PC.

(12) It is unavailable to control function-keys on MDI panel by C-EXE application with "crt_setswt( CRT_SWT_MFKY )". [*] It is impossible to read function-key information even if "crt_readfkey()" function is executed. [*]

5.8.4 Making application program

A) Alterations

It is required for the already existing application program to modify the source codes as it avoids specification restrictions if you want to run the program on FS300i. You should take care of the following notices for making new application program. Index number of the following notices corresponds to the previous section's each item number.

(1) An application program which runs on FS300i should not make screen changing inhibited. For example, don't execute "crt_setswt( CRT_SWT_DIS )" (don't inhibit screen changing actively), execute "crt_setswt( CRT_SWT_GREN )" while it draws graphics (enable to change screen during drawing graphics), etc. (2) Redraw all contents in the user screen if the screen is switched between CNC side and PC side. For example, get the current output device, CNC or PC, using "crt_pcinfo()" function, and if it switches, redraw whole screen. (3) Don't execute I/O operation from/to DRIVE B: (memory card) on FS300i with PC. (4) The application program which uses "Composite" graphic mode doesn't correctly draw graphics on FS300i. It is needed to redesign color specification for application screen using "Character over graphics" mode. (5) Don't use 256-color graphics mode. Modify the application program to use only 16 colors. (6) If you want not to use automatic key repeating on PC side screen, set delay time and interval time for key repeating both as max value (1024[msec]) using "aux_mdi_repeat()" function. (7) If you want to customize MDI key mapping for CNC's screen, alter key mapping on PC side ("CNCscrnApp").

(8),(9) To control LCD display (turning ON/OFF the back-light, reversing the screen), use the ordinary screen control feature of PC.

(10) While the application program is displaying VGA windows, call "crt_pcinfo()" function periodically and close all VGA windows when PC side application is terminated.

(11) The application program which runs on FS300i with PC must have an exe- cution architecture such as it runs correctly without the main task and the window task running. For example, ladder program of PMC or macro program don't refer variables in which the main task sets any value, because it is no warranty that the main task has already run when ladder or macro program is executed. Execute initialization processes not in the main task but in any auxiliary tasks.

(12) Basically, leave CNC screen switching control to CNC software. C-EXE application program should not touch screen switching process.

B) Application building process

Application building process for FS300i is same as for the ordinary FS30i. You will follow C-EXE application building process for the ordinary FS30i.

The built memory-card-file is stored in F-ROM of CNC equipment. For FS300i with HSSB/Ethernet, write to F-ROM using boot menu as same as the ordinary FS30i. For FS300i with PC, write to CNC's F-ROM by PC side application pro- gram.

C) Other notices Screen refresh speed may slow down while PC side screen is alive according to its PC's processor performance. But CNC internal process executions which is independent of screen displaying (such as auxiliary tasks execution) run as same speed as the ordinary FS30i. 5.8.5 Function reference

------1. Get status of CNC screen display application

------

[Name] crt_pcinfo

[Syntax] #include unsigned short crt_pcinfo( void ) ;

[Arguments] ------

[Return] Returns status of CNC screen display application.

[Description] Gets status of "CNC screen display" application program which runs on PC of FANUC Series 300i.

"CNC screen display" application program is used to display CNC screen (including C-EXE screen) on FS300i. CNC screen can be displayed only while this application program is running. This function is used to test if CNC screen is available or not when C Executor application program runs on FS300i. This function returns the following data as return value. Upper byte Lower byte +------+------+ | CNC system type | Status of "CNCscrnApp" | +------+------+

(1) CNC system type This is 1-byte value which indicates if CNC is FS300i with PC. CRT_CNC_30i 0x00 Not FS300i with PC (ordinary FS30i, FS300i with HSSB/Ethernet) CRT_CNC_150I 0x01 FS300i with PC (2) Status of "CNCscrnApp"

This is a pack of bit-flags which indicates the status of "CNC screen display" application on PC. "1" means "effective" for each bit.

CRT_PC_ENB 0x01 "CNC screen display" is available. (This bit is set as "1" when CNC is FS300i with PC, FS300i with HSSB, FS300i with Ethernet.) CRT_ETH_SIDE 0x08 CNC screen is displayed now. (FS300i with Ethernet) CRT_PC_END 0x10 PC application terminated. CRT_PC_PWON 0x20 PC application is starting up now. CRT_PC_DWN 0x40 PC is down now. CRT_PC_SIDE 0x80 CNC screen is displayed now.

You can get the current output device using CRT_PC_SIDE and CRT_ETH_SIDE.

CRT_PC_SIDE CRT_ETH_SIDE Output device ------+------+------0 0 CNC's display unit 1 0 PC (HSSB) display unit 1 1 PC (Ethernet) display unit 0 1 undefined

The main task of C Executor runs only while CNC screen is displayed on PC side.(in case of FS300i with PC) Auxiliary tasks and the window task always run whether CNC screen is displayed or not. This function is used to test if screen function is available or not in auxiliary tasks or the window task. For example, "if CNC screen goes closed, the window task closes VGA windows", for this case, this function is used. Screen switching must be enabled when "CNCscrnApp" starts up and ends. (If screen switching is disabled, "CNCscrnApp" can't start/ end.) Call this function periodically, and enable screen switching when CRT_PC_PWON or CRT_PC_END flag rises up. [Example] The following program closes VGA windows when "CNCscrnApp" goes closed on PC. (This is executed in the window task.)

#include void example( void ) { unsigned short pcinfo ; pcinfo = crt_pcinfo() ; /* Is CNC 300i ? */ if ( pcinfo & CRT_PC_ENB ) { /* Has PC app closed or been down ? */ if ( pcinfo & ( CRT_PC_END + CRT_PC_DWN ) ) { vwin_close( 0 ) ; vwin_close( 1 ) ; } } } 5.9 High-Level Task ======

5.9.1 Overview of High-Level Task

High-Level Task is the independent task of C Executor ordinary tasks (Main Task, Auxiliary Tasks and Window Task) and is called at fixed intervals.

Task priority +------+ | CNC interrupt Tasks (Axis control,PMC execution,etc.) | High | +------+ ^ | | High-Level Task | | +------+------+ | | CNC interrupt Tasks (Preparing, Automatic operation) | | +------+------+ | | Auxiliary Tasks | | | +------+------+ Window Task | v | Main Task | CNC display Task| | Low +------+------+------+

5.9.2 Specification

(1) Execution spec. Execution 8 msec interval (Interval time is not always fixed. Refer following "Task execution rule".) Max. execution 1 msec (for each 8 msec) time (Actually, max. approx. 0.8 msec of execution time is recommended. Refer following "Task execution rule" for the details.) (2) Available variable types and operators

The following variable types are available in High-Level task.

Type char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, array of these types and pointers to these

type variables.

Kind auto variable, static variable, global variable, D-RAM/S-RAM shared variable.

The following operations are available in High-Level task.

arithmetical operations (+,-,*,/,%) and logical operations (>>,<<,&, |,^,~) and kindred operations (++,--,&&,||, etc.) to char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long types.

(3) Available library functions Only the following functions are available in High-Level Task. rettask() Stop execution of a high-level task cnc_hldata() Start and stop acquiring high-level task execution management data cnc_rdprgnum() Read the program number of a program being executed cnc_rdseqnum() Read the sequence number of a sequence being executed cnc_actf() Read the actual feed rate (F) of a controlled axis cnc_acts() Read the actual rotation speed of the spindle cnc_absolute() Read the absolute position of a controlled axis cnc_machine() Read the machine position of a controlled axis cnc_relative() Read the relative position of a controlled axis cnc_distance() Read the distance-yet-to-go of a controlled axis cnc_skip() Read the skip position of a controlled axis cnc_srvdelay() Read the servo delay amount for a controlled axis cnc_accdecdly() Read the acceleration/deceleration delay amount for a controlled axis cnc_alarm() Read alarm status cnc_rdspload() Read information about the load on the serial spindle cnc_adcnv() Read A/D conversion data pmc_rdpmcrng() Read arbitrary PMC data (input range specified) pmc_wrpmcrng() Output arbitrary PMC data (output range specified)

All of the other library functions are unavailable. High-Level Task can't call all existent library functions, for example, ANSI standard functions such as "printf", "malloc", "strcpy", etc. or FANUC original functions other than those above. Refer to 34window.man for descriptions about functions other than rettask() or cnc_hldata().

(4) Reading/Writing PMC data Using pmc_rdpmcrng() and pmc_wrpmcrng() can, respectively, read and write PMC data (internal relays (R) and keep relays (K)). Refer to 34window.man for descriptions about pmc_rdpmcrng() or pmc_wrpmcrng().

(5) Data sharing with the other tasks High-Level Task can share data with the other tasks via D-RAM common variables (dramver.c) or S-RAM common variables (sramver.c). 5.9.3 Task execution rule

High-Level Task is called after CNC task in the periodical interrupt procedure at 8msec intervals.

<---- 8msec ---> <---- 8msec ---> <---- 8msec ---> |------|------|------| |--->|==>| |--->|==>| |--->|==>| (A) (B)

(A) CNC task (B) C-EXE High-Level Task

High-Level Task (B) is surely called once at each 8 msec. But execution intervals are not always exact 8 msec.

(T1) <---- 8msec ---> <---- 8msec ---> <---- 8msec ---> <---- 8msec ---> |------|------|------|------| |--->|==>| |----->|==>| |--->|==>| |--->|==>| (T2) |<---- 9msec ----->|<--- 7msec -->|<---- 8msec --->| T1 Interval of interrupt procedure ( == 8 msec ) T2 Interval of High-Level Task ( != 8 msec )

The timing of calling High-Level Task changes according to execution time of CNC task (A) as mentioned above. Generally, each tasks on CNC system, such as CNC, PMC, Servo, etc., run synchronously by hand-shaking each other. Therefore, nothing must be considered about relationship to the other tasks even if the execution intervals change. Total processing time of above-mentioned (B) is limited up to 1 msec for each interruption. When the task attempts to run over 1 msec, the execution is forcedly interrupted by timer interruption. The interrupted task will restart its execution from the interrupted instruction in the next timer interruption procedure. <---- 8msec ---> <---- 8msec ---> <---- 8msec ---> |------|------|------| |--->|===>| |--->|=>| |--->|==>| (B) ^ ^ (B') INTERRUPTED RESTART |<------16msec ------>| (actual interval) In this case, a series of process is divided into multiple parts that are executed on separate interruptions. Therefore, it makes actual interval of the task longer than 8 msec. To avoid this, it is recommended to keep reserve of execution time for High-Level Task, not to reach the upper limit 1 msec. For example, keep actual max. execution time of High-Level task up to approximately 0.8 msec. C Executor management procedure takes approx. 0.02 msec for calling High-Level task. This time is included in the execution time of High-Level task. High-Level Task has priority over the other CNC tasks such as preparing task. If High-Level task runs long time, CPU time for CNC preparing task, etc. may be reduced. (In this case, any harmful effect, such as machining time by CNC's automatic operation increases, etc., may occur.) To avoid influence to the other tasks, it is better to keep execution time of High- Level task as short as possible

The following variables (management data) are defined for looking over the execution time of High-Level Task.

extern struct HL_MNGDATA HL_DATA ;

The detail of this management data is mentioned below.

Each task of C Executor application that includes High-Level task starts as following order.

Task start-up order ~~~~~~~~~~~~~~~~~~~

Initialize CNC soft | v Initialize C-EXE | v Prepare all tasks |------+ v | Start Alarm task | (Interruption procedure | | for every 8 msec) v | Start Communication task | | v v Start High-Level task Start Main task | v Start Window task (Alarm/Communication/Window tasks may not exists.) High-Level task starts on the 1st 8 msec interrupt procedure just after completion of preparation for all tasks. This execution doesn't link to any other tasks' start-up. Therefore, start-up order of High-Level task and the other tasks if not fixed. 5.9.4 Application programming

The following sections mention development process of application including High-Level Task.

(1) Source module(s)

The structure of High-Level Task's source modules is same as the other tasks. That is, it has one or more source modules ( "*.c" file ) and one "main()" function is included in them. The structure of "main()" function is as follows.

void main( void ) { [Initialization] <-- This is executed only at 1st interruption.

for(;;) { [Process for each 8 msec] rettask() ; <-- This function interrupts the } execution of High-Level Task. }

A series of process that is executed at each 8 msec makes a loop program flow. "rettask()" function must be called in the loop.

(2) Describing makefile List the module names of High-Level Task on "TASK5=" line in module definition section on the top of "makefile". List depending relationship of each modules in module dependency block on the bottom of "makefile". These describing format is same as the other tasks.

(3) Compiling and linking Compiling and linking process is same as the ordinary application program.

(4) Setting, etc. No special settings (such as CNC parameter, etc.) are required for application program including High-Level Task. It is loaded into CNC and run as same as the ordinary application program. 5.9.5 Function reference

------1. Interrupt execution of High-Level Task ------

[Name] rettask

[Syntax] void rettask( void )

[Arguments] ------

[Return] ------

[Description] Interrupts High-Level Task's process.

This function is called at the end of a series of process (for each 8 msec) in High-Level Task. The execution will restart just after this function in the next High-Level Task (after 8 msec). The program structure of High-Level Task is generally as follows. void main( void ) { [Initialization] for(;;) { [Process for each 8 msec] rettask() ; } } This function must be called in the main loop like this. ------2. Start and End of getting the High-Level task execution management data ------

[Name] cnc_hldata

[Syntax] #include int cnc_hldata( int mode ) ;

[Arguments] mode execution mode (DATA_START/DATA_END)

[Return] Always 0 returns.

[Description] The start and end of execution management data getting.

The program structure of High-Level Task is generally as follows. void main( void ) { [Initialization] for(;;) { cnc_hldata( DATA_START ); [Process for each 8 msec]] cnc_hldata( DATA_END ); rettask() ; } } Make sure that the desired processing is executed between cnc_hldata calls, as shown above. [Attention] Please do not call this function in the case that don't get execution management data, to economize on processing time. 3. High-Level task execution management data

"High-Level task execution management data" are variables in where how High- Level task runs is stored. The following structure is defined.

struct HL_MNGDATA { unsigned long HL_COUNT ; unsigned int HL_STIME ; unsigned int HL_ETIME ; unsigned int HL_MAXETIME ; unsigned int HL_MAXPROCTIME ; unsigned int HL_TIMEOVER ; unsigned int HL_RETFLAG ; unsigned int HL_BUFCTRL ; unsigned int HL_BUFSIZE ; unsigned int HL_BUFIDX ; unsigned long HL_PTRBUF ; } ;

extern struct HL_MNGDATA HL_DATA ; All tasks can access this "HL_MNGDATA". All members are readable and writable.

HL_COUNT High-Level task calling count (accumulated value).

HL_STIME High-Level task's execution start time. HL_ETIME High-Level task's execution end time. When High-Level task starts and ends in each 8 msec interruption process are recorded in these members. This value is elapsed time ([micro-sec]) from the top of each 8 msec interruption process. And the next operation shows execution time of High- Level task ([micro-sec]). HL_ETIME - HL_STIME HL_MAXETIME Maximum value of HL_ETIME. This is the maximum value of end time of High-Level task's execution. This indicates the maximum elapsed time of interruption process. The unit of this value is [micro-sec]. HL_MAXPROCTIME Maximum value of (HL_ETIME - HL_STIME)

This is the maximum execution time of High-Level task. The unit of this value is [micro-sec].

HL_TIMEOVER Total counts that execution time exceeds the limit (1 msec).

This is total count that High-Level task attempts to exceeds 1 msec execution time and is forcibly terminated.

HL_RETFLAG "rettask()" function execution flag.

This is internal flag.

HL_BUFCTRL Execution time logging control flag. HL_BUFSIZE Execution time logging buffer size. HL_BUFIDX Execution time logging buffer index. HL_PTRBUF Pointer to execution time logging buffer.

These are control variables for logging High-Level task's execution time (HL_STIME and HL_ETIME). To set command value in HL_BUFCTRL starts logging function.

HL_BUFCTRL = 0 Stop logging (initial state) 1 Start logging (one shot) 2 Start logging (repeat) Before starting logging function, set address of buffer memory in HL_PTRBUF and byte size of it in HL_BUFSIZE. Buffer size must be multiple of 8. HL_BUFIDX is index which indicates writing position. At start time of logging, set HL_BUFIDX = 0. After starting logging, HL_STIME and HL_ETIME are stored in buffer memory for each High-Level task calling. When the index encounters the end of buffer, one of the following process will be done. HL_BUFCTRL = 1 Stop logging. HL_BUFCTRL is set as 0. HL_BUFCTRL = 2 Continue logging from the top of buffer memory with setting writing index (HL_BUFIDX) as 0. Data format stored in buffer memory is as follows.

Byte offset from the top of buffer Stored data ------+------+0000 HL_STIME (0) +0004 HL_ETIME (0) +0008 HL_STIME (1) +0012 HL_ETIME (1) : : 5.10 Programming technique ======

5.10.1 Various techniques

(1) Making application program faster

There is considerable over-head in calling library function of C Executor. (in comparison with personal computer's applications.) This is mainly based on the two reason.

1. Execution of function may changes privilege level. To display to the screen or to call CNC window process, procedure changes privilege level. This transition of privilege level needs many CPU clocks.

2. Function may request CNC software. All "Write function" and a part of "Read function"(reading macro variable, etc.) of CNC window functions request CNC software to process, and wait completion. This takes more than 8msec ( = a half of poring period of CNC software) on the average. Therefore, frequent calling of function may make the processing speed of the application program down. Reducing function calling count, by using single function calling for multiple processes, makes speed up.

(Example) * Character output Use "putchar()" to display one by one. --> Use "puts()" or "printf()" to display one character string. * Reading/Writing NC data To read/write the continuous data, use "range type" function other than single access type function. On VGA display device, characters are displayed very slowly while the character cursor is enabled by "ESC[>5l". To avoid this, disable the cursor by specifying "ESC[>5h" mode. (2) How to use inter-task common variable

There are two type variables (memory) that C Executor application can access.

Local memory Memory that only owner task can access.

Inter-task Memory that all tasks can access. common memory

< C Executor memory > +------+ | Library memory | +------+ | TASK1 local memory | --+ +------+ | | TASK2 local memory | +- Only each task can access. +------+ | | TASK3 local memory | --+ +------+ --+ | Inter-task common memory | +- All tasks can access. +------+ --+

Program code, global variables, static variables and stack are (including local variables) for each task are allocated in each task's local memory. < Local memory for each task > +------+ | Program code | +------+ | Global variables, | | Static variables | +------+ | Stack area (Local variables) | +------+ For multitask application, inter-task common variables, which are allocated on common memory area, is used to share information with the other tasks. There are two memory area for inter-task common variable on S-RAM and D-RAM. The variables which are defined in "SRAMVER.C" and "DRAMVER.C" of the application program are allocated on inter-task common memory area of S-RAM and D-RAM. < Inter-task common memory area > +------+ | S-RAM common memory | <-- Vars. defined in SRAMVAR.C +------+ | D-RAM common memory | <-- Vars. defined in DRAMVAR.C +------+ These memory objects are able to accessed by each task. Put all data which are used for exchanging information between tasks on this inter-task common memory area. (i.e.,in variables defined in SRAMVER.C or DRAMVER.C) Take care of exchanging pointers between tasks. It is possible to exchange pointer value stored in common variable between tasks. But don't put data, which are pointed by the pointer, on the local memory area for each tasks. When the other task attempts to access the local memory of another task using the pointer, invalid memory access occurs. It is possible to exchange pointers which point memory object allocted on the common memory. 5.10.2 Applying C Executor to machine

(1) Machine maintenance

Machine Tool Builders(MTB) can make their own custom man-machine interface, such as screen display and operation method, on CNC device made by FANUC using C Executor. This is better for MTB and end users in most case. However, take care the following point.

FANUC servicemen maintain FANUC-CNC which is equipped with machine tool running on field. FANUC servicemen well know about FANUC-CNC's operations. But they don't well know the MTB own operation methods. If servicemem don't suitably operate the machine by MTB own operation methods, maintenance work may not be carried smoothly. By the following consideration in MTB, problems on maintenance work are reduced.

* Attach the manual on which operation method of your application is described to the machine surely.

* Keep the NC screens which are needed for maintenance work (mainly such as [SYSTEM] screens) displayable.

* Enable the basic machine operation even without your C application. (For example, while CNC is started with [M]+[0] keys.)

(2) Application which needs sure response The auxiliary tasks don't well respond to the events because of task management specification. For example, in the application which has a periodical auxiliary task execution, the actual period of the auxiliary task may scatter by 10 - 20 [msec]. This is based on that the C application tasks coexist with the NC software tasks and its priority is lower than the NC task. The C application has an enough response for man-machine interface processing. Use the PMC ladder software or the C application of PMC for processing which needs sure response. For example, sampling machine signals or load of motors periodically, communicating with the other devices, PMC is more suitable for these application than C Executor. B-63944EN-3/01 INDEX

INDEX

2-byte characters...... 720 High-Level Task ...... 760 How do application program run on each equipment ... 750 How to make application program...... 59, 748 ANSI C standard library ...... 18, 38, 70 Application program...... 8 Application program development environment...... 14 INDEX...... 35 Application programming...... 764 Installing the Diab C/C++ Power-PC compiler ...... 65 Applying C Executor to machine...... 772 Available functions for the window task ...... 747 Kanji character code ...... 726 Key operation at power on...... 734 C Executor...... 6 Keycode...... 713 C language library function list ...... 18 Keycode of special keys on MDI panel ...... 714 C library...... 7 CNC/PMC window library...... 24, 48, 301 List of Functions...... 38 Code Tables...... 713 Compatibility related to variables of type 'int' ...... 66 Composition of development system...... 14 MAKEFILE ...... 63 Conforming CNC screen display...... 749 Making application program...... 755 Conforming O8-digits program number ...... 744 MDI operation library...... 482 CRT display control characters...... 715 MS-C extended C standard library ...... 21, 204 CRT operation library...... 507 Multitasking...... 727

Dat2mem utility manual ...... 738 Notes...... Data access between tasks ...... 729 Describing 2-byte characters in source-codes...... 66 Other libraries...... 26, 51 Development procedure...... 16 Other References...... 727 Difference of each task class...... 728 Outline...... 59 Display code for single byte characters ...... 723 Overview...... 3, 745, 749 Display control escape sequences...... 715 Overview of High-Level Task...... 760 Displayable characters ...... 719

Parameter setting on CNC ...... 735 FCA Library ...... 659 Power-on procedure...... 734 Feature...... 4 Programming technique...... 770 File Operation Library...... 604 File system...... 731 F-ROM Library...... 692 Remarks...... 67 Function reference ...... 68, 757, 765 Required software for application development ...... 37 Restrictions on specification...... 754 Graphic library...... 22, 46, 207

i-1 INDEX B-63944EN-3/01

Save current environment for non-local jump. ...... 111 Serial Library...... 612 Single byte characters...... 719 Special files ...... 62 Specification...... 760 System components ...... 6

Task classes ...... 727 Task execution rule...... 762 Task Management...... 730 Task management library...... 631 Task switching...... 728 The hardwares of CNC which are used in C Executor.... 11 Touch-panel Library...... 707

Usage of the window task...... 746 Using compiler libraries ...... 66

Various techniques ...... 770

Window task...... 745 Window task's execution ...... 745

i-2 Revision Record FANUC Series 30i/300i/300is-MODEL A C Language Executor PROGRAMMIG MANUAL (B-63944EN-3)

01 Jul., 2003

Edition Date Contents Edition Date Contents • No part of this manual may be reproduced in any form.

• All specifications and designs are subject to change without notice.