Я никогда не программировал 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";
}
}
Теперь предположим, у вас есть государственная машина, как это:
При запуске выше программы будет печататься
StateNode
StateNode
_ Нет условие -> State1
государственный State1
__condition -> State2
__exit ->
государственный State2
прочее состояние -> состояние1
Первый StateNode - это неназванный выход, а следующий - InitialNode (вы также можете получить эту информацию из API и использовать ее). State1
имеет два возможных перехода (для выхода и State2
). И State2
переходит только до State1
.
Теперь, со списком названных состояний, вы можете создать перечисление для разных состояний. Также у вас есть охранники для всех переходов, которые вы можете преобразовать в if-каскады или инструкции switch.
Конечно, это не полный генератор кода, но вы можете получить представление о том, как сделать это на этом эшафоте.
Ну, я ученик автоматизации, 3-й семестр. Это будет очень приятно, если я смогу увидеть ваш прототип. :) – ptd
Это наверняка будет слишком длинным, как ответ здесь. В основном, возьмите StartNode, получите исходящие переходы, оцените охранников и создайте состояния для всех государств, которых вы достигнете. –
Я могу дать свой адрес электронной почты, если вы действительно хотите отправить мне свой прототип. Я вижу, что вы хорошо знаете эту тему, как долго это будет, создавать «переводчик кода» и можете ли вы сказать, какую квалификацию должен иметь программист ?. Потому что я хотел бы знать, будет ли это правильный переход к использованию государственной машины, а не SCL. Так что и пользователю, и пользователю нужно просто сделать государственный автомат, а людям в маркетинге и бизнесе будет проще. – ptd