Elektroda.pl
Elektroda.pl
X
SterControlSterControl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Step7, wskazniki, BLKMOV, typ Any

25 Kwi 2007 08:49 5579 6
  • Poziom 13  
    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.

    Code:

          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"
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • SterControlSterControl
  • Specjalista Automatyk
    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ę.
  • SterControlSterControl
  • Poziom 13  
    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
    Specjalista Automatyk
    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:
  • Poziom 13  
    Dziekuje bardzo, zabieram sie za analize :)
    Edit
    Bardzo pieknie napisany ten przyklad, jeszcze raz dziekuje.
  • Poziom 16  
    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
  • Specjalista Automatyk
    1.przeczytaj temat Link
    2.zastosuj mój podprogram (załącznik - register.zip)
    Wszystkie zmienne jako "Integer".