565 lines
21 KiB
C#
565 lines
21 KiB
C#
// FormSampleApp.cs : アプリケーション用クラスの機能定義ファイル
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (C) 2023 MITSUBISHI Electric Corporation All Rights Reserved
|
|
//
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using static SampleAppCS.ClassDefine;
|
|
|
|
namespace SampleAppCS
|
|
{
|
|
public partial class FormSampleApp : Form
|
|
{
|
|
private EZNCAUTLib.DispEZNcCommunication oEZNcAutCom = null;
|
|
private Boolean bConnectStatus = false;
|
|
private Boolean bCommunicateStatus = false;
|
|
//Open3の第4引数は"EZNC_LOCALHOST"固定
|
|
private String strHostName = "EZNC_LOCALHOST";
|
|
|
|
//コンストラクタ
|
|
public FormSampleApp()
|
|
{
|
|
InitializeComponent();
|
|
|
|
//アプリ名の登録
|
|
this.Text = APPLICATION_NAME + this.Text;
|
|
groupBoxErrorCode.Text = APPLICATION_NAME + groupBoxErrorCode.Text;
|
|
|
|
//NCタイプの登録(C70/C80除く)
|
|
foreach (String stType in Enum.GetNames(typeof(SYSTEMTYPE)))
|
|
{
|
|
if ((stType != "EZNC_SYS_MELDASC70") && (stType != "EZNC_SYS_CNCC80"))
|
|
{
|
|
comboBoxSystemType.Items.Add(stType);
|
|
}
|
|
}
|
|
}
|
|
|
|
//ErrorCodeの出力
|
|
private void CheckError(String strMethod, Int32 lResult)
|
|
{
|
|
if (lResult != 0)
|
|
{
|
|
Int32 lBase = 16;
|
|
|
|
textBoxErrorCode.Text = strMethod + " failed. " + "0x" +
|
|
Convert.ToString(lResult, lBase) + Environment.NewLine + textBoxErrorCode.Text;
|
|
}
|
|
}
|
|
|
|
//「接続/切断」ボタン押下時の処理
|
|
private void ButtonConnect_Click(object sender, EventArgs e)
|
|
{
|
|
//M700/M800シリーズではポート番号に683という固定値を指定
|
|
Int32 lPort = 683;
|
|
Int32 lNCType;
|
|
Int32 lResult;
|
|
Boolean bResult;
|
|
String strIPAddress;
|
|
|
|
//IPアドレスの取得
|
|
if (textBoxIPAddress.Text == "")
|
|
{
|
|
MessageBox.Show("IPアドレスが不正です。");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
strIPAddress = textBoxIPAddress.Text;
|
|
}
|
|
|
|
//NCタイプの取得
|
|
bResult = Enum.TryParse<SYSTEMTYPE>(comboBoxSystemType.Text, out SYSTEMTYPE sysNCType);
|
|
if (bResult == false)
|
|
{
|
|
MessageBox.Show("NCタイプが不正です。");
|
|
return;
|
|
}
|
|
|
|
if (oEZNcAutCom == null)
|
|
{
|
|
//オブジェクトの作成
|
|
oEZNcAutCom = new EZNCAUTLib.DispEZNcCommunication();
|
|
|
|
//通信回線のオープン
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_CNCC80)
|
|
{
|
|
//下記の設定は一例のため、接続環境に合わせた設定が必要
|
|
lResult = oEZNcAutCom.SetMelsecProtocol(0x00, 0xFF, 0x00, 0x00, 0x3E1, 0x1018,
|
|
0x1002, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, strIPAddress, 0x04,
|
|
Int32.Parse(textBoxTimeOut.Text), 0x00, 0x00, 0x00, 5006, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01);
|
|
CheckError("SetMelsecProtocol", lResult);
|
|
}
|
|
else if (sysNCType == SYSTEMTYPE.EZNC_SYS_MELDASC70)
|
|
{
|
|
//下記の設定は一例のため、接続環境に合わせた設定が必要
|
|
lResult = oEZNcAutCom.SetMelsecProtocol(0x01, 0x01, 0x00, 0x00, 0x3E1, 0x0901,
|
|
0x1A, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, strIPAddress, 0x04,
|
|
Int32.Parse(textBoxTimeOut.Text), 0x00, 0x01, 0x04, 5001, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01);
|
|
CheckError("SetMelsecProtocol", lResult);
|
|
}
|
|
else
|
|
{
|
|
//TCPIP通信設定
|
|
lResult = oEZNcAutCom.SetTCPIPProtocol(strIPAddress, lPort);
|
|
CheckError("SetTCPIPProtocol", lResult);
|
|
}
|
|
|
|
if (oEZNcAutCom != null)
|
|
{
|
|
//マルチスレッドの有効化
|
|
lNCType = (Int32)sysNCType | EZNC_SYS_MULTI;
|
|
|
|
//通信回線のオープン
|
|
lResult = oEZNcAutCom.Open3(lNCType, Int32.Parse(textBoxMachineNo.Text),
|
|
Int32.Parse(textBoxTimeOut.Text), strHostName);
|
|
CheckError("Open", lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
//接続の設定
|
|
bConnectStatus = true;
|
|
|
|
//通信回線のクローズ
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_CNCC80 ||
|
|
sysNCType == SYSTEMTYPE.EZNC_SYS_MELDASC70)
|
|
{
|
|
lResult = oEZNcAutCom.Close();
|
|
}
|
|
else
|
|
{
|
|
lResult = oEZNcAutCom.Close2((Int32)RESETTYPE.EZNC_RESET_SIMPLE);
|
|
}
|
|
CheckError("Close", lResult);
|
|
}
|
|
else
|
|
{
|
|
//オブジェクトの解放
|
|
oEZNcAutCom = null;
|
|
MessageBox.Show("ホスト名(IPアドレス)またはNCタイプが不正です。");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (bCommunicateStatus == true)
|
|
{
|
|
//通信回線のクローズ
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_CNCC80 ||
|
|
sysNCType == SYSTEMTYPE.EZNC_SYS_MELDASC70)
|
|
{
|
|
lResult = oEZNcAutCom.Close();
|
|
}
|
|
else
|
|
{
|
|
lResult = oEZNcAutCom.Close2((Int32)RESETTYPE.EZNC_RESET_SIMPLE);
|
|
}
|
|
CheckError("Close", lResult);
|
|
|
|
//通信終了の設定
|
|
bCommunicateStatus = false;
|
|
|
|
//周期処理の終了
|
|
timerHighCycle.Enabled = false;
|
|
timerLowCycle.Enabled = false;
|
|
}
|
|
|
|
//切断の設定
|
|
bConnectStatus = false;
|
|
|
|
//オブジェクトの解放
|
|
oEZNcAutCom = null;
|
|
|
|
//GUI状態の初期化
|
|
ResetGUIStatus();
|
|
}
|
|
|
|
//GUI状態の更新
|
|
UpdateGUIStatus();
|
|
}
|
|
|
|
//「実行」ボタン押下時の処理
|
|
private void ButtonExcute_Click(object sender, EventArgs e)
|
|
{
|
|
Int32 lNCType;
|
|
Int32 lAxisNo = 0;
|
|
Int32 lIndex = 0;
|
|
Int32 lResult;
|
|
String strIPAddress;
|
|
|
|
//IPアドレスの取得
|
|
if (textBoxIPAddress.Text == "")
|
|
{
|
|
MessageBox.Show("IPアドレスが不正です。");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
strIPAddress = textBoxIPAddress.Text;
|
|
}
|
|
|
|
//NCタイプの取得
|
|
Enum.TryParse<SYSTEMTYPE>(comboBoxSystemType.Text, out SYSTEMTYPE sysNCType);
|
|
|
|
if (radioButtonStart.Checked == true)
|
|
{
|
|
//マルチスレッドの有効化
|
|
lNCType = (Int32)sysNCType | EZNC_SYS_MULTI;
|
|
|
|
//通信回線のオープン
|
|
lResult = oEZNcAutCom.Open3(lNCType, Int32.Parse(textBoxMachineNo.Text),
|
|
Int32.Parse(textBoxTimeOut.Text), strHostName);
|
|
CheckError("Open", lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
//通信開始の設定
|
|
bCommunicateStatus = true;
|
|
|
|
//周期処理の開始
|
|
timerHighCycle.Enabled = true;
|
|
timerLowCycle.Enabled = true;
|
|
|
|
//NCシステム番号の取得
|
|
lResult = oEZNcAutCom.System_GetVersion(lAxisNo, lIndex, out String strNCVersion);
|
|
CheckError("GetVersion", lResult);
|
|
textBoxSystemVersion.Text = strNCVersion;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//通信回線のクローズ
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_CNCC80 ||
|
|
sysNCType == SYSTEMTYPE.EZNC_SYS_MELDASC70)
|
|
{
|
|
lResult = oEZNcAutCom.Close();
|
|
}
|
|
else
|
|
{
|
|
lResult = oEZNcAutCom.Close2((Int32)RESETTYPE.EZNC_RESET_SIMPLE);
|
|
}
|
|
CheckError("Close", lResult);
|
|
|
|
if (lResult == 0)
|
|
{
|
|
//通信終了の設定
|
|
bCommunicateStatus = false;
|
|
|
|
//周期処理の終了
|
|
timerHighCycle.Enabled = false;
|
|
timerLowCycle.Enabled = false;
|
|
}
|
|
}
|
|
|
|
//GUI状態の更新
|
|
UpdateGUIStatus();
|
|
}
|
|
|
|
//周期処理(0.1秒周期)
|
|
private void TimerHighCycle_Tick(object sender, EventArgs e)
|
|
{
|
|
//位置情報の取得
|
|
GetPosition();
|
|
}
|
|
|
|
//周期処理(1秒周期)
|
|
private void TimerLowCycle_Tick(object sender, EventArgs e)
|
|
{
|
|
//アラーム情報の取得
|
|
GetAlarm();
|
|
|
|
//プログラム情報の取得
|
|
GetProgramData();
|
|
}
|
|
|
|
//位置情報の取得
|
|
private void GetPosition()
|
|
{
|
|
Int32 lResult;
|
|
Double dPosition;
|
|
|
|
//NCタイプの取得
|
|
Enum.TryParse<SYSTEMTYPE>(comboBoxSystemType.Text, out SYSTEMTYPE sysNCType);
|
|
|
|
//現在座標位置の取得
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_CNCC80)
|
|
{
|
|
textBoxCurrentPositionX.Text = "Not supported";
|
|
textBoxCurrentPositionY.Text = "Not supported";
|
|
textBoxCurrentPositionZ.Text = "Not supported";
|
|
}
|
|
else
|
|
{
|
|
lResult = oEZNcAutCom.Position_GetCurrentPosition(1, out dPosition);
|
|
CheckError("GetCurrentPosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxCurrentPositionX.Text = dPosition.ToString("F3");
|
|
}
|
|
|
|
lResult = oEZNcAutCom.Position_GetCurrentPosition(2, out dPosition);
|
|
CheckError("GetCurrentPosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxCurrentPositionY.Text = dPosition.ToString("F3");
|
|
}
|
|
|
|
lResult = oEZNcAutCom.Position_GetCurrentPosition(3, out dPosition);
|
|
CheckError("GetCurrentPosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxCurrentPositionZ.Text = dPosition.ToString("F3");
|
|
}
|
|
}
|
|
|
|
//ワーク座標位置の取得
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_CNCC80)
|
|
{
|
|
textBoxWorkPositionX.Text = "Not supported";
|
|
textBoxWorkPositionY.Text = "Not supported";
|
|
textBoxWorkPositionZ.Text = "Not supported";
|
|
}
|
|
else
|
|
{
|
|
lResult = oEZNcAutCom.Position_GetWorkPosition(1, out dPosition, 0);
|
|
CheckError("GetWorkPosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxWorkPositionX.Text = dPosition.ToString("F3");
|
|
}
|
|
|
|
lResult = oEZNcAutCom.Position_GetWorkPosition(2, out dPosition, 0);
|
|
CheckError("GetWorkPosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxWorkPositionY.Text = dPosition.ToString("F3");
|
|
}
|
|
|
|
lResult = oEZNcAutCom.Position_GetWorkPosition(3, out dPosition, 0);
|
|
CheckError("GetWorkPosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxWorkPositionZ.Text = dPosition.ToString("F3");
|
|
}
|
|
}
|
|
|
|
//機械座標位置の取得
|
|
lResult = oEZNcAutCom.Position_GetMachinePosition(1, out dPosition, 0);
|
|
CheckError("GetMachinePosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxMachinePositionX.Text = dPosition.ToString("F3");
|
|
}
|
|
|
|
lResult = oEZNcAutCom.Position_GetMachinePosition(2, out dPosition, 0);
|
|
CheckError("GetMachinePosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxMachinePositionY.Text = dPosition.ToString("F3");
|
|
}
|
|
|
|
lResult = oEZNcAutCom.Position_GetMachinePosition(3, out dPosition, 0);
|
|
CheckError("GetMachinePosition", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxMachinePositionZ.Text = dPosition.ToString("F3");
|
|
}
|
|
}
|
|
|
|
//アラーム情報の取得
|
|
private void GetAlarm()
|
|
{
|
|
Int32 lMessageNumber = 3;
|
|
Int32 lResult;
|
|
String strAlarmMsg;
|
|
Array lSystem = Array.CreateInstance(typeof(Int32), lMessageNumber);
|
|
Array lWarning = Array.CreateInstance(typeof(Int32), lMessageNumber);
|
|
Array lAlarmType = Array.CreateInstance(typeof(Int32), lMessageNumber);
|
|
|
|
//アラーム表示のテキスト消去
|
|
textBoxAlarmMessage.ResetText();
|
|
|
|
//NCタイプの取得
|
|
Enum.TryParse<SYSTEMTYPE>(comboBoxSystemType.Text, out SYSTEMTYPE sysNCType);
|
|
|
|
//アラーム情報の取得
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_MELDASC70)
|
|
{
|
|
lResult = oEZNcAutCom.System_GetAlarm2(lMessageNumber,
|
|
(Int32)ALARMTYPE.M_ALM_ALL_ALARM, out strAlarmMsg);
|
|
}
|
|
else
|
|
{
|
|
lResult = oEZNcAutCom.System_GetAlarm3(lMessageNumber, (Int32)ALARMTYPE.M_ALM_ALL_ALARM,
|
|
ref lSystem, ref lWarning, ref lAlarmType, out strAlarmMsg);
|
|
}
|
|
CheckError("GetAlarm", lResult);
|
|
|
|
//アラーム情報の出力
|
|
if ((lResult == 0) && (strAlarmMsg != ""))
|
|
{
|
|
//改行コードを区切りとして文字列を分割
|
|
String[] strAlarmMsgArray = strAlarmMsg.Split(new[] { "\r\n" }, StringSplitOptions.None);
|
|
|
|
for (Int32 i = 0; i < strAlarmMsgArray.Length; i++)
|
|
{
|
|
//アラームメッセージの出力(NC警告メッセージの場合はWaringという文字列を付与)
|
|
if (Int32.Parse(lWarning.GetValue(i).ToString()) != 0)
|
|
{
|
|
textBoxAlarmMessage.Text = textBoxAlarmMessage.Text + "(Warning)"
|
|
+ strAlarmMsgArray[i] + Environment.NewLine;
|
|
}
|
|
else
|
|
{
|
|
textBoxAlarmMessage.Text = textBoxAlarmMessage.Text
|
|
+ strAlarmMsgArray[i] + Environment.NewLine;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//プログラム情報の取得
|
|
private void GetProgramData()
|
|
{
|
|
Int32 lBlockNumber = 10;
|
|
Int32 lCountSize;
|
|
Int32 lCountStart = 0;
|
|
Int32 lResult;
|
|
String strProgramDataSubstring;
|
|
|
|
//NCタイプの取得
|
|
Enum.TryParse<SYSTEMTYPE>(comboBoxSystemType.Text, out SYSTEMTYPE sysNCType);
|
|
|
|
//実行プログラム表示のテキスト消去
|
|
listBoxCurrentProgram.Items.Clear();
|
|
|
|
//サポート対象外の場合の処理
|
|
if (sysNCType == SYSTEMTYPE.EZNC_SYS_CNCC80)
|
|
{
|
|
listBoxCurrentProgram.Items.Add("Not supported");
|
|
textBoxPrgNo.Text = "Not supported";
|
|
textBoxSequenceNo.Text = "Not supported";
|
|
return;
|
|
}
|
|
|
|
//プログラムブロック読み出し
|
|
lResult = oEZNcAutCom.Program_CurrentBlockRead(lBlockNumber,
|
|
out String strProgramData, out Int32 lCurrentBlockNumber);
|
|
CheckError("CurrentBlockRead", lResult);
|
|
|
|
//プログラム情報の出力
|
|
if (lResult == 0)
|
|
{
|
|
//改行コードを区切りとして文字列をリストに追加
|
|
lCountSize = strProgramData.IndexOf("\n");
|
|
while (lCountSize > 0)
|
|
{
|
|
strProgramDataSubstring = strProgramData.Substring(lCountStart,
|
|
lCountSize - lCountStart - 1);
|
|
listBoxCurrentProgram.Items.Add(strProgramDataSubstring);
|
|
|
|
lCountStart = lCountSize + 1;
|
|
lCountSize = strProgramData.IndexOf("\n", lCountStart);
|
|
}
|
|
|
|
//強調行の指定
|
|
if (lCurrentBlockNumber == 1)
|
|
{
|
|
//1ブロック目を強調
|
|
listBoxCurrentProgram.SelectedIndex = 0;
|
|
}
|
|
else if (lCurrentBlockNumber == 2)
|
|
{
|
|
//2ブロック目を強調
|
|
listBoxCurrentProgram.SelectedIndex = 1;
|
|
}
|
|
}
|
|
|
|
//プログラム番号の取得
|
|
lResult = oEZNcAutCom.Program_GetProgramNumber2((Int32)PROGRAMTYPE.EZNC_MAINPRG, out String strProgramNo);
|
|
CheckError("GetProgramNumber", lResult);
|
|
if(lResult == 0)
|
|
{
|
|
textBoxPrgNo.Text = strProgramNo;
|
|
}
|
|
|
|
//シーケンス番号の取得
|
|
lResult = oEZNcAutCom.Program_GetSequenceNumber((Int32)PROGRAMTYPE.EZNC_MAINPRG, out Int32 lSequenceNo);
|
|
CheckError("GetSequenceNumber", lResult);
|
|
if (lResult == 0)
|
|
{
|
|
textBoxSequenceNo.Text = lSequenceNo.ToString();
|
|
}
|
|
}
|
|
|
|
//GUI状態の更新
|
|
private void UpdateGUIStatus()
|
|
{
|
|
//接続中の場合
|
|
if(bConnectStatus == true)
|
|
{
|
|
textBoxConnectStatus.Text = "接続";
|
|
textBoxConnectStatus.BackColor = Color.LightBlue;
|
|
buttonConnect.Text = "切断";
|
|
textBoxIPAddress.Enabled = false;
|
|
comboBoxSystemType.Enabled = false;
|
|
buttonExcute.Enabled = true;
|
|
|
|
//通信開始中の場合
|
|
if(bCommunicateStatus == true)
|
|
{
|
|
textBoxOpenStatus.Text = "通信開始";
|
|
textBoxOpenStatus.BackColor = Color.LightBlue;
|
|
}
|
|
//通信終了中の場合
|
|
else
|
|
{
|
|
textBoxOpenStatus.Text = "通信終了";
|
|
textBoxOpenStatus.BackColor = Color.Yellow;
|
|
}
|
|
}
|
|
//切断中の場合
|
|
else
|
|
{
|
|
textBoxConnectStatus.Text = "切断";
|
|
textBoxConnectStatus.BackColor = Color.Red;
|
|
buttonConnect.Text = "接続";
|
|
textBoxOpenStatus.Text = "通信終了";
|
|
textBoxOpenStatus.BackColor = Color.Yellow;
|
|
textBoxIPAddress.Enabled = true;
|
|
comboBoxSystemType.Enabled = true;
|
|
buttonExcute.Enabled = false;
|
|
}
|
|
}
|
|
|
|
//GUI状態の初期化
|
|
private void ResetGUIStatus()
|
|
{
|
|
textBoxSystemVersion.ResetText();
|
|
textBoxCurrentPositionX.ResetText();
|
|
textBoxCurrentPositionY.ResetText();
|
|
textBoxCurrentPositionZ.ResetText();
|
|
textBoxWorkPositionX.ResetText();
|
|
textBoxWorkPositionY.ResetText();
|
|
textBoxWorkPositionZ.ResetText();
|
|
textBoxMachinePositionX.ResetText();
|
|
textBoxMachinePositionY.ResetText();
|
|
textBoxMachinePositionZ.ResetText();
|
|
listBoxCurrentProgram.Items.Clear();
|
|
textBoxPrgNo.ResetText();
|
|
textBoxSequenceNo.ResetText();
|
|
textBoxAlarmMessage.ResetText();
|
|
textBoxErrorCode.ResetText();
|
|
}
|
|
}
|
|
}
|