Восстанавливаем исходный SCL текст из STL
Цель статьи
Теоретическая часть
Последовательность действий
Преобразуем STL код в SCL
Проверка результата
Видео приложение
Изложение оптимальной методики восстановления.
Необходимость в восстановлении исходного текста возникает достаточно редко, например, из-за желания понять или скорректировать работу функции, написанной другим программистом, а также в целях самообразования.
В любом случае, изначально мы имеем скомпилированную функцию или функциональный блок, при открытии которых в менеджере проектов Simatic S7, открывается STL редактор и мы видим STL код полученный в результате компиляции исходного SCL текста, которого у нас нет.
Наша задача получить этот исходный текст, который будет компилироваться в блок идентичный блоку, имеющемуся у нас. При сравнении эти блоки не должны давать отличий в MC7 коде и иметь одинаковый checksum, который можно посмотреть в свойствах этих блоков. Добиться этого можно используя SCL редактор одинаковой версии, и установив одинаковые параметры компиляции. Версию под которой был собран исследуемый блок мы можем посмотреть в комментариях STL кода. Обычно различия от версии к версии не очень заметны, поэтому можно попытаться компилировать версией, которая у вас имеется.
Настройки компилятора. Вызываются Options -> Customize -> вкладка Compiler. Настроек компилятора не настолько много, чтобы это вызвало проблему в подборе. По сути их - несколько:
Вид настроек
Краткая расшифровка
Create object code |
C этой опцией, вы определяете необходимость создания выполняемого кода. Компиляция без этой опции выполняет только синтаксическую проверку. (Обычно установлена). |
Optimize object code |
Когда вы выбираете эту опцию, блоки оптимизируются по использованию памяти и скорости выполнения кода в PLC. (Обычно установлена). |
Monitor array limits |
Если опция выбрана, в момент выполнения кода проверяется индекс массива и если он выходит за пределы заданного OK флаг сбрасывается в FALSE. (Обычно сброшена) |
Create debug info | Создает отладочную информацию в коде, которая позволяет производить мониторинг SCL программы. Увеличивает размер кода. (Обычно сброшена). |
Set OK flag | Позволяет обращаться к OK флагу из S7-SCL кода. (Обычно сброшена) |
Permit nested comments | Разрешает использование вложенных комментариев. (Обычно установлена) |
Maximum string length | Определяет максимальную длину строки, по умолчанию 254. |
Значения настроек
Итак начнем - открываем блок в STL редакторе, выполнив двойной щелчок на блоке в Simatic Manager.
Вид открытого блока с информацией о версии компилятора
Выполняем команду File -> Save (необходимо для того чтобы изменился признак Created in language = STL)
Далее File -> Generate source..., выбираем из списка только необходимый блок.
Окно выбора.
Открываем полученный блок командой File -> Open
Вид в STL редакторе.
Теперь создаем новый SCL файл в папке проекта Sources (команда Insert -> S7 software -> SCL source), открываем созданный файл и копируем в него все, что получили на предыдущем шаге.
Далее изменяем заголовок блока, чтобы была возможна безошибочная компиляция:
- Изменяем номер блока, чтобы при компиляции не перезаписать исходный блок,
- Ставим одинарные кавычки на признаках TITLE и VERSION.
Имена входных/выходных переменных не нуждаются в корректировке.
Например:
L #in1 L #in2 +R T #result
Преобразуется в следующую строчку
result:=in1+in2;
Конструкцию IF..THEN..ELSE можно узнать по следующим строчкам.
A #START_ON // условие IF JCN M001 ..... // операторы для THEN JU M002M001: NOP 0 ..... // операторы для ELSE M002: CLR
Соответственно получаем
IF START_ON THEN ....; ELSE ....; END_IF;
Как выглядят другие языковые конструкции можно узнать, создав в SCL тестовый блок, с именно этой конструкцией и скомпилировав его.
Таблица некоторых общераспространенных конструкций (загрузить.pdf 36кБ.):
Cкомпилируем полученный текст командой File -> Compile.
Сравниваем полученные блоки командой Compare Blocks.
Если преобразование было выполнено успешно, результат должен выглядеть приблизительно так:
Сравнение блоков.
Основной параметр здесь - Block checksum, если он одинаковый у двух блоков значит код тоже одинаковый и исходный SCL текст программы восстановлен.
В ролике показан пример востановления исходного текста функции CRP_IN (библиотека ModPID)
Все в реальном времени, ничего не пропущено.
При просмотре лучше развернуть на весь экран.