Új hozzászólás Aktív témák

  • Szirty

    őstag

    válasz norcee #2122 üzenetére

    Hali norcee!

    Példaképp írtam egy rövid kódot, ami hasonlót művel. Próbálj meg ebből kiindulni ha amegfelel:

    L #Kezdet // A a kért elem száma (ha ez 0, akkor az első elemet adja vissza)
    L 4
    *I // A kezdőcím előállítása (*4, mivel REAL duplaszó, ami 4 byte)
    L 50
    +I // 50 hozzádása (50-es címen van az első real típusú elem, amit ki kell olvasni)
    SLD 3 // Léptetés a bit címek miatt, a pointer előállításához
    T #Ptr // #Ptr a kért elem címére mutat az instance DB-n belül
    L DID [#Ptr] // A kért elem betöltése
    T #Eredmeny // A kért elem másolása a kimeneti duplaszóba

    Ez egy FB-ben van, ahol az interface rész így fest:
    FUNCTION_BLOCK FB 2
    TITLE =
    VERSION : 0.1

    VAR_INPUT
    Kezdet : INT ;
    Hossz : INT ;
    END_VAR
    VAR_OUTPUT
    Eredmeny : REAL ;
    END_VAR
    VAR
    Dummy1 : ARRAY [1 .. 42 ] OF BYTE ;
    Real_1 : ARRAY [1 .. 100 ] OF REAL ;
    END_VAR
    VAR_TEMP
    Ptr : DWORD ; //Pointer
    END_VAR

    A #Hossz-nak itt nincs szerepe, a #Dummy1 tömb pedig csak azért van, hogy az 50-es címen kezdődjön az a 100 valós típusú változó.

    A blokk #Eredmény kimeneten visszaadja a #Kezdet-ben megadott számú elemet Real_1 tömbből.

    Ha egyszerre több elemet kell másolni, akkor a célnál annyi elem fog landolni ahányat másolsz, ez gondolom nem vitás. Emiatt (a változó adathossz miatt) ez vagy ANY típus lehet (mármint a cél paramétere) vagy egy DB, amiben előre el van készítve annyi elem, amennyinél többet soha nem másolsz.
    Ez a része nem volt világos annak hogy hogyan akarod. De az BLKMOV-val megoldható, ha összeállítasz neki egy (vagy ha a célnak is kell, akkor kettő ANY pointert, éppen úgy, ahogy w3dzz-nek szóló üzenetben is szó van róla.

Új hozzászólás Aktív témák