logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Algorytm sortowania ciśnień w PLC Siemens S7-200/Unitronics

michasp 15 Sie 2009 10:05 2957 3
  • #1 6895086
    michasp
    Poziom 17  
    Posty: 308
    Pomógł: 1
    Ocena: 11
    Witam,

    temat jak w tytule. Dawno nie programowałem żadnego PLC, stąd proszę o pomoc szanownych kolegów. Będę miał w kilkunastu MW (słowach wejściowych pochodzących z panela) - dane. Są to ciśnienia z układu: P1, P2, P3, P4 ... z identycznych kilkunastu gałęzi, do których podpinamy różne rzeczy do testowania. Będzie to dajmy na to: P1 - MW 2, P2 - MW 4, P3 - MW 6 ... MW 36. Każdemu ze słów jest przyporządkowany pomiar ciśnienia w określonym miejscu w układzie. Potrzebuję jakiegoś algorytmu, aby maszyna startowała tę drabinkę działania czujnika PX, w której jest najwyższa wartość w MW. Czyli jeśli np. P1: 10 bar, P2: 14 bar, P3: 7 bar, P4: 11 bar, P5: 10 bar, to maszyna ma zacząć pompowanie kolejno: P2, P4, P1, P5, P3. Drabinka dla każdego P będzie identyczna, lub podobna. Chodzi mi tylko o to, jak sprytnie zacząć od wartości najwyższej do najniższej. Sterownik ma być klasy Siemens S7-200 lub Unitronics (ten ma chyba tylko drabinkę).

    Pomóżcie coś poradzić,

    M

    Dodano po 4 [godziny] 40 [minuty]:

    Chyba na coś wpadłem, jakby zacząć od maksymalnej wartości np. 16 bar, i w każdej linii porównywać wartość zadaną, czy jest większa od 16 - jeśli by była - realizowałbym działanie, a byłoby to odznaczane specjalnym bitem. W sprawdzaniu mniejszej liczby (15,14,13...) linia, która spełniała warunek >16 nie brałaby udziału. Po sprawdzeniu wszystkich linii (dla 16) - dodaniu do jakiegoś słowa po każdym bicie z linii - maszyna odejmowała by od 16 jeden - i cykl sprawdzenia obejmował by wszystko z 15. Tak by się schodziło coraz niżej. Aż do wykonania działań z wszystkich linii. Jeśli byłoby to np. przy 7 (bo nie byłoby zadanych ciśnień poniżej 7 bar), cykl działań wskakiwałby od początku - tzn. wartością sprawdzaną byłoby znowu 16.

    Może to trochę zagmatwane, ale pochłonęłoby to trochę komparatorów i chyba załatwiłoby to sprawę.

    M
  • Pomocny post
    #2 6902003
    arkady_pl
    Poziom 24  
    Posty: 574
    Pomógł: 59
    Ocena: 24
    Pomysł jest ok, zakładając, że nie ma wartości powyżej 16. Komparatorów będziesz miał tyle ile linii pomiarowych. Do tego wystarczy jeden rejestr z wartością do porównania.
  • Pomocny post
    #3 6908821
    roks
    Specjalista Automatyk
    Posty: 524
    Pomógł: 77
    Ocena: 55
    Witam

    Ile jest tych pomiarów ? ->dla 4-5 jest to stosunkowo proste .

    Bardziej niż o sortowanie chodzi o znalezienie najwiekszej wartości spośród X pomiarów .

    pozdrowienia

    PS. Wielkość kodu zależy tylko od ilości pomiarów , w sterowników zakładając że jest X pomiarów , dla jednego cyklu sterownik wykona X-1 porównań , choć komparatorów będzie więcej . Dla przykładu dla 4 pomiarów wykonywane będą 3 porównania , w programie trzeba użyć 7 komparatorów , to przy najprostszej realizacji algorytmu . z każdym kolejnym pomiarem ilość porównań rośnie o jeden , jednak ilość komparatorów w postępie geometrycznym :-(

    O ile da się wykorzystać w sterowniku tablicę jednowymiarową to 1 komparator i X-1 porównań . To sprawdzę -> dla S7-200 napewno możliwe , dla Unitronicsa muszę sprawdzić .

    Dodano po 5 [godziny] 31 [minuty]:

    Witam poniżej co prawda w IL ale na tyle proste że w każdym sterowniku do się przełożyć na drabinkę - > kod programu dla 5 pomiarów , ale w zasadzie można zrobić dowolną liczbę.

    warunkiem jest możliwość operowania na tablicach w sterowniku .
    
    (* warunki początkowe *)
    Ld 1
    st i
    
    ld 2
    st j
    (*-------------------*)
    (* ładowanie tablicy *)
    Ld pomiar_1
    st pomiary[1]
    Ld pomiar_2
    st pomiary[2]
    Ld pomiar_3
    st pomiary[3]
    Ld pomiar_4
    st pomiary[4]
    Ld pomiar_5
    st pomiary[5]
    (*----------------------------------*) 
    
    poczatek:
    ld j
    ge 6 (* wyjście z pętli porównań dla 5 pomiarów  *)
    jmpc koniec
    
    Ld pomiary[i] (* porównanie *)
    ge pomiary[j] 
    jmpcn iteracja_1 
    
    ld j
    add 1
    st j
    
    ld i 
    st x
    
    jmp poczatek
    
    iteracja_1:
    
    LD j 
    st X
    
    Ld j
    st i
    
    ld j 
    add 1
    st j 
    jmp poczatek 
    
    koniec: (* koniec porównań *)
    
    (* X jest numerem pomiaru o najwiekszej wartości *) 


    wykonywane jest w tym przypadku są cztery porównania, także działać będzie bardzo szybko nawet przy 50 pomiarach -> 49 porównań

    w razie pytań proszę pisać

    pozdrowienia
  • #4 6923563
    michasp
    Poziom 17  
    Posty: 308
    Pomógł: 1
    Ocena: 11
    Dziękuję wszystkim, rozwiązałem to jak opisywałem powyżej. Komparatorów jest tyle co linii - podstawiam wartość X i po przejściu danej liczby odejmuję jeden. Jest to stosunkowo nieskomplikowany algorytm, a robi co trzeba. Za chwilę rozpocznę kolejny temat, ale już odnośnie PID w S7-200.

    Pozdrawiam!

    M
REKLAMA