Description
                Writes the PMC data of the specified PMC address/range.
 
                This function is used to exchange the data between the application on
                MMC function and LADDER software on PMC.
            
Universal Fanuc Driver
Fanuc Focas Library CD
Declaration
Arguments
Specify the library handle. See "Library handle" for details.
| data_type is 0(byte type) | : | length = 8 + N | 
| data_type is 1(word type) | : | length = 8 + N × 2 | 
| data_type is 2(long type) | : | length = 8 + N × 4 | 
| data_type is 4(32-bit floating-point type) | : | length = 8 + N × 4 | 
| data_type is 5(64-bit floating-point type) | : | length = 8 + N × 8 | 
                            Pointer to the IODBPMC structure.
                            The IODBPMC structure is as follows.
                            In case of using PMC memory D in Series 0i-F, 30i/31i/32i/35i-B, PMi-A, define character constant "PMCMEMD" at compiling by the '-D' option.
                        
#if defined (PMCMEMD)
typedef struct iodbpmc {
    short            type_a ;   /* Kind of PMC address */
    short            type_d ;   /* Type of the PMC data */
    unsigned short   datano_s ; /* Start PMC address number */
    unsigned short   datano_e ; /* End PMC address number */
    union {
        char    cdata[N] ;/* The PMC data(byte type) */
        short   idata[N] ;/*             (word type) */
        long    ldata[N] ;/*             (long type) */
        float   fdata[N] ; /*            (32-bit floating-point type)*/
        double  dfdata[N]; /*            (64-bit floating-point type)*/
    } u ;           /* N is the number of read data */
} IODBPMC ;
#else
typedef struct  iodbpmc {
    short   type_a ;    /* Kind of PMC address */
    short   type_d ;    /* Type of the PMC data */
    short   datano_s ;  /* Start PMC address number */
    short   datano_e ;  /* End PMC address number */
    union {
        char    cdata[N] ;/* The PMC data(byte type) */
        short   idata[N] ;/*             (word type) */
        long    ldata[N] ;/*             (long type) */
        float   fdata[N] ; /*            (32-bit floating-point type)*/
        double  dfdata[N]; /*            (64-bit floating-point type)*/
    } u ;           /* N is the number of written data */
} IODBPMC ;
#endif
- type_a
 - Specify the identification code corresponding to the kind of the PMC address.
 - type_d
 - Specify the type of the PMC data.
It must be the same one as the type of data of the PMC side. - datano_s
 - Specify the start PMC address number.
 - datano_e
 - Specify the end PMC address number.
 
| 0 | : | Byte type | 
| 1 | : | Word type | 
| 2 | : | Long type | 
| 4 | : | 32-bit floating-point type(30i-B Series/0i-F/PMi-A only) | 
| 5 | : | 64-bit floating-point type(30i-B Series/0i-F/PMi-A only) | 
Example of specifying argument
- 250 is written in D0100(It is assumed the word type)
 - 0 is written all of R0200,..,R0209(It is assumed byte type)
 - 1.1 is written in D0100(It is assumed 32-bit floating-point type)
 - -2.2 and 33.3 are written in R104, R112(It is assumed 64-bit floating-point type)
 
| buf.type_a | 9 | 
| buf.type_d | 1 | 
| buf.datano_s | 100 | 
| buf.datano_e | 101 | 
| length | 8+2×1 (=10) | 
| buf.u.idata[0] | 250 | 
| buf.type_a | 5 | 
| buf.type_d | 0 | 
| buf.datano_s | 200 | 
| buf.datano_e | 209 | 
| length | 8+1×10 (=18) | 
| buf.u.cdata[0] ,..,buf.u.cdata[9]  | 
0 all | 
| buf.type_a | 9 | 
| buf.type_d | 4 | 
| buf.datano_s | 100 | 
| buf.datano_e | 103 | 
| length | 8+4×1 (=12) | 
| buf.u.idata[0] | 1.1 | 
| buf.type_a | 5 | 
| buf.type_d | 5 | 
| buf.datano_s | 104 | 
| buf.datano_e | 119 | 
| length | 8+8×2 (=24) | 
| buf.u.idata[0] | -2.2 | 
| buf.u.idata[1] | 33.3 | 
Return
EW_OK is returned on successful completion, otherwise any value except EW_OK is returned.
The major error codes are as follows.
| Return code | Meaning/Error handling | 
|---|---|
(1)  | 
|
(2)  | 
Size of IODBPMC structure(length) is wrong.  | 
(3)  | 
Address range error PMC address number(datano_s,datano_e) is wrong.  | 
(4)  | 
Kind of PMC address(type_a) or type of PMC data (type_d) is wrong.  | 
(17)  | 
(Series 16i/18i/21i, 0i-A/B/C)  | 
As for the other return codes or the details, see "Return status of Data window function"
CNC option
For HSSB connection,
For Ethernet connection,
The Ethernet function and the extended driver/library function are necessary. However, in case of Series 16i/18i/21i-B, 0i-B/C/D/F, Series 30i and PMi-A, the required CNC option is as follows. When Embedded Ethernet is used,above two optional functions are not required.
When Ethernet board is used,
- only Ethernet function is required.
 
CNC parameter
This function is not related to CNC parameter.
CNC mode
This function can be used in any CNC mode.
Available CNC
| 0i-A | 0i-B/C(Note) | 0i-D | 0i-F | 15 | 15i | 16 | 18 | 21 | 16i-A | 18i-A | 21i-A | 16i-B | 18i-B | 21i-B | 30i-A | 30i-B | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| M (Machining) | |||||||||||||||||
| T (Turning) | - | ||||||||||||||||
| LC (Loader) | - | - | - | - | - | - | - | - | 
| 0i-D | 0i-F | 16i | 18i | 30i-A | 30i-B | |
|---|---|---|---|---|---|---|
| P (Punch press) | - | |||||
| L (Laser) | - | - | - | - | ||
| W (Wire) | - | - | 
| Power Mate i-D | |
| Power Mate i-H | |
| Power Motion i-A | O | 
| "O" | : | Both Ethernet and HSSB | |
| "E" | : | Ethernet | |
| "H" | : | HSSB | |
| "X" | : | Cannot be used | |
| "-" | : | None | 
Note) 0i-C does not support the HSSB function.
See Also
Example(C Language)
The following program writes the PMC data within the specified
PMC address range.
#include "fwlib32.h"
/* start/end are start/end PMC address to be written. */
/* values is array of value to be written. */
short example( short start, short end, char* values )
{
        IODBPMC *pmcrng;
        short ret, idx;
        unsigned short length;
        length = 8 + (end - start + 1);
        pmcrng = (IODBPMC *)malloc( length );
        pmcrng->type_a = 0;                       // In case that kind of PMC address is G
        pmcrng->type_d = 0;                       // In case that type of PMC data is Byte
        pmcrng->datano_s = start;
        pmcrng->datano_e = end;
        for (idx = 0; idx < end - start + 1; idx++)
        {
                pmcrng->u.cdata[idx] = values[idx];
        }
        ret = pmc_wrpmcrng( h, length, pmcrng );
        if ( ret )
        {
                printf( "ERROR!(%d)\n", ret );
        }
        free( pmcrng ) ;
        return ( ret ) ;
}
Example(C#)
The following program writes the PMC data within the specified
PMC address range.
class example
{
    /* start/end are start/end PMC address to be written. */
    /* values is array of value to be written. */
    public short sample(short start, short end, byte[] value)
    {
        Focas1.IODBPMC0 pmcHead = new Focas1.IODBPMC0();
        short ret, idx;
        ushort length;
        length = (ushort)(8 + (end - start + 1));
        byte[] bytes = new byte[length];
        IntPtr ptrHead = Marshal.AllocCoTaskMem(Marshal.SizeOf(pmcHead));
        pmcHead.type_a = 0;                    // In case that kind of PMC address is G
        pmcHead.type_d = 0;                    // In case that type of PMC data is Byte
        pmcHead.datano_s = start;
        pmcHead.datano_e = end;
        Marshal.StructureToPtr(pmcHead, ptrHead, false);
        Marshal.Copy(ptrHead, bytes, 0, 8);
        for (idx = 0; idx < end - start + 1; idx++)
        {
            bytes[8 + idx] = value[idx];
        }
        ret = Focas1.pmc_wrpmcrng(h, length, bytes);
        if (ret != Focas1.EW_OK)
        {
            Console.WriteLine("ERROR!({0})", ret);
        }
        Marshal.FreeCoTaskMem(ptrHead);
        return (ret);
    }
}
}