MC200编程手册(C#)
简介
本篇章介绍CNCApi的接口使用,主要文件是ClrCNCApi.dll。
源文件组织结构
Objective-C├── dll
│ ├── x64
│ │ ├── ClrCNCApi.dll
│ │ └── ClrCNCApid.dll
│ ├── x86
│ │ └── ClrCNCApi.dll
准备工作
Windows
下载SDK压缩包,解压到你的工程目录或者其余任意目录 检查目录中是否包含上述内容
使用命名空间
根据版本需求引用对应的ClrCNCApi.dll文件,使用命名空间weconcnc:
其余可能使用到的命名空间:
Text Onlyusing System;
using System.IO;
using System.Linq;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Collections.Concurrent;
using Timer = System.Windows.Forms.Timer;
类型定义
SDK中使用的数据类型的定义
WECONCNC_ERROR_E:接口返回值定义
Text OnlyWECONCNC_ERROR_SUCCESS:没有错误
WECONCNC_ERROR_LINK_FAILED:连接错误
WECONCNC_ERROR_EXEC_CMD_FAILED:执行指令错误
WECONCNC_ERROR_UPLOAD_FILE_FAILED:上传文件出错
WECONCNC_ERROR_DOWNLOAD_FILE_FAILED:下载文件出错
MACHINE_STATE_E: 机器电源状态
Text OnlySTATE_ESTOP:急停
STATE_ESTOP_RESET:急停复位
STATE_OFF:电源关闭
STATE_ON:电源打开
INTERP_STATE_E:机器运行状态
Text OnlyINTERP_IDEL:空闲
INTERP_READING:读取文件中
INTERP_PAUSED:暂停
INTERP_WAITING:等待就绪
OP_MODE_E:机器运行模式
Text OnlyMODE_MANUAL:手动模式
MODE_AUTO:自动模式
MODE_MDI:指令模式
INI_DISPLAY_E:机器
Text OnlyDEFAULT_LINEAR_VELOCITY:默认直线运行速度
MAX_LINEAR_VELOCITY:最大直线运行速度
INI_CONFIG_FIELD:配置文件项
Text OnlyINI_MAX_VEL:最大速度(mm/s)
INI_MAX_ACC:最大加速度(mm/s^2)
INI_MAX_LIMIT:正限位
INI_MIN_LIMIT:负限位
INI_FERROR:跟随误差
INI_MIN_FERROR:最小跟随误差
INI_BACKLASH:间隙
INI_JERK:加加速度(预留,暂时无用)
ABS_CONFIG_FIELD:伺服配置文件项
Text OnlyABS_SCALE:脉冲当量倒数
ABS_LEAD:导程(即电机旋转一圈走多少个用户单位)
ABS_RR_DEN:减速比分母
ABS_RR_NUM:减速比分子
ABS_CW:坐标取反
IO_CONFIG_FIELD:IO配置文件项
Text OnlyIO_SPEED:外部IO速度
IO_X_MIN_LIMIT:外部IO对X负限位
IO_X_MAX_LIMIT:外部IO对X正限位
IO_FLAP_X:翻版坐标X
IO_FLAP_Y:翻版坐标Y
IO_LIMIT_Z:外部IO对XY移动进行限制的Z轴位置
IO_FLAP_TIME:翻版上时间(秒)
IO_FLAP_DOWN_TIME:翻板下保压时间(秒)
COORDINATE_T
POINT_T
Text Onlybool bUpdate; //是否有数据输入
double dValue; //数据
POSITION_T
Text OnlyPOINT_T x; //点的x坐标
POINT_T y; //点的y坐标
POINT_T z; //点的z坐标
POINT_T a; //点的a坐标
POINT_T b; //点的b坐标
POINT_T c; //点的c坐标
POINT_T u; //点的u坐标
POINT_T v; //点的v坐标
POINT_T w; //点的w坐标
CNC_INI_CONFIG_T
Text Onlyint nAxis; //轴号
double dMaxVel; //最大速度
double dMaxAcc; //最大加速度
double dMaxLimit; //正限位
double dMinLimit; //负限位
double dFError; //跟随误差
double dMinFError; //最小跟随误差
double dBacklash; //间隙
double dJerk; //加加速度(预留)
CNC_ABS_CONFIG_T
Text Onlyint nServo; //伺服序号
double dScale; //脉冲当量的倒数
double dLead; //导程
double dRRDen; //减速比分母
double dRRNum; //减速比分子
bool bCw; //坐标取反
CNC_IO_CONFIG_T
Text Onlyint dSpeed; //外部IO速度
double dXMinLimit; //外部IO对x负限位
double dXMaxLimit; //外部IO对X正限位
double dFlapX; //翻板坐标X
double dFlapY; //翻板坐标Y
double dLimitZ; //外部IO对XY移动进行限制的Z轴位置
int nFlapTime; //翻板上时间(秒)
int nFlapDownTime; //翻板下保压时间(秒)
代理系统接口
WeconCNC SDK提供了对运动控制器的系统状态获取和设置的接口
通过weconcnc::CProxyEntry类提供
getProxyMotion
定义:CProxyMotion getProxyMotion()
说明:获取CProxyMotion类型对象
参数:无
返回值:成功返回CProxyMotion类型对象,出错返回空值
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyEntry pEntry = new CProxyEntry(pComm);
CProxyMotion pMotion = pEntry.getProxyMotion();
if (null == pMotion)
{
Console.WriteLine("getProxyMotion failed!");
return -1;
}
return 0;
|
getProxyStatus
定义:CProxyStatus getProxyStatus()
说明:获取CProxyStatus类型对象
参数:无
返回值:成功返回CProxyStatus类型对象,出错返回空值
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyEntry pEntry = new CProxyEntry(pComm);
CProxyStatus mcmStatus = pEntry.getProxyStatus();
if (null == mcmStatus)
{
Console.WriteLine("getProxyStatus failed!");
return -1;
}
return 0;
|
getProxySys
定义:CProxySys getProxySys()
说明:获取CProxySys类型对象
参数:无
返回值:成功返回CProxySys类型对象,出错返回空值
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyEntry pEntry = new CProxyEntry(pComm);
CProxySys pSys = pEntry.getProxySys();
if (null == pSys)
{
Console.WriteLine("getProxySys failed!");
return -1;
}
return 0;
|
状态获取接口
WeconCNC SDK提供了对运动控制器的状态获取接口
通过weconcnc::CProxyStatus类提供
getMotionState
定义:WECONCNC_ERROR_E getMotionState(ref MACHINE_STATE_E eState);
说明:该接口将读取机器电源状态
参数:【OUT】MACHINE_STATE_E,请参见MACHINE_STATE_E定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyStatus pstatus = new CProxyStatus(pComm);
MACHINE_STATE_E eState = new MACHINE_STATE_E();
ret = pstatus.getMotionState(ref eState);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get motion state failed!");
return -1;
}
Console.WriteLine($("Motion state: {state}");
return 0;
|
getInterpState
定义:WECONCNC_ERROR_E getInterpState(ref INTERP_STATE_E eState);
说明:该接口将读取机器运行状态
参数:【OUT】INTERP_STATE_E,请参见INTERP_STATE_E定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyStatus pstatus = new CProxyStatus(pComm);
INTERP_STATE_E state = INTERP_STATE_E.INTERP_IDEL;
ret = pstatus.getInterpState(ref state);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get interp state failed!");
return -1;
}
Console.WriteLine("Interp state: {state}");
return 0;
|
getOpMode
定义:WECONCNC_ERROR_E getOpMode(ref OP_MODE_E eMode);
说明:该接口将读取当前操作模式
参数:【OUT】OP_MODE_E,请参见OP_MODE_E定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyStatus pstatus = new CProxyStatus(pComm);
OP_MODE_E mode = OP_MODE_E.MODE_MANUAL;
ret = pstatus.getOpMode(ref mode);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get option mode failed!");
return -1;
}
Console.WriteLine("Option Mode: {mode}");
return 0;
|
getCoord
定义:WECONCNC_ERROR_E getCoord(ref COORDINATE_T stCoord);
说明:该接口将读取当前坐标值
参数:【OUT】COORDINATE_T,请参见COORDINATE_T定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyStatus pstatus = new CProxyStatus(pComm);
COORDINATE_T coord = new COORDINATE_T();
ret = pstatus.getCoord(ref coord);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get coord failed!");
return -1;
}
Console.WriteLine("Option Mode: {mode}");
return 0;
|
getLine
定义:WECONCNC_ERROR_E getLine(ref int nCurrentLine);
说明:该接口将获取当前G代码运行的行数
参数:【OUT】nCurrentLine,当前运行行数
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyStatus pstatus = new CProxyStatus(pComm);
int nCurLine = 0;
ret = pstatus.getLine(ref nCurLine);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get coord failed!");
return -1;
}
Console.WriteLine("Current Run Line: {nCurLine}");
return 0;
|
getError
定义:WECONCNC_ERROR_E getError(ref ConcurrentQueue qErrInfo);
说明:该接口将获取当前系统运行的错误信息
参数:【OUT】ConcurrentQueue qErrInfo,当前运行错误信息
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyStatus pstatus = new CProxyStatus(pComm);
ConcurrentQueue<string> queErrInfo = new ConcurrentQueue<string>();
ret = pstatus.getError(ref queErrInfo);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get coord failed!");
return -1;
}
foreach (String error in queErrInfo) {
Console.WriteLine(error);
}
return 0;
|
运动控制接口
WeconCNC SDK提供了对运动控制器的状态控制接口
通过weconcnc::CProxyMotion类提供
setEstop
定义:WECONCNC_ERROR_E setEstop(bool bEnable);
说明:该接口设置当前系统的急停状态
参数:【IN】bool bEnable,想要设置的急停状态,true为急停,false为解除急停
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
bool bEnable = true;
ret = pMotion.setEstop(bEnable);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set Estop failed!");
return -1;
}
return 0;
|
setEnable
定义:WECONCNC_ERROR_E setEnable(bool bEnable);
说明:该接口设置当前系统的使能状态
参数:【IN】bool bEnable,想要设置的使能状态,true为使能,false为关闭使能
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
bool bEnable = true;
ret = pMotion.setEnable(bEnable);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set Enabel failed!");
return -1;
}
return 0;
|
setOpMode
定义:WECONCNC_ERROR_E setOpMode(OP_MODE_E mode);
说明:该接口设置当前系统的急停状态
参数:【IN】OP_MODE_E,请参见OP_MODE_E定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
OP_MODE_E mode = OP_MODE_E.MODE_MANUAL;
ret = pMotion.setOpMode(mode);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set optional mode failed!");
return -1;
}
return 0;
|
continuousJog
定义:WECONCNC_ERROR_E continuousJog(int nAxis, double dSpeed, int nJogMode = -1);
说明:连续点动控制
参数:
Text Only【IN】int nAxis,控制的轴号
【IN】double dSpeed, 速度(mm/min)
【IN】int nJogMode 点动模式,0,1。
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
int nAxis = 0;
double dSpeed = 1000;
int nJogMode = 0;
ret = pMotion.continuousJog(nAxis, dSpeed, nJogMode);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("continuous jog failed!");
return -1;
}
return 0;
|
incrementJog
定义:WECONCNC_ERROR_E incrementJog(int nAxis, double dSpeed, double dDistance, int nJogMode = -1);
说明:增量点动控制
参数:
Text Only【IN】int nAxis,控制的轴号
【IN】double dSpeed, 速度(mm/s)
【IN】double dDistance,增量移动的距离
【IN】int nJogMode 点动模式,0,1
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
int nAxis = 0;
double dSpeed = 1000;
double dDistance = 1;
ret = pMotion.incrementJog(nAxis, dSpeed, dDistance);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("increment jog failed!");
return -1;
}
return 0;
|
stopJog
定义:WECONCNC_ERROR_E stopJog(int nAxis, int nJogMode = -1);
说明:该接口用于使连续点动停止
参数:
Text Only【IN】int nAxis,控制的轴号
【IN】int nJogMode 点动模式,0,1
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
int nAxis = 0;
ret = pMotion.stopJog(nAxis);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("stop jog failed!");
return -1;
}
return 0;
|
setFeedOverride
定义:WECONCNC_ERROR_E setFeedOverride(int nFeedOverride);
说明:该接口设置当前系统进给率
参数:
Text Only【IN】int nFeedOverride,为进给率百分比,例如1即为1%
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
int nAxis = 0;
ret = pMotion.setFeedOverride(nAxis);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set feed override failed!");
return -1;
}
return 0;
|
home
定义:WECONCNC_ERROR_E home(int nAxis);
说明: 指定轴回零
参数:
Text Only【IN】int nAxis,控制的轴号
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi commApi = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = commApi.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion mcmMotion = new CProxyMotion(commApi);
int nAxis = 0;
ret = mcmMotion.home(nAxis);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("home failed!");
return -1;
}
return 0;
|
execMDI
定义:WECONCNC_ERROR_E execMDI(String sMdi);
说明:该接口使用MDI指令进行运动
参数:
Text Only【IN】String sMdi,MDI指令
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
String sMdi = "G0 X0";
ret = pMotion.execMDI(sMdi);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("run mdi failed!");
return -1;
}
return 0;
|
openProgram
定义:WECONCNC_ERROR_E openProgram(String sFileName);
说明:该接口设置当前系统要打开的文件。
参数:
Text Only【IN】String sFileName,要加载到系统中打开的文件名
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
String sFileName = "fileName.txt";
ret = pMotion.openProgram(sFileName);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("open program failed!");
return -1;
}
return 0;
|
runProgram
定义:WECONCNC_ERROR_E runProgram(int nStartLine);
说明:该接口设置当前系统打开的文件要从第几行开始运行
参数:
Text Only【IN】int nStartLine,开始运行的行数
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
int nStartLine = 0;
ret = pMotion.runProgram(nStartLine);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("run program failed!");
return -1;
}
return 0;
|
stopProgram
定义:WECONCNC_ERROR_E stopProgram();
说明:停止当前系统正在运行的程序
参数:无
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
ret = pMotion.stopProgram();
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("stop program failed!");
return -1;
}
return 0;
|
pauseProgram
定义:WECONCNC_ERROR_E pauseProgram();
说明:暂停当前系统正在运行的程序
参数:无
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
ret = pMotion.pauseProgram();
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("pause program failed!");
return -1;
}
return 0;
|
resumeProgram
定义:WECONCNC_ERROR_E resumeProgram();
说明:恢复运行当前系统暂停中的程序
参数:无
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
ret = pMotion.resumeProgram();
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("resume program failed!");
return -1;
}
return 0;
|
stepProgram
定义:WECONCNC_ERROR_E stepProgram();
说明:单步运行当前系统加载的程序
参数:无
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
ret = pMotion.stepProgram();
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("step program failed!");
return -1;
}
return 0;
|
resetProgram
定义:WECONCNC_ERROR_E resetProgram();
说明:重置当前系统加载的程序
参数:无
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
ret = pMotion.resetProgram();
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("reset program failed!");
return -1;
}
return 0;
|
moveTo
定义:WECONCNC_ERROR_E moveTo(POSITION_T pos, double dFeed);
说明:移动至当前指定位置
参数:
Text Only【IN】POSITION_T pos,希望要移动到的位置
【IN】double dFeed, 速率(mm/min)
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp, nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
POSITION_T pos = new POSITION_T();
double dFeed = 1000;
pos.x = new POINT_T(100);
pos.y = new POINT_T(100);
ret = pMotion.moveTo(pos, dFeed);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("execute move cmd failed!");
return -1;
}
return 0;
|
moveLine
定义:WECONCNC_ERROR_E moveLine(POSITION_T posStart, POSITION_T posEnd, double dFeed);
说明:先移动至线段起点,随后移动至线段终点
参数:
Text Only【IN】POSITION_T posStart,希望要移动到的线段起点
【IN】 POSITION_T posEnd,希望要移动到的线段终点
【IN】double dFeed, 速率(mm/min)
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp, nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
POSITION_T posStart = new POSITION_T();
POSITION_T posEnd = new POSITION_T();
double dFeed = 1000;
posStart.x = new POINT_T(100);
posStart.y = new POINT_T(100);
posEnd.x = new POINT_T(200);
posEnd.y = new POINT_T(200);
ret = pMotion.moveLine(posStart, posEnd, dFeed);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("execute move cmd failed!");
return -1;
}
return 0;
|
moveArc
定义:WECONCNC_ERROR_E moveArc(POSITION_T posStart, POSITION_T posEnd, POSITION_T posCenter, double dFeed, bool bCw);
说明:先直线移动至弧线起点,随后以圆弧运动至弧线终点
参数:
Text Only【IN】POSITION_T posStart,弧线的起点
【IN】POSITION_T posEnd,弧线的终点
【IN】POSITION_T posCenter, 弧线的圆心
【IN】double dFeed, 速率(mm/min)
【IN】 bool bCw,旋转方向,true:顺时针,false: 逆时针
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp, nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
POSITION_T posStart = new POSITION_T();
POSITION_T posEnd = new POSITION_T();
POSITION_T posCenter = new POSITION_T();
double dFeed = 1000;
bool bCw = true;
posStart.x = new POINT_T(100);
posStart.y = new POINT_T(100);
posEnd.x = new POINT_T(100);
posEnd.y = new POINT_T(100);
posCenter.x = new POINT_T(200);
posCenter.y = new POINT_T(200);
ret = pMotion.moveArc(posStart, posEnd, posCenter, dFeed, bCw);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("execute move cmd failed!");
return -1;
}
return 0;
|
downloadGcode
定义:WECONCNC_ERROR_E downloadGcode(ref String sFromFile);
说明:下载G代码文件
参数:
Text Only【IN】string sFromFile,文件所在路径
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxyMotion pMotion = new CProxyMotion(pComm);
String sFromFile = "C://test.txt";
ret = pMotion.downloadGcode(ref sFromFile);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("download gcode file failed!");
return -1;
}
return 0;
|
系统设置接口
WeconCNC SDK提供了对运动控制器的系统状态获取和设置的接口
通过weconcnc::CProxySys类提供
setIniConfig
定义:WECONCNC_ERROR_E setIniConfig(intnAxis, INI_CONFIG_FIELD eField, String sParam);
WECONCNC_ERROR_E setIniConfig(int nAxis, ref List> listIniConfig);
说明:设置单个 /多个ini配置的值。
参数:
Text Only【IN】int nAxis,轴号
【IN】INI_CONFIG_FIELD eField,请参见INI_CONFIG_FIELD定义
【IN】String sParam,参数的值
【IN】List<KeyValuePair<INI_CONFIG_FIELD, String>> listIniConfig,多组期望设置的参数与对应的值
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
String sParam = "1000";
int nAxis = 0;
ret = pSys.setIniConfig(nAxis, INI_CONFIG_FIELD.INI_MAX_VEL, ref sParam);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("setting ini config failed!");
return -1;
}
return 0;
|
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
var listIniConfig = new List<KeyValuePair<INI_CONFIG_FIELD, string>>
{
new KeyValuePair<INI_CONFIG_FIELD, string>(INI_CONFIG_FIELD.INI_MAX_VEL, "1000"),
new KeyValuePair<INI_CONFIG_FIELD, string>(INI_CONFIG_FIELD.INI_MAX_ACC, "200"),
new KeyValuePair<INI_CONFIG_FIELD, string>(INI_CONFIG_FIELD.INI_MAX_LIMIT, "3040"),
new KeyValuePair<INI_CONFIG_FIELD, string>(INI_CONFIG_FIELD.INI_MIN_LIMIT, "-1"),
new KeyValuePair<INI_CONFIG_FIELD, string>(INI_CONFIG_FIELD.INI_FERROR, "50000"),
new KeyValuePair<INI_CONFIG_FIELD, string>(INI_CONFIG_FIELD.INI_BACKLASH, "2000000"),
new KeyValuePair<INI_CONFIG_FIELD, string>(INI_CONFIG_FIELD.INI_JERK, "0")
};
int nAxis = 0;
ret = pSys.setIniConfig(nAxis, ref listIniConfig);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("setting multi ini config failed!");
return -1;
}
return 0;
|
getIniConfig
定义:WECONCNC_ERROR_E getIniConfig(int nAxis, INI_CONFIG_FIELD eField, ref String sParam);
WECONCNC_ERROR_E getIniConfig(int nAxis, ref CNC_INI_CONFIG_T stIniConfig);
说明:获取指定/全部的ini设置数据。
参数:
Text Only【IN】int nAxis,轴号
【IN】INI_CONFIG_FIELD eField,请参见INI_CONFIG_FIELD定义
【OUT】String sParam,参数的值
【OUT】CNC_INI_CONFIG_T stIniConfig,请参见CNC_INI_CONFIG_T定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp, nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nAxis = 0;
String sParam = "";
INI_CONFIG_FIELD iniConfigField = INI_CONFIG_FIELD.INI_MAX_VEL;
ret = pSys.getIniConfig(nAxis, iniConfigField, ref sParam);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("get ini config failed!");
return -1;
}
Console.WriteLine($"{iniConfigField} : {sParam}");
return 0;
|
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nAxis = 0;
CNC_INI_CONFIG_T stIniConfig = new CNC_INI_CONFIG_T();
ret = pSys.getIniConfig(nAxis, ref stIniConfig);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get multi ini config failed!");
return -1;
}
Console.WriteLine("dMaxVel: {0}", stIniConfig.dMaxVel);
Console.WriteLine("dMaxAcc: {0}", stIniConfig.dMaxAcc);
Console.WriteLine("dMaxLimit: {0}", stIniConfig.dMaxLimit);
Console.WriteLine("dMinLimit: {0}", stIniConfig.dMinLimit);
Console.WriteLine("dFError: {0}", stIniConfig.dFError);
Console.WriteLine("dMinFError: {0}", stIniConfig.dMinFError);
Console.WriteLine("dBacklash: {0}", stIniConfig.dBacklash);
Console.WriteLine("dJerk: {0}", stIniConfig.dJerk);
return 0;
|
setAbsConfig
定义:WECONCNC_ERROR_E setAbsConfig(int nServo, ABS_CONFIG_FIELD eField, ref String sParam);
WECONCNC_ERROR_E setAbsConfig(int nServo, ref List> listAbsConfig);
说明:设置单个 /多个多圈绝对值配置的值
参数:
Text Only【IN】int nServo,伺服序号
【IN】ABS_CONFIG_FIELD eField,请参见ABS_CONFIG_FIELD定义
【IN】String sParam,参数的值
【IN】List<KeyValuePair<ABS_CONFIG_FIELD, String>> listAbsConfig,多组期望设置的参数与对应的
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
String sParam = Convert.ToString(2);
ret = pSys.setAbsConfig(nServo, ABS_CONFIG_FIELD.ABS_LEAD, ref sParam);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set abs config failed!");
return -1;
}
return 0;
|
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
var listAbsConfig = new List<KeyValuePair<ABS_CONFIG_FIELD, string>>()
{
new KeyValuePair<ABS_CONFIG_FIELD, string>(ABS_CONFIG_FIELD.ABS_SCALE,"1"),
new KeyValuePair<ABS_CONFIG_FIELD, string>(ABS_CONFIG_FIELD.ABS_LEAD,"1"),
new KeyValuePair<ABS_CONFIG_FIELD, string>(ABS_CONFIG_FIELD.ABS_RR_DEN,"1"),
new KeyValuePair<ABS_CONFIG_FIELD, string>(ABS_CONFIG_FIELD.ABS_RR_NUM,"1"),
new KeyValuePair<ABS_CONFIG_FIELD, string>(ABS_CONFIG_FIELD.ABS_CW,"1")
};
ret = pSys.setAbsConfig(nServo, ref listAbsConfig);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set multi abs config failed!");
return -1;
}
return 0;
|
getAbsConfig
定义:WECONCNC_ERROR_E getAbsConfig(int nServo, ABS_CONFIG_FIELD eField, ref String sParam);
WECONCNC_ERROR_E getAbsConfig(int nServo,ref CNC_ABS_CONFIG_T stAbsConfig);
说明:获取指定/全部的多圈绝对值设置数据
参数:
Text Only【IN】intnServo,轴号
【IN】ABS_CONFIG_FIELD eField,请参见ABS_CONFIG_FIELD定义
【OUT】String sParam,参数的值
【OUT】CNC_ABS_CONFIG_T stAbsConfig,请参见CNC_ABS_CONFIG_T定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp, nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
String sParam = "";
ABS_CONFIG_FIELD absConfigField = ABS_CONFIG_FIELD.ABS_SCALE;
ret = pSys.getAbsConfig(nServo, absConfigField, ref sParam);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("get abs config failed!");
return -1;
}
Console.WriteLine($"{absConfigField} : {sParam}");
return 0;
|
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
CNC_ABS_CONFIG_T stAbsConfig = new CNC_ABS_CONFIG_T();
ret = pSys.getAbsConfig(nServo, ref stAbsConfig);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get multi abs config failed!");
return -1;
}
Console.WriteLine("dScale: {0}", stAbsConfig.dScale);
Console.WriteLine("dLead: {0}", stAbsConfig.dLead);
Console.WriteLine("dRRDen: {0}", stAbsConfig.dRRDen);
Console.WriteLine("dRRNum: {0}", stAbsConfig.dRRNum);
Console.WriteLine("bCw: {0}", stAbsConfig.bCw);
return 0;
|
setIoConfig
定义:WECONCNC_ERROR_E setIoConfig(IO_CONFIG_FIELD eField,ref String sParam);
WECONCNC_ERROR_E setIoConfig(ref List> listIoConfig);
说明:设置单个 /多个外部IO配置的值
参数:
Text Only【IN】IO_CONFIG_FIELD eField,请参见IO_CONFIG_FIELD定义
【IN】String sParam,参数的值
【IN】List<KeyValuePair<IO_CONFIG_FIELD, String>> listIoConfig,多组期望设置的参数与对应的值
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
String sParam = "10";
ret = pSys.setIoConfig(IO_CONFIG_FIELD.IO_SPEED, ref sParam);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set io config failed!");
return -1;
}
return 0;
|
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
var listIoConfig = new List<KeyValuePair<IO_CONFIG_FIELD, String>>()
{
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_SPEED,"10"),
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_X_MIN_LIMIT,"100"),
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_X_MAX_LIMIT,"3000"),
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_FLAP_X,"1000"),
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_FLAP_Y,"2000"),
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_LIMIT_Z,"-30"),
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_FLAP_TIME,"10"),
new KeyValuePair<IO_CONFIG_FIELD, String>(IO_CONFIG_FIELD.IO_FLAP_DOWN_TIME,"5")
};
ret = pSys.setIoConfig(ref listIoConfig);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set multi io config failed!");
return -1;
}
return 0;
|
getIoConfig
定义:WECONCNC_ERROR_E getIoConfig(IO_CONFIG_FIELD eField, ref String sParam);
WECONCNC_ERROR_E getIoConfig(ref CNC_IO_CONFIG_T stIoConfig);
说明:获取指定/全部当前外部IO设置数据
参数:
Text Only【IN】int nServo,轴号
【IN】IO_CONFIG_FIELD eField,请参见IO_CONFIG_FIELD定义
【OUT】String sParam,参数的值
【OUT】CNC_IO_CONFIG_T stIniConfig,请参见CNC_IO_CONFIG_T定义
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp, nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
String sParam = "";
IO_CONFIG_FIELD ioConfigField = IO_CONFIG_FIELD.IO_SPEED;
ret = pSys.getIoConfig(ioConfigField, ref sParam);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("get io config failed!");
return -1;
}
Console.WriteLine($"{ioConfigField} : {sParam}");
return 0;
|
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp, nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
CNC_IO_CONFIG_T stIoConfig = new CNC_IO_CONFIG_T();
ret = pSys.getIoConfig(ref stIoConfig);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("get multi io config failed!");
return -1;
}
Console.WriteLine("dSpeed: {0}", stIoConfig.dSpeed);
Console.WriteLine("dXMinLimit: {0}", stIoConfig.dXMinLimit);
Console.WriteLine("dXMaxLimit: {0}", stIoConfig.dXMaxLimit);
Console.WriteLine("dFlapX: {0}", stIoConfig.dFlapX);
Console.WriteLine("dFlapY: {0}", stIoConfig.dFlapY);
Console.WriteLine("dLimitZ: {0}", stIoConfig.dLimitZ);
Console.WriteLine("nFlapTime: {0}", stIoConfig.nFlapTime);
Console.WriteLine("nFlapDownTime: {0}", stIoConfig.nFlapDownTime);
return 0;
|
resetServoError
定义:WECONCNC_ERROR_E resetServoError(int nServo)
说明:清除指定伺服报错
参数:
Text Only【IN】int nServo,伺服序号
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
ret = pSys.resetServoError(nServo);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("reset servo error failed!");
return -1;
}
return 0;
|
resetServoAbs
定义:WECONCNC_ERROR_E resetServoAbs(int nServo)
说明:伺服多圈绝对值清零
参数:
Text Only【IN】int nServo,伺服序号
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
ret = pSys.resetServoAbs(nServo);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("reset servo abs failed!");
return -1;
}
return 0;
|
setMotorRevo
定义:WECONCNC_ERROR_E setMotorRevo(int nServo, int nMotorRevo)
说明:设置伺服电子齿轮比分子
参数:
Text Only【IN】int32_t nServo,伺服序号
【IN】int nMotorRevo,电子齿轮比分子的值
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
int nMotorRevo = 131072;
ret = pSys.setMotorRevo(nServo, nMotorRevo);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set motor revo failed!");
return -1;
}
return 0;
|
getMotorRevo
定义:WECONCNC_ERROR_E getMotorRevo(int nServo, int nMotorRevo)
说明:获取伺服电子齿轮比分子
参数:
Text Only【IN】int nServo,伺服序号
【OUT】int nMotorRevo,电子齿轮比分子的值
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
int nMotorRevo = 0;
ret = pSys.getMotorRevo(nServo, ref nMotorRevo);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get motor revo failed!");
return -1;
}
Console.WriteLine($"nMotorRevo : {nMotorRevo}");
return 0;
|
setShaftRevo
定义:WECONCNC_ERROR_E setShaftRevo(intnServo, int nShaftRevo);
说明:获取伺服电子齿轮比分母
参数:
Text Only【IN】intnServo,伺服序号
【IN】int nShaftRevo,电子齿轮比分母的值
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
int nShaftRevo = 10000;
ret = pSys.setShaftRevo(nServo, nShaftRevo);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("set shaft revo failed!");
return -1;
}
return 0;
|
getShaftRevo
定义:WECONCNC_ERROR_E getShaftRevo(int nServo, int nShaftRevo)
说明:获取伺服电子齿轮比分母
参数:
Text Only【IN】intnServo,伺服序号
【OUT】int nShaftRevo,电子齿轮比分母的值
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
CProxySys pSys = new CProxySys(pComm);
int nServo = 0;
int nShaftRevo = 0;
ret = pSys.getShaftRevo(nServo, ref nShaftRevo);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("get shaft revo failed!");
return -1;
}
Console.WriteLine($"nShaftRevo : {nShaftRevo}");
return 0;
|
通信接口
WeconCNC SDK提供了对运动控制器的系统状态获取和设置的接口
通过weconcnc::CCommApi类提供
connect
定义:WECONCNC_ERROR_E connect(String sIp, ushort uPort)
说明:连接到服务器
参数:
Text Only【IN】String sIp,IP地址
【IN】ushort uPort,端口号
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
return 0;
|
disconnect
定义:WECONCNC_ERROR_E disconnect()
说明:断开连接
参数:无
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
ret = pComm.disconnect();
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("disconnect failed!");
return -1;
}
return 0;
|
execCmd
定义:WECONCNC_ERROR_E execCmd(ref String sCmd, ref String sResult)
说明:发送执行指令
参数:
Text Only【IN】 String sCmd,指令
【OUT】String sResult,执行结果
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
String sCmd = "";
String sResult = "";
ret = pComm.execCmd(ref sCmd, ref sResult);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("execCmd failed!");
return -1;
}
return 0;
|
uploadFile
定义:WECONCNC_ERROR_E uploadFile(ref String sFromFile, ref String sToFile)
说明:上传指定文件至指定地址
参数:
Text Only【IN】String sFromFile,文件地址
【IN】String sToFile,存储地址
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
String sFromFile = "";
String sToFile = "";
ret = pComm.uploadFile(ref sFromFile, ref sToFile);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("upload file failed!");
return -1;
}
return 0;
|
downloadFile
定义:WECONCNC_ERROR_E downloadFile(ref String sFromFile, ref String sToFile)
说明:下载指定文件至指定地址
参数:
Text Only【IN】String sFromFile,文件地址
【IN】String sToFile,目的存储地址
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CCommApi pComm = new CCommApi();
String sIp = "192.168.64.96";
ushort nPort = 9995;
var ret = pComm.connect(ref sIp,nPort);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret) {
Console.WriteLine("connect failed!");
return -1;
}
String sFromFile = "";
String sToFile = "";
ret = pComm.downloadFile(ref sFromFile, ref sToFile);
if (WECONCNC_ERROR_E.WECONCNC_ERROR_SUCCESS != ret)
{
Console.WriteLine("download file failed!");
return -1;
}
return 0;
|
IO监控接口
WeconCNC SDK提供了对运动控制器的系统状态获取和设置的接口
通过weconcnc::CIoControl_C类提供
init
定义:int init(String sIp, int nPort);
说明: 初始化服务器套接字
参数:
Text Only【IN】String sIp,IO服务器地址
【IN】int nPort,IO服务器端口号
返回值: 成功返回0,出错返回负值
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
return 0;
|
getSupportio
定义:int getSupportio(ref List listIoname);
说明: 获取所有支持的IO
参数:
Text Only【OUT】List<String> listIoname, 所有支持的IO的名称
返回值: 成功返回0,出错返回负值。
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
List<String> listIoname = new List<String>();
ret = pIo.getSupportio(ref listIoname);
if (ret < 0)
{
Console.WriteLine("get support io failed!");
return ret;
}
foreach (String sIoname in listIoname) {
Console.WriteLine($"Io name : {sIoname}");
}
return 0;
|
getIoValue
定义:int getIoValue(String sIoname, String sIovalue);
int getIoValue(List listIoname, ref List listIovalue);
说明: 获取单个/多个IO值
参数:
Text Only【IN】String sIoname, 需要获取值的IO名称
【OUT】String sIovalue,获取到的IO值
【IN】List<String> listIoname,需要获取值的IO名称集合
【OUT】List<String> listIovalue,获取到的IO值的集合
返回值:成功返回0,出错返回负值。
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
String sIoname = "5axis_io_cnc.0.add_in";
String sIovalue = "";
ret = pIo.getIoValue(sIoname, ref sIovalue);
if (ret < 0)
{
Console.WriteLine("get io value failed!");
return -1;
}
Console.WriteLine($"{sIoname} : {sIovalue}");
return 0;
|
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
var listIoname = new List<string>
{
"5axis_io_cnc.0.axis_homing",
"5axis_io_cnc.1.axis_homing",
"5axis_io_cnc.2.axis_homing",
"5axis_io_cnc.3.axis_homing",
"5axis_io_cnc.4.axis_homing",
"5axis_io_cnc.5.axis_homing"
};
var listIovalue = new List<string>();
ret = pIo.getIoValue(listIoname, ref listIovalue);
if (ret < 0)
{
Console.WriteLine("get io value failed!");
return -1;
}
for (int i = 0; i < listIoname.Count; ++i)
{
Console.WriteLine($"{listIoname[i]} : {listIovalue[i]}");
}
return 0;
|
setIoValue
定义:
int setIoValue(String sIoname, String sIovalue);
int setIoValue(Dictionary dictIodata);
说明: 设置单个/多个IO值
参数:
Text Only【IN】String sIoname,需要设置的IO名称
【IN】String sIovalue,设置的IO值
【IN】Dictionary<String, String> dictIodata,字典存储IO名称和IO值
返回值:WECONCNC_ERROR_E,请参见WECONCNC_ERROR_E定义
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
String sIoname = "5axis_io_cnc.0.axis_homing";
String sIovalue = "TRUE";
ret = pIo.setIoValue(sIoname, sIovalue);
if (ret < 0)
{
Console.WriteLine("set io value failed!");
return -1;
}
return 0;
|
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
Dictionary<String, String> dictIodata = new Dictionary<String, String>
{
{ "5axis_io_cnc.0.axis_homing", "False" },
{ "5axis_io_cnc.1.axis_homing", "False" },
{ "5axis_io_cnc.2.axis_homing", "False" },
{ "5axis_io_cnc.3.axis_homing", "False" },
{ "5axis_io_cnc.4.axis_homing", "False" },
{ "5axis_io_cnc.5.axis_homing", "False" }
};
ret = pIo.setIoValue(dictIodata);
if (ret < 0)
{
Console.WriteLine("setIoValue failed!");
return -1;
}
return 0;
|
setUpdateTime
定义:int setUpdateTime(int nMsleep);
说明: 设置更新周期
参数:【IN】int nMsleep,单位毫秒的一个周期时间
返回值: 成功返回0,出错返回负值。
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
int nMsleep = 100;
ret = pIo.setUpdateTime(nMsleep);
if (ret < 0) {
Console.WriteLine("setUpdateTime failed!");
return -1;
}
return 0;
|
getListall
定义:
int getListall(ref List listComp, ref List listType, ref List listDir, ref List listValue, ref List listName, ref List listLink);
说明: 获取所有列表
参数:
Text Only【OUT】List<String> listComp, 引脚的comp值
【OUT】List<String> listType, 数据类型
【OUT】List<String> listDir, 输入/输出类型
【OUT】List<String > listValue, 值
【OUT】List<String > listName, 名称
【OUT】List<String> listLink, 链接情况
返回值: 成功返回0,出错返回负值
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
List<String> listComp = new List<String>();
List<String> listType = new List<String>();
List<String> listDir = new List<String>();
List<String> listValue = new List<String>();
List<String> listName = new List<String>();
List<String> listLink = new List<String>();
ret = pIo.getListall(ref listComp, ref listType, ref listDir, ref listValue, ref listName, ref listLink);
if (ret < 0)
{
Console.WriteLine("getListall failed!");
return -1;
}
for (int i = 0; i < listName.Count; ++i) {
Console.WriteLine($"Name:{listName[i]} Type:{listType[i]} Dir:{listDir[i]} Value:{listValue[i]} Comp:{listComp[i]} Link:{listLink[i]}");
}
return 0;
|
getAllbool
定义:
getAllbool(List listBoolname);
说明: 获取所有布尔类型参数的名称
参数:
【OUT】List listBoolname,获取到的所有布尔类型参数的名称列表
返回值: 成功返回0,出错返回负值
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
List<String> listBoolname = new List<String>();
ret = pIo.getAllbool(ref listBoolname);
if (ret < 0)
{
Console.WriteLine("listBoolname failed!");
return -1;
}
foreach (String sBoolname in listBoolname) {
Console.WriteLine($"Name:{sBoolname}");
}
return 0;
|
getAllboolCount
定义:
int getAllboolCount();
说明: 获取布尔类型参数数量
参数:无
返回值: 成功返回布尔类型参数数量,出错返回负值
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
int nBoolCount = pIo.getAllboolCount();
if (nBoolCount < 0) {
Console.WriteLine("getAllboolCount failed!");
return nBoolCount;
}
Console.WriteLine($"Count : {nBoolCount}");
return 0;
|
Manual_update
定义:int Manual_update();
说明: 手动更新io数据
参数:无
返回值:成功返回0,出错返回负值
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
ret = pIo.Manual_update();
if (ret < 0) {
Console.WriteLine("Manual_update failed!");
return -1;
}
return 0;
|
getPayLoad
定义:int getPayLoad(ref List listPayload);
说明: 获取五轴的有效载荷
参数:
Text Only【OUT】List<String> listPayload,获取到的五轴有效载荷数据
返回值: 成功返回0,出错返回负值
示例:
C# |
---|
| CIoControl_C pIo = new CIoControl_C();
String sIp = "192.168.64.96";
int nPort = 16131;
int ret = -1;
ret = pIo.init(sIp, nPort);
if (ret < 0)
{
Console.WriteLine("init failed!");
return -1;
}
Thread.Sleep(200);
List<String> listPayload = new List<String>();
ret = pIo.getPayLoad(ref listPayload);
if (ret < 0) {
Console.WriteLine("getPayLoad failed!");
return -1;
}
foreach (String sPayload in listPayload)
{
Console.WriteLine($"Payload : {sPayload}");
}
return 0;
|
工程创建示例
1.VS添加C#相关组件












3.建立UI及对应的方法
①DemoUI界面示例

②连接功能实现示例


Note
💡 注意,如果没有工具箱,则从 视图->工具箱 打开(如下图) 或者使用 快捷键Ctrl+Alt+X 打开工具箱







💡 其他控件按照需求自行设置
4.Demo文件示例
Designer.txt
Form1.txt
💡上面两个文件为设计代码,Designer.text中为UI设计代码,Form1.txt中为功能实现代码
💡按照下面的步骤进行操作可以获得一份程序demo
Note
💡请先根据 “创建Winform项目” 中的步骤进行操作得到一份工程,效果如下图。

Note
💡根据下图确认工程默认命名空间是否为 "Demo"。

Note
💡根据下图进入Form1.cs的功能实现代码界面。

Note
💡复制Form1.txt的内容至Form1.cs的功能实现代码界面,效果如下图。

Note
💡根据下图进入Form1.Designer.cs的UI设计代码界面。

Note
💡复制Designer.txt的内容至Form1.Designer.cs的UI设计代码界面,效果如下图。

💡根据下图检查是否成功生成UI

💡点击启动按钮,成功运行Demo,效果图如下
