yangys
2024-01-29 65847de5b990c347c12394d48c745438e141a6ba
focas增加java直接调用fwlib的实现
已修改6个文件
已添加43个文件
2539 ■■■■■ 文件已修改
mdc-parent/mdc-collect/nativelib/focas/Fwlib32.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/nativelib/focas/Fwlib64.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/nativelib/focas/fwlibe1.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/nativelib/focas/fwlibe64.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/natives/focas/Fwlib32.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/domain/MachiningData.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/FocasJavaClient.java 861 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/FocasThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/JNAFocas.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/JNAJavaFocas.java 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/DBTLUSE.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/Focas.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/IODBPMC0.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/LOADELM.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBACT.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBALMMSG2.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBALMMSG2_data.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBEXAXISNAME.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBEXEPRG.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBNC_2.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBPOS.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBPRO.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBPRO8.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSPLOAD.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSPLOAD_data.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSPN.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBST.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSVLOAD.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSYS.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBUSEGRP.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/POSELM.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/POSELMALL.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/utils/LibraryLoadHelper.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/lib/focas/Fwlib64.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/lib/focas/fwlibe64.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/Fwlib32.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/Fwlib64.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/HxFocasApi.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/HxFocasApi.lib 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/fwlibe1.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/fwlibe64.dll 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/FocasClientTest.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/FocasJavaClientTest.java 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyDll.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyDllTest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyJNAFocas.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyJNAFocasTest.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/utils/LibraryLoadHelperTest.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mdc-parent/mdc-collect/nativelib/focas/Fwlib32.dll
Binary files differ
mdc-parent/mdc-collect/nativelib/focas/Fwlib64.dll
Binary files differ
mdc-parent/mdc-collect/nativelib/focas/fwlibe1.dll
Binary files differ
mdc-parent/mdc-collect/nativelib/focas/fwlibe64.dll
Binary files differ
mdc-parent/mdc-collect/natives/focas/Fwlib32.dll
Binary files differ
mdc-parent/mdc-collect/pom.xml
@@ -22,7 +22,7 @@
        <jedis.version>3.1.0</jedis.version>
        <nekohtml.version>1.9.22</nekohtml.version>
        <commons-pool2.version>2.6.2</commons-pool2.version>
        <jna.version>5.4.0</jna.version>
        <jna.version>5.14.0</jna.version>
        <poi.version>4.1.2</poi.version>
        <poi-ooxml.version>4.1.2</poi-ooxml.version>
        <poi-ooxml-schemas.version>4.1.2</poi-ooxml-schemas.version>
@@ -127,7 +127,7 @@
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.4.0</version>
            <version>${jna.version}</version>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/domain/MachiningData.java
@@ -35,18 +35,33 @@
    private Integer spindleSpeed;
    // @Column(name = "spindle_override")
    /**
     * ä¸»è½´å€çއ
     */
    private Integer spindleOverride;
    // @Column(name = "spindle_load")
    /**
     * ä¸»è½´è´Ÿè½½
     */
    private Integer spindleLoad;
    // @Column(name = "feedrate_override")
    /**
     * è¿›ç»™å€çއ
     */
    private Integer feedrateOverride;
    // @Column(name = "feed_rate")
    /**
     * è¿›ç»™çއ
     */
    private Integer feedRate;
    // @Column(name = "rapid_feed_override")
    /**
     * å¿«é€Ÿè¿›ç»™å€çއ G00的倍率
     */
    private Integer rapidFeedOverride;
    // @Column(name = "rapid_feed")
@@ -65,6 +80,9 @@
    private String alarmMsg;
    // @Column(name = "tool_no")
    /**
     * åˆ€å…·ç¼–号
     */
    private Integer toolNo;
    // @Column(name = "tool_name")
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/FocasJavaClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,861 @@
package com.qianwen.mdc.service.focas;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.qianwen.mdc.service.focas.types.DBTLUSE;
import com.qianwen.mdc.service.focas.types.IODBPMC0;
import com.qianwen.mdc.service.focas.types.LOADELM;
import com.qianwen.mdc.service.focas.types.ODBACT;
import com.qianwen.mdc.service.focas.types.ODBALMMSG2;
import com.qianwen.mdc.service.focas.types.ODBALMMSG2_data;
import com.qianwen.mdc.service.focas.types.ODBEXAXISNAME;
import com.qianwen.mdc.service.focas.types.ODBEXEPRG;
import com.qianwen.mdc.service.focas.types.ODBPOS;
import com.qianwen.mdc.service.focas.types.ODBPRO;
import com.qianwen.mdc.service.focas.types.ODBPRO8;
import com.qianwen.mdc.service.focas.types.ODBSPLOAD;
import com.qianwen.mdc.service.focas.types.ODBST;
import com.qianwen.mdc.service.focas.types.ODBSVLOAD;
import com.qianwen.mdc.service.focas.types.ODBSYS;
import com.qianwen.mdc.service.focas.types.ODBUSEGRP;
import com.qianwen.mdc.service.focas.types.POSELMALL;
import com.qianwen.mdc.utils.MdcException;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.ShortByReference;
public class FocasJavaClient {
    private String ip;
    private short port;
    private short flibHndl;// å¥æŸ„
    private static final Logger logger = LoggerFactory.getLogger(FocasJavaClient.class);
    private int timeout = 10;
    private short axisNum = 0;
    private List<String> axisNames = null;
    private int count = 0;
    private boolean connected = false;
    public int connect() {
        ShortByReference fHndl = new ShortByReference();
        short ret = JNAJavaFocas.Fwlib.cnc_allclibhndl3(this.ip, this.port, this.timeout, fHndl);
        if (ret == FocasRet.EW_OK) {
            // è¿žæŽ¥æˆåŠŸ
            this.count = 0;
            this.connected = true;
            this.flibHndl = fHndl.getValue();
        } else if (ret == FocasRet.EW_SOCKET) {
            // è¿žæŽ¥å¤±è´¥
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return ret;
    }
    /**
     * æ–­å¼€è¿žæŽ¥
     *
     * @return
     */
    public int disconnect() {
        short ret = JNAJavaFocas.Fwlib.cnc_freelibhndl(this.flibHndl);
        if (ret == FocasRet.EW_OK) {
            this.connected = false;
        }
        return ret;
    }
    /**
     * é‡æ–°é“¾æŽ¥æœºåºŠ
     *
     * @return
     */
    public int reconnect() {
        int ret = 0;
        try {
            disconnect();
            ret = connect();
        } catch (Exception e) {
        }
        return ret;
    }
    /**
     * è¯»å–设备型号,如: 160i-W , 180i-W
     *
     * @return
     */
    public String readCncType() {
        ODBSYS sysInfo = new ODBSYS();
        short ret = JNAJavaFocas.Fwlib.cnc_sysinfo(flibHndl, sysInfo);
        if (ret != FocasRet.EW_OK) {
            return "";
        }
        // 32, 48
        // String cncTypeNum = new String(new char[] {(char)sysInfo.cnc_type[0] ,
        // (char)sysInfo.cnc_type[1]});//类型编号
        String cncTypeNum = byteArrToString(sysInfo.cnc_type);
        String cncType;
        switch (cncTypeNum) {
        case "15":
            cncType = "Series 15/15i";
            break;
        case "16":
            cncType = "Series 16/16i";
            break;
        case "18":
            cncType = "Series 18/18i";
            break;
        case "21":
            cncType = "Series 21/21i";
            break;
        case "30":
            cncType = "Series 30i";
            break;
        case "31":
            cncType = "Series 31i";
            break;
        case "32":
            cncType = "Series 32i";
            break;
        case "35":
            cncType = "Series 35i";
            break;
        case " 0":
            cncType = "Series 0i";
            break;
        case "PD":
            cncType = "Power Mate i-D";
            break;
        case "PH":
            cncType = "Power Mate i-H";
            break;
        case "PM":
            cncType = "Power Motion i";
            break;
        default:
            cncType = "其它类型";
            break;
        }
        return cncType;
    }
    /**
     * byte数组转换为字符串
     *
     * @param bytes
     * @return
     */
    String byteArrToString(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        char[] charArr = new char[bytes.length];
        int i = 0;
        while (i < bytes.length && bytes[i] != 0) {
            charArr[i] = (char) bytes[i];
            i++;
        }
        return new String(charArr, 0, i);
    }
    String charArrToString(char[] charArr) {
        if (charArr == null) {
            return null;
        }
        int i = 0;
        while (charArr[i] != 0) {
            i++;
        }
        return new String(charArr, 0, i);
    }
    public String readAxisName() {
        ShortByReference rdnum = new ShortByReference((short)32);//最大32个轴
        ODBEXAXISNAME dataObj = new ODBEXAXISNAME();
        short ret2 = JNAJavaFocas.Fwlib.cnc_exaxisname(this.flibHndl,(short)0,rdnum,dataObj);
        ArrayList<String> names = new ArrayList<>();
        if(ret2 == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            Class<ODBEXAXISNAME> clazz1 = ODBEXAXISNAME.class;
            for(int i=0;i<rdnum.getValue();i++) {
                try {
                    Field f = clazz1.getField("axname"+(i+1));
                    byte[] anameB = (byte[])f.get(dataObj);
                    names.add(byteArrToString(anameB));
                } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        String anames = StringUtils.join(names, ":");
        return anames;
    }
    /**
     * è¯»å–状态
     *
     * @return
     */
    public ODBST readState() {
        ODBST stateObj = new ODBST();
        short ret = JNAJavaFocas.Fwlib.cnc_statinfo(this.flibHndl, stateObj);
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            // System.out.println(stateObj);
            // jsonResult.put("alarmState", stateObj.alarm);
            // jsonResult.put("emergency", stateObj.emergency);
            // ä»¥ä¸Š2个可以确定争取也
            // jsonResult.put("opState", stateObj.aut);//这个基本ok
            // jsonResult.put("ncState", stateObj.motion);//这个不确定
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return stateObj;
    }
    /**
     * è¯»å–报警信息
     * @param lang
     * @return
     */
    public JSONObject readAlarm(String lang) {
        JSONObject jsonResult = new JSONObject();
        ShortByReference num = new ShortByReference((short)10);
        ODBALMMSG2 almmsg = new ODBALMMSG2();
        short ret = JNAJavaFocas.Fwlib.cnc_rdalmmsg2(this.flibHndl,(short)-1,num,almmsg);
        if (ret == 0) {
            this.count = 0;
            this.connected = true;
            int n = num.getValue();
            if (n > 0) {
                ArrayList<Integer> alarmNoList = new ArrayList<>();
                ArrayList<Short> alarmAxisList = new ArrayList<>();
                ArrayList<Short> alarmTypeList = new ArrayList<>();
                ArrayList<String> alarmTxtList = new ArrayList<>();
                Class<ODBALMMSG2> clazz = ODBALMMSG2.class;
                for (int i = 0; i < n; i++) {
                    Field f;
                    try {
                        f = clazz.getField("msg"+(i+1));
                        ODBALMMSG2_data d = (ODBALMMSG2_data)f.get(almmsg);
                        alarmNoList.add(d.alm_no);
                        alarmTypeList.add(d.type);
                        alarmAxisList.add(d.axis);
                        alarmTxtList.add(this.byteArrToString(d.alm_msg) );
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (SecurityException e) {
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    String msg = StringUtils.join(alarmTxtList,":");
                    if (lang.equals("Shift_JIS") || lang.equals("GBK")) {
                        jsonResult.put("alarmTxt", new String(msg.getBytes(), lang).trim());
                    } else {
                        jsonResult.put("alarmTxt", new String(msg.getBytes(), StandardCharsets.UTF_8).trim());
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
        } else if (ret == -16 || ret == -8) {
            int i2 = this.count + 1;
            this.count = i2;
            if (i2 >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return jsonResult;
    }
    /**
     * è¯»å–主轴倍率
     * https://csharp.hotexamples.com/zh/examples/-/Focas1.IODBPMC0/-/php-focas1.iodbpmc0-class-examples.html
     *
     * @return
     */
    public int readSpindleOverride() {
        int spindleOverride = 0;
        IODBPMC0 dataObj = new IODBPMC0();
        short ret = JNAJavaFocas.Fwlib.pmc_rdpmcrng(this.flibHndl, (short) 0, (short) 0, (short) 30, (short) 30,
                (short) 16, dataObj);// æ•´åž‹æ˜¯è¯»ä¸»è½´å€çŽ‡çš„å›ºå®šå‚æ•°
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            spindleOverride = dataObj.cdata[0];
            ;
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return spindleOverride;
    }
    /**
     * è¯»å–主轴负载 readSpLoad
     *
     * @return
     */
    public int readSpLoad() {
        int spLoad = 0;
        /*
         * ODBSPN dataObj = new ODBSPN(); short ret =
         * JNAJavaFocas.Fwlib.cnc_rdspload(this.flibHndl,Focas.ALL_SPINDLES, dataObj);
         */
        ShortByReference data_num = new ShortByReference((short) 1);
        ODBSPLOAD dataObj = new ODBSPLOAD();
        short ret = JNAJavaFocas.Fwlib.cnc_rdspmeter(this.flibHndl, (short) 0, data_num, dataObj);
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            // sp.spload1.spload.data
            spLoad = dataObj.spload1.spload.data;
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return spLoad;
    }
    /**
     * è¯»å–CNC主轴的转速
     *
     * @return
     */
    public int readActs() {
        int actSpeed = 0;
        // IntByReference actSpeed = new IntByReference();
        ODBACT dataObj = new ODBACT();
        short ret = JNAJavaFocas.Fwlib.cnc_acts(this.flibHndl, dataObj);
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            actSpeed = dataObj.data;
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return actSpeed;
    }
    /**
     * è¯»å–所有伺服轴负载,冒号分割
     * @return
     */
    public String readAxisServoload() {
        ShortByReference data_num = new ShortByReference((short)32);
        ODBSVLOAD dataObj = new ODBSVLOAD();
        short ret = JNAJavaFocas.Fwlib.cnc_rdsvmeter(this.flibHndl,data_num,dataObj);
        ArrayList<Integer> loads = new ArrayList<>();
        if (ret == 0) {
            this.count = 0;
            this.connected = true;
            Class<ODBSVLOAD> clazz = ODBSVLOAD.class;
            for (int i = 0; i < data_num.getValue(); i++) {
                Field f;
                try {
                    f = clazz.getField("svload"+(i+1));
                    LOADELM loadelm = (LOADELM)f.get(dataObj);
                    loads.add(loadelm.data);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        } else if (ret == -16 || ret == -8) {
            int i2 = this.count + 1;
            this.count = i2;
            if (i2 >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return StringUtils.join(loads,":");
    }
    /**
     * è¯»å–进给倍率
     *
     * @return
     */
    public int readFeedRateOverride() {
        int feedRateResult = 0;
        IODBPMC0 dataObj = new IODBPMC0();
        // https://csharp.hotexamples.com/zh/examples/-/Focas1.IODBPMC0/-/php-focas1.iodbpmc0-class-examples.html
        short ret = JNAJavaFocas.Fwlib.pmc_rdpmcrng(this.flibHndl, (short) 0, (short) 0, (short) 12, (short) 12,
                (short) 9, dataObj);
        if (ret == FocasRet.EW_OK) {
            // FeedOverRide = (100 - (dataObj.cdata[0] - 155)).ToString();//进给倍率 è½¬æ¢æˆç™¾åˆ†æ¯”
            // ä¸ºä»€ä¹ˆæ˜¯155没搞懂,设备不同也可能不是155
            // this.txtFeedOverRide.Text = FeedOverRide.ToString();
        }
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            feedRateResult = dataObj.cdata[0];
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return feedRateResult;
    }
    /**
     * è¯»å–实际进给倍率
     *
     * @return
     */
    public int readActf() {
        int actFeedRate = 0;
        ODBACT dataObj = new ODBACT();
        short ret = JNAJavaFocas.Fwlib.cnc_actf(this.flibHndl, dataObj);
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            actFeedRate = dataObj.data;
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return actFeedRate;
    }
    /**
     * è¯»å–快速倍率??,这个没找到资料,以前程序也没有使用
     *
     * @return
     */
    /*
     * public int readRapidRate() { int rapidRateResult = 0; IntByReference
     * rapidRate = new IntByReference(); short ret =
     * JNAFocas.XX.readRapidRate(this.flibHndl, rapidRate); if (ret == 0) {
     * this.count = 0; this.connected = true; rapidRateResult =
     * rapidRate.getValue(); } else if (ret == -16 || ret == -8) { int i =
     * this.count + 1; this.count = i; if (i >= 3) { this.connected = false; } throw
     * new MdcException(); } return rapidRateResult; }
     */
    /**
     * æ˜¯å¦æ˜¯ONO8d(即是否Series 15i, 16/18/21, 16i/18i/21i, 0i, 30i, Power Mate i))
     *
     * @return
     */
      boolean isONO8D() { //TODO è¿™ä¸ªæ˜¯å¦éœ€è¦å†çœ‹çœ‹ï¼Ÿ
          String cncType = this.readCncType();
          return cncType.contains("15i") || cncType.contains("16") || cncType.contains("18");
      }
    /**
     * è¯»å–程序编号,包括当前程序编号和主程序编号
     *
     * @return ç¼–号
     */
    public int readPrgNo() {
        int prgNo = -1;
        short ret = -1;
        boolean isOno8D = this.isONO8D();
        ODBPRO8 dataObj8 = new ODBPRO8();
        ODBPRO dataObj = new ODBPRO();
         //isOno8D = true;
         if(isOno8D) {
             ret = JNAJavaFocas.Fwlib.cnc_rdprgnumo8(this.flibHndl, dataObj8);
         }else {
             ret = JNAJavaFocas.Fwlib.cnc_rdprgnum(this.flibHndl, dataObj);
         }
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            if(isOno8D) {
                prgNo = dataObj8.data;
            }else {
                prgNo = dataObj.data;
            }
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return prgNo;
    }
    /**
     * æš‚停,m00程序暂停,m01选择性暂停 wb
     *
     * @return
     */
    public boolean isM00M01() {
        IntByReference state = new IntByReference();
        short ret = JNAFocas.HxFocas.readM00M01State(this.flibHndl, state);
        if (ret == 0) {
            this.count = 0;
            this.connected = true;
            if (state.getValue() == 1) {
                return true;
            }
            return false;
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        } else {
            return false;
        }
    }
    public boolean isPrgReady() {
        IntByReference state = new IntByReference();
        short ret = JNAFocas.HxFocas.readPrgReadyState(this.flibHndl, state);
        if (ret == 0) {
            this.count = 0;
            this.connected = true;
            if (state.getValue() == 1) {
                return true;
            }
            return false;
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        } else {
            return false;
        }
    }
    /**
     * è¯»å–正在执行的程序名称
     *
     * @param prgNo
     * @return
     */
    public String readExePrgName() {
        String realPrgName = null;
        ODBEXEPRG dataObj = new ODBEXEPRG();
        // TODO æœ‰é—®é¢˜ï¼Œæ²¡æœ‰æŒ‰ç…§ç¼–号获取
        // short ret = JNAJavaFocas.Fwlib.cnc_rdproginfo(this.flibHndl,
        // (short)1,(short)31, dataObj);
        short ret = JNAJavaFocas.Fwlib.cnc_exeprgname(this.flibHndl, dataObj);
        if (ret == 0) {
            this.count = 0;
            this.connected = true;
            realPrgName = this.byteArrToString(dataObj.name);
            // new String(prgName).trim();
            int len = realPrgName.length();
            if (len >= 2) {
                realPrgName = realPrgName.substring(1, len - 1);
            }
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return realPrgName;
    }
    /**
     * è¯»å–各个轴的位置信息
     * @return
     */
    public JSONObject readPosition() {
        JSONObject jsonResult = new JSONObject();
        final short type = -1;
        ShortByReference data_num = new ShortByReference((short)32); //最大的轴个数,最多32,调用后会返回实际数
        ODBPOS dataObj = new ODBPOS();
        short ret = JNAJavaFocas.Fwlib.cnc_rdposition(this.flibHndl,type,data_num,dataObj);
        //cnc_rdposition
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            short num = data_num.getValue();
            //absoluteSb.append(dataObj.p1.abs.data);
            ArrayList<Integer> absArr = new ArrayList<>();
            ArrayList<Integer> abs2Arr = new ArrayList<>();
            ArrayList<Integer> relArr = new ArrayList<>();
            ArrayList<Integer> machArr = new ArrayList<>();
            ArrayList<Integer> distArr = new ArrayList<>();
            Class<ODBPOS> clazz1 = ODBPOS.class;
            //Class<POSELMALL> poselmallClazz = POSELMALL.class;
            for (short i = 0; i < num; i++) {
                //absArr.add(dataObj.p1.abs.data);
                try {
                    Field f = clazz1.getField("p"+(i+1));
                    POSELMALL posm = (POSELMALL) f.get(dataObj);
                    absArr.add(posm.abs.data);
                    relArr.add(posm.rel.data);
                    machArr.add(posm.mach.data);
                    distArr.add(posm.dist.data);
                } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            /*
            absoluteSb.setLength(absoluteSb.length() - 1);
            relativeSb.setLength(relativeSb.length() - 1);
            machineSb.setLength(machineSb.length() - 1);
            distanceSb.setLength(distanceSb.length() - 1);
            jsonResult.put("absolute", absoluteSb.toString());
            jsonResult.put("relative", relativeSb.toString());
            jsonResult.put("machine", machineSb.toString());
            jsonResult.put("distance", distanceSb.toString());
            */
            jsonResult.put("absolute",StringUtils.join(absArr,":"));
            jsonResult.put("relative", StringUtils.join(relArr,":"));
            jsonResult.put("machine", StringUtils.join(machArr,":"));
            jsonResult.put("distance", StringUtils.join(distArr,":"));
        } else if (ret == -16 || ret == -8) {
            int i2 = this.count + 1;
            this.count = i2;
            if (i2 >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return jsonResult;
    }
    /**
     * è¯»å–当前刀具编号
     *
     * @return
     */
    public Integer readCurToolNo() {
        Integer toolNo = null;
        //short ret = JNAFocas.xx.readCurToolNo(this.flibHndl, toolNum);
        ODBUSEGRP grpDataObj = new ODBUSEGRP();
        short ret = JNAJavaFocas.Fwlib.cnc_rdtlusegrp(this.flibHndl,grpDataObj);
        if (ret == FocasRet.EW_OK) {
            this.count = 0;
            this.connected = true;
            //grpDataObj.use
            //toolNumResult = String.valueOf(toolNum.getValue());
            DBTLUSE tlDataObj = new DBTLUSE();
            short toolRet = JNAJavaFocas.Fwlib.cnc_rdusetlno(this.flibHndl,(short)grpDataObj.use,(short)grpDataObj.use,(short)1,tlDataObj);
            if(toolRet == FocasRet.EW_OK) {
                toolNo = tlDataObj.data[0];
            }
        } else if (ret == -16 || ret == -8) {
            int i = this.count + 1;
            this.count = i;
            if (i >= 3) {
                this.connected = false;
            }
            throw new MdcException();
        }
        return toolNo;
    }
    public String getIp() {
        return this.ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public short getPort() {
        return this.port;
    }
    public void setPort(short port) {
        this.port = port;
    }
    public int getTimeout() {
        return this.timeout;
    }
    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }
    public boolean isConnected() {
        return this.connected;
    }
}
/**
 * focas返回值
 */
class FocasRet {
    /**
     * protocol error -17
     *  */
    public static short EW_PROTOCOL = -17;
    /**
     * Windows socket error -16
     *  */
    public static short EW_SOCKET = (-16);
    /**
     * DLL not exist error -15
     */
    //public static short EW_NODLL = (-15); /*  */
    //public static short EW_BUS = (-11); /* bus error */
    //public static short EW_SYSTEM2 = (-10); /* system error */
    //public static short EW_HSSB = (-9); /* hssb communication error */
    /**
     * Windows library handle error -8
     */
    public static short EW_HANDLE = (-8); /*  */
    //public static short EW_VERSION = (-7); /* CNC/PMC version missmatch */
    //public static short EW_UNEXP = (-6); /* abnormal error */
    //public static short EW_SYSTEM = (-5); /* system error */
    //public static short EW_PARITY = (-4); /* shared RAM parity error */
    ///public static short EW_MMCSYS = (-3); /* emm386 or mmcsys install error */
    //public static short EW_RESET = (-2); /* reset or stop occured error */
    //public static short EW_BUSY = (-1); /* busy error */
    /**
     * no problem (0)
     */
    public static short EW_OK = 0;
    /**
     * command prepare error (1)
     */
    //以下用不到暂时注释了
    //public static short EW_FUNC = 1;
    /*public static short EW_NOPMC = 1;  pmc not exist
    public static short EW_LENGTH = 2;  data block length error
    public static short EW_NUMBER = 3;  data number error
    public static short EW_RANGE = 3;  address range error
    public static short EW_ATTRIB = 4;  data attribute error
    public static short EW_TYPE = 4;  data type error
    public static short EW_DATA = 5;  data error
    */
    /**
     * no option error 6
     */
    public static short EW_NOOPT = 6;
    /*
    public static short EW_PROT = 7;  write protect error
    public static short EW_OVRFLOW = 8;  memory overflow error
    public static short EW_PARAM = 9;  cnc parameter not correct error
    public static short EW_BUFFER = 10;  buffer error
    public static short EW_PATH = 11;  path error
    public static short EW_MODE = 12;  cnc mode error
    public static short EW_REJECT = 13;  execution rejected error
    public static short EW_DTSRVR = 14;  data server error
    public static short EW_ALARM = 15;  alarm has been occurred
    public static short EW_STOP = 16;  CNC is not running
    public static short EW_PASSWD = 17;  protection data error
     * Result codes of DNC operation
    public static short DNC_NORMAL = (-1);  normal completed
    public static short DNC_CANCEL = (-32768);  DNC operation was canceled by CNC
    public static short DNC_OPENERR = (-514);  file open error
    public static short DNC_NOFILE = (-516);  file not found
    public static short DNC_READERR = (-517);*/ /* read error */
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/FocasThread.java
@@ -96,6 +96,7 @@
                this.mdcData.setAxisAbsolute(jsonPosition.getString("distance"));
                this.mdcData.setAxisServoloads(this.focasClient.readAxisServoload());
                this.mdcData.setToolName(this.focasClient.readCurToolNo());
                //mdcData.setToolNo(null);
                this.mdcData.setSpindleLoad(Integer.valueOf((int) this.focasClient.readSpLoad()));
                this.mdcData.setSpindleOverride(Integer.valueOf(this.focasClient.readSpRate()));
                int acts = this.focasClient.readActs();
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/JNAFocas.java
@@ -9,6 +9,7 @@
public interface JNAFocas extends Library {
    public static final ApplicationHome ah = new ApplicationHome(JNAFocas.class);
    public static final String dllPath = ah.getSource().getParentFile().toString() + "\\lib\\focas\\";
    //public static final String dllPath = "D:\\focas\\";
    //public static final String dllPath = "lib\\focas\\";
    public static final JNAFocas HxFocas = (JNAFocas) Native.load(dllPath + "HxFocasApi", JNAFocas.class);
    public static final JNAFocas Fwlib32 = (JNAFocas) Native.load(dllPath + "Fwlib32", JNAFocas.class);
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/JNAJavaFocas.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,208 @@
package com.qianwen.mdc.service.focas;
import com.qianwen.mdc.service.focas.types.DBTLUSE;
import com.qianwen.mdc.service.focas.types.IODBPMC0;
import com.qianwen.mdc.service.focas.types.ODBACT;
import com.qianwen.mdc.service.focas.types.ODBALMMSG2;
import com.qianwen.mdc.service.focas.types.ODBEXAXISNAME;
import com.qianwen.mdc.service.focas.types.ODBEXEPRG;
import com.qianwen.mdc.service.focas.types.ODBPOS;
import com.qianwen.mdc.service.focas.types.ODBPRO;
import com.qianwen.mdc.service.focas.types.ODBPRO8;
import com.qianwen.mdc.service.focas.types.ODBSPLOAD;
import com.qianwen.mdc.service.focas.types.ODBSPN;
import com.qianwen.mdc.service.focas.types.ODBST;
import com.qianwen.mdc.service.focas.types.ODBSVLOAD;
import com.qianwen.mdc.service.focas.types.ODBSYS;
import com.qianwen.mdc.service.focas.types.ODBUSEGRP;
import com.qianwen.mdc.utils.LibraryLoadHelper;
import com.sun.jna.Library;
import com.sun.jna.ptr.ShortByReference;
public interface JNAJavaFocas  extends Library {
    public static final String dllPath = "D:\\focas\\";
    //public static final JNAJavaFocas Fwlib = (JNAJavaFocas) LibraryLoadHelper.(dllPath + "Fwlib32", JNAJavaFocas.class);
    public static final JNAJavaFocas Fwlib = (JNAJavaFocas) LibraryLoadHelper.loadNative("Fwlib"+System.getProperty("sun.arch.data.model"),"focas", JNAJavaFocas.class);
    static final JNAJavaFocas Fwlibe1 = (JNAJavaFocas) LibraryLoadHelper.loadNative("fwlibe"+("64".equals(System.getProperty("sun.arch.data.model"))?"64":"1"),"focas", JNAJavaFocas.class);
    /**
     * é“¾æŽ¥
     * @param ipAddr
     * @param port
     * @param timeout
     * @param flibHndl
     * @return
     */
    short cnc_allclibhndl3(String ipAddr, short port, int timeout, ShortByReference flibHndl);
    /**
     * æ–­å¼€
     * @param handle
     * @return
     */
    short cnc_freelibhndl(short handle);
    /**
     * è¯»å–系统信息
     * @param handle  è¿žæŽ¥å¥æŸ„
     * @param odbsys æ•°æ®å›žä¼ å¯¹è±¡
     * @return
     */
    short cnc_sysinfo(short handle, ODBSYS odbsys);
    /**
     * è®¾å¤‡çŠ¶æ€å’Œå·¥ä½œæ¨¡å¼
     * @param handle è¿žæŽ¥å¥æŸ„
     * @param stateObj æ•°æ®å›žä¼ å¯¹è±¡
     * @return
     */
    short cnc_statinfo(short handle, ODBST stateObj);
    /**
     *
     * @param handle
     * @param adr_type åœ°å€ç±»åž‹
     * @param data_type  æ•°æ®ç±»åž‹
     * @param s_number PMC地址起始号
     * @param e_number PMC地址结束号
     * @param length è®¾å®šæ•°æ®é•¿åº¦
     * @param dataObj æ•°æ®è¿”回对象
     * @return
     */
    short pmc_rdpmcrng(short handle,  short adr_type, short data_type, short s_number, short e_number, short length,IODBPMC0 dataObj);
    /**
     * read actual spindle speed(S) å®žé™…主轴速度 ,dataObj.data为速度
     * @param handle
     * @param dataObj
     * @return
     */
    short cnc_acts(short handle, ODBACT dataObj);
    /**
     *
     * @param FlibHndl
     * @param sp_no ä¸»è½´å·
     * @param dataObj
     * @return
     */
    @Deprecated
    short cnc_rdspload(short FlibHndl, short sp_no, ODBSPN dataObj);
    /**
     *
     * @param FlibHndl library handle
     * @param type  Specify the data type. 0 spindle load meter data ; 1:spindle motor speed data; -1:all type
     * @param data_num Specify the pointer to the number of data to be read. This function returns the number of data which was read actually.
     * @param loadmeter
     * @return
     */
    public short cnc_rdspmeter(short FlibHndl, short type, ShortByReference data_num,ODBSPLOAD loadmeter);
    /**
     * è¯»CNC伺服轴的实际进给倍率,并将其存储到“OBDACT”中的“data”
     * @param FlibHndl
     * @param dataObj
     * @return
     */
    public short cnc_actf(short FlibHndl, ODBACT dataObj);
    /**
     * è¯»å–程序编号 é™¤ Series 15i, 16/18 å¤–的其他系列
     * @param FlibHndl
     * @param dataObj æ•°æ®è¿”回对象
     * @return
     */
    public short cnc_rdprgnum(short FlibHndl,ODBPRO dataObj);
    /**
    * è¯»å–程序编号ONO8D Series 15i, 16/18 ç³»åˆ—
    * @param FlibHndl
    * @param dataObj æ•°æ®è¿”回对象
    * @return
    */
    public short cnc_rdprgnumo8(short FlibHndl,ODBPRO8 dataObj);
    /**
     *
     * @param FlibHndl
     * @param type ç±»åž‹ [ in ] è®¾ç½®è¾“出格式:0 : binary;1 : ASCII
     * @param length é•¿åº¦  [ in ] 12 : binary 31 : ASCII
     * @param dataObj è¿”回数据的对象引用
     * @return
     */
   // public short cnc_rdproginfo(short FlibHndl, short type, short length,ODBNC_2 dataObj);
    /**
     * è¯»æ­£åœ¨è¿è¡Œçš„程序信息
     * @param FlibHndl
     * @param dataObj
     * @return
     */
    public short cnc_exeprgname(short FlibHndl, ODBEXEPRG dataObj);
    /**
     * è¯»å„种刀组号 ,正在使用,当前选择的
     * @param FlibHndl
     * @param dataObj
     * @return
     */
    public short cnc_rdtlusegrp(short FlibHndl, ODBUSEGRP dataObj);
    /**
     * è¯»å‡ºç‰¹å®šåˆ€ç»„中正在使用的刀具的刀具使用顺序号。即显示状态处在“可用(使用中)”的刀具的使用顺序号
     * @param FlibHndl
     * @param s_grp å¼€å§‹ç»„号
     * @param e_grp ç»“束组号
     * @param length é•¿åº¦ï¼ˆODBTLUSE类的大小)
     * @param dataObj æ•°æ®è¿”回对象
     * @return
     */
    public short cnc_rdusetlno(short FlibHndl, short s_grp, short e_grp, short length, DBTLUSE dataObj);
    /**
     *
     * @param FlibHndl
     * @param type  Specify the data type.
            0    :    absolute position
            1    :    machine position
            2    :    relative position
            3    :    distance to go
            -1    :    all type
     * @param data_num Specify the pointer to the number of data to be read. This function returns the number of data which was read actually.
     * @param dataObj è¿”回数据对象
     * @return
     */
    public short cnc_rdposition(short FlibHndl, short type, ShortByReference data_num,ODBPOS dataObj);
    /**
     * è¯»ä¼ºæœã€ä¸»è½´å
     * @param FlibHndl
     * @param type type ,0:Controlled axis name; 1:Spindle name
     * @param num in & out, æŒ‡å®šè¯»å–数量/实际读取数量
     * @param dataObj æ•°æ®è¿”回对象
     * @return
     */
    public short cnc_exaxisname(short FlibHndl,short type,ShortByReference num, ODBEXAXISNAME dataObj);
    /**
     *
     * @param FlibHndl
     * @param data_num æ•°æ®ä¸ªæ•°in最多;out å®žé™…个数
     * @param dataObj æ•°æ®å¯¹è±¡
     * @return
     */
    public short cnc_rdsvmeter(short FlibHndl,ShortByReference data_num,ODBSVLOAD dataObj);
    /**
     *
     * @param FlibHndl
     * @param type -1全部,其他:https://www.inventcom.net/fanuc-focas-library/misc/cnc_rdalmmsg2
     * @param num æ€»æ•°æœ€å¤§
     * @param almmsg
     * @return
     */
    public short cnc_rdalmmsg2(short FlibHndl,short type, ShortByReference num, ODBALMMSG2 almmsg);
    // short connectServer(String ipAddr, short port, int timeout, ShortByReference flibHndl);
    // short disconnectServer(short flibHndl);
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/DBTLUSE.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class DBTLUSE  extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends DBTLUSE implements Structure.ByReference {
    }
    public static class ByValue extends DBTLUSE implements Structure.ByValue {
    }
    public DBTLUSE() {
        data = new int[5];
    }
    public short s_grp;  /* start group number */
    public short dummy;  /* dummy */
    public short e_grp;  /* end group number */
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
    public int[] data;
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "s_grp", "dummy", "e_grp", "data"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/Focas.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.qianwen.mdc.service.focas.types;
/**
 * å¸¸é‡å®šä¹‰
 */
public class Focas {
    public static final short ALL_AXES = -1;
    public static final short ALL_SPINDLES = -1;
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/IODBPMC0.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class IODBPMC0 extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends IODBPMC0 implements Structure.ByReference {
    }
    public static class ByValue extends IODBPMC0 implements Structure.ByValue {
    }
    public IODBPMC0() {
        cdata = new byte[5];
    }
    //[FieldOffset(0)]
    public short type_a;    /* PMC address type */
    //[FieldOffset(2)]
    public short type_d;    /* PMC data type */
    //[FieldOffset(4)]
    public short datano_s;  /* start PMC address */
    //[FieldOffset(6)]
    public short datano_e;  /* end PMC address */
   // [FieldOffset(8),
   //MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
    public byte[] cdata;       /* PMC data */
    /* In case that the number of data is 5 */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "type_a", "type_d", "datano_s", "datano_e", "cdata"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/LOADELM.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class LOADELM extends Structure{
    public int data;       /* load meter */
    public short dec;        /* decimal position */
    public short unit;       /* unit */
    public byte name;       /* name of data */
    public byte suff1;      /* suffix */
    public byte suff2;      /* suffix */
    public byte reserve;    /* reserve */
    public static class ByReference extends LOADELM implements Structure.ByReference {
    }
    public static class ByValue extends LOADELM implements Structure.ByValue {
    }
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "data", "dec", "unit", "name", "suff1", "suff2", "reserve"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBACT.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/* cnc_actf:read actual axis feedrate(F) */
/* cnc_acts:read actual spindle speed(S) */
public class ODBACT extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBACT implements Structure.ByReference {
    }
    public static class ByValue extends ODBACT implements Structure.ByValue {
    }
    public ODBACT() {
        dummy = new short[2];
    }
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public short[] dummy;      /* dummy */
    public int data;      /* actual feed / actual spindle */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "dummy", "data" });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBALMMSG2.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class ODBALMMSG2  extends Structure{
    /* * æ”¶å‘
     */
    public static class ByReference extends ODBALMMSG2 implements Structure.ByReference {
    }
    public static class ByValue extends ODBALMMSG2 implements Structure.ByValue {
    }
    public ODBALMMSG2_data msg1 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg2 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg3 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg4 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg5 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg6 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg7 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg8 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg9 = new ODBALMMSG2_data();
    public ODBALMMSG2_data msg10 = new ODBALMMSG2_data();
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "msg1", "msg2", "msg3", "msg4", "msg5", "msg6", "msg7", "msg8", "msg9", "msg10" });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBALMMSG2_data.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class ODBALMMSG2_data  extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBACT implements Structure.ByReference {
    }
    public static class ByValue extends ODBACT implements Structure.ByValue {
    }
     public int alm_no;
     public short type;
     public short axis;
     public short dummy;
     public short msg_len;
     //[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
     public byte[] alm_msg = new byte[64];
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "alm_no", "type", "axis" , "dummy" , "msg_len" , "alm_msg"  });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBEXAXISNAME.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * è¯»ä¼ºæœã€ä¸»è½´åçš„返回结果
 */
public class ODBEXAXISNAME extends Structure{
    /* * æ”¶å‘
     */
    public static class ByReference extends ODBEXAXISNAME implements Structure.ByReference {
    }
    public static class ByValue extends ODBEXAXISNAME implements Structure.ByValue {
    }
    public ODBEXAXISNAME() {
        //dummy = new short[2];
    }
    public byte[] axname1 = new byte[4];
    public byte[] axname2 = new byte[4];
    public String axname3 = new String();
    public String axname4 = new String();
    public String axname5 = new String();
    public String axname6 = new String();
    public String axname7 = new String();
    public String axname8 = new String();
    public String axname9 = new String();
    public String axname10 = new String();
    public String axname11 = new String();
    public String axname12 = new String();
    public String axname13 = new String();
    public String axname14 = new String();
    public String axname15 = new String();
    public String axname16 = new String();
    public String axname17 = new String();
    public String axname18 = new String();
    public String axname19 = new String();
    public String axname20 = new String();
    public String axname21 = new String();
    public String axname22 = new String();
    public String axname23 = new String();
    public String axname24 = new String();
    public String axname25 = new String();
    public String axname26 = new String();
    public String axname27 = new String();
    public String axname28 = new String();
    public String axname29 = new String();
    public String axname30 = new String();
    public String axname31 = new String();
    public String axname32 = new String();
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "axname1", "axname2", "axname3", "axname4", "axname5", "axname6", "axname7", "axname8", "axname9", "axname10", "axname11", "axname12", "axname13", "axname14", "axname15", "axname16", "axname17", "axname18", "axname19", "axname20", "axname21", "axname22", "axname23", "axname24", "axname25", "axname26", "axname27", "axname28", "axname29", "axname30", "axname31", "axname32" });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBEXEPRG.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * å½“前执行程序的信息返回对象
 */
public class ODBEXEPRG extends Structure {
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBEXEPRG implements Structure.ByReference {
    }
    public static class ByValue extends ODBEXEPRG implements Structure.ByValue {
    }
    public ODBEXEPRG() {
        name = new byte[36];
    }
    // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 36)]
    public byte[] name; /* running program name */
    public int o_num; /* running program number */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays.asList(new String[] { "name", "o_num" });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBNC_2.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * è¯»ç¨‹åºä¿¡æ¯
 */
public class ODBNC_2 extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBNC_2 implements Structure.ByReference {
    }
    public static class ByValue extends ODBNC_2 implements Structure.ByValue {
    }
    public ODBNC_2() {
        asc = new byte[31];
        //asc = new char[31];
    }
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
    public byte[] asc; /* ASCII string type */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "asc"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBPOS.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * ä½ç½®ä¿¡æ¯è¿”回结构
 */
public class ODBPOS extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBPOS implements Structure.ByReference {
    }
    public static class ByValue extends ODBPOS implements Structure.ByValue {
    }
    public POSELMALL p1=new POSELMALL();
    public POSELMALL p2=new POSELMALL();
    public POSELMALL p3=new POSELMALL();
    public POSELMALL p4=new POSELMALL();
    public POSELMALL p5=new POSELMALL();
    public POSELMALL p6=new POSELMALL();
    public POSELMALL p7=new POSELMALL();
    public POSELMALL p8=new POSELMALL();
    public POSELMALL p9=new POSELMALL();
    public POSELMALL p10=new POSELMALL();
    public POSELMALL p11=new POSELMALL();
    public POSELMALL p12=new POSELMALL();
    public POSELMALL p13=new POSELMALL();
    public POSELMALL p14=new POSELMALL();
    public POSELMALL p15=new POSELMALL();
    public POSELMALL p16=new POSELMALL();
    public POSELMALL p17=new POSELMALL();
    public POSELMALL p18=new POSELMALL();
    public POSELMALL p19=new POSELMALL();
    public POSELMALL p20=new POSELMALL();
    public POSELMALL p21=new POSELMALL();
    public POSELMALL p22=new POSELMALL();
    public POSELMALL p23=new POSELMALL();
    public POSELMALL p24=new POSELMALL();
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11","p12","p13","p14","p15","p16","p17","p18","p19","p20","p21","p22","p23","p24"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBPRO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 *  cnc_rdprgnum:read program number under execution
 *  API文档:ONO8D=false(没有定义) æˆ–者 ONO8D=0,意思为:不是 Series 15i, 16/18型号。data,mdata就是4位,定义为short类型;
 *  å¦åˆ™å°±æ˜¯ONO8D=true或者1,data,mdata定义为int,,本类是4位;8位数据使用ODBPRO8
 *  */
public class ODBPRO extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBPRO implements Structure.ByReference {
    }
    public static class ByValue extends ODBPRO implements Structure.ByValue {
    }
    public ODBPRO() {
        dummy = new short[2];
    }
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public short[] dummy;
    /**
     * running program number,子程序编号,没有子程序时和主程序编号相同
     */
    public short data;
    /**
     * main program number,主程序编号
     */
    public short mdata;
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "dummy", "data","mdata" });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBPRO8.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 *  cnc_rdprgnum:read program number under execution
 *  API文档:ONO8D=false(没有定义) æˆ–者 ONO8D=0,意思为:不是 Series 15i, 16/18型号。data,mdata就是4位,定义为short类型;
 *  å¦åˆ™å°±æ˜¯ONO8D=true或者1,data,mdata定义为int,,本类是8位;4位数据使用ODBPRO
 *  */
public class ODBPRO8 extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBPRO8 implements Structure.ByReference {
    }
    public static class ByValue extends ODBPRO8 implements Structure.ByValue {
    }
    public ODBPRO8() {
        dummy = new short[2];
    }
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public short[] dummy;
    /**
     * running program number,子程序编号,没有子程序时和主程序编号相同
     */
    public int data;
    /**
     * main program number,主程序编号
     */
    public int mdata;
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "dummy", "data","mdata" });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSPLOAD.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * è¯»ä¸»è½´è´Ÿè½½ï¼Ÿï¼Ÿï¼Ÿ,应该是这个
 */
public class ODBSPLOAD extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBSPLOAD implements Structure.ByReference {
    }
    public static class ByValue extends ODBSPLOAD implements Structure.ByValue {
    }
    public ODBSPLOAD() {
        spload1 = new ODBSPLOAD_data();     /* spindle load */
        spload2 = new ODBSPLOAD_data();     /* spindle load */
        spload3 = new ODBSPLOAD_data();     /* spindle load */
        spload4 = new ODBSPLOAD_data();/* spindle load */
    }
     public ODBSPLOAD_data spload1;     /* spindle load */
     public ODBSPLOAD_data spload2;     /* spindle load */
     public ODBSPLOAD_data spload3;     /* spindle load */
     public ODBSPLOAD_data spload4;     /* spindle load */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "spload1", "spload2", "spload3", "spload4"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSPLOAD_data.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class ODBSPLOAD_data  extends Structure{
    public LOADELM spload = new LOADELM();     /* spindle load meter */
    public LOADELM spspeed = new LOADELM();    /* spindle speed */
    public static class ByReference extends ODBSPLOAD_data implements Structure.ByReference {
    }
    public static class ByValue extends ODBSPLOAD_data implements Structure.ByValue {
    }
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "spload", "spspeed"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSPN.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * è¯»ä¸»è½´è´Ÿè½½ï¼Ÿï¼Ÿï¼Ÿï¼Œä¸ç”¨è¿™ä¸ªäº†ï¼Œæš‚时保留
 */
@Deprecated
public class ODBSPN  extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBSPN implements Structure.ByReference {
    }
    public static class ByValue extends ODBSPN implements Structure.ByValue {
    }
    public ODBSPN() {
        data = new short[4];
    }
     public short datano; /* dummy */
     public short type;   /* axis number */
     //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
     public short[] data;   /* preset data */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "datano", "type", "data"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBST.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * è®¾å¤‡çŠ¶æ€å’Œå·¥ä½œæ¨¡å¼çš„è¿”å›žç»“æž„
 */
public class ODBST  extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBST implements Structure.ByReference {
    }
    public static class ByValue extends ODBST implements Structure.ByValue {
    }
    public short dummy;     /* dummy */
    public short tmmode;    /* T/M mode */
    public short aut;       /* selected automatic mode */
    public short run;       /* running status */
    public short motion;    /* axis, dwell status */
    public short mstb;      /* m, s, t, b status */
    public short emergency; /* emergency stop status */
    public short alarm;     /* alarm status */
    public short edit;      /* editting status */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "dummy", "tmmode", "aut", "run", "motion", "mstb", "emergency","alarm","edit" });
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSVLOAD.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * è¯»ä¼ºæœè½´è´Ÿè½½çš„返回对象
 */
public class ODBSVLOAD extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBSVLOAD implements Structure.ByReference {
    }
    public static class ByValue extends ODBSVLOAD implements Structure.ByValue {
    }
    public ODBSVLOAD() {
    }
    public LOADELM svload1 = new LOADELM();     /* servo load meter */
    public LOADELM svload2 = new LOADELM();     /* servo load meter */
    public LOADELM svload3 = new LOADELM();     /* servo load meter */
    public LOADELM svload4 = new LOADELM();     /* servo load meter */
    public LOADELM svload5 = new LOADELM();     /* servo load meter */
    public LOADELM svload6 = new LOADELM();     /* servo load meter */
    public LOADELM svload7 = new LOADELM();     /* servo load meter */
    public LOADELM svload8 = new LOADELM();     /* servo load meter */
    public LOADELM svload9 = new LOADELM();     /* servo load meter */
    public LOADELM svload10= new LOADELM();     /* servo load meter */
    public LOADELM svload11= new LOADELM();     /* servo load meter */
    public LOADELM svload12= new LOADELM();     /* servo load meter */
    public LOADELM svload13= new LOADELM();     /* servo load meter */
    public LOADELM svload14= new LOADELM();     /* servo load meter */
    public LOADELM svload15= new LOADELM();     /* servo load meter */
    public LOADELM svload16= new LOADELM();     /* servo load meter */
    public LOADELM svload17= new LOADELM();     /* servo load meter */
    public LOADELM svload18= new LOADELM();     /* servo load meter */
    public LOADELM svload19= new LOADELM();     /* servo load meter */
    public LOADELM svload20= new LOADELM();     /* servo load meter */
    public LOADELM svload21= new LOADELM();     /* servo load meter */
    public LOADELM svload22= new LOADELM();     /* servo load meter */
    public LOADELM svload23= new LOADELM();     /* servo load meter */
    public LOADELM svload24= new LOADELM();     /* servo load meter */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "svload1", "svload2", "svload3", "svload4","svload5","svload6","svload7","svload8","svload9","svload10","svload11","svload12","svload13","svload14","svload15","svload16","svload17","svload18","svload19","svload20","svload21","svload22","svload23","svload24"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBSYS.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang3.builder.ToStringBuilder;
import com.sun.jna.Structure;
/**
 * ç³»ç»Ÿä¿¡æ¯ç»“æž„
 */
public class ODBSYS extends Structure {
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBSYS implements Structure.ByReference {
    }
    public static class ByValue extends ODBSYS implements Structure.ByValue {
    }
    public ODBSYS() {
        cnc_type = new byte[2];
        mt_type = new byte[2];
        series = new byte[4];
        version = new byte[4];
        axes = new byte[2];
    }
    public short addinfo;
    public short max_axis;
    /**
     * å‰2为是机器类型编码,
     */
    // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public byte[] cnc_type;
    // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public byte[] mt_type;
    // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] series;
    // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] version;
    // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public byte[] axes;
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "addinfo", "max_axis", "cnc_type", "mt_type", "series", "version", "axes" });
    }
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/ODBUSEGRP.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
/**
 * åˆ€ç»„读取信息返回结构
 */
public class ODBUSEGRP extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends ODBUSEGRP implements Structure.ByReference {
    }
    public static class ByValue extends ODBUSEGRP implements Structure.ByValue {
    }
    public int next;       /* next use group number */
    public int use;        /* using group number */
    public int slct;       /* selecting group number */
    public int opt_next;   /* next use optional group number */
    public int opt_use;    /* using optional group number */
    public int opt_slct;   /* selecting optional group number */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "next", "use", "slct", "opt_next", "opt_use", "opt_slct"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/POSELM.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class POSELM  extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends POSELM implements Structure.ByReference {
    }
    public static class ByValue extends POSELM implements Structure.ByValue {
    }
    public int data;         /* position data */
    public short dec;        /* place of decimal point of position data */
    public short unit;       /* unit of position data */
    public short disp;       /* status of display */
    public char name;        /* axis name */
    public char suff;        /* axis name preffix */
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "data","dec","unit","disp","name","suff"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/service/focas/types/POSELMALL.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.qianwen.mdc.service.focas.types;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Structure;
public class POSELMALL extends Structure{
    /**
     * æ”¶å‘
     */
    public static class ByReference extends POSELM implements Structure.ByReference {
    }
    public static class ByValue extends POSELM implements Structure.ByValue {
    }
    /**
     * ç»å¯¹ä½ç½®
     */
    public POSELM abs = new POSELM();
    /**
     * æœºæ¢°ä½ç½®
     */
    public POSELM mach = new POSELM();
    /**
     * ç›¸å¯¹ä½ç½®
     */
    public POSELM rel = new POSELM();
    /**
     * å‰©ä½™è·ç¦»
     */
    public POSELM dist = new POSELM();
    @Override
    protected List<String> getFieldOrder() {
        return Arrays
                .asList(new String[] { "abs","mach","rel","dist"});
    }
}
mdc-parent/mdc-collect/src/main/java/com/qianwen/mdc/utils/LibraryLoadHelper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.qianwen.mdc.utils;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class LibraryLoadHelper {
    static String localPath = "nativelib";//focas
    public synchronized static <T extends Library> T loadNative(String nativeName,String subdir,Class<T> clazz) {
         String systemType = System.getProperty("os.name");
            String fileExt = (systemType.toLowerCase().indexOf("win") != -1) ? ".dll" : ".so";
            File path = new File(".");
            //将所有动态链接库dll/so文件都放在一个临时文件夹下,然后进行加载
            //这是应为项目为可执行jar文件的时候不能很方便的扫描里面文件
            //此目录放置在与项目同目录下的natives文件夹下
            String sysUserTempDir = path.getAbsoluteFile().getParent() + File.separator + localPath+ File.separator+subdir;
            System.out.println("------>>native lib临时存放目录 : " + sysUserTempDir);
            String fileName = nativeName + fileExt;
            InputStream in = null;
            //BufferedInputStream reader = null;
            FileOutputStream fos = null;
            File tempFile = new File(sysUserTempDir + File.separator + fileName);
            if(!tempFile.getParentFile().exists())
                tempFile.getParentFile().mkdirs() ;
            if (!tempFile.exists()) {
                try {
                    //读取文件形成输入流
                    in = LibraryLoadHelper.class.getClassLoader().getResourceAsStream(localPath+"/"+ subdir+"/"+ fileName);
                    fos = new FileOutputStream(tempFile);
                    IOUtils.copy(in, fos);
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        IOUtils.close(in);
                        IOUtils.close(fos);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            String loadPath = StringUtils.removeEnd(tempFile.getPath(), fileExt);
            System.out.println("------>> åŠ è½½native文件 :" + loadPath + "成功!!");
            return (T)Native.load(loadPath,clazz);
    }
}
mdc-parent/mdc-collect/src/main/resources/lib/focas/Fwlib64.dll
Binary files differ
mdc-parent/mdc-collect/src/main/resources/lib/focas/fwlibe64.dll
Binary files differ
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/Fwlib32.dll
Binary files differ
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/Fwlib64.dll
Binary files differ
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/HxFocasApi.dll
Binary files differ
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/HxFocasApi.lib
Binary files differ
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/fwlibe1.dll
Binary files differ
mdc-parent/mdc-collect/src/main/resources/nativelib/focas/fwlibe64.dll
Binary files differ
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/FocasClientTest.java
@@ -2,28 +2,31 @@
import org.junit.jupiter.api.Test;
import com.alibaba.fastjson.JSONObject;
import com.sun.jna.Native;
import com.sun.jna.ptr.ShortByReference;
public class FocasClientTest {
    public static final String dllPath = "D:\\mdc\\lib\\focas\\";
    //public static final MyJNAFocas HxFocas = (MyJNAFocas) Native.load(dllPath + "HxFocasApi", JNAFocas.class);
    public static final MyJNAFocas Fwlib32 = (MyJNAFocas) Native.load(dllPath + "Fwlib64", MyJNAFocas.class);
    public static String IP = "192.168.1.8";
    public static short port = 8193;
    @Test
    public void testConn() {
    public void testReadState() {
        ShortByReference flibHndl = new ShortByReference();
        //short result = Fwlib32.connectServer("localhost", (short)8193, 5000, flibHndl);
        //short ret = Fwlib32.disconnectServer(flibHndl.getValue());
        
        /*
        FocasClient c = new FocasClient();
        c.setIp("localhost");
        c.setPort((short)8193);//默认端口
        int cresult = c.connect();
        System.out.println(cresult);
        c.disconnect();
        */
        c.setIp(IP);
        c.setPort(port);
        try {
            int result =  c.connect();
            JSONObject stateObj = c.readState();
            //System.out.print("result="+result);
            System.out.print(stateObj);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            c.disconnect();
        }
    }
}
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/FocasJavaClientTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,246 @@
package com.qianwen.mdc.service.focas;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.qianwen.mdc.service.focas.types.ODBST;
import com.sun.jna.Platform;
import com.sun.jna.ptr.ShortByReference;
public class FocasJavaClientTest {
    public static String IP = "192.168.1.8";
    public static short port = 8193;
    FocasJavaClient client = new FocasJavaClient();
    @BeforeEach
    public void setUp() {
        //CLibrary INSTANCE = (CLibrary) Native.load(Platform.isWindows() ? "libtest" : "test", CLibrary.class);
        client.setIp(IP);
        client.setPort(port);
        int ret = client.connect();
        System.out.println("connret="+ret);
    }
    @AfterEach
    public void tearDown() {
        client.disconnect();
    }
    @Test
    public void testConn() {
        ShortByReference flibHndl = new ShortByReference();
        //int r = MyJNAFocas.MathLib.add(9, 20);
        //System.out.println(r);
        //MyJNAFocas.HxFocas.connectServer("localhost", (short)8193, 5000, flibHndl);
        try {
            short result = JNAJavaFocas.Fwlib.cnc_allclibhndl3(IP, port, 10, flibHndl);
            System.out.print(result);
            short ret = JNAJavaFocas.Fwlib.cnc_freelibhndl(flibHndl.getValue());
            System.out.print("ret="+ret);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //@Test
    public void testReadCncType1() {
        FocasJavaClient c = new FocasJavaClient();
        c.setIp(IP);
        c.setPort(port);
        c.setTimeout(5);
        c.connect();
        String ty = c.readCncType();
        System.out.println(ty);
        c.disconnect();
    }
    String byteArrToString(byte[] bytes) {
        if(bytes == null) {
            return null;
        }
        char[] charArr = new char[bytes.length];
        int i = 0;
        while(bytes[i] != 0 && i<bytes.length) {
            charArr[i] = (char)bytes[i];
            i++;
        }
        return new String(charArr,0,i);
    }
    /**
     * è‡ªæµ‹æ–¹æ³•
     */
    /*
    @Test
    public void testReadCncType() {
        ShortByReference flibHndl = new ShortByReference();
        try {
            short result = JNAJavaFocas.Fwlib.cnc_allclibhndl3(IP, port, 10, flibHndl);
            ODBSYS sysInfo = new ODBSYS();
            short val = JNAJavaFocas.Fwlib.cnc_sysinfo(flibHndl.getValue(), sysInfo);
            String se = "d";//new String(getBytes(sysInfo.cnc_type)).trim();
            //32, 48
            String cncTypeNum = this.byteArrToString(sysInfo.cnc_type);//类型编号
            String CNCType;
            switch (cncTypeNum)
            {
                case "15":
                    CNCType = "Series 15/15i";
                    break;
                case "16":
                    CNCType = "Series 16/16i";
                    break;
                case "18":
                    CNCType = "Series 18/18i";
                    break;
                case "21":
                    CNCType = "Series 21/21i";
                    break;
                case "30":
                    CNCType = "Series 30i";
                    break;
                case "31":
                    CNCType = "Series 31i";
                    break;
                case "32":
                    CNCType = "Series 32i";
                    break;
                case "35":
                    CNCType = "Series 35i";
                    break;
                case " 0":
                    CNCType = "Series 0i";
                    break;
                case "PD":
                    CNCType = "Power Mate i-D";
                    break;
                case "PH":
                    CNCType = "Power Mate i-H";
                    break;
                case "PM":
                    CNCType = "Power Motion i";
                    break;
                default:
                    CNCType = "其它类型";
                    break;
            }
            String seriesStr = this.byteArrToString(sysInfo.series);//类型编号
            System.out.println("val="+val+",data="+CNCType);
            System.out.println("seriesStr="+seriesStr);
            System.out.println("version="+this.byteArrToString(sysInfo.version));
            System.out.println("mttype="+this.byteArrToString(sysInfo.mt_type));
            System.out.println("axes="+this.byteArrToString(sysInfo.axes));
            short ret = JNAJavaFocas.Fwlib.cnc_freelibhndl(flibHndl.getValue());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    */
    @Test
    public void testReadState() {
        ODBST obj = client.readState();
        System.out.println(obj);
    }
    @Test
    public void testReadSpindleOverride() {
        int r = client.readSpindleOverride();
        System.out.println(r);
    }
    @Test
    public void readActs() {
        int actSpeed = client.readActs();
        System.out.println(actSpeed);
    }
    @Test
    public void testReadSpLoad() {
        float spLoad = client.readSpLoad();
        System.out.println(spLoad);
    }
    @Test
    public void testReadActf() {
        float actf = client.readActf();
        System.out.println(actf);
    }
    @Test
    public void testReadPrgNo() {
        int prgNo = client.readPrgNo();
        System.out.println(prgNo);
    }
    @Test
    public void testReadRealPrgName() {
        String prg= client.readExePrgName();
        System.out.println("当前执行程序="+prg);
    }
    @Test
    public void testReadCurToolNo() {
        Integer tool= client.readCurToolNo();
        System.out.println("tool="+tool);
    }
    @Test
    public void testReadAxisName() {
        client.readAxisName();
    }
    @Test
    public void testReadPosition() {
        client.readPosition();
        //System.out.println("tool="+tool);
    }
    @Test
    public void testReadAxisServoload() {
        client.readAxisServoload();
        //System.out.println("tool="+tool);
    }
    @Test
    public void testReadAlarm() {
        client.readAlarm("GBK");
        //System.out.println("tool="+tool);
    }
    String byteArrToString2(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        char[] charArr = new char[bytes.length];
        int i = 0;
        while (i < bytes.length && bytes[i] != 0) {
            charArr[i] = (char) bytes[i];
            i++;
        }
        return new String(charArr, 0, i);
    }
    //@Test
    public void testByteToString() {
        byte[] bs = new byte[] {32,48};
        String a = byteArrToString2(bs);
        //System.out.println("tool="+tool);
    }
}
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyDll.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.qianwen.mdc.service.focas;
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface MyDll  extends Library{
    public static final MyDll MathLib = (MyDll) Native.load("D:\\MathLibrary", MyDll.class);
    int add(int a, int b);
}
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyDllTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.qianwen.mdc.service.focas;
import org.junit.jupiter.api.Test;
public class MyDllTest {
    @Test
    public void testAdd() {
        int r = MyDll.MathLib.add(9, 20);
        System.out.println(r);
    }
}
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyJNAFocas.java
@@ -2,16 +2,76 @@
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.ShortByReference;
public interface MyJNAFocas  extends Library {
    public static final String dllPath = "lib\\focas\\";
    //public static final JNAFocas HxFocas = (JNAFocas) Native.load(dllPath + "HxFocasApi", JNAFocas.class);
    public static final JNAFocas Fwlib32 = (JNAFocas) Native.load(dllPath + "Fwlib32", JNAFocas.class);
    //public static final JNAFocas Fwlibe1 = (JNAFocas) Native.load(dllPath + "fwlibe1", JNAFocas.class);
    public static final String dllPath = "D:\\focas\\";
    public static final MyJNAFocas HxFocas = (MyJNAFocas) Native.load(dllPath + "HxFocasApi", MyJNAFocas.class);
    public static final MyJNAFocas Fwlib32 = (MyJNAFocas) Native.load(dllPath + "Fwlib32", MyJNAFocas.class);
    public static final MyJNAFocas Fwlibe1 = (MyJNAFocas) Native.load(dllPath + "fwlibe1", MyJNAFocas.class);
     short connectServer(String ipAddr, short port, int timeout, ShortByReference flibHndl);
     short disconnectServer(short flibHndl);
     short readCncType(short flibHndl, byte[] cncType);
        short readAxisName(short flibHndl, ShortByReference axisNum, byte[] axisName);
        short readNcState(short flibHndl, ShortByReference status);
        short readOpState(short flibHndl, ShortByReference status);
        short readState(short flibHndl, ShortByReference ncState, ShortByReference opState, ShortByReference alarmState, ShortByReference emergency);
        short readAlarm(short flibHndl, ShortByReference alarmCount, int[] alarmNo, short[] alarmType, short[] alarmAxis, byte[] alarmMsg);
        short readSpRate(short flibHndl, IntByReference spRate);
        short readSpLoad(short flibHndl, IntByReference spLoad);
        short readSpSpeedSet(short flibHndl, IntByReference spSpeedSet);
        short readActs(short flibHndl, IntByReference acts);
        short readServoLoad(short flibHndl, ShortByReference axisNum, int[] servoLoad);
        short readFeedRate(short flibHndl, IntByReference feedRate);
        short readFeedSet(short flibHndl, IntByReference feedSet);
        short readActf(short flibHndl, IntByReference actf);
        short readRapidRate(short flibHndl, IntByReference rapidRate);
        short readPrgNo(short flibHndl, ShortByReference mainPrgNo, ShortByReference curPrgNo);
        short readSubPrg(short flibHndl, byte[] prgName, IntByReference prgNo);
        short readSeqNo(short flibHndl, IntByReference seqNo);
        short readExecPrg(short flibHndl, ShortByReference length, byte[] execPrg);
        short readM00M01State(short flibHndl, IntByReference state);
        short readPrgReadyState(short flibHndl, IntByReference state);
        short readRealPrgName(short flibHndl, int prgNo, byte[] prgName);
        short readPosition(short flibHndl, short axisNum, float[] absolute, float[] relative, float[] machine, float[] distance);
        short readCurToolNo(short flibHndl, IntByReference toolNo);
        short readOpenTime(short flibHndl, IntByReference time);
        short readCycleTime(short flibHndl, IntByReference time);
        short readCutTime(short flibHndl, IntByReference time);
        short readOperateTime(short flibHndl, IntByReference time);
        short readPartsCount(short flibHndl, IntByReference partsCount);
        short readPartsTotal(short flibHndl, IntByReference partsTotal);
}
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/service/focas/MyJNAFocasTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,138 @@
package com.qianwen.mdc.service.focas;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import org.junit.jupiter.api.Test;
import com.qianwen.mdc.service.focas.types.ODBSYS;
import com.sun.jna.Native;
import com.sun.jna.ptr.ShortByReference;
public class MyJNAFocasTest {
    public static String IP = "192.168.1.8";
    public static short port = 8193;
    @Test
    public void testConn() {
        ShortByReference flibHndl = new ShortByReference();
        //int r = MyJNAFocas.MathLib.add(9, 20);
        //System.out.println(r);
        //MyJNAFocas.HxFocas.connectServer("localhost", (short)8193, 5000, flibHndl);
        try {
            short result = JNAJavaFocas.Fwlib.cnc_allclibhndl3(IP, port, 10, flibHndl);
            System.out.print(result);
            short ret = JNAJavaFocas.Fwlib.cnc_freelibhndl(flibHndl.getValue());
            System.out.print("ret="+ret);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //@Test
    public void testReadCncType1() {
        FocasJavaClient c = new FocasJavaClient();
        c.setIp(IP);
        c.setPort(port);
        c.setTimeout(5);
        c.connect();
        String ty = c.readCncType();
        System.out.println(ty);
        c.disconnect();
    }
    String byteArrToString(byte[] bytes) {
        if(bytes == null) {
            return null;
        }
        char[] charArr = new char[bytes.length];
        int i = 0;
        while(bytes[0] != 0 && i<bytes.length) {
            charArr[i] = (char)bytes[i];
            i++;
        }
        return new String(charArr,0,i);
    }
    /**
     * è‡ªæµ‹æ–¹æ³•
     */
    @Test
    public void testReadCncType() {
        ShortByReference flibHndl = new ShortByReference();
        try {
            short result = JNAJavaFocas.Fwlib.cnc_allclibhndl3(IP, port, 10, flibHndl);
            ODBSYS sysInfo = new ODBSYS();
            short val = JNAJavaFocas.Fwlib.cnc_sysinfo(flibHndl.getValue(), sysInfo);
            String se = "d";//new String(getBytes(sysInfo.cnc_type)).trim();
            //32, 48
            String cncTypeNum = this.byteArrToString(sysInfo.cnc_type);//类型编号
            String CNCType;
            switch (cncTypeNum)
            {
                case "15":
                    CNCType = "Series 15/15i";
                    break;
                case "16":
                    CNCType = "Series 16/16i";
                    break;
                case "18":
                    CNCType = "Series 18/18i";
                    break;
                case "21":
                    CNCType = "Series 21/21i";
                    break;
                case "30":
                    CNCType = "Series 30i";
                    break;
                case "31":
                    CNCType = "Series 31i";
                    break;
                case "32":
                    CNCType = "Series 32i";
                    break;
                case "35":
                    CNCType = "Series 35i";
                    break;
                case " 0":
                    CNCType = "Series 0i";
                    break;
                case "PD":
                    CNCType = "Power Mate i-D";
                    break;
                case "PH":
                    CNCType = "Power Mate i-H";
                    break;
                case "PM":
                    CNCType = "Power Motion i";
                    break;
                default:
                    CNCType = "其它类型";
                    break;
            }
            String seriesStr = this.byteArrToString(sysInfo.series);//类型编号
            System.out.println("val="+val+",data="+CNCType);
            System.out.println("seriesStr="+seriesStr);
            System.out.println("version="+this.byteArrToString(sysInfo.version));
            System.out.println("mttype="+this.byteArrToString(sysInfo.mt_type));
            System.out.println("axes="+this.byteArrToString(sysInfo.axes));
            short ret = JNAJavaFocas.Fwlib.cnc_freelibhndl(flibHndl.getValue());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
mdc-parent/mdc-collect/src/test/java/com/qianwen/mdc/utils/LibraryLoadHelperTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.qianwen.mdc.utils;
import org.junit.jupiter.api.Test;
import com.qianwen.mdc.service.focas.JNAJavaFocas;
public class LibraryLoadHelperTest {
    @Test
    public void testJdkbits() {
        JNAJavaFocas Fwlib = (JNAJavaFocas) LibraryLoadHelper.loadNative("Fwlib"+System.getProperty("sun.arch.data.model"),"focas", JNAJavaFocas.class);
        System.out.println(Fwlib);
    }
}