Использование 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 файлы? Это должно работать так же, как с &из заголовков, поэтому значения должны быть в репо, но меня не волнуют какие-либо различия в этих значениях.

3 ответа

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

Допустим, у нас есть фильтр в /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 для определенных строк кода

Добро пожаловать 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 было бы более элегантное решение.

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

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