Перейти к содержанию
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

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


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

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

Обычно пишут на 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-файлов, или продолжить без изменения настроек.