저는 S7을 프로그래밍 한 적이 없지만 기본적으로 당신이 찾고있는 것을 알고 있습니다. EA에는 SCL 용 발전기가 없으며 Sparx에서 발생하는 것을 볼 기회가별로 없습니다. 그래서 두 가지 가능성이 있습니다.
우선 (나에게 선호되는 것은 아니지만) 코드 생성 중에 사용되는 Sparx 매크로 언어의 내장을 탐구하는 것입니다. 기존 템플릿에 대해 약간의 수정 만하면되지만 괜찮은 새 템플릿 작성은 재미 없다 (나를 위해).
두 번째 방법은 코드 생성에 API를 사용하는 것입니다. 이것은 매우 쉽습니다. (대학에서 컴파일러를 공부 한 이래로 저에게 좋습니다.) 당신이해야 할 일은 상태 머신을 타고 그것을 가로 지르고 그에 따라 언어 구성을 뱉어내는 것입니다. 그것은 당신의 기술에 크게 의존하지만, 며칠 안에 대략적인 프로토 타입을 만들 것입니다.
편집 여기는 EA의 API를 사용하여 상태 머신을 구문 분석 샘플 펄 (난 당신이 일주일 정도 사용하지 않는 경우는 피타을 알고,하지만 당신은 가능성이 있지만 그것을 해독 할 수) 스크립트입니다
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
__no 조건 -> State1 정
주 State1 정
__condition -> 상태 2
__exit ->
주 상태 2
기타 조건 -> 주 1
첫 번째 StateNode는 이름없는 exit이고 다음은 InitialNode입니다 (API에서 해당 정보를 가져 와서 사용할 수도 있습니다). State1
에는 가능한 두 가지 전환이 있습니다 (종료하려면 State2
). State2
은 State1
으로 전환됩니다.
이제 이름이 지정된 상태 목록을 사용하여 다른 상태에 대한 열거 형을 만들 수 있습니다. 또한 if-cascades 또는 switch-statements로 변환 할 수있는 모든 변환에 대한 보호 기능을 제공합니다.
물론 이것은 완전한 코드 생성기는 아니지만이 비계에서 만드는 방법을 알 수 있습니다.
저는 3 학기의 자동화 학생입니다. 프로토 타입을 볼 수 있다면 정말 좋을 것입니다. :) – ptd
그 대답은 여기에 너무 길어질 것입니다. 기본적으로 StartNode를 가져 와서 나가는 전환을 얻고, 가드를 평가하고, 도달하는 모든 국가의 상태를 만듭니다. –
프로토 타입을 보내고 싶다면 이메일 주소를 알려줄 수 있습니다. 나는 당신이이 주제를 얼마나 잘 알고 있는지, 얼마나 오랫동안 "코드 번역기"를 만들 것인지, 그리고 프로그래머가 가져야 할 자격을 말할 수 있는지 알고 있습니다. SCL이 아닌 상태 시스템을 사용하는 것이 올바른지 알고 싶습니다. 따라서 사용자는 상태 머신을 만들어야하며, 마케팅 및 영업 부서의 사람들에게는 더 쉬울 것입니다. – ptd