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

Jak użyć BLKMOV w Step7 do przesłania tekstu do DB 10?

Goompas 25 Kwi 2007 08:49 6899 6
  • #1 3819378
    Goompas
    Poziom 13  
    Posty: 123
    Pomógł: 3
    Ocena: 2
    Witam.
    W zmiennej lokalnej o nazwie #Tekst_To_Send funkcji FB5 znajduje sie tekst, ktory chce wyslac przez modul RS-a. Jednak zeby to zrobic musze go przepisac do DB, jak to zrobic? Wiem ze musze uzyc BLKMOV i zmiennej typu Any. Chce przepisac ten tekst do DB 10 w ktorym w DBW 26 zadeklarowalem zmienna typu STRING[25].
    Robie to w ten sposob, jednak nie dziala.
    #DBArea jest typu Any, #StringLEn jest typu Int.
    Bede wdzieczny takze za jakiekolwiek informacje/materialy na temat uzywania wskaznikow w Step7.

    
          A     #DodanoDlugosc
          L     P##DBArea
          LAR1  
    //typ byte
          L     W#16#1002
          T     LW [AR1,P#0.0]
    //lengh
          L     #StringLen
          T     LW [AR1,P#2.0]
    //DB_No
          L     10
          T     LW [AR1,P#4.0]
    //memory area
          L     W#16#8400
          T     LW [AR1,P#6.0]
    //DBB_No
          L     26
          T     LW [AR1,P#8.0]
    //Przepisanie
          CALL  "BLKMOV"
           SRCBLK :=#Tekst_To_Send
           RET_VAL:=#RetMove
           DSTBLK :=#DBArea
    
          S     "ZapisanoTekst"
    
  • #2 3822482
    andy1955
    Specjalista Automatyk
    Posty: 700
    Pomógł: 136
    Ocena: 50
    tak na szybko
    Funkcja BLKMOV oczekuje dwóch any-pointerów - źródła oraz celu.
    Zdefiniowałeś tylko cel (poprawności nie sprawdzałem ) .Jako źródło podałeś bezpośrednio wartość (ciąg) string ale BLKMOV oczekuje adresu z dodatkowymi parametrami. W jaki sposób można zbudować ANY ,który wskazywałby na lokalną wartość w jednej funkcji (obszar pamięci b#16#86) to muszę się jeszcze zastanowić (w sobotę lub w niedzielę mam więcej czasu).
    Druga sprawa: nie bardzo rozumiem czemu ma to służyć :
    A #DodanoDlugosc
    ...
    S "ZapisanoTekst"
    Rozkaz "L" jest zawsze wykonywany niezależnie od VKE (wyniku binarnego).
    Więcej postaram się napisać w sobotę lub niedzielę.
  • #3 3826143
    Goompas
    Poziom 13  
    Posty: 123
    Pomógł: 3
    Ocena: 2
    Ok poczekam, chociaz poradzilem sobie w inny sposob, ale moze ten bedzie lepszy.
    To A #DodanoDlugosc, chcialem przez to zrobic, aby te instrukcje byly wykonywane dopiero po wykonaniu innych wczesniejszych, jakgdyby kontrola krokow.
  • Pomocny post
    #4 3829238
    andy1955
    Specjalista Automatyk
    Posty: 700
    Pomógł: 136
    Ocena: 50
    A oto moja odpowiedz.Oczywiscie to rozwiazanie nie jest rozwiazaniem jedynym ale zasada budowy ANY- Pointera jest taka sama.
    Zalacznik otworzyc za pomoca Step7.
    Do tworzenie adresu w ANY można również wykorzystać Pointer P#
    np. zamiast:
    L 4 //tworzenie adresu startowego -pointera
    ITD //tworzenie adresu startowego -pointera
    SLD 3 //tworzenie adresu startowego -pointera
    T LD [AR1,P#6.0]

    można zapisać:
    L P##Tekst_To_Send // 2 Versja tworzenia adresu
    T LD [AR1,P#6.0]
    ale pierwszy przykład jest bardziej wszechstronny (można szybko zaprogramować pośrednio adres używając zmiennej typu Integer)
    Oczywiście adres docelowy mozna utworzyć w ten sposób:
    L 10 //Numer DB
    T LW [AR1,P#4.0]

    L P#DBX 22.0 // Poczatek adresu docelowego
    T LD [AR1,P#6.0] //tworzenie adresu docelowego

    L B#16#84 //typ danych w tym przyp DB
    T LB [AR1,P#6.0]
    Załączniki:
    • Any.zip (327.01 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #5 3841349
    Goompas
    Poziom 13  
    Posty: 123
    Pomógł: 3
    Ocena: 2
    Dziekuje bardzo, zabieram sie za analize :)
    Edit
    Bardzo pieknie napisany ten przyklad, jeszcze raz dziekuje.
  • #6 6293073
    aprzycho
    Poziom 16  
    Posty: 266
    Pomógł: 7
    Ocena: 25
    witam,

    Mam wywolanie

    CALL "BLKMOV"
    SRCBLK :=P#DB1001.DBX0.0 BYTE 3
    RET_VAL:=LW10
    DSTBLK :=P#DB1000.DBX0.0 BYTE 3

    Chce żeby numer DB liczba bajtów kopiowanych była parametrem. Jak to zrobić najszybciej.
    Pozdrawiam
  • #7 6294605
    andy1955
    Specjalista Automatyk
    Posty: 700
    Pomógł: 136
    Ocena: 50
    1.przeczytaj temat Link
    2.zastosuj mój podprogram (załącznik - register.zip)
    Wszystkie zmienne jako "Integer".

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy użycia funkcji BLKMOV w środowisku Step7 do przesłania tekstu z lokalnej zmiennej typu STRING do bloku danych DB10, gdzie tekst ma być zapisany w polu STRING[25] w DBW26. Problem polega na prawidłowym zdefiniowaniu wskaźników typu ANY, które BLKMOV wymaga jako parametrów źródła i celu. Wskazano, że BLKMOV oczekuje wskaźników z dodatkowymi parametrami adresowymi, a nie bezpośrednich wartości tekstowych. Zaproponowano tworzenie wskaźników ANY za pomocą instrukcji L, T oraz wykorzystanie wskaźnika P# do adresowania pamięci, co umożliwia dynamiczne wskazywanie lokalizacji danych w pamięci PLC. Przykłady pokazują, jak skonstruować wskaźnik do lokalnej zmiennej tekstowej oraz do docelowego obszaru w DB10, uwzględniając numer DB, offset i typ pamięci (byte, word). Autor otrzymał również wskazówki dotyczące kontroli kolejności wykonywania instrukcji oraz sugestie dotyczące użycia wskaźników i ich budowy w Step7. W dalszej części dyskusji pojawiły się pytania o parametryzację numeru DB i liczby bajtów kopiowanych w wywołaniu BLKMOV oraz propozycje wykorzystania podprogramów i zmiennych typu Integer do tego celu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA