2017-01-19 2 views
1

Я хотел бы знать, могу ли я программировать ПЛК с автоматом/диаграммой состояний.Преобразование машины языка UML в SCL?

С помощью Sparx EA мы можем составить наш государственный автомат. Есть ли возможность преобразовать этот конечный автомат в SCL (язык структурированного управления, используемый в программировании ПЛК)? Или какие данные мы можем взять у Sparx EA, которые мы можем использовать в качестве ввода для PLC-программирования?

Возможно, вам лучше понять, как реализовать эту идею.

ответ

1

Я никогда не программировал S7, но в основном знаю, что вы ищете. У EA нет генератора для SCL, и вероятность низкая, чтобы увидеть, что это происходит от Sparx. Таким образом, есть две возможности.

Первым (но не предпочтительным мной) является вникание в кишки макроса Sparx, который используется во время генерации кода. Если вам просто нужна небольшая адаптация для существующих шаблонов, это хорошо, но писать совершенно новый - это не забава (для меня).

Второй способ - использовать API для генерации кода. Это довольно легко (ну, для меня с тех пор, как я изучал построение компилятора в университете). То, что вы сделаете, - это взять государственный аппарат, пройти его и выплюнуть соответствующие языковые конструкции. Это сильно зависит от ваших навыков, но через пару дней я создам грубый прототип.

Редактировать Вот пример Perl (я знаю, что это лаваш, если вы не используете его в течение недели или около того, но вы, вероятно, может расшифровать его, хотя) скрипт, который анализирует состояние машины с помощью API EA,:

package Compiler; 
use strict; 
use Win32::OLE qw (in); 

sub new { 
    my ($self, $rep) = @_; 
    $self = {}; 
    $self->{nodes} = {}; 
    $self->{rep} = $rep; 
    bless $self; 
} 

sub traverse { 
    my ($self, $node) = @_; 
    my $guid = $node->ElementGUID; 
    return if defined($self->{nodes}->{$guid}); 
    my $nodeInfo = { 'name' => $node->Name, 'type'=> $node->Type, 'out' =>()}; 
    $self->{nodes}->{$guid} = $nodeInfo; 

    for my $trans (in $node->Connectors) { 
    my $target = $self->{rep}->GetElementByID($trans->SupplierID); 
    next if $target->ElementGUID eq $guid; 

    my @targetInfo = ($trans->TransitionGuard, $target->ElementGUID); 
    push(@{$nodeInfo->{out}}, \@targetInfo); 
    $self->traverse($target); 
    } 
} 

1; 

и простой основной программы, как это:

use strict; 
no strict 'refs'; 
use compiler; 

my $rep = $ENV{'REP'}; # get repository pointer "by magic" 
my $node = $rep->GetElementByGUID('{574C5E0C-E032-44c6-A6B0-783D35B9958B}'); # fixed addressing of InitialNode 
my $compiler = Compiler->new($rep); 
$compiler->traverse($node); # read in all possible transitions/states 
my %states = %{$compiler->{nodes}}; # this hash holds all states and their transitions 

for my $key (keys %states) { 
    my $state = $states{$key}; # loop through all found states 
    print "$state->{type} $state->{name}\n"; # state name 
    for my $out (@{$state->{out}}) { 
    my ($guard, $guid) = @{$out}; 
    my $target = $compiler->{nodes}->{$guid}; 
    print "__$guard -> $target->{name}\n"; 
    } 
} 

Теперь предположим, у вас есть государственная машина, как это:

enter image description here

При запуске выше программы будет печататься

StateNode
StateNode
_ Нет условие -> State1
государственный State1
__condition -> State2
__exit ->
государственный State2
прочее состояние -> состояние1

Первый StateNode - это неназванный выход, а следующий - InitialNode (вы также можете получить эту информацию из API и использовать ее). State1 имеет два возможных перехода (для выхода и State2). И State2 переходит только до State1.

Теперь, со списком названных состояний, вы можете создать перечисление для разных состояний. Также у вас есть охранники для всех переходов, которые вы можете преобразовать в if-каскады или инструкции switch.

Конечно, это не полный генератор кода, но вы можете получить представление о том, как сделать это на этом эшафоте.

+0

Ну, я ученик автоматизации, 3-й семестр. Это будет очень приятно, если я смогу увидеть ваш прототип. :) – ptd

+0

Это наверняка будет слишком длинным, как ответ здесь. В основном, возьмите StartNode, получите исходящие переходы, оцените охранников и создайте состояния для всех государств, которых вы достигнете. –

+0

Я могу дать свой адрес электронной почты, если вы действительно хотите отправить мне свой прототип. Я вижу, что вы хорошо знаете эту тему, как долго это будет, создавать «переводчик кода» и можете ли вы сказать, какую квалификацию должен иметь программист ?. Потому что я хотел бы знать, будет ли это правильный переход к использованию государственной машины, а не SCL. Так что и пользователю, и пользователю нужно просто сделать государственный автомат, а людям в маркетинге и бизнесе будет проще. – ptd

2

Несомненно. Вам нужен инструмент генератора кода, который может читать диаграмму конечного автомата и генерировать эквивалентный структурированный текст.

Форма кода довольно проста. Вы можете определить ST boolean для каждого бита (если вы можете иметь прямые параллельные состояния, как в StateCharts) или целое число ST, содержащее номер состояния.

код ST для каждого состояния является то:

if (StateXXX) then 
     <action in this state> 
     if (somecondition) 
      StateXXX=false; 
      StateYYY=true; 
     endif 
    endif 

Вам нужно создать этот код для каждого состояния.

В этом случае вопрос о том, что tool Вы используете для этого? Возможно, любой инструмент, который может читать UML-диаграмму, которая обычно экспортируется как XML-документ из редакторов UML; с проанализированным XML, вы можете написать код, чтобы подняться над ним и выплюнуть вышеописанные фрагменты кода.

Возможно, это проще, если вы кодируете фрагменты, которые являются четко определенными шаблонами. Вы можете использовать специальные шаблоны (просто текстовые строки, содержащие маркеры, где что-то нужно заполнить), или вы можете использовать инструмент, который обеспечивает структуру и состав сгенерированного кода, например Program Transformation System (PTS).

PTS принимает грамматику для языка, будет анализировать экземпляры этого языка и позволить вам преобразовать этот язык, наконец, выплескивая измененный экземпляр языка. Полезный частный случай превращает, если хотите, тривиальную программу в сложную, реальную программу. Кроме того, хорошая PTS позволит вам писать шаблоны и правила трансформации с точки зрения формальных шаблонов кода, которые обеспечивают, по крайней мере, синтаксис шаблона действительным. Это гарантирует, что части, с которыми вы работаете, всегда делают определенный минимальный смысл. (В отличие от этого, вы можете написать любой мусор, который вам нравится в текстовом шаблоне). Когда вы пишете много таких шаблонов, это очень полезно, чтобы не создавать нежелательной информации.

Для этого конкретного примера, для (PTS моей компании называется DMS см био) вы можете написать шаблоны для вышеприведенного фрагмента:

pattern StateInstance(statenumber: natural, action: statements, exit_condition: expression, exit_state: natural): statement = 
    " if (StateNumber=\statenumber) then 
     \action 
     if (\exit_condition) then 
      StateNumber=\exit_state 
     endif 
     endif 
    "; 

DMS предоставляет интерфейсы API для создания экземпляров этого шаблона (и другие, вы обычно пишете многие) и составляют их результаты (с использованием экземпляров в качестве аргументов для других шаблонов для создания экземпляра) для создания окончательной программы. Вы также можете добавить правило преобразования для оптимизации сгенерированного кода. (DMS управляется определениями грамматики, он уже знает 40 языков и, в частности, имеет надежные определения для ST и для XML).

+0

Спасибо за ваш ответ. Но при создании кода s7 я не могу разместить весь код в одном документе. Поэтому в s7 мы должны поместить его в разные модули. Это означает, что мне также нужно автоматизировать процесс, чтобы создать новый модуль и скопировать в него некоторые коды. Есть идеи? – ptd

+0

Это просто больше преобразований. PTS должен иметь возможность создавать несколько исходных файлов из одного входного документа. Сама структура модуля - это еще один шаблон, который должен быть заполнен частью кода. Вам понадобится дополнительная техника в PTS, чтобы решить, какая часть общего сгенерированного кода идет в файл. Большинство PTS могут анализировать, но иногда это неудобно; DMS имеет большую поддержку пользовательских анализаторов. Каковы критерии? –

0

Если вы используете ПЛК Siemens, тогда у S7 был дополнительный программный пакет, называемый s7-graph: http://w3.siemens.com/mcms/simatic-controller-software/en/step7/simatic-s7-graph/Pages/Default.aspx. Здесь вы можете реализовать государственные машины. Но не знаю никаких импортных вариантов.

Я использовал его для некоторого оборудования, которое контролировалось как государственные машины. Этот программный пакет не был бесплатным, я не помню его цены. Я также не знаю, поддерживали ли все семейства ПЛК S7. Я использовал 400 серий и работал там.

Попросите вашего местного дистрибьютора Siemens позволить вам играть с ним немного, прежде чем использовать его в любом проекте.

+0

Благодарим вас за эту информацию – ptd

Смежные вопросы