ПЛК: преобразование структурированного текста (ST) в функциональную блок-схему (FBD) - PullRequest
0 голосов
/ 21 января 2019

Известен ли способ преобразования существующего структурированного кода текстового ПЛК в функциональную блок-схему ?(Или даже CFC с Beckhoff)
Я знаю, что это сложно из-за различных потоков языков, на которых основаны.
Может быть, только частично или по крайней мере какая-то структура с правильными переменными, связанными с функциейблоки?
Я должен создать обзор логического кода в Visio, основанный на внешнем виде FBD, и было бы очень полезно иметь хотя бы некоторую структуру, на которой бы основывались мои рисунки, и не нужнорисовать все из базового кода ST.

Небольшой пример кода, будь этот FB «BrakeControl», сделанный в ST, но есть гораздо большие FB, которые мне нужно отобразить:

IF stSettings.bExists THEN
      IF stSettings.eMode = E_OPMode.eOPModeOpen OR stSettings.eMode = E_OPMode.eOPModeClose THEN
        // close brake manual - only possible if below max braking rpm and hydraulic closed
        bCloseBrake := stSettings.eMode = E_OPMode.eOPModeClose AND stIO.stGenerator.IstGen_Speed.fPercent < stSettings.fStartRev AND itfHydCtrl.IsClosed;
    ELSE
        IF stIOs.IbBrake_Auto AND stIOs.IbBrake_Worn AND  
           (itfTurbCtrl.State = E_TurbState.eTurbStateFault OR 
            itfTurbCtrl.State = E_TurbState.eTurbStateStop OR
            itfTurbCtrl.State = E_TurbState.eTurbStateReady )           
        THEN
            IF stIO.stGenerator.IstGen_Speed.fPercent < stSettings.fStartRev AND itfHydCtrl.IsClosed THEN
                bCloseBrake := TRUE;
            END_IF  
        END_IF

        IF stIOs.IbBrake_Auto AND NOT stIOs.IbBrake_Worn AND itfTurbCtrl.ManualMode THEN    
            IF stIO.stGenerator.IstGen_Speed.fPercent < stSettings.fStartRev AND  stIO.stPenstock.IbBypass_Closed 
                AND stIO.stPenstock.IbMIV_Closed AND itfHydCtrl.IsClosed THEN
                bCloseBrake := TRUE;
            END_IF  
        END_IF

    END_IF

    IF bBrakeRelease THEN
        bCloseBrake := FALSE;
    END_IF  
    stIOs.QbBrake_On := bCloseBrake;

1 Ответ

0 голосов
/ 23 января 2019

Нет, это невозможно напрямую.Существует преобразование между Ladder и FBD, и если вы перенесете код на Codesys, вы можете добавить IL в этот список.К сожалению, ST никак не может быть автоматически перенесен.

Там, где раньше у меня были требования к клиенту, я поместил код в отдельную библиотеку, а затем использовал FB как блок в FBD / CFC.Это может показаться немного «несправедливым», но цель хорошо написанного программного обеспечения - создавать абстракции на все более высоких уровнях.Вы можете утверждать, что этот низкоуровневый блок управления тормозом находится на соответствующем уровне абстракции, чтобы не требовать дополнительной детализации - вы бы не разбирали блок «TON» для своего клиента.Я понимаю, что это может не сработать для некоторых из ваших больших FB, но, возможно, вы могли бы провести некоторый рефакторинг тех из них в меньшие FB, а затем использовать описанный выше подход?новый язык.Я не уверен, что мне было бы удобно сделать «порт для документов» и гарантировать такую ​​же функциональность для чего-то нетривиального.Блоки CFC имеют определенный порядок вызовов, который может вызвать условия гонки, если вы не будете осторожны, и FBD приближается назад (или, во всяком случае, я так думаю!).

Удачи с ним.

...