Mapping Tabellen, Multipumpensteuerung DEMO

Maagic7

Level-2
Beiträge
453
Reaktionspunkte
248
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist ein Thread, der eigentlich aus einer Frage im TIA Forum entstanden ist.
Alternierungsbaustein beliebig vieler Pumpen

Alternierungsbaustein beliebig vieler pumpen

Das hat eine ellenlagen Funktion ergeben, die nach meiner Auffassung sehr schlecht wartbar ist.
Da ich kurz an der Diskussion beteiligt war, dann aber feststellen musste, dass mein Vorschlag, das mit einer Mapping Tabelle zu lösen nicht auf anhieb funktioniert hat, musste ich erst mal meine Mapping Funktionen überarbeiten und nochmals etwas testen.
Da man die Technik mit den Mapping Tabellen relativ selten benötigt und das wahrscheinlich noch einige Diskussion auslöst, hab ich mich entschieden, dafür einen eigen Beitrag als Programmierstrategie aufzumachen.

Es gibt mit Sicherheit noch 100 weitere Ansätze das lösen, mir geht es aber eher darum, die Technik der Mapping Tabelle dafür zu zeigen!

Ich habe eine DEMO-Projekt für ein 4-Pumpensystem in Step7 classic erstellt und dieses dann auch nach TIA 15 konvertiert.

Die beiden Porojekte sind hier angehängt!

Anhang anzeigen MultiPumpCtrl_Step7.zip

Anhang anzeigen MultiPumpCtrl_TIA_V15.zip
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Würde es dir was aus machen, den Code zu posten?

Ausmachen natürlich nicht! Nur geht das nicht komplett. Das sind mehrere Bausteine, eingebettet in ein Projekt.
Dazu DBs und eine Variablentabelle, um das mit einer CPU oder in mit der simualtions SPS zu testen.

Ich häng den PDF Druck des Hautp-FBs mal hier an.

Hier der Code der blanken Mapping Funktion:
Code:
FUNCTION m7_MAP_4xBOOL : VOID
    TITLE ='Maps 4 IN to 4 OUT using a mapping table; BOOL'

// ==============================================================================
// This function maps 4 individual Inputs to 4 individual Outputs using a 
// mapping table MAP_1..MAP_4. There is no check FOR double using an INPUT 
// or OUTPUT.
//
// 2 mapping modes are available: Set it with cfg_InToOut_OutFromIn
// For MAP_TABLES [1,2,3,4] and [4,3,2,1] the result of both modes
// is identical
//
// Mode InToOut: The input is copyied to the output according to the MAP_TABLE
//               IN_x => OUT[MAP[x]]
//
// MAP_1 = 4 :  OUT_4 := IN_1   ; IN_1 => OUT_4
// MAP_2 = 2 :  OUT_2 := IN_2   ; IN_2 => OUT_2
// MAP_3 = 1 :  OUT_1 := IN_3   ; IN_3 => OUT_1
// MAP_4 = 3 :  OUT_3 := IN_4   ; IN_4 => OUT_3
//
// Mode OutFromIn : The output reads the corresponding input according to the 
//                  MAP_TABLE 
//                  OUT_x := IN[MAP[x]]
//
// MAP_1 = 4 :  OUT_1 := IN_4   ; OUT_1 <= IN_4
// MAP_2 = 2 :  OUT_2 := IN_2   ; OUT_2 <= IN_2
// MAP_3 = 1 :  OUT_3 := IN_1   ; OUT_3 <= IN_1
// MAP_4 = 3 :  OUT_4 := IN_3   ; OUT_4 <= IN_3
//  
// ==============================================================================
// 
// AUTHOR: S.Maag
// DATE: 07/2012
//
// CHANGELOG:
// ------------------------------------------------------------------------------
// DATE         NAME        DESCRIPTION
// ------------------------------------------------------------------------------
// 07.04.2020   S.Maag      Coverted to SCL 
//                          Now support 2 mapping modes InToOut and OutFromIn
//                          old version from 2012 was only for OutFromIn
// ------------------------------------------------------------------------------
 
    VERSION : '3.0'
    AUTHOR  : 'S.Maag'
    FAMILY  : 'Maagic7'

VAR_INPUT
  inBit1 : BOOL;
  inBit2 : BOOL;
  inBit3 : BOOL;
  inBit4 : BOOL;  
  MAP_1  : INT;     // mapping table MAP[1]
  MAP_2  : INT;     // mapping table MAP[2]
  MAP_3  : INT;     // mapping table MAP[3]
  MAP_4  : INT;     // mapping table MAP[4]
  cfg_InToOut_OutFromIn : BOOL;  // 0: inBit_x => OUT[MAP_x]; 1: OUT_x := inBit[MAP_x]
END_VAR

VAR_OUTPUT
    outBit1 : BOOL;
    outBit2 : BOOL;
    outBit3 : BOOL;
    outBit4 : BOOL;
END_VAR
    
VAR_TEMP
    memIN : ARRAY[0..7] OF BOOL; 
    memOUT: ARRAY[0..7] OF BOOL;
    ptr_memOUT AT memOUT : BYTE;
END_VAR
  
    ptr_memOUT := B#16#0;  // memOUT[] := 0;
     
    IF cfg_InToOut_OutFromIn THEN
    // OutFomIN
    // OUT_x := inBIT[MAP_x];
        memIN[0] := FALSE;
        memIN[1] := inBit1;
        memIN[2] := inBit2;
        memIN[3] := inBit3;
        memIN[4] := inBit4;
        
        IF MAP_1 <=4 THEN memOUT[1] := memIN[MAP_1]; END_IF;
        IF MAP_2 <=4 THEN memOUT[2] := memIN[MAP_2]; END_IF;
        IF MAP_3 <=4 THEN memOUT[3] := memIN[MAP_3]; END_IF;
        IF MAP_4 <=4 THEN memOUT[4] := memIN[MAP_4]; END_IF;

    ELSE
    // InToOut
    // inBIT_x => OUT(MAP_x]
        IF MAP_1 <=4 THEN memOUT[MAP_1] := inBit1; END_IF;
        IF MAP_2 <=4 THEN memOUT[MAP_2] := inBit2; END_IF;
        IF MAP_3 <=4 THEN memOUT[MAP_3] := inBit3; END_IF;
        IF MAP_4 <=4 THEN memOUT[MAP_4] := inBit4; END_IF;
    END_IF;

    outBit1 := memOUT[1];
    outBit2 := memOUT[2];
    outBit3 := memOUT[3];
    outBit4 := memOUT[4];

END_FUNCTION

// **********************************************************************
 

Anhänge

Zuletzt bearbeitet:
Achtung das Beispiel MultiPumpenCtrl hat wahrscheinlich einen Fehler!
Uns ist das erst vor kurzem bei einer Anlage mit vielen Heizungen aufgefallen.
Das eigentliche Mapping ist davon aber nicht betroffen.

Der Fehler liegt im Sortierungsbaustein um die Pumpen einzureihen.
Dieser verdreht unter bestimmten Umständen die Zuordnung.
Ich hab den Sortierungsbaustein mittlerweile überarbeitet.
Das abschließende o.k. vom Test steht aber noch aus!
 
Zurück
Oben