Hirdetés

2024. május 6., hétfő

Gyorskeresés

Útvonal

Fórumok  »  Egyéb hardverek  »  PLC programozás

Hozzászólások

(#501) Szirty válasza moseras (#500) üzenetére


Szirty
őstag

Szevasz moseras!

"Konkrétan meg lehet e azt csinálni, hogy egy nyomógomb (mint bemenet) egy kimenetet egyszer bekapcsol, egyszer kikapcsol, egyszer inverzbe rak, egyszer pedig a kimenet követi a nyomógomb állapotát, és mindezt attól függően, hogy a művelettípust leíró PLC változómat hogy állítottam be a HMI-ből ?"

Igen, de ez nem változó típus kérdése, mert ezt már le kell programozni. De természetesen megoldható.

"- tegyük fel, hogy van olyan PLC-m, illetve HMI-m, amiben van RTC. A user azt szeretné, hogy egy "valami" változó reggel 6-ig egy X értéket vegyen fel, 6-12 között egy Y-t, stb. Ehhez milyen HMI "elem" van (van-e ilyen egyáltalán), illetve ilyenkor az RTC értékét a HMI-SW olvassa ki saját magából, és az alapján küldi el a PLC-nek, vagy a PLC olvassa ki a sajátját(ezt a verziót most nem tudom elképzelni, hogy ez hogyan is működhet) ?"

Ó igen a klasszikus probléma, amikor a rendszerben több valós idejű óra is van és időtől függő műveleteket akarunk végezni. :)
Ebben a tekintetben siemens oldalról tudok kiindulni. A legjobb ilyenkor, ha kinevezzük valamelyik eszköz óráját "master"-nek és a többit ehhez szinkronizáljuk.
Ezzel elérhető, hogy minden óra egyszerre járjon, innentől bármelyik adatait felhasználhatjuk. Én mindig a PLC óráját használom mérvadónak, mert az kikapcsoláskor is ketyeg, a HMI-nél meg ez attól függ milyen fajta. (Bizonyos típusoknál nincs backup áramforrás ehhez.)
Az időre való kapcsolást többféleképpen is meg lehet oldani. Mindegyikhez kell programozni. A legegyszerűbb összehasonlító műveleteket használni, de néhány PLC-ben vannak idő kezelésével foglalkozó funkciók. Pl. S7-nél van time interrupt.
Sajnos ilyenkor foglalkozni kell a téli/nyári időszámítással és azzal is,hogy mi van akkor, ha a felhasználó állít az órán. Ezt meg lehetővé kell tenni, hiszen az óra késhet vagy siethet is.

"tudok-e olyan változókat létrehozni (és ezt HMI-ből állítani), amely azt írja le, hogy az adott műveletet melyik bemenettel és/vagy kimenettel kell végrehajtani ?"

Igen. Programozással. Pont nem rég volt egy ilyen feladatom. HMI-ről állíthatóan kellett eldönteni hogy egy adott bemenetnek mi legyen a funkciója.
Erre is több programozási megoldás létezik. Az egyszerűbb, de kevésbé hatékony, az, hogy sok elágazással és összehasonlítással döntjük el mit is kell csinálnia egy kiemnetnek (az össze selképzelhető kombinációra kell egy ág). A hatékonyabb megoldás az indirekt címzés. Ez sokkal nehezebb és a megoldás nagyban függ az adott PLC képességeitől és ezen képességek ismeretétől a programozó szempontjából.

(#502) attrax válasza Destructor (#1) üzenetére


attrax
aktív tag

PLC-s lennék énis..

Unterschreiben

(#503) attrax válasza bekecs (#459) üzenetére


attrax
aktív tag

Nálunk van felvétel.Priviben írj

Unterschreiben

(#504) attrax válasza Szirty (#483) üzenetére


attrax
aktív tag

Csao,én ezt INC utasítással oldottam Omronban. (mármint a ki-be kapcsolgatást) minden gombnyomásrqa lép egy bitet és hozzá rendeltem a címéhez 1 db kimenetet.Tehát 1.gomnxomás egy bit jobbra mégegy nyomás mégegy bit.Érted.Sztem legegyxűbb.
Nem vagyok nagy plc guru de a programot ami a garázskapumat viszi csatolhatom ha érdekel vkit.

Unterschreiben

(#505) moseras válasza Szirty (#501) üzenetére


moseras
tag

Szia.

Köszi. Nagyon sokat segítesz, ha lesz egy saját HMI-nk, akkor te lehetsz az első, aki letesztelheti :)) :R

Okés, tehát akkor valahogy így ? (ez most C-ül van, de az most mindegy, ha értem, akkor át tudom tenni ST-re vagy FB-re is):

// ezt a 3 valtozot allitom HMI-bol
unsigned int plc_pushbutton_desc; // ez a nyomogombot leiro valtozo
unsigned int plc_output_desc; // ez a kimenetet leiro valtozo
unsigned int plc_operation_desc; // ez a muveletet leiro valtozo

switch (plc_operation_desc) {
case 0:
bekapcsolo_muvelet(plc_pushbutton_desc, plc_output_desc);
break;
case 1:
kikapcsolo_muvelet(plc_pushbutton_desc, plc_output_desc);
break;
case 2:
inverz_muvelet(plc_pushbutton_desc, plc_output_desc);
break;
default:
inverz_muvelet(plc_pushbutton_desc, plc_output_desc);
break;
}

És akkor ebből kell annyi block-ot felrakni, ahány be/kimenetet megadhatok ?

Imi.

(#506) Alx6501


Alx6501
csendes tag

Sziasztok!

PLC-hez keresek olyan köztes modult ami képes lenne az I/O portokat "megnyújtani" (wifi, rádiós modem, ...) segítségével. A porotk száma elég nagy, a távolság viszont néhány 10 méter. Előre is köszi a válaszokat.

Alex

(#507) Szirty válasza Alx6501 (#506) üzenetére


Szirty
őstag

Hali Alx6501!

"porotk száma elég nagy, a távolság viszont néhány 10 méter."

Mennyi az az "elég nagy"?
És milyen válaszidő (sebesség) szükséges?

(#508) DP_Joci válasza Alx6501 (#506) üzenetére


DP_Joci
tag

Szia,

És milyen a plc?

(#509) Alx6501 válasza DP_Joci (#508) üzenetére


Alx6501
csendes tag

Szia!

Twidora gondoltam. A wifi jellegű (ha nem rádiós lesz a köztes eszköz) adattovábbítás miatt RJ45-ös csatlakotóval és beépített Ethernet modullal.

Alex

(#510) moseras


moseras
tag

Sziasztok!

Találtam beépített PID szabályzót a WAGO-s libekben. Ez egy 0-100 között mozgó REAL-t ad eredményül, ami rendben is van egy analóg beavatkozó egységhez.
De milyen modult kell mellérakni, ha a beavatkozóm egy időalapú jobbra/balra forgást végző szelep ? Egyszerűen az %-ot időre konvertálom, és annak megfelelően nyitom/zárom a szelepet ?
A másik, hogy ha egy kétállapotú (relé) beavatkozóm van, akkor mit csinálok a PID-el ?

Köszi.

(#511) Szirty válasza moseras (#510) üzenetére


Szirty
őstag

Hali moseras!

"De milyen modult kell mellérakni, ha a beavatkozóm egy időalapú jobbra/balra forgást végző szelep ? Egyszerűen az %-ot időre konvertálom, és annak megfelelően nyitom/zárom a szelepet ?
A másik, hogy ha egy kétállapotú (relé) beavatkozóm van, akkor mit csinálok a PID-el ?"

A válasz az, hogy nem folyamatos szabályzót (continuous controller) kell használni, hanem léptető vezérlőt (stepping controller).
Az annyival több, hogy tartalmaz egy PWM vezérlőt is, aminek már nem "analóg" kimenete van, ahnem lét digitális.
Az egyik a beavatkozó jel növelésére, a másik a csökkentésére szologál.

(#512) DP_Joci válasza Alx6501 (#509) üzenetére


DP_Joci
tag

Szia,

Igazából a siemens-et ismergetem. ;)

De használtam már TSX premium PLC-t, Advantys OTB és STB modulokkal, profibuszon és etherneten is, működött.

http://automatizalas.schneider-electric.hu/index.php?pid=3|tkid=25

A Twidóról itt találhatsz érdekességeket:

http://automatizalas.schneider-electric.hu/index.php?pid=9|tid=2

(#513) DP_Joci


DP_Joci
tag

Sziasztok,

Van valakinek általános vagy bármilyen ismertetője szervókról (beállítások, paraméterek ),még nem használtam.

Esetleg hasonló doksi robotokról.

köszi

(#514) Szirty válasza DP_Joci (#513) üzenetére


Szirty
őstag

Hali!

SyncPos opció frekiváltóhoz
MiniStep léptetőmotor vezérlő

Az alábbi linken a hajtás doksik között is találsz (többet is)
Omron cuccok

(#515) DP_Joci válasza Szirty (#514) üzenetére


DP_Joci
tag

Köszönöm!

(#516) DP_Joci


DP_Joci
tag

Sziasztok,

Lehet-e siemens (s7-300-400 ) plc-nél a DB sorszámát változóval, vagy indirekten, vagy akárhogy megadni? :DD

PL: minden DB (datablock) 1. bájtját akarom kiolvasni.

(#517) Szirty válasza DP_Joci (#516) üzenetére


Szirty
őstag

Hali DP_Joci!

"Lehet-e siemens (s7-300-400 ) plc-nél a DB sorszámát változóval, vagy indirekten, vagy akárhogy megadni? "

Lehet.
Így hirtelen két megoldás jut eszembe.
Az egyik akkor használható ha a DB elérése egy blokkon belül türténik és a DB számát kivülről, paraméterként adod át.
Ezt teszi lehetővé a BLOCK_DB paraméter típus. A szóbanforgó FC/FB interface részében input változóként megadsz egy BLOCK_DB típusó változót.
Pl.:

OPN után a DB-t a T DBWxxx L DBWxxx utasításokkal eléred.

A másik módszer nyakatekertebb. Össze kell állítani egy ANY pointert úgy, hogy a nekünk megfelelő számú DB-re mutasson (ez akár integer is lehet). Utána egy pointeres címzéssel elérhető a kívánt DB.
Azért ezzel nem árt vigyázni. Ha rossz DB-re vagy anak nem létező címére hivatkozol, akkor jön a "STOP caused by programming error" :)

(#518) moseras válasza Szirty (#511) üzenetére


moseras
tag

Szia.

Köszi, megtaláltam. Itt egy PID blokk van, annak sok kimenete, benne az analóg, illetve a PWM növel/csökkent is.

Mondtad, hogy használtok ilyen WAGO-s profibus I/O-kat. Mit csinál olyankor a PLC, ha ezek az I/O-k nem válaszolnak ?

Megáll minden, vagy csak az amivel kapcsolatos a távoli I/O ?
Illetve milyen változót kell a HMI-re kitenni, hogy a user is lásson ebből valamit ?

Köszi

Imi.

(#519) Szirty válasza moseras (#518) üzenetére


Szirty
őstag

Hali moseras!

"Mondtad, hogy használtok ilyen WAGO-s profibus I/O-kat. Mit csinál olyankor a PLC, ha ezek az I/O-k nem válaszolnak ?
Megáll minden, vagy csak az amivel kapcsolatos a távoli I/O ?"

Olyankor lép életbe a "B" terv :)
S7-nél úgy működik a dolog, hogy van egy ún HW config, ahol szépen meg kell adni minden eszközt, ami a buszon van. A profibus token ring rendszerű, vagyis a master minden konfigurált slave-nek egymás után minden busz ciklusban küld egy jelzést, amire a slave-nek válaszolnia kell. Ha valamelyik eszköz leválik a buszról (nem válaszol) azt a master azonnal észleli. Ilyenkor két eset lehetséges:
1. Létezik erre az esetre hibakezelő blokk. Ilyenkor azt végrehajtja. Abba lehet programot írni, hogy mit tegyen a rendszer ilyenkor. Le lehet benne kérdezni melyik eszköz szakadt le, le lehet programozni mit csináljon ilyenkor a gép. stb.
2. Nem létezik a hibakezelő blokk, így azt nem tudja meghívni, a CPU STOP állapotba kerül és a teljes berendezés azonnal megáll.

Persze lehet üres hibakezelő blokkot is beletenni. Néha ez is megfelelő. Ilyenkor a smmit hívja meg hiba esetén. vagyis semmit nem tesz a hiba miatt, de nem is áll le (STOP).
Az a modul amelyik leszakadt, ilyenkor rendszerint azonnal kikapcsolja a kimeneteit.
A berendezést vezérlő program ilyenkor esetleg nem megfelelően is működhet, mert ha a leszakadt modulon bemenetek is voltak, akkor azok nulla állapotúnak látszanak és a program is ennek megfelelően fog működni. vagyis ha nem írunk hibakezelést az esetre (B tervet) akkor a program nem fogja "tudni" hogy bizonyos bemenetek nem azért nulla állapotúak mert az adott bemenet fizikailag is nulla állapotú, hanem mert kommunikációs hiba van. Sokszor ez nem mindegy :)

"Illetve milyen változót kell a HMI-re kitenni, hogy a user is lásson ebből valamit ?"

S7-nél az említett hibakezelő blokk (OB) a megoldás erre, amibe írni kell egy programot ami ad megfelelő jelzést ami aztán meg is jeleníthető (akár szövegesen is).
Vagy meg kell hívni az SFC51-et (Reading a System Status List or Partial List with SFC 51 "RDSYSST"). EZzel le lehet kérdezni az összes buszon lévő összes eszköz jelenlétét:

A hibakezelő blokkal kapcsolatban firkáltam már. Itt találod.

[ Szerkesztve ]

(#520) DP_Joci válasza Szirty (#517) üzenetére


DP_Joci
tag

Szia,
Az első módszert az szoktam használni. Azzal ebben az esetben az a baj, hogy bemenő változó csak konkrét DB lehet.
CALL FC2
DB_in:=DB2

A DB[változó] megadást nem fogadja el.

Olyat kerestem első körben, hogy DB[var].DBw0 vagy valami hasonló, de ez nem igazán megy ebben a formában.

Ilyeneket elfogad, hogy:
OPN DB[MW0]
vagy
OPN DB[#DB_temp]
ahol a
L #DB_IN ez egy bejövő word változó, ezt nem lehet közvetlen használni
T #DB_temp ez egy TEMP word változó

Ez nekem megfelel.

Az ANY pointeres dolog az érdekes lehet.
Van esetleg egy példád erre, megpróbáltam kreálni egy ilyen pointert, de nem igazán tudok DB-re hivatkozni vele. :W

(#521) Szirty válasza DP_Joci (#520) üzenetére


Szirty
őstag

Helló DP_Joci!

"Az ANY pointeres dolog az érdekes lehet.
Van esetleg egy példád erre, megpróbáltam kreálni egy ilyen pointert, de nem igazán tudok DB-re hivatkozni vele."

Egyszer csináltam olyat, hogy különböző számú egyforma szerkezető DB-kből másoltam adatokat, ahol a DB számát a program kalkulálta ki. Itt ANY pointertípusban kellett összeállítani a címet, mert a másolás BLKMOV hívással történt, aminek ANY kell.
Persze hogy nem találom.

Ha megnézed az ANY felépítését:

Akkor hamar kiderül hogyan kell összesakkozni egy címet.
Csak arra kell nagyon vigyázni nehogy mellécímezzen az ember. Az indirekt címzés már csak ilyen. Jó nagyokat lehet vele szívni és alaposan tesztelni kell.

A helpben van példa az "Example of the Data Type ANY" címszó alatt.

FUNCTION FC1: INT
TITLE = Transfer and handling of ANY pointers
// Task :
// This block should copy a source area to a target area using
// SFC20 (BLKMOV) where the source is put together from
// a number of individual parameters to form an Any pointer
// and the target is already specified as an Any pointer.

AUTHOR: SIEMENS
FAMILY: TOOLS
NAME: ANY_PTR
VERSION: 00.01
VAR_INPUT
SRC_DB : INT;
SRC_Byte : INT;
SRC_Type : BOOL;
SRC_Len : INT;
DEST_Any : ANY;
END_VAR

VAR_TEMP
T_AR1 : DWORD;
T_AR2 : DWORD;
T_SRC_Any : ANY;
T_DEST_Any : ANY;
Count : INT;
SFC_Ret_Val: INT;
END_VAR
BEGIN
NETWORK
TITLE = Save the contents of the address registers AR1 and AR2
TAR1 T_AR1;
TAR2 T_AR2;
NETWORK
TITLE = Put together and check source area
LAR1 P#T_SRC_Any; //Load start address of the source Any
//pointer into AR1
L B#16#10; //Enter syntax ID in the Any pointer
T LB [AR1, P#0.0];

L B#16#2; //Load area type BYTE
AN SRC_Type; //If BYTE was chosen, then
//jump to entry
JC Tran;
L B#16#4; //Otherwise load area type WORD
Tran: T LB [AR1, P#1.0]; //and store in the Any pointer
L SRC_Len; //Enter number of bytes/words to be
//transferred
T LW [AR1, P#2.0];
L SRC_DB; //Enter source DB number
T LW [AR1, P#4.0];
L 0; //If source DB number = 0 then
//transfer from bit memory area,
==I ; //otherwise from a DB
JC Mem;

L P#DBX0.0; //Load area pointer in data block
JU Offs;
Mem: L P#M0.0; //Load area pointer in bit memory area
Offs: L SRC_Byte; //Load copy of the number of the first bytes to be copied SLD 3; //Convert to pointer format
+D ; //Add to area pointer
T LD [AR1, P#6.0]; //Enter result in ANY pointer
NETWORK
TITLE = Enter and check the target Any pointer
L P#DEST_Any; //Place address of Any pointer in AR1
LAR1 ;
L B#16#2; //If the area type of the transferred
//Any pointer
L B [AR1, P#1.0]; //= byte or = word, the jump
//follows
==I ;
O( ;
L B#16#4;
==I ;
) ;
JC Copy;

L W#16#80FF; //Otherwise load error code
T RET_VAL; //Transfer to the caller
JU End; //Finish block processing
Copy: LAR2 P#T_DEST_Any; //Load address of temp. Any pointer
L 5; //5 words must be copied
Back: T Count;
L W [AR1, P#0.0]; //Move the Any pointer
//as an input variable to
T LW[AR2, P#0.0]; //the local data
+AR1 P#2.0;
+AR2 P#2.0;
L Count;
LOOP Back;
NETWORK
TITLE = Call SFC20 (BLKMOV)

CALL SFC20
(
SRCBLK := T_SRC_Any,
RET_VAL := SFC_Ret_Val,
DSTBLK := T_DEST_Any
);
NETWORK
TITLE = Pass on return value of SFC
L SFC_Ret_Val;
T RET_VAL;
NETWORK
TITLE = Restore the contents of the address registers AR1 and AR2
End: LAR1 T_AR1;
LAR2 T_AR2;
END_FUNCTION

DATA_BLOCK DB10
TITLE = Copy_In
AUTHOR: SIEMENS
FAMILY: EXAMPLE
NAME: COPY_IN
VERSION: 00.01
STRUCT
test: ARRAY[0..29] of BYTE;
END_STRUCT;

BEGIN
END_DATA_BLOCK

DATA_BLOCK DB11
TITLE = Copy_Out
AUTHOR: SIEMENS
FAMILY: EXAMPLE
NAME: COPY_OUT
VERSION: 00.01
STRUCT
test: ARRAY[0..29] of BYTE;
END_STRUCT;
BEGIN
END_DATA_BLOCK

ORGANIZATION_BLOCK OB1
TITLE = Cycle
AUTHOR: SIEMENS
FAMILY: EXAMPLE
NAME: OB_CYC
VERSION: 00.01
VAR_TEMP
OB1_System: array [1..20] of byte;
Src_Db : INT;
Src_Byte : INT;
Src_Type : BOOL;
Src_Len : INT;
END_VAR
BEGIN
NETWORK
TITLE = First call example for FC1

// This call for FC1 copies 5 words from memory byte 33
// to DB10 from data byte 3. This means the memory
// words 33, 35, 37, 39, and 41 are copied to the data
// words 3, 5, 7, 9, and 11 of DB10.
L 0;
T Src_Db;
L 33;
T Src_Byte;
Set ;
= Src_Type;
L 5;
T Src_Len;
CALL FC1
(
SRC_DB := Src_Db,
SRC_Byte := Src_Byte,
SRC_Type := Src_Type,
SRC_Len := Src_Len,
DEST_Any := P# DB10.DBX 3.0 BYTE 20,
RET_VAL := MW100
);


NETWORK
TITLE = Second call example for FC1
// This call for FC1 copies 7 bytes from DB11 from
// data byte 13 to the process output image from
// QB99. This means the data bytes 13 to 19
// of DB11 are copied to the output bytes 99 - 105.
L 11;
T Src_Db;
L 13;
T Src_Byte;
CLR ;
= Src_Type;
L 7;
T Src_Len;
CALL FC1
(
SRC_DB := Src_Db,
SRC_Byte := Src_Byte,
SRC_Type := Src_Type,
SRC_Len := Src_Len,
DEST_Any := P# Q 99.0 WORD 5,
RET_VAL := MW100
);

END_ORGANIZATION_BLOCK

(#522) Szirty válasza DP_Joci (#520) üzenetére


Szirty
őstag

(#523) DP_Joci válasza Szirty (#522) üzenetére


DP_Joci
tag

L P##DB_pointer_in_any
LAR1
L B#16#10
T LB [AR1,P#0.0]
L B#16#19
T LB [AR1,P#1.0]
L W#16#1
T LW [AR1,P#2.0]
L W#16#0
T LW [AR1,P#4.0]
L #DB_num_in
T LD [AR1,P#6.0]
//;
L P##DB_pointer_out_any
LAR1
L B#16#10
T LB [AR1,P#0.0]
L B#16#19
T LB [AR1,P#1.0]
L W#16#1
T LW [AR1,P#2.0]
L W#16#0
T LW [AR1,P#4.0]
L #DB_num_out
T LD [AR1,P#6.0]
//;
CALL SFC 84
REQ :=M255.7
SRCBLK :=#DB_pointer_in_any
RET_VAL:=MW8
BUSY :=M3.1
DSTBLK :=#DB_pointer_out_any

Ilyen paraméter tipusú ANY-hez volt már szerencséd?
Ezzel hibát nem kapok, de eredményt sem, lehet hogy az SCF84-et értem félre.

[ Szerkesztve ]

(#524) Szirty válasza DP_Joci (#523) üzenetére


Szirty
őstag

Hali DP_Joci!

L P##DB_pointer_in_any
LAR1

Betölti az akku1-be a #DB_pointer_in_any változó címét, majd az akku1-et az 1-es address regiszterbe tolja.

L B#16#10
T LB [AR1,P#0.0]

10 hexa értéket tölt akku1-be, majd azt elrakja az AR1 address regiszter által címzett címre 0 byte és 0 bit eltolással (P#0.0 az eltolás).
Lényegében tehát ezzel a #DB_pointer_in_any változó nulladik byte-jába 10 hexa értéket rak.
Ha most megnézed az ANY felépítését:

Akkor látható, hogy az a byte mindig 10h S7 esetén. Nem véletlen tett ide 10h-t :)

L B#16#19
T LB [AR1,P#1.0]

Az ANY 1-es byte-jába 19h-t tölt.
Ez a byte mondja meg az adattípust. Ez egy nagyon érdekes sor, mert 19h adattípus nem létezik amennyire tudom :)

L W#16#1
T LW [AR1,P#2.0]

A 2-es byte az ANY típusnál az métlési faktor. Ennek akkor van jelentősége, amikor nem egy adatterületre kell hivatkozni (pl. blokk másolás). Ez mindig az adattípusban megadott típus darabszámára vonatkozik. vagyis ha ott Byte típus van meghatározva, akkor itt 10 10 byte-ot jelent, ha ott word van meghatározva, akkor a 10-es érték az ismétlési faktorban már 20 byte-ot jelent, stb.

L W#16#0
T LW [AR1,P#4.0]

Itt kell megadni a DB számát, ami nem lehet nulla (mivel 0-ás DB nincs).
Ugyanakkor amennyiben az adatterület definíciója nem DB-t határoz meg (ANY byte6) akkor nulla kell hogy legyen. (bár ilyenkor ezt nyilván nem veszi figyelembe a rendszer).

L #DB_num_in
T LD [AR1,P#6.0]

A 6. byte elvileg az adatterület típusát adja meg. Az, hogy ide egy #DB_num_in nevű változót tölt arra utal, hogy van itt egy kis csúszás. Szerintem #DB_num_in-t a 4-es byte-ba kéne tölteni.

"Ezzel hibát nem kapok, de eredményt sem, lehet hogy az SCF84-et értem félre."

Attól függ mit szeretnél...

(#525) DP_Joci válasza Szirty (#524) üzenetére


DP_Joci
tag

Szia,
Igazából nem létszükséglet számomra jelenleg a pointerek használata, csak mint érdekesség foglalkozom velük.
Vagyis feleslegesen nem akarom rabolni az idődet ezzel, csak ha érdekel és van rá kapacitásod akkor foglalkozz vele.

Amiről te beszélsz az a ANY Format for Data Types ez ok.

De van egy olyan is hogy:

ANY Format for Parameter Types

For parameter types STEP 7 stores the data type and the address of the parameters. The repetition factor is always 1. Bytes 4, 5, and 7 are always 0. Bytes 8 and 9 indicate the number of the timer, counter, or block.

Ide nem tudtam kimásolni a helpből az ábrát..

The following table shows the coding of the data types for the parameter type ANY for parameter types.

Hexadecimal Code Data Type Description
b#16#17 BLOCK_FB FB number
b#16#18 BLOCK_FC FC number
b#16#19 BLOCK_DB DB number
b#16#1A BLOCK_SDB SDB number
b#16#1C COUNTER Counter number
b#16#1D TIMER Timer number

Valójában én ezt raktam össze, a b#16#19 mondja meg hogy ez egy DB , a 8 as 9-es byte pedig hogy melyik DB.
L #DB_num_in : egy integer változó lenne ami megmondja, hogy melyik DB-t akarom.
Igazából nem látom a működés eredményét, ha az az lenne, hogy egyik DB-ből másol a másikba. :(

(#526) Szirty válasza DP_Joci (#525) üzenetére


Szirty
őstag

ali DP_Joci!

"gazából nem látom a működés eredményét, ha az az lenne, hogy egyik DB-ből másol a másikba. :("

Itt egy példa, ami egy integerben megadott számú adatblokkból egy INT típust egy integerben megadott számú címről bemásol az MW0-ba az ANY használatával.:

FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
SrcDB : INT ; //Forrás blokk száma
SrcADDR : INT ; //Kezdőcím a forrásblokkban
END_VAR
VAR_TEMP
SRC : ANY ;
RV : INT ;
END_VAR
BEGIN
NETWORK
TITLE =

L P##SRC;
LAR1 ;
L B#16#10; //Mindig 10h
T LB [AR1,P#0.0];
L B#16#5; //Típus azonosító 5h=INT
T LB [AR1,P#1.0];
L W#16#1; //Ismétlési faktor = 1
T LW [AR1,P#2.0];
L #SrcDB; //A forrás DB száma
T LW [AR1,P#4.0];
L #SrcADDR;
SLD 3;
L DW#16#84000000; //Adatterület azonosítója 84h=Data block
OD ; //Az adatterület és a cím együtt egy DW-ben
T LD [AR1,P#6.0];
CALL SFC 20 (//Blokk másolás
SRCBLK := #SRC,
RET_VAL := #RV,
DSTBLK := P#M 0.0 WORD 1);

END_FUNCTION

És a hívás:

CALL FC 1
SrcDB :=24
SrcADDR:=4

Ez az MW0-ba írja a DB24 DBW4-et

(#527) DP_Joci válasza Szirty (#526) üzenetére


DP_Joci
tag

Szia,

Megtaláltam, az EXAMPLE 2 –t nézd meg:

[link]

Bár lehet, hogy nekem van valami elírva a test programomban.

(#528) DP_Joci válasza Szirty (#526) üzenetére


DP_Joci
tag

Felíratkoztam a prog.hu-n a PLC levelező listára, de nem kapok leveleket.
Azért mert nincs levelezés, vagy mert nálam nem működik valami?

(#529) thomass


thomass
csendes tag

Üdvözlök Mindenkit!
Egy nagyon kezdő kérdést bátorkédnék itt feltenni,bár úgylátom,hogy itt inkább komoly témákban folyik eszmecsere.
PC-PLC közötti RS232 soros adatátviteli beállításokkal kapcsolatban szeretnék információt szerezni.
A Moeller oldalain találtam az alábbi segédletet:
www.moeller.hu/binary/pc-plc_kapcsolat.pdf
A kérdésem az lenne ,hogy az OMRON PLC-k esetében is használhatók-e az oldalon leírtak?
A válaszokat előre is köszönöm!

(#530) moseras válasza thomass (#529) üzenetére


moseras
tag

Szia.

A Moeller a WAGO-hoz hasonlóan CodeSys alapú fejlesztőkörnyezetet használ a PLC program megírására, tesztelésére, illetve a beprogramozásra. Tudtommal az OMRON nem ezt használja, bár konkrétan nem ismerem.

Nyilván az elv ugyanaz: ismerni kell a PLC RS232 portjának beállításait, sebesség, bitszám, stopbitek száma, paritás. Esetleg lehet autobaud-os megoldás is. Ha USB/CAN232 konvertert használsz, akkor ajánlom az ATEN UC-232A-t.

Ha nem programozáshoz, hanem már működés közbeni kommunikációhoz kell, akkor ahhoz OMRON-ost kell kérdezned.

Imi.

(#531) moseras válasza Szirty (#519) üzenetére


moseras
tag

Szia.

Köszi, keresem a megoldást rá.

"Az a modul amelyik leszakadt, ilyenkor rendszerint azonnal kikapcsolja a kimeneteit."

Erre nem találok megoldást CANopen-ben. A Beckhoff-nak vannak WATCHDOG-al rendelkező moduljai, amiknél megadható egy időintervallum, ami ha lejár, lekapcsolja a kimeneteit. A WATCHDOG-ot pedig a kommunikáció nullázza. A WAGO-nál nem találok ilyent.

RETAIN memory:
Szükségem lenne ilyenre is. A WAGO-ban van is ilyen 24 kByte (750-841). Azt szeretném, hogy a user a HMI-n kap egy táblázatot nevekkel, ott átírhatja ezeket, majd ezek visszakerülnek a RETAIN memóriába. Ha elmegy a táp, akkor is ezeket megőrzi, és legközelebb már ezekkel indul el. Jól gondolom e ezt ?

Köszi.

Imi.

[ Szerkesztve ]

(#532) Szirty válasza thomass (#529) üzenetére


Szirty
őstag

Helló thomass!

"A kérdésem az lenne ,hogy az OMRON PLC-k esetében is használhatók-e az oldalon leírtak?"

Nem, mert az általad linkelt leírásban a Moellerhez való szoftver részleteiről esik szó (mikor hova kell kattintani). Az Omron szoftver ettől eltér, ez a leírás nem követhető Omronnal.

(#533) Szirty válasza moseras (#531) üzenetére


Szirty
őstag

Hali moseras!

"A WATCHDOG-ot pedig a kommunikáció nullázza. A WAGO-nál nem találok ilyent."

belenéztem a HW configba mit lehet WAGO-nál állítani.
Van watchdog, 10ms időalappal. Beállítható hogy mit csináljon ha a belső busz (k-bus) megszakad vagy hibás.
Nem tudom kipróbálni mi történik WAGO kimenettel ha leáll a profibusz, mert csak beépítve van egyelőre ilyenünk és én még nem foglalkoztam vele, pár új gépben van beépítve...

"Azt szeretném, hogy a user a HMI-n kap egy táblázatot nevekkel, ott átírhatja ezeket, majd ezek visszakerülnek a RETAIN memóriába. Ha elmegy a táp, akkor is ezeket megőrzi, és legközelebb már ezekkel indul el."

Az általam ismert HMI-knél ez máshogy működik: Alapvetően minden változó a PLC-ben van, a HMI-ben csak hivatkozik rájuk az ember. Ha egy értéket kell kijelezni vagy állapotot megjeleníteni változó alapján, a HMI ciklikusan újra és újra lekérdezi a PLC-ből az érintett változó állapotát. Kivétel ez alól siemens OP-knál és egyéb HMI-knél a receptek kezelése. A recept adatrekordjait a HMI tárolja. Külön funkcióhívásokkal lehet ezeket az adatokat a PLC és a HMI között mozgatni.

(#534) Szirty válasza DP_Joci (#527) üzenetére


Szirty
őstag

Hali!

Nem tudom miért nem működik.

(#535) moseras válasza Szirty (#533) üzenetére


moseras
tag

Szia Szirty!

A k-bus ugye a modulok közötti belső busz, ahogy te is írtad. Ez egy 6-os érintkezősávon terjed. Tudtommal kettő a táp (5V), illetve 1 pár LVDS oda, 1 pár LVDS vissza. Az okés, hogy ha ezen a belső buszon leszakad a kommunikáció hiba miatt, akkor leállnak a kimenetek a modulokban.

Jelenleg nekem csak egy CANopen slave-em van, amit távolról vezérlek. Ha ennél megszakad a CAN busz, a kimenetei aktívak maradnak. Azt csináltam, hogy az egyik szabad DO-val egy időrelét impulzussal életben tartottam. Ha megszűnt a CAN busz, akkor az impulzusok is megszűntek, az időrelé is leszakította a számunkra fontos kimenetet.

"Az általam ismert HMI-knél ez máshogy működik"

Az általam felvázolt verziót meg fogom nézni, hogy működhet e úgy, ahogy leírtam.

Köszönöm.

Imi.

(#536) DP_Joci válasza Szirty (#534) üzenetére


DP_Joci
tag

Szia Szirty,

Mi nem működik, a program vagy a levelező lista? :DD

(#537) DP_Joci


DP_Joci
tag

Sziasztok,

Van valakinek s7 canopener , s7 know how manager vagy hasonló programja (persze nem demo).
Ha igen és van rá lehetőség akkor szeretném elkérni (pl.emailben). :D
Köszi

(#538) Szirty válasza DP_Joci (#536) üzenetére


Szirty
őstag

Hali DP_Joci!

"Mi nem működik, a program vagy a levelező lista?"

A program:

"(#534) Szirty válasza DP_Joci (#527) üzenetére"

(#539) DP_Joci válasza Szirty (#538) üzenetére


DP_Joci
tag

Szia,

Oké, lassan kiigazodom.

És a levelező lista, ha jól láttam te fel vagy íratkozva.

(#540) DP_Joci válasza DP_Joci (#537) üzenetére


DP_Joci
tag

Sziasztok,

Ne keressétek tovább, már meg van. :K
köszi

(#541) Pato7


Pato7
csendes tag

Sziasztok!
Tudna nekem valaki segíteni? Mitsubishi PLC szeretnék programozni, de eddig csak maga a PLC áll a rendelkezésemre!
Se kábelem, se szoftverem nincsen!
Előre is nagyon köszi

(#542) m.gabor


m.gabor
csendes tag

Sziasztok!
Segitséget szeretnék kérni. Adott egy Omron CPM1A PLC és ezzel kellene megoldanom egy gépnek a működését. 3 pneumatikus karnak kellene megfelelő sorrendben és időzitéssel mozognia. Ehhez szükségem lenne egy kábelre, amivel fel tudom programozni PCről, hogy vezérelje a szelepeket.
Jól gondolom, hogy ez megoldható vele? Analóg áramköröket már építettem, de a digitálishoz tök hülye vagyok.

Előre is köszi

M. Gabor

(#543) Pato7 válasza m.gabor (#542) üzenetére


Pato7
csendes tag

Szia!
Ezt a PLC-t, ha jól tudom, CIF01-es interfészen keresztül tudod programozni!

(#544) m.gabor válasza Pato7 (#543) üzenetére


m.gabor
csendes tag

Igen, valami CMP1-CIF01 kábelt olvasgattam hozzá (gőzöm sincs, mit jelent az a CIF01). Találtam is egy bekötést, de nem működik. Az sem lehetetlen, hogy én vagyok béna, igy annak is örülnék, ha valaki meg tudná mutatni 10percben, hogy hogy is nézne ki egy ilyen csatlakoztatás, és egy adott bemenet hatására egy adott kimenet változtatgatását hogyan lehet megoldani.
Előre is köszönöm a segitséget,

M. Gabor

(#545) Szirty válasza m.gabor (#544) üzenetére


Szirty
őstag

Hali!

"Az sem lehetetlen, hogy én vagyok béna, igy annak is örülnék, ha valaki meg tudná mutatni 10percben, hogy hogy is nézne ki egy ilyen csatlakoztatás"

A CIF001 nem egy kábel, hanem egy interfész. Így néz ki. Nem bekötni kell, hanem megépíteni (vagy megvásárolni) :)

(#546) m.gabor válasza Szirty (#545) üzenetére


m.gabor
csendes tag

OK, akkor nem annyira egyszerű, mint gondoltam.
Megvásárolni meg nem lenne célszerű egy egyszeri használathoz ezt a kütyüt kb35000 ért.
Megépitéshez van esetleg rajzod?

M. Gabor

(#547) Szirty válasza m.gabor (#546) üzenetére


Szirty
őstag

Helló m.gabor!

"Megvásárolni meg nem lenne célszerű egy egyszeri használathoz ezt a kütyüt kb35000 ért."

Nos ez igaz. Sajna nincs ilyen rajzom és nem is tudok róla hogy közkézen forogna ilyesmi. Ugyanakkor elég valószínű, hogy egy alkalomra megépíteni épúgy nem célszerű...

Talán a kölcsönkérés ami még járható lehet.

[ Szerkesztve ]

(#548) Pato7


Pato7
csendes tag

Na, akkor felteszem újra kérdésem!

Tudna nekem valaki segíteni? Mitsubishi PLC szeretnék programozni, de eddig csak maga a PLC áll a rendelkezésemre!
Se kábelem, se szoftverem nincsen!
Előre is nagyon köszi

(#549) DP_Joci válasza Pato7 (#548) üzenetére


DP_Joci
tag

Szia,

Itt [link] elég sokminden megtalálható.

(#550) moseras


moseras
tag

Sziasztok!

Voltam egy WAGO-s bemutatón, ahol egy adott feladat végrehajtása közben a PLC-nek min. 5 ms, max. 52 ms, átlagban pedig 7 ms volt a ciklusideje. Ebből következik e az, hogy jelen esetben kevesebb mint 20 felfutó élet (1000/52 ms) tudnék számlálni egy DI bemeneten (mert ugye a legrosszabb esetben 2-szer is változhatna a jelem a bemeneten mielőtt egyszer kiolvasta volna a PLC) ?

Vagyis ha biztosra akarok menni 20 Hz-re, akkor fel kell tennem egy számláló modult ?

Köszi.

Imi.

Útvonal

Fórumok  »  Egyéb hardverek  »  PLC programozás
Copyright © 2000-2024 PROHARDVER Informatikai Kft.