Перейти к публикации

NXOpen 8.0 .NET Перебрать оснастку (инструмент и патроны) из файла


KlimTV1987

Рекомендованные сообщения

Всем доброго времени суток.

 

Осваиваю NXOpen. Поставлена задача получить из файла список инструмента с параметрами, чтобы в дальнейшем передать информацию в Вертикаль. Попробовал записать журнал, действия добавить и удалить новый инструмент. Вышел на следующий код:

    NXOpen.CAM.NCGroup nCGroup1 = (NXOpen.CAM.NCGroup)workPart.CAMSetup.CAMGroupCollection.FindObject("HERMLE_C20U");
    NXOpen.CAM.NCGroup nCGroup2;
    nCGroup2 = workPart.CAMSetup.CAMGroupCollection.CreateTool(nCGroup1, "mill_planar", "CHAMFER_MILL", NXOpen.CAM.NCGroupCollection.UseDefaultName.True, "CHAMFER_MILL");

В приведённом коде на первой строке получаю NullReferenceException. Значение свойства CAMSetup объекта workPart возвращает null.

 

В журнале всё прекрасно работает.

 

Кто сталкивался с такой проблемой, подскажите как решили. Или у меня случай уникальный?  :sad:

 

З.Ы. Если есть рабочий пример решения подобной задачи, поделитесь, люди добрые.

Ссылка на сообщение
Поделиться на других сайтах


Возможно CAMSetup=null если вы не зашли в модуль Обработки


Держите,рабочая функция для получения всех инструментов. Пропускаются неиспользуемые объекты и станочная оснастка.
 

private List<Tag> GetToolList()
        {

            List<Tag> TList = new List<Tag>();
            Tag SetupTag = Tag.Null;
            Tag ToolRootTag = Tag.Null;
            Tag ToolNullTag = Tag.Null;
            try
            {
                theUFSession.Setup.AskSetup(out SetupTag);
                theUFSession.Setup.AskMctRoot(SetupTag, out ToolRootTag);
                theUFSession.Setup.AskMctNull(SetupTag, out ToolNullTag);
            }
            catch { return TList; }

            int count = 0;
            Tag[] ListTag;
            theUFSession.Ncgroup.AskMemberList(ToolRootTag, out count, out ListTag);
            REC_GetToolList(ListTag, ref TList, ToolNullTag);

            return TList;
        }

        //для рекурсии
        private void REC_GetToolList(Tag[] ListTag, ref List<Tag> TList, Tag ToolNullTag)
        {
            for (int i = 0; i < ListTag.Length; i++)
            {
                int type = 0, subtype = 0;
                theUFSession.Obj.AskTypeAndSubtype(ListTag[i], out type, out subtype);
                if ((type == 109) && (subtype == 0)) if (!ListTag[i].Equals(ToolNullTag)) TList.Add(ListTag[i]);

                int count = 0;
                Tag[] ListTagRec;
                theUFSession.Ncgroup.AskMemberList(ListTag[i], out count, out ListTagRec);
                REC_GetToolList(ListTagRec, ref TList, ToolNullTag);

            }

        }
Ссылка на сообщение
Поделиться на других сайтах

Когда-то требовалось вывести общие атрибуты CAM-проекта: Имя симулятора, Наименование, Имя магазина станка, а также перечень РИ с позициями, может чем-то помочь:

try
{
//Ищем имя симулятора ИСПРАВИТЬ НА ОБЪЕКТ ИЗ ДЕРЕВА
simName = workPart.camsetup().getMachineLibref();

//Цикл сортировки и записи объектов по типам
//******************************************
//Коллекция для хранения перечня режущего инструмента
List toolList = new ArrayList();
int toolCount = 0; //счетчик количества инструментов
Iterator iter = workPart.camsetup().camgroupCollection().iterator();

while (iter.hasNext()){

NXObject obj = (NXObject) iter.next();

//Сортировка объектов по типам
//****************************
//Инструмент
if (obj instanceof Tool) {
//writeToTextFile.writeToTextFile(Integer.toString(i) + "." + obj.name() + "\r\n", true, logInstance+"tools_list.txt");
toolList.add((Tool) obj);
toolCount++;
}
}

//Ищем пары инструмент-позиция в магазине
Map toolPocketPair = new HashMap();//здесь храним строки вида: Имя инструмента + Имя кармана
for (int j = 0; j < toolList.size(); j++)
{
if (toolList.get(j) != null)
{
toolPocketPair.put(toolList.get(j), toolList.get(j).getParent());//получили коллекцию Инструмент-Карман
//theUI.nxmessageBox().show("Завершено", nxopen.NXMessageBox.DialogType.INFORMATION, toolList.get(j).name() + " " + toolList.get(j).getParent().name());

}


else theUI.nxmessageBox().show("Info", nxopen.NXMessageBox.DialogType.WARNING, "Не удалось найти инструмент");

}

//Идем вверх по дереву
List treeIerarchy = new ArrayList(); //здесь храним дерево структуры где корневым элементом является первый найденный инструмент
if (toolList.get(0) != null)
{
NCGroup treeToolIter = toolList.get(0);
while (!treeToolIter.equals(workPart.camsetup()))
{
treeIerarchy.add(treeToolIter);
treeToolIter = treeToolIter.getParent();

}
}
else theUI.nxmessageBox().show("Info", nxopen.NXMessageBox.DialogType.ERROR, "Нельзя искать родителей у пустого объекта");
theUI.nxmessageBox().show("Завершено", nxopen.NXMessageBox.DialogType.INFORMATION, treeIerarchy.get(treeIerarchy.size()-1).name());

Если выгрузить коллекции в TXT, то вывод будет примерно таким:

 

Общие атрибуты проекта:
Загруженный симулятор.
Обозначение: SC250_asm_sim/A
Наименование: ТОКАРНО-ФРЕЗЕРНЫЙ_СТАНОК
Имя магазина станка: TURRET
-------------------------


Имя инструмента: 005111_A
Позиция: POCKET_04


Имя инструмента: 005250_A_1
Позиция: POCKET_03


Имя инструмента: 005250_A
Позиция: POCKET_02


Имя инструмента: 005839_A
Позиция: POCKET_01

 

Ссылка на сообщение
Поделиться на других сайтах

Спасибо что откликнулись.

 

Возможно CAMSetup=null если вы не зашли в модуль Обработки

 

Можно чуть по подробнее, как в него "зайти". Можете поделиться кусочком кода? 

 

По коду: у меня срабатывает catch на строке кода 

theUFSession.Setup.AskMctRoot(SetupTag, out ToolRootTag);

Ошибка NX error status 13450004. А до этого была ошибка в строке

theUFSession.Setup.AskSetup(out SetupTag);

Но с ней разобрался открыв файл не через Session, а через UFSession. Может быть требуются ещё какие-то предварительные действия?

Ссылка на сообщение
Поделиться на других сайтах
Можно чуть по подробнее, как в него "зайти". Можете поделиться кусочком кода? 

Я имел ввиду, когда программу запускаете, чтобы в nx был в модуле обработке. 

По коду: у меня срабатывает catch на строке кода 

может быть  SetupTag =null или 0, тогда эта аналог вашей ошибки.

Вот что мне журнал записал, пи переходе в модуль обработки.
Там и setup сразу берется
 

    NXOpen.Session theSession = NXOpen.Session.GetSession();
    NXOpen.Part workPart = theSession.Parts.Work;
    NXOpen.Part displayPart = theSession.Parts.Display;
    // ----------------------------------------------
    //   Menu: Application->Manufacturing...
    // ----------------------------------------------
    theSession.ApplicationSwitchImmediate("UG_APP_MANUFACTURING");
    
    bool result1;
    result1 = theSession.IsCamSessionInitialized();
    
    theSession.CreateCamSession();
    
    NXOpen.CAM.CAMSetup cAMSetup1;
    cAMSetup1 = workPart.CreateCamSetup("mill_planar");
Ссылка на сообщение
Поделиться на других сайтах
theSession.CreateCamSession();

 

Да, видимо в этом всё дело. Я попробовал записать журнал и из него вставить код в пустой проект. Работает. theSession.IsCamSessionInitialized() возвращает true. 

Однако, при использовании в моём проекте theSession.CreateCamSession() вызывает NXException Invalid part tag

 

Подозреваю, что это происходит потому, что 

    NXOpen.Part workPart = theSession.Parts.Work;
    NXOpen.Part displayPart = theSession.Parts.Display;

в случае с журналом ссылаются на только что созданную, активную деталь. А я в своем проекте открываю деталь по средством theSession.Parts.Open(), а theSession.Parts.Work остаётся null. В описании написано, что функция Open не делает деталь активной. Но не написано, как мне её таковой сделать, если это нужно. В справочнике пока ничего не нашел.

 

Знаете такую функцию? Или, если я размышляю в неверном направлении, причина другая?

Ссылка на сообщение
Поделиться на других сайтах

Да, видимо в этом всё дело. Я попробовал записать журнал и из него вставить код в пустой проект. Работает. theSession.IsCamSessionInitialized() возвращает true. 

Однако, при использовании в моём проекте theSession.CreateCamSession() вызывает NXException Invalid part tag

 

Подозреваю, что это происходит потому, что 

    NXOpen.Part workPart = theSession.Parts.Work;
    NXOpen.Part displayPart = theSession.Parts.Display;

в случае с журналом ссылаются на только что созданную, активную деталь. А я в своем проекте открываю деталь по средством theSession.Parts.Open(), а theSession.Parts.Work остаётся null. В описании написано, что функция Open не делает деталь активной. Но не написано, как мне её таковой сделать, если это нужно. В справочнике пока ничего не нашел.

 

Знаете такую функцию? Или, если я размышляю в неверном направлении, причина другая?

Попробуйте перед созданием CAM сессии убедиться, что Part tag != null. Вы дебаггер jdb подключали к проекту?

Изменено пользователем Lockdain
Ссылка на сообщение
Поделиться на других сайтах
А я в своем проекте открываю деталь по средством theSession.Parts.Open(), а theSession.Parts.Work остаётся null

Там кроме метода Open() есть и другие, например OpenDisplay.
 
Ссылка на сообщение
Поделиться на других сайтах
Попробуйте перед созданием CAM сессии убедиться, что Part tag != null. Вы дебаггер jdb подключали к проекту?
 

Нет. Что за дебаггер jdb? Не знаком с таким.

 

Там кроме метода Open() есть и другие, например OpenDisplay.

Спасибо, помогло.

 

На данный момент есть такой код. Считывает имена инструментов из навигатора операций

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NXOpen;

namespace ConsoleApplication3
{
    class Program
    {
        // Сессия NX
        private static Session theSession;

        [STAThreadAttribute]
        static void Main(string[] args)
        {
            // выбор файла пользователем
            System.Windows.Forms.OpenFileDialog fileDialog = new System.Windows.Forms.OpenFileDialog();
            fileDialog.CheckFileExists = true;
            fileDialog.CheckPathExists = true;
            fileDialog.Filter = "NX models|*.prt";
            fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            System.Windows.Forms.DialogResult dialogResult = fileDialog.ShowDialog();
            // если файл успешно выбран
            if (dialogResult == System.Windows.Forms.DialogResult.OK)
            {
                // файл для обработки
                string file = fileDialog.FileName;
                // Получаем сессию NX
                theSession = Session.GetSession();
                // открываем файл в NX как активный
                PartLoadStatus pLS;
                Part workPart = theSession.Parts.OpenDisplay(file, out pLS);
                pLS.Dispose();
                // подключаем CAM
                theSession.CreateCamSession();
                // если подключилось успешно, приступаем к считыванию инструмента
                if (theSession.IsCamSessionInitialized())
                {
                    ReadCAMTools(workPart);
                }
		// сообщаем о завершении
		Console.WriteLine(Environment.NewLine + "Нажмите Enter для завершения...");
		Console.ReadLine();
            }
        }


        private static void ReadCAMTools(Part part)
        {
            // коллекция групп
            NXOpen.CAM.NCGroup[] nxGroup = part.CAMSetup.CAMGroupCollection.ToArray();
	    // перебираем группы
            foreach (NXOpen.CAM.NCGroup nxG in nxGroup)
            {
                // отбираем только те, которые являются инструментом
                if (nxG.GetType().ToString() == "NXOpen.CAM.Tool")
                {
		    // имя инструмента
                    Console.WriteLine(nxG.Name);
                    Console.WriteLine(Environment.NewLine + "-------------------------------------");
                }
            }
        }
    }
}

Теперь вопрос в том, как из этого дополнительно получить описание инструмента, номер инструмента, хвостовик (всё отображается в навигаторе операций). Кто-нибудь знает, как с этими параметрами работать?

 

Пробовал записать журнал, команда "Изменить" навигатора операций. Создаётся объект NXOpen.Cam.MilltoolBuilder и через него ведётся работа. Нашел в описании API его свойства, там есть подходящие. Только не совсем понятны следующие моменты:

1. ToolBuilder'ов в part.CAMSetup.CAMGroupCollection великое множество. Как понять, какой именно мне нужен в данный конкретный момент?

2. Для создания ToolBuilder нужно в аргумент функции передать объект NXOpen.CAM.Tool. Как превратить NXOpen.CAM.NCGroup в NXOpen.CAM.Tool ?

Ссылка на сообщение
Поделиться на других сайтах

смотрите uf_param.h
у всех cam объектов (инструмент, операция, метод, геометрия) есть параметры.
У каждого параметра есть свой индекс uf_param_indices.h (но там не все описаны).
Почти все геометрические параметры инструмента можно вытащить через этот функционал, исключение это держатель, точки трасировки (может и еще что то есть),
для этого есть отдельные функции в uf_cam.h.
 

Ссылка на сообщение
Поделиться на других сайтах

@@KlimTV1987, извиняюсь, не обратил внимание на то, что вы используете .NET, это дебагер для java. 

Ссылка на сообщение
Поделиться на других сайтах
смотрите uf_param.h у всех cam объектов (инструмент, операция, метод, геометрия) есть параметры. У каждого параметра есть свой индекс uf_param_indices.h (но там не все описаны). Почти все геометрические параметры инструмента можно вытащить через этот функционал, исключение это держатель, точки трассировки (может и еще что то есть), для этого есть отдельные функции в uf_cam.h.

 

Геометрия пока что не нужна, но буду иметь в виду, спасибо.

 

Вот, своего добился. Теперь буду думать над передачей этого добра в вертикаль. Всем спасибо за советы!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NXOpen;

namespace ConsoleApplication3
{
    class Program
    {
        // Сессия NX
        private static Session theSession;

        [STAThreadAttribute]
        static void Main(string[] args)
        {
            // выбор файла пользователем
            System.Windows.Forms.OpenFileDialog fileDialog = new System.Windows.Forms.OpenFileDialog();
            fileDialog.CheckFileExists = true;
            fileDialog.CheckPathExists = true;
            fileDialog.Filter = "NX models|*.prt";
            fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            System.Windows.Forms.DialogResult dialogResult = fileDialog.ShowDialog();
            // если файл успешно выбран
            if (dialogResult == System.Windows.Forms.DialogResult.OK)
            {
                // файл для обработки
                string file = fileDialog.FileName;
                // Получаем сессию NX
                theSession = Session.GetSession();
                // открываем файл в NX как активный
                PartLoadStatus pLS;
                Part workPart = theSession.Parts.OpenDisplay(file, out pLS);
                pLS.Dispose();
                // подключаем CAM
                theSession.CreateCamSession();
                // если подключилось успешно, приступаем к считыванию инструмента
                if (theSession.IsCamSessionInitialized())
                {
                    ReadCAMTools(workPart);
                }
		// сообщаем о завершении
		Console.WriteLine(Environment.NewLine + "Нажмите Enter для завершения...");
		Console.ReadLine();
            }
        }


        private static void ReadCAMTools(ref Part part)
        {
            // коллекция групп
            NXOpen.CAM.NCGroup[] nxGroup = part.CAMSetup.CAMGroupCollection.ToArray();
            // перебираем
            foreach (NXOpen.CAM.NCGroup nxG in nxGroup)
            {
                // отбираем только те группы, которые являются инструментами
                if (nxG.GetType().ToString() == "NXOpen.CAM.Tool")
                {
                    // Имя из навигатора операций
                    string toolName = nxG.Name;
                    Console.WriteLine(toolName);
                    // преобразуем элемент группы в инструмент
                    NXOpen.CAM.Tool tool = (NXOpen.CAM.Tool)nxG;
                    // открываем инструмент
                    NXOpen.CAM.MillToolBuilder millToolBuilder1;
                    millToolBuilder1 = part.CAMSetup.CAMGroupCollection.CreateMillToolBuilder(tool);
                    // считываем параметры
                    Console.WriteLine("Описание = " + millToolBuilder1.TlDescription);
                    Console.WriteLine("Хвостовик = " + millToolBuilder1.TlHolderDescription);
                    Console.WriteLine("Номер инструмента = " + millToolBuilder1.TlNumberBuilder.Value);
                    Console.WriteLine("Номер по каталогу = " + millToolBuilder1.TlCtlgNum);
                    Console.WriteLine(Environment.NewLine + "-------------------------------------");
                }
            }
        }
    }
}

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




  • Сообщения

    • mannul
    • FitchKrause
      Ранее на этом станке успешно запускали нарезку 5-и уплотнителей, нарезали две штуки, и в момент смены инструмента нажали reset. Посыпались ошибки, их вроде устранили, попутно сбросив нули станка(не специально) и восстановив их, после он проработал примерно час и проблем не было. Ещё ранее, его пару раз запускали и нарезали уплотнители, работал без проблем. А про разборку двигателя не известно, скорее всего как он приехал, включили, дабы проверить на работоспособность и все.
    • karlf
      Ну, интересный момент в том, что на этом бэкапе, который загружается полностью, ключ не видится и на блоках в шкафу горит красная лампочка. А на бэкапе, который не грузится полностью, на блоках загорается зелёная. То есть сам ключ физически работает
    • Ветерок
      Самое сложное тут - разобраться в чертеже :)
    • malvi.dp
    • gudstartup
      в общем не читает он ваш ключ поэтому и уровни доступа не активируются жаль что у вас нет второго ключа обычно dmg поставляет два да и бэкапа 100% рабочего нет... это проблема если не ключ тогда база ключа или соединения с plc у вас навернулись
    • gudstartup
      на новых серво вытаскивать не нужно наконец то фанук внесли изменение в конструкцию @Koels вентилятор на ралиаторе если радиатор вне зоны электрошкафа а во внешней среде подвержен загрязнению особенно если станок использует сож. индикация на приводе F / вынимаете и чистите можно на некоторых сериях чпу даже скорость посмотреть. если не помогает и вентилятор точно вращается тогда можно эту ошибку отключить 8901 # 0  FAN A fan motor error is: 0:    Detected. 1:    Not detected. 1807 # 2  SWP This parameter specifies the operation of the αi series servo amplifier in its warning state (for example, with the fan stopped). 0:     An alarm is issued when the amplifier is placed in the warning state. Automatic operation enters the feed hold state and the servo axis is decelerated to a stop. 1:     An alarm is not issued even when the amplifier is placed in the warning state. Automatic operation is kept. The servo is deactivated if the amplifier shifts from the warning state to the alarm state.
    • karlf
      Вот так сейчас выглядит при загрузке с родного диска
    • Beliko
      Добрый день форумчане! Нужна помощь. Суть такая – есть проект, составленный на FeatureCam. При сохранении управляющей программы формируются несколько файлов. Из них два текстовых, один с расширением .t2.TXT , второй .TXT. В первом, я как понимаю, описаны вспомогательные функции, то есть это как бы подпрограмма или флаг, а вторая это основная программа с описанием всех операций. В тексте есть кадры – М400, М401, М402…….( Wait ), это обращение и вызов тех операций, которые находятся в файле .t2.TXT. Эти два файла работают вместе. Подскажите пожалуйста как их объединить. У нас станок со стойкой Fanuc 18i TB и чтобы записать рабочий файл необходимо присвоить ему имя типа О0111 (или другие цифры). А как в этом случае, чтобы работали два файла вместе в нашей стойке?  Прошу прощения за безграмотность, мы только учимся. За ранее всем благодарен.
    • MagicNight
      Добрый день. Каким образом можно сохранить или экспортировать проект из PowerMill версия 2023, чтобы была возможность открыть его в PowerMill версия 6? Кто-то сталкивался с этим?
×
×
  • Создать...