Использование 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\ Репозитории».
мой рабочий процесс таков:
- Пишите код на робота или WorkVisual
- Запустите мой очиститель KRL-Git, чтобы удалить все автоматически сгенерированные строки из репозитория.
- сделать 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» при каждом коммите.