plc4good.org.ua

Восстанавливаем исходный SCL текст из STL




Цель статьи
Теоретическая часть
Последовательность действий
Преобразуем STL код в SCL
Проверка результата
Видео приложение



Цель статьи:

Изложение оптимальной методики восстановления.



Теоретическая часть:

Необходимость в восстановлении исходного текста возникает достаточно редко, например, из-за желания понять или скорректировать работу функции, написанной другим программистом, а также в целях самообразования.

В любом случае, изначально мы имеем скомпилированную функцию или функциональный блок, при открытии которых в менеджере проектов Simatic S7, открывается STL редактор и мы видим STL код полученный в результате компиляции исходного SCL текста, которого у нас нет.

Наша задача получить этот исходный текст, который будет компилироваться в блок идентичный блоку, имеющемуся у нас. При сравнении эти блоки не должны давать отличий в MC7 коде и иметь одинаковый checksum, который можно посмотреть в свойствах этих блоков. Добиться этого можно используя SCL редактор одинаковой версии, и установив одинаковые параметры компиляции. Версию под которой был собран исследуемый блок мы можем посмотреть в комментариях STL кода. Обычно различия от версии к версии не очень заметны, поэтому можно попытаться компилировать версией, которая у вас имеется.



Последовательность действий.

Настройки компилятора. Вызываются Options -> Customize -> вкладка Compiler. Настроек компилятора не настолько много, чтобы это вызвало проблему в подборе. По сути их - несколько:

SCL

Вид настроек



Краткая расшифровка


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.


STL_1_2

Вид открытого блока с информацией о версии компилятора



Выполняем команду File -> Save (необходимо для того чтобы изменился признак Created in language = STL)

Далее File -> Generate source..., выбираем из списка только необходимый блок.



STL

Окно выбора.



Открываем полученный блок командой File -> Open


STL

Вид в STL редакторе.



Теперь создаем новый SCL файл в папке проекта Sources (команда Insert -> S7 software -> SCL source), открываем созданный файл и копируем в него все, что получили на предыдущем шаге.

Далее изменяем заголовок блока, чтобы была возможна безошибочная компиляция:
- Изменяем номер блока, чтобы при компиляции не перезаписать исходный блок,
- Ставим одинарные кавычки на признаках TITLE и VERSION.


Имена входных/выходных переменных не нуждаются в корректировке.




Преобразуем STL код в SCL.

Например:

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кБ.):

SCL_STL



Cкомпилируем полученный текст командой File -> Compile.



Проверка результата

Сравниваем полученные блоки командой Compare Blocks.
Если преобразование было выполнено успешно, результат должен выглядеть приблизительно так:



STL

Сравнение блоков.



Основной параметр здесь - Block checksum, если он одинаковый у двух блоков значит код тоже одинаковый и исходный SCL текст программы восстановлен.



Видео приложение

В ролике показан пример востановления исходного текста функции CRP_IN (библиотека ModPID)
Все в реальном времени, ничего не пропущено.
При просмотре лучше развернуть на весь экран.




Назад