Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Blok danych DB z blokiem danych FB

2010712 14 Jan 2013 17:00 3105 7
  • #1
    2010712
    Level 17  
    Witam,
    Bawię się w Step 7 i dziwną rzecz napotkałem. przy wywołaniu FB z DB,
    Mam blok funkcyjny w którym wywołuję funkcję SFC20 i SFC 21 po 2 razy. Chcę przypisywać nimi wartośći do DB.
    Wszystko byłoby OK gdyby utworzył DB instance z moim FB i wywołałbym. Ja natomiast chcę stworzyć swój DB o swojej strukturze, gdzie miałbym dwie macierze i 2 stringi. Tworząc DB shared mam taką możliwośća,ale nie mogę go już później przypisać do mojego FB (podświetlenie na czerwono) w OB1.
    Jest na to jakieś rozwiązanie. Pytanie kieruję do kolegów wymiataczy w Step 7 Rkarcz i ElMapet;-)


    II PYTANIE,
    Co może być złego w kodzie poniższym (ma to być gen.impulsów np. raz 5s a raz 10s na jednym wyjściu):
    AN I124.0
    R T1
    R Q8.0
    JC M1
    A T1
    JC M1
    AN Q8.0
    = Q8.0
    L S5T#10s
    JC M2
    L S5T#5s
    M2: SE T1
    M1: NOP 0

    Dodam,że w powyszej sytuacji lapka miga prawie niezauważalnie
  • #2
    andy1955
    Automation specialist
    Quote:
    Tworząc DB shared mam taką możliwośća,ale nie mogę go już później przypisać do mojego FB (podświetlenie na czerwono) w OB1.

    Każdy FB generuje swój DB (Instance) o własnej strukturze i dlatego kiedy podstawiasz swój DB to wyskakuje błąd.
    Nie wiem dlaczego chcesz to zrobić ?
  • #3
    2010712
    Level 17  
    Ponieważ jak tworzę DB instance to on posiada zmienne w DB czyli 4xSFC a moje macierze i stringi są wpisywane za pomocą POINTERA (pewne dlatego nie generują się DB instance) tworząc od "ręki" DB mogę stworzyć w nim obszar który mnie interesuje
  • #4
    PikaCZ
    Level 12  
    Witam,

    Blok DB Instance (DBI) to blok który jest zawsze tworzony automatycznie i zawiera definicje wszystkich zmiennych (In, Out, Stats) zdefiniowanych w funkcji FB. Można powiedzieć że ten blok to taka pamięć dla danej funkcji FB. Do każdego wywołanie funkcji FB musisz podać nowy blok DBI, nową instancję.

    Blok DB shear, jest rodzajem pamięci globalnej, możesz w nim zapisać wszystko co chcesz nie zależnie od definicji jakiejkolwiek funkcji FB którą masz w programie.

    Jeżeli w swojej funkcji FB chcesz wykorzystać dane znajdujące się w zdefiniowanym przez ciebie DB bloku możesz to zrobić na kilka sposobów.

    Jednym z najprostszych i powiedzmy eleganckich sposobów jest przekazanie numer DB bloku przez wejście do funkcji FB którego typ zdefiniowany jest jako "DB num" (czy coś takiego, piszę z głowy). Niestety w ten sposób pisząc kod funkcji FB nie będziesz widział logicznej struktury swojego DB bloku.

    Jeżeli twoja funkcja FB ma zawsze pracować z tym samy blokiem danych DB wtedy możesz w kodzie funkcji odwoływać się bezpośrednio do tego bloku bez przekazywania numeru jako parametru.

    Wszystko zależy od tego co chcesz osiągnąć.
  • #5
    Rkarcz
    Automation specialist
    2010712 wrote:
    Ponieważ jak tworzę DB instance to on posiada zmienne w DB czyli 4xSFC a moje macierze i stringi są wpisywane za pomocą POINTERA (pewne dlatego nie generują się DB instance) tworząc od "ręki" DB mogę stworzyć w nim obszar który mnie interesuje


    To co chciałbyś stworzyć w bloku DB (nie instance) stwórz w DB instance. Takie obszary do których będziesz się odnosił pointerem. I nie ma znaczenia gdzie je umieścisz IN, OUT, IN_OUT, STAT. Kwestia adresowania pointerem po zmiennej, a nie po numerze zmiennej - P##zmienna. Stwórz sobie zmienne na jakich chcesz operować i zostaną one wygenerowane przy użyciu FB. Sam tak robię. Np. dla SCADY tworzę masę nastaw, które są jako wejścia do których nic nie podpinam z zewnątrz. Mają być w strukturze zmiennych i używam je wewnątrz bloku.
  • #6
    2010712
    Level 17  
    Mam taki FB:
    Blok danych DB z blokiem danych FB

    a taki DB:
    Blok danych DB z blokiem danych FB

    gdy w OB1 wywołuję FB , DB podświetla na czerwono. Dopiero gdy stworzę DB instance to jest ok, ale nie ma zdefiniowanego obszaru jak na rys DB.

    Jak zrobię tak jak mówicz, czyli zdefiniuję w FB w parametrach jak niżej:
    Blok danych DB z blokiem danych FB

    wygeneruje DB instance jak niżej:

    Blok danych DB z blokiem danych FB

    Co może być przyczyną podświetlenia na czerwono w opisywanej sytuacji?
  • #7
    Rkarcz
    Automation specialist
    Jeśli tworzysz FB to po to, żeby je wielokrotnie powielać z różnymi odwołaniami do parametrów - po to masz DB Instance dla każdego wywołania.
    A ty wewnątrz FB odwołujesz się do zmiennych spoza bloku FB. Mało to przejrzyste i przede wszystkim nie powielalne n-razy. Tak naprawdę możesz to przepisać pętlą stosując właśnie pointery z 2 obszarów tego samego FB.
  • #8
    2010712
    Level 17  
    Rkarcz wrote:
    przepisać pętlą stosując właśnie pointery z 2 obszarów tego samego FB.
    nie rozumiem tego przepisania pętlo. Mógłbym prosić o jakieś jaśniejsze wskazówki? Dziękuję