Vítej, Host. Prosím přihlaš se nebo se zaregistruj.
17.01.2019, 07:12:38

Domů Nápověda Vyhledávání Přihlásit Registrovat
 
Fórum k produktům firmy ELSACO Kolín  

+  PROMOS fórum
|-+  HW
| |-+  Periferní jednotky RS-485
| | |-+  SBI-12 a C#
0 uživatelů a 1 Host prohlíží toto téma. « předchozí další »
Stran: [1] Dolů Tisk
Autor Téma: SBI-12 a C#  (Přečteno 4652 krát)
libor
moderátor+

Příspěvků: 388



« kdy: 06.01.2014, 07:43:43 »

Dobrý den,
mám od Vás zakoupenou sběrnici SBI-12 se 16 logickými vstupy. Mám program vytvořený v C#. Potřebuji poradit. Existuje globální funkce, která přečte všechny logické vstupy najednou? Jde mi o načítání stavů.


Dotaz zaslaný mailem (viz výzva).
Zaznamenáno

libor
moderátor+

Příspěvků: 388



« Odpověď #1 kdy: 06.01.2014, 07:49:18 »

Dobrý den,
jednotky SBI-12 komunikují protokolem Epsnet (případně Modbus - dle nastavení). Budu předpokládat, že máte nastavený protokol Epsnet.

Na této stránce je ke stažení Driver.Epsnet (fred-driver-epsnet.zip). Po jeho nainstalování dostanete nejenom testovací nástroj na ověření funkce komunikace (spuštění aplikace VP.RemoteDriver.exe, které je součástí instalace), ale také rozhraní IEpsnet, které umožňuje snadné používání protokolu Epsnet bez nutnosti jeho vlastní implementace.

Po nainstalování otevřete Váš projekt v C# a přidejte referenci na COM objekt - ve Visual Studio 2008 je to hlavním menu Project -> Add Reference.... V zobrazeném dialogu volte záložku COM a na ní vyberte Elsaco Epsnet 2.0 Type Library (viz přiložený obrázek reference-epsnet.png).

Nyní můžete používat rozhraní IEpsnet ve Vašem projektu. Detailní popis je v nápovědě, která je součástí instalace. Ve zkratce je to takto:

- potřebujete instanci objektu EpsnetLib.Epsnet, tj:

Kód:
// COM objekt - komunikace protokolem Epsnet
EpsnetLib.Epsnet epsnet;

- kterou potřebuje inicializovat:

Kód:
Type oType = Type.GetTypeFromProgID("Elsaco.Driver.Epsnet.2");

if (oType != null)
{
    // vytvoreni instance
    epsnet = (EpsnetLib.Epsnet)Activator.CreateInstance(oType);

    // nastaveni pripojeni (tj. COM, na kterem je pripojeno SBI-12)
    epsnet.SetConnection("serialPort:COM5/38400/8/2");

    // nastaveni adresy ciloveho zarizeni (adresy SBI-12)
    epsnet.SetCurrentStationAddress(1);              
}

- a pak už jenom čtení hodnot, dle manuálu k SBI-12 na straně 7, jsou nefiltrované stavy vstupů na prvních 2 bajtech v bloku 2 nebo 3 (to je jedno) od offsetu 0, tj. budeme tedy číst z bloku 3 a offsetu 0 pouze 2 bajty:


Kód:
object x;
// zkus nacist data
x = epsnet.Read(3, 0, 2);

// pretypuj vysledek na pole dat
try
{
    // nactena data uloz do pole (cteni z bloku 3, offset 0, delka 2)
    byte[] nData = (byte[])x;

    // ... dalsi zpracovani
}
catch
{
    // chyba (napr. chyba komunikace)
}

- zpracovaní hodnot ... po načtení dat a přetypování na datový typ byte máme v poli nData stavy všech vstupů. V nData[0] je prvních 8 vstupů, v nData[1] je druhých 8 vstupů. Stav vstupu je vždy jako jeden bit, tj. pro zjištění stavu jednotlivých vstupů je potřeba použít bitové operace, a to nejlépe logický součin:

Kód:
if ((nData[0] & 0x01) == 0x01) {
    // 1. vstup je aktivni
}
else {
    // 1. vstup neni aktivni
}

if ((nData[0] & 0x02) == 0x02) {
    // 2. vstup je aktivni
}
else {
    // 2. vstup neni aktivni
}

if ((nData[0] & 0x04) == 0x04) {
    // 3. vstup je aktivni
}
else {
    // 3. vstup neni aktivni
}

// atd...

if ((nData[0] & 0x40) == 0x40) {
    // 7. vstup je aktivni
}
else {
    // 7. vstup neni aktivni
}


if ((nData[0] & 0x80) == 0x80) {
    // 8. vstup je aktivni
}
else {
    // 8. vstup neni aktivni
}

a analogicky pro druhou osmici

Kód:
if ((nData[1] & 0x01) == 0x01) {
    // 9. vstup je aktivni
}
else {
    // 9. vstup neni aktivni
}

// ...atd.



Pokud by jste chtěl s jednotkou komunikovat protokolem Modbus, pak je postup stejný, jen je potřeba nainstalovat místo IEpsnet rozhraní IModbus




(připojené soubory vidí pouze registrovaní uživatelé)
Zaznamenáno

libor
moderátor+

Příspěvků: 388



« Odpověď #2 kdy: 07.01.2014, 07:44:02 »

Dobrý den,
děkuji za Vasí odpoved. Podle Vasich rad zjistim jestli je stav aktivni ci ne. Ale potreboval bych vedet jakym zpusobem hodnotu daneho citace na stavu nactu/zaznamenam. Dale mi neni presne jasna funkce offsetu. jak zjistime hodnoty citacu (jak je vymaskuji).


Dotaz zaslaný mailem (viz výzva).
Zaznamenáno

libor
moderátor+

Příspěvků: 388



« Odpověď #3 kdy: 07.01.2014, 07:46:26 »

Dobrý den,
v případě, že chcete zjišťovat nejenom aktuální stavy, ale i hodnotu čítače, tak je lepší načítat celý blok dat najednou a následně si z toho přes funkci GetReadData dostávat jednotlivé hodnoty. Takže příkaz na čtení by vypadal nějak takto (čteme místo 2 bajtů celých 36 bajtů):

Kód:
x = epsnet.Read(3, 0, 36);

následuje opět v bloku try přetypování na nData, kde zase jako předtím máme v nData[0] a nData[1] aktuální stavy jednotlivých vstupů. A nyní získáme hodnoty čítačů (jak jsem psal přes GetReadValue nebo to jde přes třídu BitConverter z C#):

(popis funkce GetReadValue z rozhraní IEpsnet je v nápovědě)

Kód:
ushort citac0 = epsnet.GetReadValue(4, 18);
ushort citac1 = epsnet.GetReadValue(6, 18);
ushort citac2 = epsnet.GetReadValue(8, 18);
ushort citac3 = epsnet.GetReadValue(10, 18);
ushort citac4 = epsnet.GetReadValue(12, 18);
// atd.


Kód:
// nebo přes BitConverter
ushort citac0 = BitConverter.ToUInt16(nData, 4);
ushort citac1 = BitConverter.ToUInt16(nData, 6);
ushort citac2 = BitConverter.ToUInt16(nData, 8);
ushort citac3 = BitConverter.ToUInt16(nData, 10);
ushort citac4 = BitConverter.ToUInt16(nData, 12);
// atd.


A jak jste asi správně pochopil, čísla 4, 6, 8, 10, 12, ... jsou offsety z tabulky již zmíněného PDF manuálu (strana 7). Číslo 18 u GetReadValue znamená typ (18 je typ VT_UI2 - 2 bajty jako neznaménkové celé číslo) - více v nápovědě IEpsnet.
Zaznamenáno

Stran: [1] Nahoru Tisk 
« předchozí další »
Skočit na:  


Poháněno MySQL Poháněno PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines Validní XHTML 1.0! Validní CSS!