Перейти к содержанию
desti

LinuxCNC - автоматическая смена инструмента

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

Алгоритм работы смены инструмента в LinuxCNC

 

Операция смены инструмента инициализируется командой M6, до этого командой T необходимо указать номер требуемого инструмента. Таким образом, последовательность выглядит как T4M6, например.

 

Со стороны ЧПУ операция выглядит так:

 

1. устанавливается номер инструмента, который получен в команде Tx, iocontrol.0.tool-prep-number (x).

2. посылается команда iocontrol.0.tool-change (1).

3. цикл ожидания ответа iocontrol.0.tool-changed (1) от тулченжера.

4. сброс сигнала iocontrol.0.tool-change (0)

 

5. ожидание сброса сигнала iocontrol.0.tool-changed (0) тулченжером.

6. загружаются параметры инструмента из tool.tbl

7. пину iocontrol.0.tool-number присваивается значение установленного инструмента.

 

Операция ЧПУ закончена.

 

ЧПУ держит в iocontrol.0.tool-number номер активного сейчас инструмента или 0, если инструмент не инициализирован.

 

Компонент тулченжера крутит бесконечный цикл в ожидании команды iocontrol.0.tool-change.

 

Со стороны тулченжера операция смены выглядит так:

 

1. получает команду iocontrol.0.tool-change (1)

2. получает номер инструмента iocontrol.0.tool-prep-number (x).

3. устанавливает указанный инструмент каким-то своим способом.

4. выдает для ЧПУ команду iocontrol.0.tool-changed (1)

5. ждет, пока ЧПУ не снимет команду iocontrol.0.tool-change,

6. сбрасывает в 0 сигнал iocontrol.0.tool-changed.

 

На этом цикл работы компонента заканчивается.

 

На основании этой информации можно написать простой компонент-затычку, которая ничего не делает, но меняет номер установленного инструмента.

 

component testchanger				   "Компонент-заглушка для проверки процесса смены инструмента";
// основные сигналы управления
pin in bit toolchange;				   // Сигнал на смену инструмента от ЧПУ
pin in s32 toolnumber;				 // Номер инструмента, который необходимо установить. 1..12 в моем случае
pin in s32 currenttool;				  // Установленный сейчас инструмент
pin out bit toolchanged = false;	// Сигнал завершения успешной смены инструмента

variable int sleeptime = 0;		
param rw s32 rdelay = 50;		 // Символическая задержка для демонстрации

// флаги однократного вывода сообщений состояния (сообщения видны в dmesg или в консоли при запуске из консоли)
variable bool warning0  = false;  
variable bool warning1 = false;  
variable bool warning2 = false;  
variable bool warning3 = false;  
variable bool warning4 = false;  

option singleton yes;				   // только один экземпляр компонента может быть запущен
function _;
author "desti";
license "GPL";
;;
FUNCTION(_)
{
// этапы процесса в соответствии с алгоритмом

// Состояние 1: нет запроса на смену инструмента, пустой цикл, один раз выводим сообщение о запуске
if (!toolchange && !toolchanged)
{
 if(!warning0) {
  warning0  = true;  // ставим флаг
  warning1 = false; // сбрасываем остальные флаги
  warning2 = false;
  warning3 = false;
  warning4 = false;
  rtapi_print_msg(RTAPI_MSG_ERR, "testchanger now init and waiting for toolchange command. Tool number: %d", currenttool);
 }
}
// Состояние 2: пришел запрос на смену инструмента
if (toolchange && !toolchanged)
{
 if(!warning1) {
  warning1=true; // ставим флаг
  rtapi_print_msg(RTAPI_MSG_ERR, "toolchange signal received, tool number: %d, run toolchange process.", toolnumber );
 }

 if(sleeptime!=rdelay) sleeptime++; //задержка

 if(!warning2) {
  warning2=true; // ставим флаг
  rtapi_print_msg(RTAPI_MSG_ERR, "toolchange process finished, set toolchanged signal.");
  toolchanged = true;
 }
}

// Состояние 3: ЧПУ сняло запрос на смену инструмента, снимаем флаг
if (!toolchange && toolchanged)
{
 if(!warning3) {
  warning3=true; // ставим флаг
  rtapi_print_msg(RTAPI_MSG_ERR, "CNC reset toolchange signal,  now reset toolchanged signal.");
  toolchanged = false;
 }
}

// Состояние 4: ЧПУ еще не сняло запрос на смену инструмента, думает..
if (toolchange && toolchanged)
{
 if(!warning4) {
  warning4=true; // ставим флаг
  rtapi_print_msg(RTAPI_MSG_ERR, "CNC processing toolchange setup...");
  warning0=false; // снова разрешаем сообщение об инициализации.
 }
}
}

 

В консоли, в директории с нашим файлом, выполним команду

 

halcompile --install testchanger.comp

 

В главном HAL файле запускаем компонент и подключаем пины

 

loadrt testchanger
addf testchanger servo-thread

# у компонентов типа singleton нет числа экземпляра, он записывается как name.pin, а не как name.0.pin
net tool-change iocontrol.0.tool-change => testchanger.toolchange
net tool-number iocontrol.0.tool-prep-number => testchanger.toolnumber
net tool-oldnumber iocontrol.0.tool-number => testchanger.currenttool
net tool-changed iocontrol.0.tool-changed => testchanger.toolchanged

 

Если теперь попробовать сменить инструмент, то компонент отработает последовательность и "сменит" инструмент, в консоли можно увидеть, как компонент отрабатывает этапы. В реальной жизни состояния 1 и 4 можно не обрабатывать.

 

Алгоритм работы головы СТП220АП

 

1. Получить данные от ЧПУ, проверить, нужна ли смена инструмента (toolnumber != position), если нет, то установить выйти.

2. Отжать инструментальный диск (unclamp=1),

3. Задержка на срабатывание клапана, дождаться сигнала headunclamped == 1.

4. Вращать (setuprun = 1) до тех пор, пока toolnumber != position (небольшой перелет через позицию для корректного реверса настраивается положением датчика).

5. Остановить вращение setuprun = 0

6. Задержка, включить реверс до срабатывания датчика положения (clamprun = 1)

7. Задержка, Крутить, пока readyforclamp != 1.

8. Зажать инструментальный диск (clamp = 1),

9. Задержка, ждать сигнал headunclamped == 0,

10. Отключить вращение реверса.

11. Задержка, выдать сигнал готовности для iocontrol.0.tool-changed.

12. Ждать снятия iocontrol.0.tool-change

13. Снять iocontrol.0.tool-changed.

 

Черновой, но действующий вариант компонента. Можно добавить обработку статуса homing, добавить всякие сервисные фичи на свой вкус.

 

component toolchanger				   "Управление автоматическим тулченжером СТП220АП";

// основные сигналы управления
pin in bit toolchange				   "Сигнал на смену инструмента от ЧПУ";
pin in s32 toolnumber				   "Номер инструмента, который необходимо установить. 1..12";
pin in s32 currenttool			"Установленный сейчас инструмент";
pin out bit toolchanged = false		 "Сигнал завершения успешной смены инструмента";

// датчики и сигналы зажима-разжима
pin out bit clamp = false				"Сигнал на клапан зажима";
pin out bit unclamp = false			  "Сигнал на клапан разжима";
pin in  bit headunclamped = false		"Сигнал датчика зажима головы, 1 когда отжат и можно крутить";
pin in  bit readyforclamp = false		"Сигнал датчика положения головы. 1 когда голова готова к зажиму";

// датчики и сигналы вращения
pin in s32 position	  "Текущая позиция инструмента";
pin out bit setuprun = false			"Сигнал включения клапана вращения для вращения в позицию";
pin out bit clamprun = false			"Сигнал включения клапана вращения для реверса";

// внутренние переменные
variable int run_level = 0;		  // этапы работы головы
variable int sleeptime = 0;		   // счетчик циклов задержки на включение-выключение клапанов
param rw float relaydelay = 500		   "Задержка на время срабатывания клапана";
variable bool warning = false;		// флаг сообщения инициализации

option singleton yes;				   // ограничиваем количество возможных компонентов
function _;
author "desti";
license "GPL";
;;

FUNCTION(_)
{
 switch (run_level)
	{
	 case 0:  // цикл ожидания команды смены инструмента

// ничего не происходит, смена инструмента не запрашивается, однократно выводим в лог сообщение об инициализации
		   if (!toolchange && !toolchanged) {
					  if(!warning) {
							 warning=true; // ставим флаг однократного сообщения
							 rtapi_print_msg(RTAPI_MSG_ERR, "Toolchanger ready.");
					  }
					  break;
		  }

// пришел запрос на смену инструмента
		   if (toolchange && !toolchanged)
		   {
				  if(toolnumber != position) // если затребован новый инструмент и он в правильном диапазоне
				  {
					 if(toolnumber > 0 && toolnumber < 13) {
						   unclamp = true;		   // отжим головы
						   sleeptime = 0;			 // обнуляем задержку на включение клапана
						   run_level = 1;			  // запуск цикла смены инструмента
						   break;
					} else { // что-то пошло не так..
						   run_level=13;
					}
				  } else { // смена не нужна, сразу ставим сигнал "сменен"
								run_level = 7;
				  }
		  }

// ЧПУ сняло запрос на смену инструмента, снимаем флаг, процедура закончена.
		if (!toolchange && toolchanged)
		{
				  toolchanged = false;
				  break;
		}

// ЧПУ еще не сняло запрос на смену инструмента, думает..
	   if (toolchange && toolchanged)
	   {
					break; // ничего не делаем. Можно что-нить в лог вывести
	   }
  break;

	case 1: // отжатие головы, ждем сигнала отжатия

				  if(sleeptime < relaydelay)  { sleeptime++; break; } // временная задержка для отжатия головы

				  if(headunclamped) {
								 unclamp = false; // снимаем сигнал отжима головы
								 setuprun = true; // включаем вращение смены инструмента
								 run_level = 2;   // переключаем режим
				  }
				  break;

	case 2: // Вращение головы, читаем номер инструмента
				  if(!position) { // промежуточное состояние, просто пропускаем (у меня датчик выдает 0 в промежуточном состоянии
								break;
				  }
// ждем, когда докрутится до нужной позиции (+ механическая настройка датчика)
				  if(position == toolnumber ) { 
                           setuprun = false; // стоп мотору
                           sleeptime = 0;	// загружаем таймер
                           run_level = 3;	 // след. уровень
				  }
	break;

	case 3: // задержка перед включением обратного вращения и запуск вращения на зажим
				  if(sleeptime < relaydelay) { sleeptime++; break; }
				  clamprun = true;		 // Реверс двигателя
				  run_level = 4;
	break;

	case 4: // вращаем голову назад, ждем сигнала с датчика установки в позицию
					if(readyforclamp) { // обратное вращение дошло до датчика позиции для зажима
							run_level = 5;
					}
	break;			  

	case 5: // зажимаем голову
					clamp = true; // сигнал зажатия головы
					sleeptime = 0;	// загружаем таймер
					run_level = 6;
	break;

	case 6: // останавливаем обратное вращение
               if(sleeptime < relaydelay) { sleeptime++; break; } // задержка

               clamprun = false;		 // Реверс двигателя стоп

               if(!headunclamped) {   // есть сигнал зажатия головы
                         clamp = false; // снимаем сигнал
                         run_level = 7; // переход на последний этап
               }
	break;

	case 7: // финал
					toolchanged = true;   // сигнал завершения смены инструмента
					run_level = 0; // снова переходим на этап ожидания сигналов от ЧПУ
	break;

	case 10:   break;  // затычка бесконечного цикла ошибки

	default:  // один раз ругаемся об ошибке
			run_level = 10;
			rtapi_print_msg(RTAPI_MSG_ERR, "Error in toolchanger");		  
	break;
	}
}

 

Компилируем, подключаем в HAL

 

# загружаем компонент и добавляем в поток
loadrt toolchanger
addf toolchanger servo-thread

# подключаем компонент к системе
net tool-change iocontrol.0.tool-change toolchanger.toolchange
net tool-number iocontrol.0.tool-prep-number toolchanger.toolnumber
net tool-current iocontrol.0.tool-number toolchanger.currenttool
net tool-changed toolchanger.toolchanged iocontrol.0.tool-changed

# позиция и датчики (toolhead - мой компонент для дешифрации позиции головы)
net head-pos toolhead.0.out toolchanger.position
net head-unclamped toolchanger.headunclamped hm2_5i25.0.7i77.0.0.input-20
net head-readyclamp toolchanger.readyforclamp hm2_5i25.0.7i77.0.0.input-21-not

# сигнал включения мотора и клапанов
net setuprun toolchanger.setuprun hm2_5i25.0.7i77.0.0.output-06
net clamprun toolchanger.clamprun hm2_5i25.0.7i77.0.0.output-07
net clamp toolchanger.clamp hm2_5i25.0.7i77.0.0.output-09
net unclamp toolchanger.unclamp hm2_5i25.0.7i77.0.0.output-08

# Отключаем режим "prepare" (подготовка инструмента), голова его не поддерживает.
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

 

Надеюсь, у меня получилось объяснить общий принцип построения таких компонентов. Исправления-вопросы-комментарии приветствуются.

 

Ну и на сладкое - вот так оно теперь работает:

 

https://youtu.be/zTQnwpeY0Vg

Поделиться сообщением


Ссылка на сообщение

Linux рулит(буквально), круто!!!

Поделиться сообщением


Ссылка на сообщение

Жаль плюсик некуда ставить :)

Обычно пишут на classicladder, но специальный компонент - еще круче.

Поделиться сообщением


Ссылка на сообщение

Рулит, но как-то кривовато :)

 

Пока не придумал, как корректно завершить работу компонента при механическом сбое (заклинило, например, или клапан сдох) и сообщить об этом системе (iocontrol.0.emc-enable-in?). В текущем состоянии просто повисает (в бесконечном цикле) и нужно отключить машину для сброса. Понятно, что ситуация аварийная и дальнейшая работа программы невозможна.

Поделиться сообщением


Ссылка на сообщение

как корректно завершить работу компонента при механическом сбое

Звуковой аварийный сигнал ?

Поделиться сообщением


Ссылка на сообщение

Обычно пишут на classicladder

Не люблю я его, не наш это путь :)

Поделиться сообщением


Ссылка на сообщение

Завершать компонент вроде не обязательно.

Сделать пин ошибки, при появлении сигнала на котором выдавать соответствующее сообщение и включать Estop.

Поделиться сообщением


Ссылка на сообщение

Звуковой аварийный сигнал ?

Не мне сообщить, для себя я сигнал всегда вывести смогу и светофор включить, а для системы. При аварии головы надо остановить станок, причем корректно.

Поделиться сообщением


Ссылка на сообщение

Завершать компонент вроде не обязательно.

Игра слов. Конечно, компонент крутится всегда, надо как-то корректно обработать аварийную ситуацию.

Поделиться сообщением


Ссылка на сообщение
Дата: (изменено)

Может от датчиков смены позиции головы плясать, ежели они есть, или типа не прошла, не выполнена следующая команда, т.е. цикл не завершен, и тогда аварийная ситуация. Т.е. не в исходном состоянии, и последующее отключение.

Изменено пользователем GromV

Поделиться сообщением


Ссылка на сообщение

GromV, это тоже не проблема, напихать проверок в компонент я могу, вопрос про другое.

 

Задурила голова, не может разжаться, что делать? ЧПУ уже выставил сигнал "меняй!" и будет ждать смены инструмента бесконечно долго. Завершить этот процесс можно только правильной последовательностью сигналов, а выдавать эту последовательность при аварии нельзя.

Поделиться сообщением


Ссылка на сообщение
Дата: (изменено)

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

Или выдать ЧПУ эту последовательность правильного выполнения с пометкой ошибки и последующей остановки. Что бы долго не ждал.

Изменено пользователем GromV

Поделиться сообщением


Ссылка на сообщение

Завершить этот процесс можно только правильной последовательностью сигналов

E-stop разве не прервет смену инструмента? В любом случае это авария, программу продолжать нельзя.

Поделиться сообщением


Ссылка на сообщение

Как я понял Алексей ищет корректное решение выхода из этой ситуации

Поделиться сообщением


Ссылка на сообщение

Расстреляйте Merkwurdigliebe из плюсомета :) Спасибо, это как раз то, о чем я мучительно пытался рассказать..

To signal toolchanger faults to EMC, wire the toolchanger-fault pin, and optionally the toolchanger-reason and toolchanger-ack pins.

Как это я пропустил такой замечательный iocontrol2?

Поделиться сообщением


Ссылка на сообщение

а вот есть какой-то iocontrolv2, там побогаче пинов разных

Вроде бы это только предложение, которое не реализовано... к сожалению.

Поделиться сообщением


Ссылка на сообщение

да вроде вот оно:

 

dmitry@hp:~$ grep EMCIO ~/linuxcnc/configs/x3.ini
[EMCIO]
EMCIO                   = iov2
dmitry@hp:~$ halcmd show pin | grep iocontrol
    5  bit   OUT         FALSE  iocontrol.0.coolant-flood
    5  bit   OUT         FALSE  iocontrol.0.coolant-mist
    5  bit   OUT          TRUE  iocontrol.0.emc-abort
    5  bit   IN          FALSE  iocontrol.0.emc-abort-ack
    5  bit   IN          FALSE  iocontrol.0.emc-enable-in <== estop
    5  s32   OUT             6  iocontrol.0.emc-reason
    5  bit   OUT         FALSE  iocontrol.0.lube
    5  bit   IN          FALSE  iocontrol.0.lube_level
    5  bit   OUT         FALSE  iocontrol.0.start-change
    5  bit   IN          FALSE  iocontrol.0.start-change-ack
    5  s32   OUT             4  iocontrol.0.state
    5  bit   OUT         FALSE  iocontrol.0.tool-change
    5  bit   IN          FALSE  iocontrol.0.tool-changed
    5  s32   OUT             0  iocontrol.0.tool-number
    5  s32   OUT             0  iocontrol.0.tool-prep-number
    5  s32   OUT             0  iocontrol.0.tool-prep-pocket
    5  bit   OUT         FALSE  iocontrol.0.tool-prepare
    5  bit   IN          FALSE  iocontrol.0.tool-prepared
    5  bit   IN          FALSE  iocontrol.0.toolchanger-clear-fault
    5  bit   IN          FALSE  iocontrol.0.toolchanger-fault
    5  bit   OUT         FALSE  iocontrol.0.toolchanger-fault-ack
    5  bit   OUT         FALSE  iocontrol.0.toolchanger-faulted
    5  s32   IN              0  iocontrol.0.toolchanger-reason
    5  bit   OUT         FALSE  iocontrol.0.user-enable-out ==> estop
    5  bit   OUT         FALSE  iocontrol.0.user-request-enable

 

а вот может кто посоветует куда прицепить fault от мотора шпинделя?

Поделиться сообщением


Ссылка на сообщение

Я на ESTOP такие ошибки планирую сажать, через реле.

Поделиться сообщением


Ссылка на сообщение
Дата: (изменено)

Задурила голова, не может разжаться, что делать?

Алексей от программных дел я далёк но думаю что без датчика обратной связи не обойтись

 

 

 

Да и ещё конкретно эта страница не влазит в общий формат приходится двигать по горизонтали :)

Изменено пользователем G66

Поделиться сообщением


Ссылка на сообщение

без датчика обратной связи не обойтись

Не, вопрос совсем в другом, перечитайте обсуждение.

Поделиться сообщением


Ссылка на сообщение

а вот есть какой-то iocontrolv2

Подключил, всё работает, так же, как и со стандартным iocontrol. Фичи компонента пока не проверял, потом опишу, если всё получится.

 

в секцию [EMCIO] инишника надо внести след. изменения:

 

PROTOCOL_VERSION = 2
EMCIO = iov2
или
EMCIO = iov2 -support-start-change

 

Если загружается с параметром " -support-start-change", но функция компонентом еще не поддерживается, надо поставить затычку на сигналы

 

net start-change iocontrol.0.start-change iocontrol.0.start-change-ack

Поделиться сообщением


Ссылка на сообщение

Мой корявый перевод описания компонента LinuxCNC iocontrol V2 (iov2)

 

Разница в процессах между сигналами abort от системы и fault от тулченжера

 

Сигнал abort инициируется системой LinuxCNC и всегда вызывает немедленное завершение исполняемой программы. Интерпретатор команд переходит в состояние останова. Команда abort передается в iocontrol вместе с соответствующим кодом ошибки, что приводит к немедленному завершению его внутренних процедур подготовки или смены инструмента. Iocontrol передает сигнал abort (в виде emc-abort и кода ошибки в emc-abort-reason) в тулченжер, который также должен остановить процесс смены или подготовки инструмента. Это всегда аварийная ситуация и все операции должны быть немедленно прекращены.

 

Сигналы toolchanger-fault и toolchanger-reason (причина ошибки) инициируются тулченжером в любой момент времени и обрабатываются компонентом iocontrol. Сигнал toolchanger-fault не прерывает исполнение программы, но вызывает прерывание программы обработки при вызове следующей команды M6 (если быть точным, то исполнение прерывается, когда поднимается сигнал start-change, если он используется). Это не аварийная ситуация и работы программы может быть продолжена до смены инструмента.

 

Получение команды abort во время смены инструмента

 

Если LinuxCNC выдал сигнал abort во время выполнения команды M6, то происходит следующее: LinuxCNC отменяет команду M6 и переходит в ручной (MDI) режим. Текущим остается инструмент, загруженный предыдущей командой M6, смена инструмента на новый не подтверждается. Тулченжер должен быть установлен вручную в соответствующую текущему состоянию позицию. Это подразумевает, что программа может быть запущена снова в случае исполнения команды M6 в режиме "run-from-line" (запуск с конкретной строчки), что приведет к правильной смене инструмента и продолжению работы.

 

Пример выдачи ошибки тулченжером

 

; подготовить инструмент 42

T42

; тулченжер получает команду prepare и номер инструмента, запускает процедуру подготовки

; программа обработки продолжает работать

; тулченжер ломается и посылает команду fault компоненту iocontrol

; программа продолжает работать

; программа вызывает команду смены подготовленного инструмента 42

M6

; исполнение программы прерывается из за ошибки тулченжера

 

Таким образом, программа всегда может отработать цикл обработки уже установленным инструментом.

 

Сигналы от iocontrolv2 к тулченжеру

 

emc-abort: (bit, out) : инициированный LinuxCNC => iocontrol сигнал abort для тулченжера.

 

emc-abort-ack: (bit, in) : Подтверждение от тулченжера о получении сигнала emc-abort. Если тулченжер не поддерживает обработку этого сигнала, то надо поставить заглушку.

 

net emc-abort-ack iocontrol.0.emc-abort iocontrol.0.emc-abort-ack

 

После получения сигнала emc-abort, работа компонента iocontrol блокируется до получения сигналf emc-abort-ack.

 

emc-reason: (s32,out) : причина выставления команды emc-abort для тулченжера. Применение - информационно сообщение в пользовательском интерфейсе, сигнал активен всё время активности сигнала emc-abort.

 

Возможные коды ошибок, получаемых iocontrol вместе c командой abort от LinuxCNC:

 

EMC_ABORT_TASK_EXEC_ERROR = 1

EMC_ABORT_AUX_ESTOP = 2

EMC_ABORT_MOTION_OR_IO_RCS_ERROR = 3

EMC_ABORT_TASK_STATE_OFF = 4

EMC_ABORT_TASK_STATE_ESTOP_RESET = 5

EMC_ABORT_TASK_STATE_ESTOP = 6

EMC_ABORT_TASK_STATE_NOT_ON = 7

EMC_ABORT_TASK_ABORT = 8

EMC_ABORT_INTERPRETER_ERROR = 9

EMC_ABORT_INTERPRETER_ERROR_MDI = 10

EMC_ABORT_USER = 100 // пользовательские коды должны начинаться со 100

 

iocontrol добавляет свой код, сигнализирующий об отмене команды M6 по причине ошибки тулченжера (когда активен toolchanger-faulted).

 

EMC_ABORT_BY_TOOLCHANGER_FAULT = 101

 

start-change: (bit,out) : команда, посылаемая до выполнения любой предшествующей команде M6 внутренней операции, в соответствии с настройками в разделе [EMCIO] инишника (остановка шпинделя, переезд в 0 по Z или переезд в позицию смены инструмента).

 

start-change-ack: (bit, in) : подтверждение от тулченжера о получении команды start-change.

 

Сигналы start-change и start-change-ack реализованы от просьбе группы энтузиастов для каких-то своих целей и, в реальной жизни, скорее всего, вам не понадобятся. Сигналы активны только при загрузке компонента с опцией -support-start-change, поэтому просто не грузите iocontrol v2 с этой опцией.

 

Сигналы от тулченжера в iocontrolv2

 

toolchanger-fault: (bit, in) : инициируемый тулченжером сигнал ошибки. Сигнал также поднимает сигнал iocontrol toolchanger-faulted.

 

toolchanger-fault-ack: (bit,out) : подтверждение от iocontrol о получении сигнала toolchanger-fault. Поднимается, когда сигнал toolchanger-fault активен и сбрасывается, когда сигнал toolchanger-fault не активен. Toolchanger может как угодно обрабатывать этот сигнал, получение сигнала гарантирует, что iocontrol получил сообщение о проблемах в тулченжере и это событие обработано.

 

Использование сигнала toolchanger-fault-ack не обязательно. Он просто становится true когда поднимается toolchanger-fault и состояние ошибки в сигнале toolchanger-reason прочитано компонентом iocontrol.

 

toolchanger-reason: (s32, in) : сигнал причины ошибки, передаваемый тулченжером в iocontrol вместе с сигналом toolchanger-fault. Использование - в зависимости от типа сигнала либо продолжение обработки, либо прерывание программы, а также, при отрицательном значении, для выдачи информации в пользовательский интерфейс. Читается компонентом iocontrol только когда активен сигнал toolchanger-fault. Значения, отличные от нуля, вызовут сообщение оператору или сообщение об ошибке.

 

Сигнал toolchanger-reason может принимать следующие значения:

  • toolchanger-reason > 0 : Сигнал смены инструмента не завершен, исполнение программы может быть продолжено, внутренним параметрам #5600 и #5601 будут присвоены, соответственно, 1.0 (сигнал об ошибке тулченжера) и код ошибки из toolchanger-reason.
  • toolchanger-reason = 0 : исполнение программы должно быть прервано.
  • toolchanger-reason

Больше никаких интерпретаций кодов ошибок нет.

 

Остальные сигналы:

 

toolchanger-faulted: (bit, out): сигнал, подтверждающий получение и обработку сигнала toolchanger-fault, а также проверку кода ошибки в сигнале toolchanger-reason на нахождение в допустимом диапазоне значений. Если этот сигнал в TRUE, то следующий вызов M6 приведет к прерыванию исполняемой программы.

 

toolchanger-clear-fault: (bit, in): сброс состояния ошибки со стороны тулченжера. Автоматический или ручной сигнал, который сообщает iocontrol об устранении проблемы в тулченжере. Сбрасывает сигнал toolchanger-faulted если сигнал toolchanger-fault уже сброшен тулченжером. Использование - например нажатие кнопки сброса ошибки на тулченжере или в пользовательском интерфейсе после устранения проблем.

 

state (s32, out): сигнал для индикации внутреннего состояния компонента.

 

Общий принцип работы связки iocontrol - тулченжер

 

Для передачи сигнала ошибки тулченжера необходимо подключить сигналы toolchanger-fault, toolchanger-reason (опционально) и toolchanger-ack.

Получение компонентом iocontrol сигнала toolchanger-fault вызывает поднятие сигнала toolchanger-faulted и блокировку работы iocontrol до тех пор, пока состояние ошибки не будет сброшено сигналом toolchanger-clear-fault, при условии, что сигнал toolchanger-fault уже сброшен. С этого момента возможно дальнейшее выполнение программы обработки.

 

Чуть позже напишу скелет компонента тулченжера для работы с этой версией iocontrol.

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу


×
×
  • Создать...

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.