PROMOS fórum

HW => Periferní jednotky RS-485 => Téma založeno: libor 06.01.2014, 07:43:43



Název: SBI-12 a C#
Přispěvatel: libor 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 (http://forum.elsaco.cz/index.php?topic=13.msg112#msg112)).


Název: Re: SBI-12 a C#
Přispěvatel: libor 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 (http://www.elsaco.cz/index.php?file=./download/365_iepsnet.php) 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 (http://www.elsaco.cz/download/pdf/msbi1112.pdf) 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 (http://www.elsaco.cz/index.php?file=./download/366_imodbus.php).´




(připojené soubory vidí pouze registrovaní uživatelé (http://forum.elsaco.cz/index.php?action=register))


Název: Re: SBI-12 a C#
Přispěvatel: libor 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 (http://forum.elsaco.cz/index.php?topic=13.msg112#msg112)).


Název: Re: SBI-12 a C#
Přispěvatel: libor 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 (http://www.elsaco.cz/index.php?file=./download/365_iepsnet.php) 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 (http://www.elsaco.cz/download/pdf/msbi1112.pdf) (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 (http://www.elsaco.cz/index.php?file=./download/365_iepsnet.php).