2017-01-19 6 views
1

상태 머신/다이어그램으로 PLC를 프로그래밍 할 수 있는지 알고 싶습니다.UML 상태 시스템을 SCL로 변환 하시겠습니까?

Sparx EA의 도움으로 상태 시스템을 구성 할 수 있습니다. 이 상태 머신을 SCL (Structured Control Language, PLC 프로그래밍에서 사용됨)으로 변환 할 수 있습니까? 또는 Sparx EA에서 어떤 종류의 데이터를 가져올 수 있습니까? PLC 프로그래밍을위한 입력으로 사용할 수 있습니까?

또는이 아이디어를 실현하는 방법을 더 잘 알았을 수도 있습니다.

답변

1

저는 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). State2State1으로 전환됩니다.

이제 이름이 지정된 상태 목록을 사용하여 다른 상태에 대한 열거 형을 만들 수 있습니다. 또한 if-cascades 또는 switch-statements로 변환 할 수있는 모든 변환에 대한 보호 기능을 제공합니다.

물론 이것은 완전한 코드 생성기는 아니지만이 비계에서 만드는 방법을 알 수 있습니다.

+0

저는 3 학기의 자동화 학생입니다. 프로토 타입을 볼 수 있다면 정말 좋을 것입니다. :) – ptd

+0

그 대답은 여기에 너무 길어질 것입니다. 기본적으로 StartNode를 가져 와서 나가는 전환을 얻고, 가드를 평가하고, 도달하는 모든 국가의 상태를 만듭니다. –

+0

프로토 타입을 보내고 싶다면 이메일 주소를 알려줄 수 있습니다. 나는 당신이이 주제를 얼마나 잘 알고 있는지, 얼마나 오랫동안 "코드 번역기"를 만들 것인지, 그리고 프로그래머가 가져야 할 자격을 말할 수 있는지 알고 있습니다. SCL이 아닌 상태 시스템을 사용하는 것이 올바른지 알고 싶습니다. 따라서 사용자는 상태 머신을 만들어야하며, 마케팅 및 영업 부서의 사람들에게는 더 쉬울 것입니다. – ptd

2

확실히. 상태 머신 다이어그램을 읽을 수있는 코드 생성 도구가 필요하며 이에 상응하는 구조화 된 텍스트를 생성해야합니다.

코드의 모양은 매우 간단합니다. 각 비트에 대해 ST 부울을 정의 할 수 있습니다 (StateCharts와 같이 실시간 병렬 상태를 가질 수있는 경우) 또는 상태 번호가 포함 된 ST 정수를 정의 할 수 있습니다.

각 상태에 대한 ST의 코드는 다음입니다 : 각 상태에 대해이 코드를 생성 할 필요가

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

.

이 질문에 대한 대답은 이 무엇입니까? 아마도 UML 다이어그램을 읽을 수있는 도구 일 것입니다. 일반적으로 UML 편집기에서 XML 문서로 내보낼 수 있습니다. 구문 분석 된 XML을 사용하여 코드를 작성하여 위의 코드 조각을 뱉어 낼 수 있습니다.

잘 정의 된 템플릿 인 조각을 작성하는 경우이 방법이 더 쉽습니다. 임시 템플릿 (무언가를 입력해야하는 곳에 마커가 포함 된 텍스트 문자열)을 사용하거나 Program Transformation System (PTS)과 같이 생성 된 코드의 구조와 구성을 적용하는 도구를 사용할 수 있습니다.

PTS는 언어에 대한 문법을 ​​허용하고 해당 언어의 인스턴스를 구문 분석 한 다음 해당 언어를 변형시켜 최종적으로 수정 된 언어 인스턴스를 유출시킵니다. 유용한 특별한 경우는 사소한 프로그램을 복잡하고 실제적인 프로그램으로 변형시키는 것입니다. 또한 훌륭한 PTS를 사용하면 정식 코드 템플릿과 관련하여 패턴 및 변환 규칙을 작성할 수 있으므로 템플릿의 구문을 유효하게 적용 할 수 있습니다. 이렇게하면 작업하는 피스가 항상 최소한의 의미를 갖도록 할 수 있습니다. 반대로 텍스트 템플릿에 원하는 쓰레기를 작성할 수 있습니다. 그러한 패턴을 많이 쓸 때, 이것은 꽤 정크를 피하는 데 도움이됩니다. DMS가이 패턴을 인스턴스화하는 API (등을 제공

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 
    "; 

, 당신은 일반적으로 쓰기 :이 특정 예를 들어

는, 당신은 위의 조각에 대한 패턴을 쓸 수 있습니다 (내 회사의 PTS는 바이오를 참조 DMS라고도 함) 많은 것들)를 생성하고 결과를 작성 (인스턴스화 된 패턴을 다른 패턴에 대한 인수로 사용하여 인스턴스화)하여 최종 프로그램을 작성하십시오. 변환 규칙을 추가하여 생성 된 코드를 최적화 할 수도 있습니다. (DMS는 문법 정의에 의해 구동되며 이미 40 개 이상의 언어를 알고 있으며 특히 ST 및 XML에 대한 강력한 정의가 있습니다.

+0

답변 해 주셔서 감사합니다. 그러나 s7 코드를 만들 때 전체 코드를 하나의 문서에 넣을 수는 없습니다. 그래서 s7에서 다른 모듈에 배치해야합니다. 즉, 새로운 모듈을 만들고 코드를 복사하는 과정을 자동화해야합니다. 어떤 생각? – ptd

+0

그것은 단지 더 많은 변형입니다. PTS는 단일 입력 문서에서 여러 소스 파일을 작성할 수 있어야합니다. 모듈 구조 자체는 코드의 일부로 채워지는 또 다른 패턴입니다. PTS에 생성 된 전체 코드 중 어느 부분이 어떤 파일에 포함되는지 결정하기 위해 PTS에 추가 장비가 필요합니다. 대부분의 PTS는 분석을 할 수 있지만 때로는 어색합니다. DMS는 맞춤형 분석기를 지원합니다. 기준은 무엇입니까? –

0

Siemens PLC-s를 사용하는 경우 S7에는 s7-graph라는 선택적 소프트웨어 패키지가 있습니다. http://w3.siemens.com/mcms/simatic-controller-software/en/step7/simatic-s7-graph/Pages/Default.aspx. 거기에 상태 머신을 구현할 수 있습니다. 그러나 가져 오기 옵션에 대해서는 알지 못합니다.

상태 시스템으로 제어되는 일부 장비에는이 기능을 사용했습니다. 그 소프트웨어 패키지는 무료가 아니었고, 나는 그것이 가격이라는 것을 기억하지 못한다. 또한 모든 S7 PLC 제품군이이를 지원하는지 여부는 알 수 없습니다. 나는 400 시리즈를 사용했고 거기에서 일했다.

지멘스 디스트리뷰터에게 문의하여 프로젝트에서 사용하기 전에 조금만 가지고 놀 수 있도록하십시오.

+0

이 정보에 대해 감사드립니다. – ptd