Sziasztok!
Egy SIEMENS S7 300 CPU/STEP7 V5.5 problémám adódott a napokban. Kérlek Titeket, aki tud, segítsen nekem ennek a feldolgozásában. Megpróbálom az alábbiakban érthetően felvázolni a helyzetet. Lehet, kicsit hosszú lesz.
Adott egy FB (nevezzük a továbbiakban FB1-nek, a példa kedvéért), amiben van egy pl. #ABC szimbolikus című array (elemeinek típusa, nagysága szerintem most nem releváns), a STAT deklarációs területen. Az FB-ben az alábbi módszerrel kinyerem a tömb kezdőcímét:
LAR1 P##ABC //Legyen #ABC kezdőcíme pl. a 20. byte-on
TAR1
L DW#16#FFFF
AD
SRD 3
T #TempAddr1 //Temporary területen deklarált Dint. Ennek az értéke lesz így 20.
#TempAddr1-re írt adattal aztán később, kisebb mértékű matekozás után és any pointer alkalmazásával a tömb elemeit címezgetem, („teszek-veszek” ). Működik is a dolog, kipróbáltam. Pöpec, de…
Nos, addig minden szuperül klappol, amíg az FB1 egy saját iDB-vel van összeeresztve. Abban az esetben, amikor az FB1-et meghívom egy másik FB-ben (esetemben, ami már egy harmadikban szintén meg lett hívva) és az én FB1-em így bekerül egy multiinstance DB definiált memóriaterületére, az emiatt bekövetkező események hatásai határozottan a nem szuper skálázási tartományba csapnak át.
Elemezve a problémát azt tapasztaltam, hogy a „LAR1 P##ABC” utasítás továbbra is a #ABC tömb relatív kezdőcímét (a példa szerinti 20-at, nyilván a helyes rutin szerint) tölti be AR1 címregiszterbe, holott a multiinstance DB-ben a #ABC tömb abszolút kezdőcíme lehet, teszem azt 314.0 (vagy akármi). Így viszont nem ketyeg megfelelően a matek a későbbiekben (pontosabban nem oda címzek, ahová szándékozok). Nyilván nem kell részleteznem azt a – helyes programműködéssel merőben összeegyeztethetetlen – pánikra okot adó, kellemetlen impressziót, amikor azt láttam, hogy az én utólag bebiggyesztett FB1-em a multiinstance blokk 20-as címtartománya körül „tesz-vesz”, a 314 körüli helyett! Szerencsére szimulátorral próbáltam, nem élesben.
Az a kérdésem lenne, hogy ezt a részletproblémát hogyan lehet elegánsan kezelni? Magyarán az én FB1-em, bárhova kerüljön is egy multiinstance DB-ben, a #ABC tömb kezdőcímének meghatározása helyesen történjen. Bocsesz, tiszta ciki, de nem jöttem rá a megoldásra magamtól. Nem nagyon szoktam adatterület címtartományokkal matekozni, nincs benne kellő praxisom, de most kellene.
Arra gondoltam, hogy az FB1-nek kívülről, IN paraméteren keresztül megadom a multiinstance DB-n belüli kezdőcímét és ezt bekalkulálom a #ABC tömb elemeinek címzéséhez szükséges számításokba, de szerintem közületek valakinek biztosan van erre jobb megoldása. Legyetek szívesek segítsetek, ha tudtok. Csak, hogy ne haljak meg hülyén. Előre is köszönöm!
RM