PLC: Язык электроавтоматики
1. Введение
2. Структура PLC программы
3. Объекты PLC
1. Таймеры
2. Входы
3. Выходы
4. Системы станка
5. Message
4. Объявление объектов PCL
1. Объявление настройки PLC
2. Чтение настройки PLC
3. Установка настройки PLC
4. Объявление постоянной УП переменной
5. Чтение постоянной УП переменной
6. Установка постоянной УП переменной
7. Объявление M команды УП, выполняемой в PLC
8. Объявление Reference Point
5. Взаимодействие с ЧПУ
1. Группа обменных объектов Machine
2. Группа обменных объектов Machine.UP
3. Группа обменных объектов Machine.Mode
4. Группа обменных объектов Channel
5. Группа обменных объектов Channel.CurrentTool
6. Группа обменных объектов Channel.Feed
7. Группа обменных объектов Channel.Mcode
8. Группа обменных объектов Channel.Spindle
9. Группа обменных объектов Channel.Probe
10. Группа обменных объектов Axis
11. Группа обменных объектов Axis.Settings
12. Группа обменных объектов Axis.Pos
13. Группа обменных объектов Axis.Grab
14. Группа обменных объектов Axis.Home
6. Программные пульты
Объекты пультов:
1. PlcButton
2. PlcSwitch
3. PlcWell
4. PlcSlider
5. PlcText
Объявление и заполнение пульта:
7. Объявление пульта
8. Заполнение пульта объектами
9. Справка по пультам
1. Введение
Язык электроавтоматики PLC (далее просто PLC) системы ЧПУ ЮпитерCNC® (далее ЮпитерCNC)
предназначен для программной привязки электрооборудования станка к системе.
Язык PLC представляет собой код на языке C#.
Предполагается, что пользователь уже обладает знаниями по программированию на
языке C# и понимает основы программирования PLC (машины состояний).
Программа PLC исполняется параллельно с программным модулем ЧПУ системы.
ВНИМАНИЕ!
После отладки программы PLC, установки параметров и
наладки оборудования всю ответственность за любые изменения программы
и параметров несет тот, кто выполнил эти изменения!
2. Структура PLC программы
Программа PLC состоит из шести частей, которые объединены в одном файле.
Пример пустого модуля:
namespace PLC; public partial struct TDM : COM.TDM { } public class PlcNameModule : PlcModule { // Здесь инициализация переменных для модуля //(не видны в других модулях PLC) // Регистрация модуля в PLC static PlcModule PlcNameModule = PlcEngine.AddOwnerPlcModule(new PlcNameModule()); public void Init() { } public void BuildCommand(ref TDM DT) { } public void Execution(ref TDM DT) { } public void OutPut(ref TDM DT) { } }
struct TDM:
public partial Struct TDM : COM.TDM { }
Это описание структуры параметров и статусов - передаваемое в различные модули PLC
Эта структура существует в единичном экземпляре.
И передается во все модули.
И с помощью нее модули могут обмениваться командами и статусами
В этой структуре можно объявить команды для других модулей.
Пример:
// Объявление команды: Команда на выход в ноль по оси Z public bool CM_CoordZ; // Обращение к команде if (DT.CM_CoordZ == true) {...}
Команды обнуляется при каждом новом цикле PLC
В этой структуре можно объявить статусы.
Пример:
// Объявление статуса: Начат выход в ноль по оси Z public static bool St_IsWorkG28Z { get; set; } = false; // Обращение к статусу if (TDM.St_IsWorkG28Z == true) {...}
Статусы сохраняют свое значение при переходе между циклами PLC.
Команды должны быть строго примитивных типов.
КАТЕГОРИЧЕСКИ запрещается делать типом команды класс. (на крайний случай структура)
Для статусов допускаются классы - строго для "static" переменных!
Инициализация переменных:
// Здесь инициализация переменных для модуля //(не видны в других модулях PLC)
Здесь можно создавать любые переменные.
Эти переменные будут видны только в этом модуле.
Так-же допускается выделение памяти - создание объектов по "New"
Пример:
static readonly PlcButton BtReset = new(Translate("СБРОС", "RESET"), EnumPlcImage.Reset);
Init():
public void Init() { }
Эта функция вызываться один раз при запуске системы ЧПУ.
Здесь можно проводить инициализационные расчеты,
работа с выделением памяти, инициализация строк и пр.
BuildCommand():
public void BuildCommand(ref TDM DT) { }
Эта функция вызывается для каждого цикла PLC - самой первой.
Предполагается что в в этой функции будут производится расчеты того - что нужно делать.
Т.к. одни и те-же команды могут приходить из разных пультов (как программных, так и физических),
а также из других систем - то:
Соответственно в этой процедуре нужно при необходимости "взвести" нужную команду.
При этом нужно учитывать - что команда могла быть "взведена" в соседнем модуле.
Пример "взвода" команды:
DT.CM_ModeM1 |= BtModeM1.Front;
На вход в функцию передан экземпляр struct TDM - DT
В этом экземпляре и "взводятся" команды и меняются и считываются различные статусы
ВНИМАНИЕ! В этой функции запрещено:
- создавать объекты, строки, Task и пр.,
- ни каких долгих расчетов и циклов
- нужен максимально быстрый расчет
Execution():
public void Execution(ref TDM DT) { }
Эта функция вызывается для каждого цикла PLC.
Вызов идет за вызовом функции BuildCommand().
Предполагается что в в этой функции будут производится основные расчеты.
В конечном итоге все сведется к расчету тех или иных статусов.
В этой функции нужно проверять команды на разрешение их выполнения по режимам ЧПУ и прочим параметрам.
Пример:
TDM.IsJogMode = TPLC.Machine.Mode.Mode == CncMode.MDI && AllDriversOn();
На вход в функцию передан экземпляр struct TDM - DT
В этом экземпляре и считываются ранее рассчитанные команды и меняются различные статусы
Имеет значение порядок расчета.
Сначала эта функция вызывается для штатных модулей ЧПУ.
А уже потом идет вызов "пользовательских" модулей - чтобы могли переопределить расчеты штатных модулей
ВНИМАНИЕ! В этой функции запрещено:
- создавать объекты, строки, Task и пр.,
- никаких долгих расчетов и циклов
- нужен максимально быстрый расчет
OutPut():
public void OutPut(ref TDM DT) { }
Эта функция вызывается для каждого цикла PLC.
Вызов идет за вызовом функции Execution().
Предполагается что в в этой функции будут производится выдача расчетов на исполнительные механизмы.
Т.е. записи результатов рассчитанных статусов.
Пример:
TDM.IsJogMode = TPLC.Machine.Mode.Mode == CncMode.MDI && AllDriversOn();
На вход в функцию передан экземпляр struct TDM – DT
Сначала эта функция вызывается для штатных модулей ЧПУ.
А уже потом идет вызов "пользовательских" модулей - чтобы могли переопределить расчеты штатных модулей
ВНИМАНИЕ! В этой функции запрещено:
- создавать объекты, строки, Task и пр.,
- ни каких долгих расчетов и циклов
- нужен максимально быстрый расчет
3. Объекты PLC
3.1 Таймеры
Объект Таймера предназначен инициации выполнения каких либо действий через определенное время или через определенное количество циклов PLC
Объявлять таймер нужно в секции Инициализация переменных
Примеры объявления таймера:
// Объявление таймера на 4.5 секунд public static PlcTimer TimerPowerOn { get; set; } = new(4.5d); // Объявление таймера на 20 циклов PLC public static PlcTimer TimerDrivesOn { get; set; } = new(20);
Параметры инициализации
• Первый параметр double - то таймер будет срабатывать через указанное количество секунд.
• Первый параметр int - то таймер будет срабатывать через указанное количество циклов PLC.
Свойства и функции таймера:
• Start() - Запуск остановленного таймера
• Start(true) - Сброс и запуск таймера
• Front() - возвращает true один раз при достижении значения таймера
• Rear() - Инвертируемо от Front()
• Reset() - Сброс отчета таймера с одновременной его остановкой
• Stop() - Останавливает отсчет таймера. Может быть продолжено с помощью Start()
Пример:
// Запуск таймера TimerPowerOn.Start(); ... // Проверка срабатывания таймера if (TimerPowerOn.Front()) { // Перезапуск таймера. TimerPowerOn.Start(true); }; ... // Сброс таймера TimerPowerOn.Reset();
3.2 Входы
Объекты входов предназначены для считывания значений из портов ввода.
Сущестует три типа входов:
• InputBit - дискретный вход
• InputInt - цифровой вход - целое число
• InputDouble - цифровой вход - плавающее число
Объявлять входы нужно в секции Инициализация переменных
Примеры объявления входов:
// Вход кнопки аварийной остановки станка readonly InputBit EmergencyStop = new( "In_Machine_EmergencyStop", Translate("Станок", "Machine"), Translate("Кнопка Аварийной остановки", "Emergency stop button")); // Объявление входа Wheel readonly InputInt Wheel = new( "Out_WHB_Wheel", Translate("Пульт WHB04B", "Remote WHB04B"), Translate("Маховик", "Wheel"));
Параметры инициализации:
• string Id входа, должен быть уникальным, по этой строке можно обращаться к входу из УП
• string Group - по этой строке входы группируются для удобства настройки при выборе
• string Name - имя входа - которое будет видно в интерфейсе
• bool Required - Обязательность привязки входа к физическому входу
Свойства и функции входов:
все типы входов:
• bool/int/double Value - значение входа. Во время работы секции PLC не изменяется.
• bool/int/double OldValue - значение входа во время предыдущей секции.
• bool IsSettings - признак того что вход привязан к физическому входу.
Если не установлено то как правило означает что этой системы в станке нет.
дискретные входы InputBit:
• bool Front - Взводится по фронту (от предыдущей секции). Во время работы секции PLC не изменяется.
• bool Rear - Взводится по спаду (от предыдущей секции). Во время работы секции PLC не изменяется.
• int DelayTime - Можно задать время в миллисекундах нечувствительности после срабатывания входа. Для устранения дребезга.
цифровые входы InputInt/InputDouble:
• int/double Difference - Разница по сравнению с предыдущей секцией. Во время работы секции PLC не изменяется.
Примеры:
// Вход кнопки аварийной остановки станка DT.CM_EmergencyStop |= EmergencyStop.Value; // Срабатывание по фронту сигнала DT.CM_StanokOn |= StanokOn.Front; // Проверка что маховик-энкодер подключен if (Wheel.IsSettings) { // Считывание перемещения маховика DT.WellFeed += Wheel.Value; }
3.3 Выходы
Объекты выходов предназначены для записи значений в порты вывода.
Существует три типа выходов:
• OutputBit - дискретный выход
• OutputInt - цифровой выход - целое число
• OutputDouble - цифровой выход - плавающее число
Объявлять выходы нужно в секции Инициализация переменных
Примеры объявления выходов:
// Выход на реле подачи силового питания на станок readonly OutputBit StanokOn = new( "Out_Machine_StanokOn", Translate("Станок", "Machine"), Translate("Реле Включения станка", "Machine Enable Relay")); // Выход регулировки интенсивности охлаждения readonly OutputInt СoolantLevel = new( "Out_Machine_СoolantLevel", Translate("Станок", "Machine"), Translate("Уровень охлаждения", "Сooling Level"));
Параметры инициализации:
• string Id выхода, должен быть уникальным, по этой строке можно обращаться к выходу из УП
• string Group - по этой строке выходы группируются для удобства настройки при выборе
• string Name - имя выхода - которое будет видно в интерфейсе
• bool Required - Обязательность привязки выхода к физическому входу
Свойства и функции выходов:
• bool/int/double Value - значение выхода. Физически выход изменится после окончания работы секции
• bool/int/double OldValue - значение выхода во время предыдущей секции.
• bool/int/double Difference - Разница по сравнению с предыдущей секцией. Во время работы секции PLC не изменяется.
• bool IsSettings - признак того что выход привязан к физическому выходу.
Если не установлено то как правило означает что этой системы в станке нет.
Примеры:
// Подача питания на станок StanokOn.Value = TPLC.Machine.MachineOn && !TDM.IsDemoMode; // Проверка что система регулировки охлаждения установлена в станке if (СoolantLevel.IsSettings) { // Регулировка интенсивности охлаждения СoolantLevel.Value = TDM.Machine_СoolantLevel; }
3.4. Системы станка
Объект LaunchMap предназначен для индикации состояния одной из систем станка
Список систем станка отображается на закладке "Станок"->"Готовность систем":
Позволяет быстро оценить состояние всех систем станка.
Как правило - для дальнейшего обращения к системе из других системе объявлять ее нужно в структуре TDM.
Примеры объявления системы:
public partial struct TDM { ..... // Вывод информации о контроле давления пневмо-системы public static LaunchMap LcPneumoSystem { get; set; } = LaunchMap( IndexLaunchMap1++, 1, Translate("Нет давления в пневмо-системе", "No pressure in the pneumatic system"), Translate("Ожидание набора давления в пневмосистеме", "Waiting for pressure to build up in the pneumatic system"), Translate("Давление в пневмосистеме в работе", "The pressure in the pneumatic system in operation")); ..... }
Параметры инициализации:
• int Id системы, должен быть уникальным, рекомендуем id присваивать так: "IndexLaunchMap1++"
• int Colum - номер колонки - в которой отображать систему, 1 или 2
• string ErrorMessage - Текст, который выводится при ошибке в системе (может быть переопределен)
• string WarningMessage - Текст, который выводится при предупреждении в системе (может быть переопределен)
• string InfoMessage - Текст, который выводится при нормальной работе системы (может быть переопределен)
Свойства и функции системы:
• MessageStatus Status - Статус системы. Перечисление, возможные значения:
MessageStatus.Error, MessageStatus.Warning, MessageStatus.Info,
• string ErrorMessage - текст состояния системы - который переопределяет базовый текст сообщения.
• string WarningMessage - текст состояния системы - который переопределяет базовый текст сообщения.
• string InfoMessage - текст состояния системы - который переопределяет базовый текст сообщения.
• string BaseErrorMessage - базовый текст состояния системы - только для чтения.
• string BaseWarningMessage - базовый текст состояния системы - только для чтения.
• string BaseInfoMessage - базовый текст состояния системы - только для чтения.
Пример вывода состояния системы:
// Поблема с низковольтным питанием станка TDM.LcLowVoltage.Status = MessageStatus.Error; // Шпиндель не достиг заданных оборотов TDM.LcCurSpindle..Status = MessageStatus.Error; TDM.LcCurSpindle.ErrorMessage = TDM.LcCurSpindle.BaseErrorMessage + Translate(": Шпиндель не достиг заданных оборотов", ": The spindle could not accelerate");
3.5. Message
Функции Message() позволяют вывести сообщения в верхнюю часть программы:
И на страницу журнала ЧПУ системы:
пример:
// Вывод сообщения при срабатывании события сброса TPLC.PLC.Message( DT.NumMessage++, DT.CM_Reset, MessageStatus.Info, Translate("Сброс ЧПУ системы", "Resetting the CInNC system"), false);
Параметры:
• int Id Id сообщения (для подавления многократного вывода сообщения в каждом цикле PLC)
Рекомендации:
- Функция должна вызываться строго при каждом проходе. Вызов функции внутри if и тому подобное - не допустим.
- id присваивать строго так: "DT.NumMessage++"
• int Id Id сообщения (для подавления многократного вывода сообщения в каждом цикле PLC)
• bool View - Признак вывода сообщения. Сообщение выведется по фронту этой переменной
• MessageStatus Status - статус сообщения. Перечисление, возможные значения:
MessageStatus.Error, MessageStatus.Warning, MessageStatus.Info, MessageStatus.Message
• string Text - Текст сообщения
• bool IsDebug - Признак вывода сообщения в лог отладки (УП или PLC)
4. Объявление объектов PCL
4.1. Объявление настройки PLC
Фуняция DeclarationPlcSetting Предназначена для объявления настройки:
Пользователь на странице настроек в разделе "Настройки PLC" может поменять такую настройку без изменения кода PLC:
DeclarationPlcSetting должен быть объявлен в разделе Init().
Пример вызова DeclarationPlcSetting:
DeclarationPlcSetting( "Probe_Shutdown", 60d, "Время, на которое включается щуп (сек)" );
Параметры функции:
• string Id - Идентификатор настройки
• double DefaultValue - Значение по умолчанию для настройки
• string Description - Текстовое описание настройки
4.2. Чтение настройки PLC
Фуняция GetPlcSetting Предназначена для чтение значение настройки в коде PLC:
Пример вызова GetPlcSetting:
double Value = GetPlcSetting("Probe_Shutdown");
Параметры функции:
• string Id - Идентификатор настройки
4.3. Установка настройки PLC
Фуняция SetPlcSetting Предназначена для чтение значение настройки в коде PLC:
Пример вызова SetPlcSetting:
SetPlcSetting("Probe_Shutdown", 60d);
Параметры функции:
• string Id - Идентификатор настройки
• double Value - Значение для сохранения настройки
4.4. Объявление постоянной УП переменной
Фуняция DeclarationNcVariable Предназначена для объявления постоянной УП переменной:
Эта переменная может быть считана и установлена как в PLC коде так и в управляющей программе.
DeclarationNcVariable должен быть объявлен в разделе Init().
Пример вызова DeclarationNcVariable:
DeclarationNcVariable( "#PROBE_FEED", "Скорость подачи при измерении заготовки", "Feed rate when measuring a workpiece", 500 );
Параметры функции:
• string Name - Идентификатор настройки
• string CommentRu - Описание настройки на Русском
• string CommentEn - Описание настройки на Английском
4.5. Чтение постоянной УП переменной
Фуняция GetNcVariable Предназначена для чтения переменной в коде PLC:
Пример вызова GetNcVariable:
double Value = GetNcVariable("#PROBE_FEED");
Параметры функции:
• string Name - Идентификатор настройки
4.6. Установка постоянной УП переменной
Фуняция SetNcVariable Предназначена для чтение значение настройки в коде PLC:
Пример вызова SetNcVariable:
SetNcVariable("#PROBE_FEED", 500d);
Параметры функции:
• string Name - Идентификатор настройки
• double Value - Значение для сохранения настройки
4.7. Объявление M команды УП, выполняемой в PLC
Фуняция DeclarationMCommand Предназначена для объявление M команды УП, выполняемой в PLC:
DeclarationMCommand должен быть объявлен в разделе Init().
Пример вызова DeclarationMCommand:
DeclarationMCommand("M7", "M9", "MQL-Масляный туман");
Параметры функции:
• string MCommand - Символ и номер команды
• string Group - Символ и номер команды которые входят в модальную группу
• string Description - Описание команды
4.8. Объявление Reference Point
Объект ReferencePoint предназначен для задания списка референтных координат
После объявления в PLC название референтных координат будет отображаться в ЧПУ:
Как правило - для дальнейшего обращения к координатам из других систем объявлять ее нужно в структуре TDM.
Пример:
public partial struct TDM { ..... // Референсные координаты для смены инструмента public static ReferencePoint G53_4 { get; set; } = new( RefPoint.G53_3, "MachinePlusLimitChannal", "Положительное ограничение осей" ); ..... }
Параметры инициализации:
• COM.RefPoint RefPoint - Номер G53 для УП. Перечисление, возможные значения:
COM.RefPoint.G28/G53_1/G53_2/G53_3/G30_1..G30_9
• string Id - Id (должен быть уникальным)
• string Name - Текст, который выводится в системе
5. Взаимодействие с ЧПУ
Взаимодействие программы PCL c системой ЧПУ происходит через различные обменные объекты.
При измении обменного объекта в ЧПУ - передаче его в PLC произойдет только в начале цикла PLC.
При изменении объекта в PLC передача его в ЧПУ произойдет только после завершения цикла PLC.
Условные сокращения:
• R - объект только для чтения
• W - объект только для записи
• RW - объект для чтения и записи
Пример обращения к обменному объекту:
TPLC.Machine.MachineOn = false;
5.1. Группа обменных объектов Machine
Наименование группы: TPLC.Machine
В этой группе расположены обменные ячейки контроля станка
TPLC.Machine.MachineOn RW, тип bool
- Признак включения силового питания
TPLC.Machine.DriversOn RW, тип bool
- Признак включения сервоприводов
TPLC.Machine.ChannelCount R, тип byte
- Количество текущих каналов
TPLC.Machine.NumChannel RW, тип NumChannel
- Текущий канал.
- Перечисление: NumChannel.Channel_1/Channel_2
TPLC.Machine.CncCommand R, тип CncCommand
- Команда от CNC системы.
- Перечисление: CncCommand.Reset
TPLC.Machine.ButtonInterception R, тип bool
- Признак перехвата кнопки из ЧПУ
TPLC.Machine.ButtonPress RW, тип Buttons
- Перехваченная кнопка,
- Перечисление: Buttons.UpRun/UpStop
TPLC.Machine.Reset RW, тип bool
- Сброс ЧПУ
TPLC.Machine.AllDisableVoltage R, тип bool
- Признак что на всех серво-драйверах выключено питание выходных каскадов
5.2. Группа обменных объектов Machine.UP
Наименование группы: TPLC.Machine.UP
В этой группе расположены обменные ячейки контроля УП
TPLC.Machine.UP.UpRun R, тип bool
- Признак выполнения УП на ЧПУ
TPLC.Machine.UP.UpStop R, тип bool
- Признак приостановки УП.
- Пока данная ячейка выставлена, УП будет в состоянии приостановки.
TPLC.Machine.UP.UpRunRequest W, тип bool
- Запрос на запуск УП.
- Выставляется на один такт, сбрасывается автоматически при запуске УП.
TPLC.Machine.UP.UpStopRequest W, тип bool
- Запрос на приостановку УП.
- Выставляется на один такт, сбрасывается автоматически при запуске УП.
TPLC.Machine.UP.UpAbortRequest W, тип bool
- Запрос на прерывание УП.
- Выставляется на один такт, сбрасывается автоматически при запуске УП.
TPLC.Machine.UP.UpReloadRequest W, тип bool
- Повторный выбор УП по M-команде.
TPLC.Machine.UP.UpChosen R, тип bool
- УП выбрана и может быть исполнена в автоматическом режиме.
TPLC.Machine.UP.UpCondStop R, тип bool
- Включен условный останов по M1.
TPLC.Machine.UP.PosUpLine R, тип Dictionary‹NumChannel, int›
- Текущая строка УП в каждом из каналов
- Перечисление: NumChannel.Channel_1/Channel_2
- Значение int - номер выполняемой строки УП
5.3. Группа обменных объектов Machine.Mode
Наименование группы: TPLC.Machine.Mode
В этой группе расположены обменные ячейки контроля за режимами ЧПУ
TPLC.Machine.Mode.Mode R, тип CncMode
- Текущий режим ЧПУ
- Перечисление CncMode.MDI/Zero/Auto/Training
TPLC.Machine.Mode.ModeRequest W, тип CncMode
- Запрос на смену режима ЧПУ.
- Перечисление CncMode.MDI/Zero/Auto/Training
TPLC.Machine.Mode.SingleFrameMode R, тип bool
- Покадровый режим УП.
TPLC.Machine.Mode.SingleFrameModeRequest W, тип bool
- Запрос на Покадровый режим УП.
TPLC.Machine.Mode.M1Mode R, тип bool
- Режим останова по M1.
TPLC.Machine.Mode.M1ModeRequest W, тип bool
- Запрос на режим останова по M1.
TPLC.Machine.Mode.TcpMode R, тип bool
- TCP режим УП.
TPLC.Machine.Mode.TcpModeRequest W, тип bool
- Запрос на включение/выключение TCP режима.
TPLC.Machine.Mode.DemoMode R, тип bool
- Демо режим ЧПУ.
TPLC.Machine.Mode.DemoModeRequest W, тип bool
- Запрос на включение/выключение демо режима.
5.4. Группа обменных объектов Channel
В ЧПУ системе может быть 1 или 2 канала работы.
Получение списка каналов:
TPLC.Channels R, тип Dictionary‹NumChannel, PLC.PLC_Channel›
- Перечисление: NumChannel.Channel_1/Channel_2
- PLC_Channel - объект - в котором определены обменные ячейки канала
TPLC.CurChannel R, тип PLC.PLC_Channel
- PLC_Channel - объект - в котором определены обменные ячейки канала
TPLC.Channels[NumChannel.Channel_X].M789Request R, тип int
- Запрос/Уведомление включения M7 M8 M9.
TPLC.Channels[NumChannel.Channel_X].GroupGM R, тип Dictionary‹EnumGroupGM, int›
- Активные модальные команды в группах.
Перечисление: EnumGroupGM.G_0_3/G_17_19/G_40_42/G_43_49/G_52/G_92/G_61_64/G_68/G_69/G_80_85/G_90_91/G_901_911/G_93_95/G_98_99/M_0_1/M_3_5/M_7_9/M_8_9
В значении словаря по EnumGroupGM - номер активной команды в группе
TPLC.Channels[NumChannel.Channel_X].ContentExpression(string Expression) функция, возвращает тип double
- Запрос вычисления выражения управляющей програамы в канале.
- Expression - строка - в которой описвно выражение для вычисления
В Вычислениях могут участвовать переменные УП
Пример обращения к обменным ячейкам канала:
// Установка скорости подачи в первом канале (Первый канал есть всегда) TPLC.Channels[NumChannel.Channel_1].Feed.CorrectorG1 = 1000; // Установка скорости подачи во втором канале (Второй канал может отсутствовать) if (TPLC.Channels.ContainsKey(NumChannel.Channel_2)) { TPLC.Channels[NumChannel.Channel_2].Feed.CorrectorG1 = 1000; } // Установка скорости подачи в текущем канале (который выбран для управления) TPLC.CurChannel.Feed.CorrectorG1 = 250; // Проверка текущей модальной команды в группе if (TPLC.Channels[NumChannel.Channel_1].GroupGM[EnumGroupGM.G_0_3] == 1) { .... }; // Плучение результата замера по оси Z double PosZ = TPLC.Channels[NumChannel.Channel_1].CalсContentExpression("#PROBE_Z");
5.5. Группа обменных объектов Channel.CurrentTool
Наименование группы: TPLC.Channels[NumChannel.Channel_X].CurrentTool
В этой группе расположены обменные ячейки контроля за инструментом в нужном канале
TPLC.Channels[NumChannel.Channel_X].CurrentTool.Number R, тип int
- Номер иснтрумента
TPLC.Channels[NumChannel.Channel_X].CurrentTool.Id R, тип int
- Уникальный идентификтор инструмента
TPLC.Channels[NumChannel.Channel_X].CurrentTool.BindingToolId R, тип int
- Номер привязки инструмента
TPLC.Channels[NumChannel.Channel_X].CurrentTool.Slot R, тип int
- Номер слота в магазине
TPLC.Channels[NumChannel.Channel_X].CurrentTool.Corrector R, тип int
- Номер корректора инструмента
TPLC.Channels[NumChannel.Channel_X].CurrentTool.RequestToolChangeForm W, тип bool
- Запрос на откытие интерактивной формы смены инструмента
5.6. Группа обменных объектов Channel.Feed
Наименование группы: TPLC.Channels[NumChannel.Channel_X].Feed
В этой группе расположены обменные ячейки контроля за подачей в нужном канале
TPLC.Channels[NumChannel.Channel_X].Feed.Value R, тип int
- Расчетная скорость подачи
TPLC.Channels[NumChannel.Channel_X].Feed.ValueReal R, тип int
- Фактическая скорость подачи
TPLC.Channels[NumChannel.Channel_X].Feed.CorrectorG1 RW, тип double
- Корректор подачи 100% для G1/2/3/4
TPLC.Channels[NumChannel.Channel_X].Feed.CorrectorG0 RW, тип double
- Корректор подачи 100% для G0
5.7. Группа обменных объектов Channel.Mcode
Наименование группы: TPLC.Channels[NumChannel.Channel_X].Mcode
В этой группе расположены обменные ячейки контроя за выполнением M команд в нужном канале
TPLC.Channels[NumChannel.Channel_X].Mcode.Code R, тип float?
- Выполняется указанная M-команда если нет - то null
- Для M5 будет передано 5.0, Для М5.23 будет передано 5.23,
TPLC.Channels[NumChannel.Channel_X].Mcode.Done W, тип bool
- Прекращение М команды. PLC уведомляет ЧПУ, что указанная M команда выполнена.
TPLC.Channels[NumChannel.Channel_X].Mcode.ParallelCode R, тип float?
- Выполняется паралельная (без остановки УП) указанная M-команда если нет - то null
- Для M5 будет передано 5.0, Для М5.23 будет передано 5.23,
TPLC.Channels[NumChannel.Channel_X].Mcode.ParallelDone W, тип bool
- Прекращение параллельной М команды. PLC уведомляет ЧПУ, что указанная параллельная M команда выполнена.
5.8. Группа обменных объектов Channel.Spindle
Наименование группы: TPLC.Channels[NumChannel.Channel_X].Spindle
В этой группе расположены обменные ячейки контроя за шпинделем в нужном канале
TPLC.Channels[NumChannel.Channel_X].Spindle.Axis R, тип EnumAxis
- Идентификатор оси шпинделя
- Перечисление: EnumAxis.NAN/X/Y/Z/A/B/C/U/V/W/Q/E/Ĉ
TPLC.Channels[NumChannel.Channel_X].Spindle.State R, тип EnumDriverState
- Статус серводрайвера шпинделя:
- Перечисление: EnumDriverState.NotReadyToOn/ErrorForToOn/ReadyToOn/Enabled/Run/QuickStop/EmergencyStop
TPLC.Channels[NumChannel.Channel_X].Spindle.SpindleStateRequest W, тип
- Запрос на смену статуса серво-драйвера шпинделя:
- Перечисление: EnumDriverState.NotReadyToOn/ErrorForToOn/ReadyToOn/Enabled/Run/QuickStop/EmergencyStop
TPLC.Channels[NumChannel.Channel_X].Spindle.SpindleSpeedCorrector RW, тип double
- Корректор оборотов шпинделя 100%
TPLC.Channels[NumChannel.Channel_X].Spindle.SpindleSpeed R, тип int
- Обороты шпинделя
TPLC.Channels[NumChannel.Channel_X].Spindle.SpindAxisMode R, тип bool
- Текущий шпиндель в режиме оси.
5.9. Группа обменных объектов Channel.Probe
Наименование группы: TPLC.Channels[NumChannel.Channel_X].Probe
В этой группе расположены обменные ячейки контроя за выполнением команд пробника в нужном канале
TPLC.Channels[NumChannel.Channel_X].Probe.Skip R, тип bool
- Прервать исполнение по датчику G31 и перейти к следующему кадру.
TPLC.Channels[NumChannel.Channel_X].Probe.Move R, тип bool
- Идёт выполнение команды G31.
5.10. Группа обменных объектов Axis
В ЧПУ системе может быть от 3 до 12 осей.
Получение списка осей:
TPLC.Axles R, тип Dictionary‹EnumAxis, PLC.PLC_Axis›
- Перечисление: EnumAxis.NAN/X/Y/Z/A/B/C/U/V/W/Q/E/Ĉ
- PLC_Axis - объект - в котором определены обменные ячейки оси
Пример обращения к обменным ячейкам осей:
// Получение позиции оси TPLC.Axles[EnumAxis.X]; if (Axles.ContainsKey(EnumAxis.X)) { var PosAbs = Axles[EnumAxis.X].Pos.Abs; };
5.11. Группа обменных объектов Axis.Settings
Наименование группы: TPLC.Axles[EnumAxis.X].Settings
В этой группе расположены обменные ячейки настроек выбранной оси
TPLC.Axles[EnumAxis.X].Settings.PurposeAxis R, тип EnumPurposeAxis
- Назначение Оси
- Перечисление EnumPurposeAxis.Linear_X/Linear_Y/Linear_Z/Rotation_A/Rotation_B/Rotation_C/Spindle/RotSpindle_C/Slave_X/Slave_Y/Slave_Z/NotInterpolated
TPLC.Axles[EnumAxis.X].Settings.IsAxisPurpose R, тип EnumPurposeAxis
- Возвращает одно из значений EnumPurposeAxis.Linear_X/Linear_Y/Linear_Z/Rotation_A/Rotation_B/Rotation_C/NotInterpolated
TPLC.Axles[EnumAxis.X].Settings.IsAxis R, тип bool
- Возвращает true - если ось - интерполируемая ось
TPLC.Axles[EnumAxis.X].Settings.IsSpindle R, тип bool
- Возвращает true - если ось - шпиндель инструмента
TPLC.Axles[EnumAxis.X].Settings.IsLinear R, тип bool
- Возвращает true - если ось линейная
TPLC.Axles[EnumAxis.X].Settings.IsRotation R, тип bool
- Возвращает true - если ось вращения
TPLC.Axles[EnumAxis.X].Settings.IsXYZ R, тип bool
- Возвращает true - если ось или X или Y или Z
TPLC.Axles[EnumAxis.X].Settings.Channel R, тип NumChannel
- Принадлежность оси к каналу
- Перечисление: NumChannel.Channel_1/Channel_2
TPLC.Axles[EnumAxis.X].Settings.FeedRateSec R, тип double
- Максимальная скорость подачи по G1 мм*сек
TPLC.Axles[EnumAxis.X].Settings.FeedRateSecG0 R, тип double
- Максимальная скорость подачи по G0 мм*сек
TPLC.Axles[EnumAxis.X].Settings.FeedHouming R, тип double
- Максимальная скорость подачи при выходе в ноль мм*мин
TPLC.Axles[EnumAxis.X].Settings.AccelerationG1 R, тип double
- Максимальное ускорение по G1 мм*сек*сек/с
TPLC.Axles[EnumAxis.X].Settings.AccelerationG0 R, тип double
- Максимальное ускорение по G0 мм*сек*сек/с
TPLC.Axles[EnumAxis.X].Settings.TypeHouming R, тип EnumTypeHouming
- Тип выхода в ноль по оси
- Перечисление: EnumTypeHouming.Forbidden/NotRequired/Required
5.12. Группа обменных объектов Axis.Pos
Наименование группы: TPLC.Axles[EnumAxis.X].Pos
В этой группе расположены обменные ячейки положения выбранной оси
TPLC.Axles[EnumAxis.X].Pos.Abs R, тип double
- Текущее абсолютное (Машинное) положение оси
TPLC.Axles[EnumAxis.X].Pos.Work R, тип double
- Текущее рабочее положение оси.
TPLC.Axles[EnumAxis.X].Pos.Delta R, тип double
- Текущее отклонение (Рассогласование) оси по обратной связи
TPLC.Axles[EnumAxis.X].Pos.Feed R, тип double
- Текущая скорость оси
TPLC.Axles[EnumAxis.X].Pos.Load R, тип double
- Текущая нагрузка на ось в %
TPLC.Axles[EnumAxis.X].Pos.Accel R, тип double
- Текущее ускорение Оси
5.13. Группа обменных объектов Axis.Grab
Наименование группы: TPLC.Axles[EnumAxis.X].Grab
В этой группе расположены обменные ячейки перехвата управления выбранной оси
TPLC.Axles[EnumAxis.X].Grab.On R, тип bool
- Режим управления осью от ПЛК включен.
TPLC.Axles[EnumAxis.X].Grab.TargetPos W, тип double
- Команда на перемещение в позицию, заданную объектом
TPLC.Axles[EnumAxis.X].Grab.Ok R, тип bool
- Достигнута координата в режиме от ПЛК - команда выполнена.
TPLC.Axles[EnumAxis.X].Grab.Reset W, тип bool
- Сброс последней команды на перемещение.
TPLC.Axles[EnumAxis.X].Grab.Feed RW, тип int
- Скорость позиционирования оси в режиме перехвата
5.14. Группа обменных объектов Axis.Home
Наименование группы: TPLC.Axles[EnumAxis.X].Home
В этой группе расположены обменные ячейки управления выхода в ноль выбранной оси
TPLC.Axles[EnumAxis.X].Home.HoumingOk R, тип bool
- Выход в «0» завершен.
TPLC.Axles[EnumAxis.X].Home.HomeRequest W, тип bool
- Запрос на выход в «0» по оси.
TPLC.Axles[EnumAxis.X].Home.IsHome R, тип bool
- Идет выход в «0» по оси.
TPLC.Axles[EnumAxis.X].Home.HomeAbort W, тип bool
- Отмена команды на выход в ноль.
6. Программные пульты
В коде PLC есть возможность запрограммировать несколько пультов, которые будут выведены на экране ЧПУ.
Вывод пультов на экран будет на вкладке "Пульт" (Вот это неожиданность)
Пример программного пульта:
Список запрограммированных пультов и их выбор - на правой панели страницы
Всего возможно добавить 8 пультов.
1, 2 и 8 - запрограммированы в штатной поставке.
3 - зарезервирован для разработчиков.
4,5,6,7 - доступны пользователям для программирования
Обекты, которые используются для программирования пультов:
6.1. PlcButton
Объект PlcButton Предназначен для описания кнопки пульта.
PlcButton должен быть объявлен в разделе Инициализации переменных.
Пример объявления кнопки пульта:
// Объявление кнопки с предопределенной картинкой static readonly PlcButton BtReset = new( Translate("СБРОС", "RESET"), EnumPlcImage.Reset, false); // Обявление кнопки с произвольной картинкой static readonly PlcButton BtReset = new( Translate("СБРОС", "RESET"), PlcEngine.CreateSvgImage( """ ‹svg›‹defs›‹style›.cls-1 {fill: #4d4d4d;}.cls-1, .cls-2 {stroke: #000;stroke-linecap: round;stroke-linejoin: round;stroke-width: 3.57px;}.cls-2 {fill: #db956f;}‹/style›‹/defs› ‹path class="cls-1" d="M424.06,191.41v245.36c0,11.04-8.97,19.98-20.04,19.98h-78.78c-11.07,0-20.04-8.95-20.04-19.98v-81.42c0-11.04-8.97-19.98-20.04-19.98h-48.21c-11.07,0-20.04,8.95-20.04,19.98v81.42c0,11.04-8.97,19.98-20.04,19.98H112.1c-11.07,0-20.04-8.95-20.04-19.98V191.41l166-105.38,166,105.38Z"/› ‹path class="cls-2" d="M48.15,249.51c-10.22,0-20.23-5.05-26.11-14.3-9.13-14.36-4.85-33.38,9.55-42.49L241.52,60.03c10.17-6.42,23.19-6.37,33.3,.15l205.83,132.7c14.32,9.24,18.42,28.29,9.17,42.57-9.26,14.26-28.36,18.36-42.69,9.14l-189.22-122L64.65,244.73c-5.13,3.24-10.85,4.78-16.5,4.78Z"/› ‹path class="cls-1" d="M92.02,154.53V71.41c0-6.09,4.95-11.03,11.06-11.03h38.94c6.11,0,11.06,4.94,11.06,11.03v44.52l-61.06,38.6Z"/› ‹/svg› """), false);
Параметры инициализации:
• string Name - Отображаемое наименование кнопки
• или: EnumPlcImage Image - Идентификатор встроенной картинки. Перечисление, возможные значения указаны в приложении
• или: SvgImage? Image - Картинка формата svg, полученная через функцию PlcEngine.CreateSvgImage(string SvGString)
• bool DifferentChanel - Признак - что кнопка может иметь различное действие в зависимости от канала (управляет системой для каждого канала в отдельности)
Пример - на кнопке "4" на скрине ниже - появляется в кружочке номер канала.
Свойства и функции кнопки:
• bool Front - Взводится по фронту нажатия кнопки (от предыдущей секции). Во время работы секции PLC не изменяется.
• bool Rear - Взводится по спаду нажатия кнопки (от предыдущей секции). Во время работы секции PLC не изменяется.
• bool Press - Состояние нажатия кнопки. Во время работы секции PLC не изменяется.
• bool Enable - Вход, при false кнопка блокируется - "3" на скрине ниже.
• bool Led - Вход, при true кнопка подсвечивается - "2" на скрине ниже.
Пример использования:
BtMoveSwitch.Enable = TDM.IsJogMode || TDM.IsZeroMode; TDM.CommanMove = BtMoveSwitch.Front;
6.2. PlcSwitch
Объект PlcSwitch Предназначен для описания переключателя пульта.
Для переключателя может задаваться количество положений.
Пользователь на экране пульта может нажимать на левую или правую часть переключателя - уменьшая или увеличивая значение переключателя.
PlcSwitch должен быть объявлен в разделе Инициализации переменных.
Пример объявления переключателя:
// Объявление переключателя скорости подачи static readonly PlcSwitch BtFeedSwitch = new( "FAST-{0}x", 4, 1, false);
Параметры инициализации:
• string Name - Отображаемое наименование переключателя. Символы в наименовании "{0}" будт заменены на число - текущее значение переключателя
• int MaxSwitch - Количество положений переключателя, максимально - 6
• int Switch - Начальное положение переключателя
• bool DifferentChanel - Признак - что кнопка может иметь различное действие в зависимости от канала (управляет системой для каждого канала в отдельности)
Свойства и функции переключателя:
• bool Switch - Значение переключателя. Чтение и запись. Во время работы секции PLC не изменяется.
• bool Enable - Вход, при false переключатель блокируется.
• bool Led - Вход, при true переключатель подсвечивается.
Пример использования:
BtFeed100.Led = BtFeedSwitch.Switch == 3; switch (BtFeedSwitch.Switch) { case 1: BtFeedSwitch.Name = "FAST 1x"; break; case 2: BtFeedSwitch.Name = "FAST 10x"; break; case 3: BtFeedSwitch.Name = "FAST 100x"; break; case 4: BtFeedSwitch.Name = "FAST 1000x"; break; };
6.3. PlcWell
Объект PlcWell Предназначен для описания энкодера-маховика пульта:
Пользователь на экране пульта может "Крутить" энкодера-маховик влево и вправо - уменьшая или увеличивая значение PlcWell.
PlcWell должен быть объявлен в разделе Инициализации переменных.
Пример объявления PlcWell:
// Обявление энкодера-маховик скорости подачи static readonly PlcWell BtWheel = new( string.Empty, EnumAxis.X);
Параметры инициализации:
• string Name - Отображаемое наименование
• object AxisImage - предопределенная картинка оси.
Может принимать типы: EnumAxis, EnumPlcImage, SvgImage
EnumAxis.NAN/X/Y/Z/A/B/C/U/V/W/Q/E/Ĉ
Свойства и функции PlcWell:
• double Steps - Значение энкодера-маховика в шагах (4 градуса - 74 шага на оборот).
Чтение. Во время работы секции PLC не изменяется.
• bool Enable - Вход, при false переключатель блокируется.
• object AxisImage - Чтение и запись.
Может принимать типы: EnumAxis, EnumPlcImage, SvgImage
Пример использования:
DT.WellFeed += BtWheel.Steps / 5d; BtWheel.AxisImage = EnumPlcImage.F; BtWheel.Enable = TDM.IsJogMode || TDM.IsWorkMode || TDM.IsZeroMode;
6.3. PlcSlider
Объект PlcSlider Предназначен для описания вертикального ползунка управления:
Пользователь на экране пульта может "Перемещать" ползунок верх-вниз - уменьшая или увеличивая значение PlcSlider.
PlcSlider должен быть объявлен в разделе Инициализации переменных.
Пример объявления PlcSlider:
// Объявление Slider скорости подачи static readonly PlcSlider SlFeed = new( "FEED {0:#.}%", TPLC.MinFeedCorrectorG1, TPLC.MaxFeedCorrectorG1, TPLC.CurChannel.Feed.CorrectorG1, 10, 5, 60, 80, 120, 150);
Параметры инициализации:
• string Name - Отображаемое наименование с форматом вывода значения
• double MinValue - минимальное значение.
• double MaxValue - максимальное значение.
• double InitValue - начальное значение.
• double TickFrequencyView - шаг показываемой шкалы.
• double TickFrequencySnap - шаг применяемой дискретной шкалы.
• double MinRed - минимальное значение - ниже которого шкала красная.
• double MinYellow - минимальное значение - ниже которого шкала желтая (до MinRed).
• double MaxYellow - максимальное значение - выше которого шкала желтая (до MaxRed).
• double MaxRed - максимальное значение - выше которого шкала красная.
Свойства и функции кнопки:
• bool Front - Взводится по фронту при перемещении ползунка. Во время работы секции PLC не изменяется.
• bool Rear - Взводится по спаду при перемещении ползунка. Во время работы секции PLC не изменяется.
• bool Enable - Вход, при false ползунок блокируется.
Пример использования:
SlFeed.Enable = TDM.IsJogMode || TDM.IsWorkMode || TDM.IsZeroMode; if (SlFeed.Front && SlFeed.Enable) { DT.CM_FeedCorrectorG1 = SlFeed.Value; };
6.5. PlcText
Объект PlcWell Предназначен для вывода произвольного текста на пульт:
Пользователь на экране пульта может "Крутить" энкодера-маховик влево и вправо - уменьшая или увеличивая значение PlcWell.
PlcText должен быть объявлен в разделе Инициализации переменных.
Пример объявления PlcText:
static readonly PlcText Text = new( Translate("Установите пробник", "Place the probe"), 10, false, PlcText.BackgroundDefault, PlcText.ForegroundDefault, PlcText.Alignment.Center, PlcText.Alignment.Center);
Параметры инициализации:
• string Text - Отображаемое текст
• double FontSize - Размер шрифта.
• bool SpecialFont - При true - выводится специальным шрифтом для чисел.
• Color Background - Цвет фона. Можно задать цвет фона по умолчанию: PlcText.BackgroundDefault
• Color Foreground - Цвет текста. Можно задать цвет фона по умолчанию: PlcText.ForegroundDefault
• Alignment VerticalAlignment - Выравнивание текста по горизонтали, PlcText.Alignment.Center/Right/Left
• Alignment HorizontalAlignment - Выравнивание текста по вертикали, PlcText.Alignment.Center/Top/Bottom
Свойства и функции PlcText:
• string Name - Отображаемое наименование кнопки
• double FontSize - Размер шрифта.
• bool SpecialFont - При tue - выводится специальным шрифтом для чисел.
• Color Background - Цвет фона. Можно задать цвет фона по умолчанию: PlcText.BackgroundDefault
• Color Foreground - Цвет текста. Можно задать цвет фона по умолчанию: PlcText.ForegroundDefault
• Alignment VerticalAlignment - Выравнивание текста по горизонтали, PlcText.Alignment.Center/Right/Left
• Alignment HorizontalAlignment - Выравнивание текста по вертикали, PlcText.Alignment.Center/Top/Bottom
Цвет можно задать свой, пример:
// Задание произвольных цветов PlcText.Name = "Новый цвет"; PlcText.Color HeadColor = new("#FFFF1F1F", "#FFFF8080");
6.6. Объявление пульта
Пульт необходимо объявлять один раз при старте системы. Как правило это нужно делать в секции инициализации переменных. Пример:
// Обявление пульта c картинкой кнопки из системы TabPultProbe = NewTabPult( Translate("МОЙ ПУЛЬТ", "USER PULT"), EnumPlcImage.Fack); // Обявление пульта с произвольной картинкой - кнопкой TabPultProbe = NewTabPult( Translate("МОЙ ПУЛЬТ", "USER PULT"), PlcEngine.CreateSvgImage( """ ‹svg›‹defs›‹style›.cls-1 {fill: #4d4d4d;}.cls-1, .cls-2 {stroke: #000;stroke-linecap: round;stroke-linejoin: round;stroke-width: 3.57px;}.cls-2 {fill: #db956f;}‹/style›‹/defs› ‹path class="cls-1" d="M424.06,191.41v245.36c0,11.04-8.97,19.98-20.04,19.98h-78.78c-11.07,0-20.04-8.95-20.04-19.98v-81.42c0-11.04-8.97-19.98-20.04-19.98h-48.21c-11.07,0-20.04,8.95-20.04,19.98v81.42c0,11.04-8.97,19.98-20.04,19.98H112.1c-11.07,0-20.04-8.95-20.04-19.98V191.41l166-105.38,166,105.38Z"/› ‹path class="cls-2" d="M48.15,249.51c-10.22,0-20.23-5.05-26.11-14.3-9.13-14.36-4.85-33.38,9.55-42.49L241.52,60.03c10.17-6.42,23.19-6.37,33.3,.15l205.83,132.7c14.32,9.24,18.42,28.29,9.17,42.57-9.26,14.26-28.36,18.36-42.69,9.14l-189.22-122L64.65,244.73c-5.13,3.24-10.85,4.78-16.5,4.78Z"/› ‹path class="cls-1" d="M92.02,154.53V71.41c0-6.09,4.95-11.03,11.06-11.03h38.94c6.11,0,11.06,4.94,11.06,11.03v44.52l-61.06,38.6Z"/› ‹/svg› """),);
Параметры инициализации:
• string Name - Отображаемое наименование в кнопке выбора пульта
• или EnumPlcImage Image - Предопределённая картинка. Будет отображаться на кнопке выбора пульта.
• или SvgImage Image - Произвольная картинка, полученная через функциюPlcEngine.CreateSvgImage(string SvGString)
Будет отображатся на кнопке выбора пульта.
Свойства и функции PlcText:
• Clear() - Очистка всех кнопок на пульте
6.7. Заполнение пульта объектами
Заполнение пульта кнопками выполняется в функции AddButton() .
Пространство пульта на странице разобьётся на N-ное количество ячеек.
Пример:
// Заполнение пульта CurTabPult.Clear(); AddButton(CurTabPult, BtChannelMode, BtDemoMode, BtModeM1, BtModeSingle, NoBut, BtModeZero); AddButton(CurTabPult, BtMoveSwitch, NoBut, NoBut, NoBut, BtCoordZ, BtCoordXY); AddButton(CurTabPult, BtRotationZp, BtRotation1p, BtSpeed, BtFeed, BtTooth, NoBut); AddButton(CurTabPult, BtRotationXm, BtRotationXp, BtWheel, BtWheel, BtWheel, NoBut); AddButton(CurTabPult, BtRotationZm, BtRotation1m, BtWheel, BtWheel, BtWheel, NoBut); AddButton(CurTabPult, BtRotation2m, BtRotation2p, BtWheel, BtWheel, BtWheel, NoBut); AddButton(CurTabPult, BtMoveX1, BtMoveX100, BtFeed1, BtFeed10, BtFeed100, NoBut);
Количество ячеек по горизонтали будет равно максимальному количеству кнопок - переданных в функциюAddButton()
Количество ячеек по вертикали будет равно количеству вызова функциюAddButton()
Параметры заполнения:
• TabPult TabPult - Объявленный функциейNewTabPult() пульт
• object PultObject - Объекты пульта - до 40 обектов.
Принимаемые типы в PultObject: PlcButton, PlcSwitch, PlcWell, PlcText.
Объекты переданные в функцию AddButton() будут располагается в одну строку слева неправа.
Функцию AddButton() нужно вызывать несколько раз - по количеству строк кнопок на пульте.
Если в определенной ячейки кнопка не нужна - нужно передать объект "NoBut"
Если один и тот-же объект(кнопку) передать в двух смежных(или более) позициях (как по горизонтали так и по вертикали) - объект (кнопка) 'растянется' на эти ячейка как одна кнопка.
Смотрите в примере объект BtWheel - он растянут на 3х3 ячеек
В коде можно в приблизительном виде увидеть как будут расположены кнопки(или другие объекты) - смотрите пример выше.
7. Справка по пультам
В коде PLC есть возможность запрограммировать справки-подсказки по кнопкам пультов.
Вывод справок по пультам - на вкладке "Пульт", справа в панели сверху кнопка открытия справки
Пример справки по пульту:
Справок по пултам может быть несколько.
Программирование практически ни чем не отличается от программирования обычного пульта.
Создаваться справка должна в разделе Init().
Пример минимальной справки:
// Объявляем справку PlcButton BImag = new("", EnumPlcImage.HelpWHB04B); // Создаем объекты справки PlcText.Color BacColor = new("#FFA1A1A1", "#FF797979"); PlcText.Color HeadColor = new("#FFFF1F1F", "#FFFF8080"); PlcText TxNoF = new(Translate("Без модиф.", "No modifier"), 20, false, null, HeadColor, PlcText.Alignment.Left, PlcText.Alignment.Center); PlcText TxYsF = new(Translate("FN (13) зажата.", "FN (13) clamped."), 20, false, null, HeadColor, PlcText.Alignment.Left, PlcText.Alignment.Center); PlcText TxYsS = new(Translate("STEP (19) зажата.", "STEP (19) clamped."), 20, false, null, HeadColor, PlcText.Alignment.Left, PlcText.Alignment.Center); // Регистрируем справку по пульту var HelpWHB = NewTabPult("", EnumPlcImage.PultWHB, -1); AddButton(HelpWHB, NoBut, NoBut, TxNoF, TxNoF, TxNoF, TxNoF, TxNoF, TxNoF, TxNoF, TxNoF); AddButton(HelpWHB, TxB01, NoBut, TxYsF, TxYsF, TxYsF, TxYsF, TxYsF, TxYsF, TxYsF, TxYsF); AddButton(HelpWHB, TxB02, NoBut, TxYsS, TxYsS, TxYsS, TxYsS, TxYsS, TxYsS, TxYsS, TxYsS); // Добавляем справку в список справок (для возможности выбора) new PlcPultHelp.HelpPult( String.Empty, //Translate("WHB", "WHB"), EnumPlcImage.PultWHB, HelpWHB );
Для полного понимания механизма программирования справки смотрите как это реализовано разработчиками в модуле PultWHB.cs