Использование git с проектами KRL (KUKA Robot Language)

У меня есть некоторые проблемы с использованием git в моих проектах KRL, и я хочу знать, есть ли обходные пути для улучшения моего рабочего процесса.

KRL — это язык программирования для промышленных роботов KUKA. Он имеет синтаксис, подобный Basic/Pascal. Программа состоит из одного или нескольких модулей. Модуль состоит из двух текстовых файлов, один для исходного кода (.src) и один для объявлений и определений (.dat).

Моя первая проблема заключается в том, что в каждом файле первые строки создают заголовок, который выглядит так:

&ACCESS RVO
&REL 175

Каждая строка заголовка начинается с & и не имеет абсолютно никакого значения для кода. Хуже всего то, что этот заголовок постоянно меняется. Поэтому, когда я копирую файл обратно из контроллера робота в свой репозиторий, git заявляет, что файл изменился, хотя исходный код тот же.

Итак, мой первый вопрос: есть ли способ с помощью фильтров или хуков игнорировать все строки, начинающиеся с &?

Моя вторая проблема заключается в том, что файлы *.dat предназначены не только для объявлений и определений, таких как заголовочные файлы в C-подобных языках, но и для хранения значений. Это выглядит так:

DECL E6POS XP1 = {X 319.710815,Y -488.601227,Z 1364.72363,A -73.5368805,B 88.6439896,C 10.5155058,S 6,T 26,E1 0.0,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0}
INT counter=123
REAL offset=0.123

Я завишу от значений, потому что они хранят позиции и счетчики, которые должны оставаться постоянными, но меня это не волнует в моем репо. Ну не полностью, они должны быть в файлах и в моем репозитории, но git не должен искать различия в этих строках.

Допустим, я создал модуль в своем репозитории и скопировал этот модуль в файл robot. Теперь я запускаю этот модуль с роботом и должен перезаписать значение позиции. Это изменяет значение в соответствующем файле *.dat. Все работает нормально и через несколько дней хочу реализовать счетчик. Я не могу просто поместить новое целочисленное определение в локально доступный файл *.dat, потому что таким образом я перезапишу значение позиции на роботе. Поэтому я должен сначала скопировать файл *.dat из контроллера робота в свое хранилище и определить там новую переменную. Но конечно git показывает мне, что файл изменился не только в новой строке, но и в строках, где робот изменил значения, такие как позиция. Это значительно усложняет обзоры, потому что у меня много значений измерений и счетчиков, которые постоянно меняются.

Итак, на мой второй вопрос: есть ли способ игнорировать все после =, но только в файлах *.dat? Это должно работать так же, как и с & из заголовков, поэтому значения должны быть в репо, но меня не волнуют какие-либо различия в этих значениях.

Не ответ на ваш вопрос, но я хотел бы упомянуть, что я разработал инструмент для преобразования файлов WorkVisual .wvs в текстовые файлы и обратно. Я использую его более пяти лет для управления исходным кодом файлов WorkVisual, и он оказался очень стабильным. Если есть интерес, могу выложить в открытый доступ.

Daniel Gehriger 02.05.2022 11:17

@DanielGehriger, это отличная идея! Я хотел бы увидеть ваш инструмент.

ascaron37 04.05.2022 07:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
909
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Добро пожаловать ascaron37!

На ваш первый вопрос, Значения заголовков с префиксом «&» автоматически генерируются KSS, и это поведение нельзя деактивировать или изменить. Заголовки не влияют на выполнение кода и поэтому могут быть удалены в любое время; однако в какой-то момент KSS просто автоматически сгенерирует их снова.

Мое решение этой проблемы состояло в том, чтобы создать инструмент «очиститель KRL-Git» в C# WPF, который очищает любые автоматически сгенерированные строки из любого файла в папке репозитория Workvisual, обычно в «C:\Users»имя пользователя»\Documents\WorkVisual 6.0\ Репозитории».

мой рабочий процесс таков:

  1. Пишите код на робота или WorkVisual
  2. Запустите мой очиститель KRL-Git, чтобы удалить все автоматически сгенерированные строки из репозитория.
  3. сделать git коммит

Я не могу поделиться проектом из-за политики компании, но могу предоставить фрагмент с примером того, как я очищаю строки:

        using System;
        using System.IO;
        using System.Windows;
        using System.Windows.Input;

        /// <summary>
        /// Delete deletable lines withing directory and children
        /// </summary>
        /// <param name = "parentDirectory"></param>
        /// <returns></returns>
        private int DeleteAllChildren(DirectoryInfo parentDirectory)
        {

            int deletables = 0;

            foreach (var childDirectory in parentDirectory.GetDirectories())
            {
                deletables += DeleteAllChildren(childDirectory);
            }

            foreach (var childFile in parentDirectory.GetFiles())
            {
                if (childFile.Extension == ".src" || childFile.Extension == ".dat" || childFile.Extension == ".sub")
                {
                    var tempFile = Path.GetTempFileName();
                    using (StreamWriter sw = new StreamWriter(tempFile))
                    {
                        using (StreamReader sr = new StreamReader(childFile.FullName))
                        {
                            var inLine = "";
                            while (!sr.EndOfStream && !inLine.Contains("DEF"))
                            {
                                inLine = sr.ReadLine();

                                if (!inLine.Contains("&REL") && !inLine.Contains("&ACCESS"))
                                {
                                    sw.WriteLine(inLine);
                                }
                                else
                                {
                                    deletables += 1;
                                }

                            }
                            while (!sr.EndOfStream)
                            {
                                sw.WriteLine(sr.ReadLine());
                            }

                            sr.Close();
                        }
                        sw.Close();
                    }

                    File.Delete(childFile.FullName);
                    File.Move(tempFile, childFile.FullName);
                }
            }

            return deletables;
        }

Извините, если вы искали более простой метод, но KUKA, похоже, не слишком заботится о стандартном управлении версиями.

Что касается вашего второго вопроса, МОЯ тактика будет заключаться в том, чтобы работать над функциональностью моего фрагмента кода выше, поскольку я уже использую его, чтобы избавиться от автоматически сгенерированных строк. Бьюсь об заклад, у некоторых профессионалов Git было бы более элегантное решение.

Разве вы не можете просто gitignore автоматически сгенерированные файлы? На самом деле в других языках люди обычно игнорируют все сгенерированные файлы.

slebetman 23.12.2020 16:59

Это не автоматически сгенерированные файлы. Это автоматически сгенерированные строки в файле.

Micahstuh 23.12.2020 17:04

Привет @Micahstuh, спасибо, что поделились и за теплый прием! Я могу поклясться, что мои файлы src и dat не были распознаны как модули без строк заголовка, но я попробую еще раз через две недели, так как до тех пор у меня нет доступа к роботу.

ascaron37 23.12.2020 19:01
Ответ принят как подходящий

Используя фильтры, вы можете игнорировать эти строки.

Допустим, у нас есть фильтр в /scripts/krl_filter.sh:

sed -e '/\&ACCESS/d' -e '/\&REL/d' -e '/\&PARAM/d' -e '/\&COMMENT/d'

Мы устанавливаем фильтр в /.git/config

[filter "krl"]
  clean = $PWD/scripts/krl_filter.sh
  smudge = cat
  required = true

Применяем его к KRL-файлам .gitattributes

*.src filter=krl
*.dat filter=krl
*.sub filter=krl

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

* для файлов .dat вы можете использовать такой фильтр:

sed -e 's/=[^=]*$/=/'

Для получения дополнительной информации об игнорировании строк в git проверьте это: Как указать git игнорировать отдельные строки, т.е. gitignore для определенных строк кода

Привет, Даниил, спасибо за ответ. Я уже видел этот поток, и это не совсем то поведение, которое мне нужно, по крайней мере, для файлов dat. Я все еще не уверен, распознаются ли модули без строк заголовка. Если они есть, то это идеально. Для файлов dat у меня есть sed -e "s/=[^=]*$//" для замены всего после назначения вместо удаления всей строки. Но опять же, я хотел бы сохранить эти значения в репо и скорее игнорировать их при сравнении. Возможно, мне придется переосмыслить то, как я работаю с krl, поэтому я приму ваш ответ.

ascaron37 03.01.2021 11:30

Не совсем правильно, что значения за & в заголовке совершенно неуместны. По крайней мере, флаг 'V' за параметром &ACCESS полезен, объявите, что этот модуль и вызов этих модульных функций видны или нет на SmartPad/SmartHmi. Остальные значения (кроме КОММЕНТАРИЯ, что говорит само за себя) используются нечасто и корректно добавляются KRC.

Поэтому я добавил в ~/.git/config фильтр, который удаляет только числа в строке &ACCESS и некоторые другие параметры заголовка.

[filter "krl"]
    clean = "sed -e 's/\(^&ACCESS [A-Z]*\).*$/\1/' -e '/\^&REL/d' -e '/\^&PARAM/d'"
    smudge = "sed -e 's/\(^&ACCESS [A-Z]*\).*$/\1/' -e '/\^&REL/d' -e '/\^&PARAM/d'"

Вы также должны применить эти фильтры к файлам в .gitattributes.

*.src filter=krl
*.dat filter=krl
*.sub filter=krl

Данные в файлах .dat представляют большую проблему. Но если вам не нужно постоянство (что вам, вероятно, не нужно, иначе вы, возможно, захотите добавить его в контроль версий), вы можете объявить переменные в файле .dat без назначения. Нравиться:

DECL INT foo
DECL E6POS bar

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

Или вы добавляете запятую sed в свой фильтр git, например

`sed -e 's/\(^ *DECL  *[A-Z]*  *[A-Za-z][A-Za-z0-9]* *=\).*\(;\\ignoreVersion\[\(.*\)\]\)/\1 \3 \2/'

С их помощью вы можете добавить комментарий к заданию, например

DECL INT foo = 1234 ;ignoreVersion[12]

В этом случае значение foo будет заменено на «12» при каждом коммите.

Другие вопросы по теме