Új hozzászólás Aktív témák
-
Szirty
őstag
Helló bodnarg!
"S 7 314-es PLC hez csatlakozó TP 270-es panelen megjelenő technológiai paramétereket szeretném "regisztrálni". Az aktuális értékeke jelenleg is ki vannak jelezve grafikus és numerikus formában is, de nem tudom azt visszamenőleg megnézni. Azt szeretném megtudni hogy megoldható e hogy a praméterek értékét kb. 1 precenként le lehessen menteni az OP CF kártyájára, valami olyan formátumban amit aztán PC-n kezelhető lenne?"
TP270-nél van erre megoldás.
De nem ítad, hogy ProTool, vagy WinCC Flexible...1. Hozz létre egy data log-ot
Állítsd be, hogy file-ba mentsen, adj meg egy flash kártyára mutató útvonalat. Adj egy nevet a datalognak.2. A menteni (log-olni) kívánt változót keresd meg a TAG listában.
A "Data log" oszlopban az <undefined> jelzés helyett állítsd be a annak a lognak a nevét, amelyiket az imént létrehoztad. A "Logging cycle"-t állítsd 1 percre.Ezzel kész is.
A log bellításainál meghatározhatod, hogy milyen módon duzassza a file-t (hány bejegyzés legyen benne maximum, ciklikus legyen, szegmentált, a HMI indításakor újrakezdje-e a rögzítést, stb).Egy szöveges CVS file-t fog létrehozni, amit egy az egyben be tudsz olvasni pl. táblázatkezelővel.
Azt nem árt tudni, hogy a flash memória nem írható végtelen sokszor, így a flash-re irányított log tulajdonképpen rongálja a kártyát, hosszú távon pedig tönkreteszi, de ez persze elég hosszú idő alatt következik be remélhetőleg. -
bekecs
csendes tag
sziasztok
Az a helyzet, hogy az én végzettségem erősáramú berendezés-szerelő, nem értek sokat az elektronikához. Szóval az van hogy szeretnék egy elektromos karbantartói állást, egy multi cégnél, ahol plc vezérlésű gépek vannak és felvételinél, kapásból egy villamos rajz olvasással kezdenek. Nem vagyok teljesen hülye a villamos rajzokhoz, de láttam már párszor ilyen gépek elektromos rajz dokumentációit, ami kurva sok oldalas, és nem teljesen tudom értelmezni őket. Szóval:
Milyen tematika szerint lehet eligazodni ilyen doksin?
Néhány irányelvre lennék kiváncsi.
Hol találok ilyenfajta rajzot hogy addig is tudjam tanulmányozni? (pl. egy konkrét gép sok oldalas rajz dokumentációja) -
Szirty
őstag
Hali bodnarg!
"A gondom az hogy ha itt megadok egy értéket pl. 540 akkor ez a PLC időtagjában 540 ms-jelent. De nekem 540 s-ra lenne szükségem. Az lenne a kérdésem hogyan lehet megadni az időalapot is? Vagy az OP-n ms-ben kell eleve megadnom az időtag értékét?"
Így van, az OP-n mindig ms-ben kell megadnod az időértéket.
Az IO field-nek állítsd be a decimal places-t 3-ra és egyből sec lesz belőle
Vagyis beírod hogy 530 [ENTER] és a tag-be 530 másodperc fog beíródni.
Az időalapot az OP kiszámolja és kezeli, neked nem kell vele foglalkozni, csak annyit, hogy ugye ha 530 másodpercet adsz meg, akkor tudni kell, hogy az időalap már nem ms (annak ellenére hogy ms-ben adod meg az időt (vagy ezred sec-ben ha úgy tetszik).Egyszer valamit hadováltam erről a web lapomon
-
Szirty
őstag
Hali bodnarg!
"Feltöltöttem néhány képet egy "minta projektről", aminél ugyanz a helyzet mint a kérdésés folyamatnál. Lehet hogy valami gond van a CF kártyával illetve kártyákkal? Vagy esetleg túl rövid a minatavételezési idő?"
Ha az minden beállítás a loggal kapcsolatban amiről képet készítettél, akkor szerintem az a baj, hogy nem adtad meg a Tag_1 nevű tag-nek, hogy szíveskedjen írni az ellen nevű log-ba!
Mivel így senki nem ír a logba, az üres marad.A Tag beállításánál Menj a Properties / Logging-hoz és ott állítsd be hogy az ellen nevő logba logoljon:
Továbbá ha folyamatos logolást akarsz, akkor a Tag_1 General beállításainal az Acquistion mode beállítást Cyclic on use-ról állítsd át Cyclic continuous-ra. Ellenkező esetben nem olvassa folyamatosan a tag értékét a PLC-ből.
Megjegyzés: Túl gyakori és túl sok változó logolása a flash kártyára gyakori újraírást eredményez. Mivel a Flash memória csak véges számú újraírást visel el, ezért a gyakori írás csökkenti az élettartamát.
-
Szirty
őstag
Hali bodnarg!
"Detektálható e az enkoder forgásiránya ezzel a funcióblokkal"
A standard doksi nem sokat ír róla, de a forgásirányt az STS_C_DN és az STS_C_UP kimenet jelzi...
Ezt a doksit keresd, ebben van benne részletesebben:
"S7-300 Programmable Controller CPU 31xC Technological Functions."[ Szerkesztve ]
-
Szirty
őstag
Hali BG!
"PC-n is tudjam fogadni illetve erről a későbbiekben valami jegyzőkönyv szerűt is tudjak nyomtatni, feltüntetve a minimum, a maximum nyomást illetve kinyomtatva a nyomás-idő diagramot és még nény sor szöveget stb."
Milyen OP. milyen runtime-mal?
Ezen sok múlik. Pl. van-e rajta ethernet? Flexible RT-vel megy-e? stb.
Különben jönnek a Ha-val kezdődő válaszok. Ha van rajta ethernet... Ha flexible... Ha nyomtatót kötsz rá, stb.Egyébként nyomtatni az OO-k is tudnak.. ha az megfelel.
-
sörösló
aktív tag
válasz bodnarg #1870 üzenetére
Nem egészen érthető a problem az általad leírtak alapján. Esetleg nem lehet valami védelem letöltés ellen? Minden 115 esetén is megvan ez a jelenség, vagy csak egy bizonyos CPU-nál? Nyugodtan és részletesen nézd át a jelenséget, step by step... aztán majdcsak kiderül valami.
-
Szirty
őstag
válasz bodnarg #2828 üzenetére
Helló bodnarg!
A maximum és a minimum meghatározása elég egyszerű. Két változóra van szükség és minden mérési ciklusban a mért eredményre.
Nézzük a MAX-ot.Kell egy változó, amiben az addig mért legnagyobb értéked lesz majd (MAX). Ebbe kezdetben nullát töltesz. Amikor mérsz egyet megvizsgálod, hogy mért érték nagyobb-e mint MAX. Ha nem, akkor nem bántod, ha nagyobb, akkor a mért értéket beleteszed MAX-ba. Ezzel kész is. Ez akár milliárd mérés közül is tárolja az addigi maximumot. Egészen addig, amíg le nem nullázod újra (vagy feltétel nélkül bele nem töltöd a mért értéket).
A minimum meghatározása ugyanez, csak kisebbre hasonlítasz.Az átlag rafináltabb. Több módszer is van, nemrég volt szó róla a PLC levelező listán is. Szerintem olvasd el ott mit hoztak ki belőle.
-
Dezsi82
tag
válasz bodnarg #2828 üzenetére
Szia!
A minimum és maximum meghatározására kaptál egy jó útbaigazítást.
Anélkül, hogy a linkeket elolvastam volna, az átlagra én a következőket javaslom.
Egyszerű megoldás
4 db memóriérték kell.
- Átlag
- Pillanatnyi átlag
- Elemek száma
- Max elemek száma (esetleg lehet konstans is)Mert hát Neked nem kellenek (ha jól sejtem) az adott értékek, csak az átlag.
Az elv a következő:
-Jön a mért érték
-Ha az elemek száma nagyobb, mint a max elemek száma, akkor
átlag = pillanatnyi átlag,
pillanatnyi átlag =mért érték,
elemek száma = 0
- Pillanatnyi átlag = ((Pillanatnyi átlag*Elemek száma)+mért érték)/(Elemek száma+1)
- Elemek száma=elemek száma + 1Így ha mondjuk ha a max elemek száma 100, és minden ciklusban veszel mintát, akkor az átlagod 100 ciklusonként frissül és, az utolsó 100 ciklus átlagát adja ki.
Ha Neked nem ez, hanem mozgó átlag kell(a kérdésed alapján sejtve ezt szeretnéd), akkor a tárolást a standard libraryban található FC85 FIFO-val csinálnám. Az átlagolás már macerásabb, nincs rá standard blokk(amennyire tudom). Vagy egyesével összeadod, ami 100 mérésnél elég favágó módszer.
Vagy marad a pointer és ciklus használata. -
Szirty
őstag
válasz bodnarg #2834 üzenetére
Helló bodnarg!
"mivel 8 jelet kell átlagoljak, előggé feltornázta ciklus időt"
Csinálj egy ring buffert, amibe egy mutatóval írsz, (Amikor a mutató eléri a buffer végét, az elejére állítod, így a címzés megy körbe-körbe)
Amikor mérsz egyet, akkor a mérési eredményt hozzáadod egy változóhoz, kiolvasod a ring buffer mutatója által mutaott elemét, amit kivonsz az iménti változóból, majd lépteted a buffer mutatóját, utána oda beírod a mért értéket.
Az átlagot ezután úgy kapod meg, hogy a változód tartalmát elosztod a ring buffer méretével.Előnye, hogy minden méréskor csak 3-4 műveletre van szükség és nem kell annyi amennyi elemű a buffer. vagyis sokkal kevésbé erőforrás igényes.
-
Dezsi82
tag
válasz bodnarg #2834 üzenetére
Szia bodnarg!
Sokat gyorsíthatsz rajta szerintem ha nem hívod meg a függvény elején az SFC24-t. Ez csak annyit csinál, hogy lekérdezi mekkora a db, és kiszámolja a buffer méretét.
Egyszerűen töröld ki a függvény hívást, és írd be fixen az SFC24 kimeneti változójába fixen az értéket. Vagy átírod a temp változót bemenetire (természetesen ennél a változatnál is ki kell törölni az SFC24 hívást).
Én egy hasonló módszerrel keresek ki 4 db 100 elemű tömbből adatokat, ebből 2 float. Nem volt gondom a ciklusidővel. Tény, hogy nem is hívom meg minden ciklusban az SFC24-t
Üdv -
Szirty
őstag
válasz bodnarg #5093 üzenetére
Szia BG!
Mazsika megoldási elve teljesen jó, bár eltévesztette, mert 3 helyiértékhez modulo 1000 kell nem 100.
Utólagos engedelmével példaprogramot írtam a megoldására. Ime:L DB1.DBD 0
L L#10
/D
L L#1000
MOD
T MW 0Létrában:
Mindkét példa a DB1.DBD0 dupla egész változóban fogadja a szétcincálandó változót (a tartalmán nem változtat) és MW0 integrbe kerül bele a 2-4 helyiértékről leválasztott érték.
A létra felhasznál egy DINT típusű #TMP nevű változót. -
-
Szirty
őstag
válasz bodnarg #5192 üzenetére
Helló bodnarg!
Itt egy "gyalogos" megoldás a problémára:
FUNCTION FC 1 : VOID
TITLE =
AUTHOR : Szirty
VERSION : 0.1
VAR_INPUT
Num : DINT ; //Bemenő érték
END_VAR
VAR_TEMP
StrTMP0 : STRING [254 ]; //String átmeneti változó
StrTMP1 : STRING [254 ]; //String eredmény
rv : INT ; //Visszatérési érték
N : CHAR ; //'0'
END_VAR
BEGIN
NETWORK
TITLE =Nulla karakter
L '0';
T #N;
NOP 0;
NETWORK
TITLE =StrTMP0 feltöltése '0' karakterekkel
CALL SFC 21 (
BVAL := #N,
RET_VAL := #rv,
BLK := #StrTMP0);
NOP 0;
NETWORK
TITLE =A dint átalakítása stringgé
CALL FC 5 (
I := #Num,
RET_VAL := #StrTMP0);
NOP 0;
NETWORK
TITLE =Az eredmény string létrehozása
L P##StrTMP0;
LAR1 ;
L P##StrTMP1;
LAR2 ;
L 12;
T B [AR2,P#1.0];
L B [AR1,P#3.0];
T B [AR2,P#2.0];
L '.';
T B [AR2,P#3.0];
L B [AR1,P#4.0];
T B [AR2,P#4.0];
L B [AR1,P#5.0];
T B [AR2,P#5.0];
L B [AR1,P#6.0];
T B [AR2,P#6.0];
L B [AR1,P#7.0];
T B [AR2,P#7.0];
L '.';
T B [AR2,P#8.0];
L B [AR1,P#8.0];
T B [AR2,P#9.0];
L B [AR1,P#9.0];
T B [AR2,P#10.0];
L B [AR1,P#10.0];
T B [AR2,P#11.0];
L '.';
T B [AR2,P#12.0];
L B [AR1,P#11.0];
T B [AR2,P#13.0];
END_FUNCTION#Num DINT paraméterben bemegy az érték és #StrTMP1 temp változóban képződik.
Esetleg indulj ki ebből (teszteld alaposan). -
Szirty
őstag
válasz bodnarg #5272 üzenetére
Helló BG!
Ha egy tag limit eventre akarsz valamit (pl. scriptet indítani) annak három feltétele van:
1. A változónak meg kell haladnia a limitet
2. Be kell állítani a limitet (tag Propeties/Limits). Ha nincs beállítva limit, akkor fogalma sem lesz mit kell meghaladni az eseményhez (alapesetben nincs tag limit beállítva)
3. Az esemény lefutásának további feltétele hogy a runtime észrevegye a limit átlépését amire csak akkor van lehetősége ha a TAG-et olvassa.Azt írtad hogy neked folyamatos olvasásra van állítva, tehát a 3. feltétel teljesül.
Mivel a proba nevű változód boolean, a második feltételnek már nem tudsz eleget tenni, mert logikai változóhoz nem lehet limitet hozzárendelni.
Ennek az az oka, hogy mivel az esemény a limit meghaladása (átlépése) esetén futna le, de felső limitnek csak 1-et adhatsz meg, a logikai változó meg nem lehet 1-nél nagyobb így a limitet nem tudja meghaladni ami miatt ez esemény nem jöhet létre. Így a boolean esetén a limit beállítás is tiltott.Azt javaslom hogy:
Ne egy változóval indítsd a recept betöltését a PLC-ből, hanem a HMI-ből indítsd. Pl. a screen
Vagy használ integer változót a Screen Loaded nevű eseményével azon a screenen amelyikre a kezelő lapoz amikor a receptekkel akar foglalkozni. Így a screen megjelenítésekor lefut a töltögetés, nem kell külön gombot nyomkodnia.Vagy:
Használd a proba tag High limit eseménye helyett a Change value eseményt, a script elejére meg tegyél egy feltételt hogy csak akkor hajtódjon végre amikor proba = TRUEVagy:
boolean helyett használj pl. integer tag-et. Akkor használhatod a limit eseményét, de be kell állítanod neki 1-es felső limitet. Amikor a PLC 1-nél nagyobb értéket ír bele amikor egynél kisebb volt, le fog futni az esemény.
Persze gondoskodnod kell arról, hogy az esemény lefutása után visszaírjon bele "valaki" 1-nél kisebb értéket.Az első módszer javaslom legjobban az utolsót legkevésbé.
-
Szirty
őstag
válasz bodnarg #5277 üzenetére
Üdv BG!
Ha azzal kapcsolatban vannak kétségek, hogy a script tényleg mindig lefut-e amikor kell, akkor tegyél ideiglenesen bele egy változó növelést. A változó értékén fogod látni lefut-e vagy sem.
Ha lefut de nem teszi a dolgát, lehet keresni ott a hibát, az átmeneti változót meg kiveszed ha készen van és jól működik.Igen amikor sok adatot kell PLC-ből áthozni vagy az áthozott adatot ugyanabban a scriptben kell feldolgozni akkor előfordulhat inkonzisztencia.
Ritkán használom a beépített recept kezelést és most nem néztem utána, de mintha lenne a receptek mozgatásánál valamiféle segítség arra vonatkozóan hogy megtörtént a művelet vagy sem. -
Szirty
őstag
válasz bodnarg #6560 üzenetére
Helló!
Csináld így:
OPN
DB 236
L #Cim
SLD 3
T #PTR
L DBD [#PTR]Ez betölti a DB236 #Cim-en lévő duplaszót.
További gondolat indító tippek:
S7 300/400 indirekt címzés
Pointerek
Az ANY paramétertípusRemélem ez segít...
[ Szerkesztve ]
Új hozzászólás Aktív témák
- Magga: PLEX: multimédia az egész lakásban
- Luck Dragon: Asszociációs játék. :)
- Vicces képek
- Okos Otthon / Smart Home
- Milyen autót vegyek?
- MasterDeeJay: Volta a bányából azaz CMP 100-210 kisteszt (Tesla V100 mining)
- Telekom mobilszolgáltatások
- Kertészet, mezőgazdaság topik
- exHWSW - Értünk mindenhez IS
- Facebook és Messenger
- További aktív témák...
- LG NanoCell 55NANO766QA Halvány píxel csík
- Philips 58PUS8545/12 1 ÉV GARANCIA Játék üzemmód
- Tyű-ha! HP EliteBook 850 G7 Fémházas Szuper Strapabíró Laptop 15,6" -65% i7-10610U 32/512 FHD HUN
- Bomba ár! HP EliteBook 840 G5 - i5-8G I 8GB I 128GB SSD I 14" FHD I HDMI I Cam I W10 I Gari!
- The Last of Us Part I Ps5