一,概述
前面介紹過,三菱CNC資料采集一般有兩種方法:
(1)通過官方A2 API(也叫EZSocket)進行資料采集,需要安裝A2驅動包(僅适用于windows系統)
(2)通過純TCP協定方法。該方法不局限于CPU架構(x86、ARM、MIPS等等),不局限作業系統(Windows、Linux、FreeRTOS、RT-Thread、μC/OS、裸機等等均可),不局限程式設計語言(Java、Python、C/C++、C#、Go等等均可)。
下面對兩種方法都進行相應介紹。
PS:建議直接用純協定方式。比如産品使用ARM Cortex-M,可以做到非常高的成本效益,也可以友善內建到軟體平台裡,歡迎交流扣扣17082750。
二,A2 API方式
1,安裝驅動包,可從下面位址下載下傳:
三菱CNC_三菱數控系統_資料采集_驅動_A2驅動,附c#demo源碼-C#文檔類資源-CSDN下載下傳
2,安裝完成後在預設路徑下會産生通訊庫,可以直接用最新版本的,複制到程式運作目錄下,直接引用就可以了。
3,撸代碼
if (lSystemType == (int)sysType.EZNC_SYS_MELDASC6C64 ||
lSystemType == (int)sysType.EZNC_SYS_MELDAS700M ||
lSystemType == (int)sysType.EZNC_SYS_MELDAS700L ||
lSystemType == (int)sysType.EZNC_SYS_MELDAS800M ||
lSystemType == (int)sysType.EZNC_SYS_MELDAS800L)
{
if (lSystemType == (int)sysType.EZNC_SYS_MELDASC6C64)
{
lResult = EZNcCom.SetTCPIPProtocol(strHostName, 64758);
}
else
{
lResult = EZNcCom.SetTCPIPProtocol(strHostName, 684);
}
ErrorCheck("SetTCPIPProtocol");
if (lResult == 0)
{
lResultOpen = EZNcCom.Open2(5, lMachine, lTimeOut, "EZNC_LOCALHOST");//EZNC_LOCALHOST
//lResultOpen = EZNcCom.Open(lSystemType, lMachine, lTimeOut, strHostName);//EZNC_LOCALHOST
lResult = lResultOpen;
ErrorCheck("Open");
}
}
else
{
lResultOpen = EZNcCom.Open2(lSystemType, lMachine, lTimeOut, strHostName);
ErrorCheck("Open");
}
4,EZSocket可以直接實作的有下述功能:
(1)通信功能
(2)NC系統功能(如系統版本、報警等讀取)
(3)位置功能(各種坐标讀取等)
(4)指令值(G代碼模态值、刀補編号、M/S/T/B功能指令模态等讀取)
(5)程式(程式編号、段編号、目前段讀取)
(6)時間(系統時間、自動運作時間等讀取)
(7)軸監視(伺服軸、主軸、輔助軸等各種狀态讀取)
(8)運作狀态(在原點位置等狀态讀取)
(9)檔案(PC檔案和NC檔案讀寫)
(10)共變量(共變量讀取)
(11)局變量(局變量、子程式嵌套層數讀取)
(12)刀具(刀補資料、刀具壽命管理資料、工件坐标系等讀取)
(13)ATC(刀庫功能讀寫)
(14) 參數(所有NC内參數讀寫)
(15)操作(部分NC操作管理)
(16)PLC接口(PLC接口讀寫)
(17) 其它NC特殊功能讀寫
三,純協定方式
直接建立TCP連接配接,能夠采集的資料也是非常豐富的
bool CMITSUBISHI_PROTOCOLDlg::LinkFirstMachine(int cn)
{
// 連接配接伺服器
if(!m_bInit[cn]) //如果沒有連接配接伺服器
{
//以下從檔案中得到伺服器的IP位址
m_clientsocket.Create();
GetDlgItemText(IDC_IPADDRESS_NC,IPstring[cn]);//控制器原IP位址
if(m_clientsocket.Connect(IPstring[cn],683))
{
m_clientsocket.Init(this);
Message_bar.Format("已經連接配接%d",cn);
GetDlgItem(IDC_STATIC_MESS)->SetWindowText(Message_bar);
m_bInit[cn]=true;
}
else
{
m_clientsocket.Close();
Message_bar.Format("無法連接配接%d",cn);
GetDlgItem(IDC_STATIC_MESS)->SetWindowText(Message_bar);
m_bInit[cn]=false;
}
}
return m_bInit[cn];
}
switch(ID.v)
{
//時間
case ID_POWER: mit.T_PowerON=l_value; break; //開機時間
case ID_AUTO: mit.T_AutoRun=l_value; break; //自動運轉
case ID_START :mit.T_AutoStart=l_value; break; //自動啟動時間 STL
case ID_PROCESS:mit.T_Process=l_value; break;
//伺服
case ID_SERVO_NAME1 : mit.name1=m_strValue; break;
case ID_SERVO_NAME2 : mit.name2=m_strValue; break;
case ID_SERVO_NAME3 : mit.name3=m_strValue; break;
//X
case ID_POS_CURRENT_X: mit.m_strCurr1=d_value; break;
case ID_POS_WORK_X: mit.m_strWork1=d_value; break;
case ID_POS_MACHINE_X: mit.m_strM1=d_value; break;
case ID_POS_DIS_X: mit.m_strDis1=d_value; break;
case ID_SERVO_GAINX: mit.gain_x=d_value; break;
case ID_SERVO_IX: mit.current_x=i_value;break; //負荷電流
case ID_SERVO_LOADX: mit.load_x=l_value;break;
//Y
case ID_POS_CURRENT_Y: mit.m_strCurr2=d_value; break;
case ID_POS_WORK_Y: mit.m_strWork2=d_value; break;
case ID_POS_MACHINE_Y: mit.m_strM2=d_value; break;
case ID_POS_DIS_Y: mit.m_strDis2=d_value; break;
case ID_SERVO_GAINY: mit.gain_y=d_value; break;
case ID_SERVO_IY: mit.current_y=i_value;break;
case ID_SERVO_LOADY: mit.load_y=l_value;break;
//Z
case ID_POS_CURRENT_Z: mit.m_strCurr3=d_value; break;
case ID_POS_WORK_Z: mit.m_strWork3=d_value; break;
case ID_POS_MACHINE_Z: mit.m_strM3=d_value; break;
case ID_POS_DIS_Z: mit.m_strDis3=d_value; break;
case ID_SERVO_GAINZ: mit.gain_z=d_value; break;
case ID_SERVO_IZ: mit.current_z=i_value; break;
case ID_SERVO_LOADZ: mit.load_z=l_value; break;
case ID_SPENDLE_GAIN : mit.gain=d_value; break; //主軸增益 資料類型是6 DOUBLE
case ID_SPENDLE_TEMP : mit.tmep=i_value; break; //溫度 2 int
case ID_SPENDLE_LOAD : mit.load=l_value; break; //負載 資料類型是3 LONG
case ID_SPENDLE_I: mit.current=i_value; break; //電流 % 2 int
case ID_SPENDLE_SPEED: mit.speed=d_value; break; //速度 6
case ID_RDY_HLD: GetDlgItem(IDC_RDY_STATE)->SetWindowText(m_strValue); break;
case ID_PROC_MODE: GetDlgItem(IDC_RDY_MODE)->SetWindowText(m_strValue); break;
case ID_SERVO_NUM: GetDlgItem(IDC_AXIZ_NUM)->SetWindowText(m_strValue); break; //BYTE
//主軸數量
case ID1039N: GetDlgItem(IDC_SPENDLE_NUM)->SetWindowText(m_strValue); break;
//間隙補償
case ID4007_1: mit.enc_comp1=d_value; break; //double
case ID4007_2: mit.enc_comp2=d_value; break; //double
case ID4007_3: mit.enc_comp3=d_value; break; //double
//G00反向間隙
case ID2011X: mit.backlashx_g0=l_value; break; //LONG
case ID2011Y: mit.backlashy_g0=l_value; break; //LONG
case ID2011Z: mit.backlashz_g0=l_value; break; //LONG
//G01反向間隙
case ID2012X: mit.backlashx_g1=l_value; break; //LONG
case ID2012Y: mit.backlashy_g1=l_value; break; //LONG
case ID2012Z: mit.backlashz_g1=l_value; break; //LONG
......
}
四,機台配置IP
1.點選右上角維護
2.左下角切換找到以太網參數或基本公用PRM
3.找到參數1926