Dobrý den, marně se snažím vyřešit pozastavení procesu v DETSTUDIU pro řídící systém I. generace AMiNi2S. Vytvářím program pro načtení hodnot protokolem MUDBUS RTU ze tří elektroměrů. Z hlavního procesu spustím podprogram pro odeslání a načtení Telegramu. Podprogram je opětovně spouštěn od přerušení přijatého znaku pro načtení celého telegramu. To vše funguje pro jeden elektroměr. Hlavní program spustím jednou za cca 10 min a potřebuji, aby postupně načetl hodnoty ze všech elektroměru v jednom cyklu. Jenže po zavolání podprogramu se ten vrátí do hlavního programu už po prvním průběhu. Nevím, jak nastavit, aby počkal na načtení celého telegramu. Je v DETSTUDIU příkaz na přerušením procesu do splnění podmínky? Případně jak nastavit podprogram, aby se navrátil až po splnění načtení všech znaků... Předem moc moc děkuji za předané zkušenosti.
Dobrý den, neposlal jste SW, takže je těžké odhadnout kde je případná chyba, takže se omezím na body, které Vám mohou pomoci.
1) Protokol Modbus RTU je plně integrován do Detstudia, a proto není potřeba si komunikaci psát vlastní. Máte dvě možnosti:
a) Pomocí modulů Modbus (komunikaci máte komplet pod kontrolou). Viz nápověda Detstudia -> Nápověda PseDet -> hledat-> moduly Modbus.
b) Definice tabulkou (nejrychlejší řešení). Viz nápověda Detstudia -> Nápověda PseDet -> hledat-> Modbus tabulka. Popis včetně příkladu najdete i v Aplikačních poznámkách https://amitomation.cz/produkt/aplikacni-poznamky/ AP0008 – Komunikace v síti MODBUS RTU (PseDet).
2) Podprogram se vrátí do hlavního procesu po vykonání všech modulů podprogramu, to je v pořádku. Pro názornost si podprogram představte jako odstavec hlavního procesu, který je jen pro přehlednost a opětovné použití opatřen záložkou. Pokud ho chcete vyvolat vícekrát se změnou adresou, tak bych to řešil změnou adresy a jeho opětovným vyvoláním například:
Let Adresa = 1
Call Modbus
Let Adresa = 2
Call Modbus
Let Adresa = 3
Call Modbus
Nebo zkopírování 3x v jednom podprogramu.
3) Pokud bych měl řešit něco od splněné podmínky tak bych použil moduly Repeat + Until nebo While (viz nápověda Detstudia). Pozor na zacyklení!
Pane Valter, moc moc děkuji za rychlou odpověď. Já jsem vycházel z AP0039-Komunikace-s-elektromery-dle-normy-CSN-EN-62056-21. AP0008 mi připadala, že je určeno jen pro komunikaci s rozšiřujícími moduly. Znamená to, že takto můžu nastavit i komunikaci s elektroměry??
Je pravda, že jsem si trochu naběhl s tou komunikací, než jsem zjistil, že ta poznámka je pro MODBUS starý typ.
Program jsem zjednodušil a funguje s jedním elektroměrem. Tak jak jsem si představoval pro 3 elektroměry, jsem právě narazil na to, že se z volaného podprogramu vrátí po prvním průběhu a nedojde tedy k předání hodnoty celého telegramu. Posílám jen pro info výpis, tak jak jsem chtěl, aby fungovalo:
Hlavní proces:
//Povel pro vyslani ramce
If cti.0
For ii, 0, 7, 1
Let OutTlg [0,ii] = OutTlg1[0,ii]
EndFor
//Vyslani ramce
Call Lib103
Let M_OD1_okamz = M_ODB_okamz
For ii, 0, 7, 1
Let OutTlg [0,ii] = OutTlg2[0,ii]
EndFor
//Vyslani ramce
Call Lib103
Let M_OD2_okamz = M_ODB_okamz
For ii, 0, 7, 1
Let OutTlg [0,ii] = OutTlg3[0,ii]
EndFor
//Vyslani ramce
Call Lib103
Let M_OD3_okamz = M_ODB_okamz
EndIf
Let cti = 0
Podprogram Lib103:
//Rozskok dle stavu, nejdříve odesílá telegram, pak v několika kolech načítá odpověď
Switch L2_Event
Case 1
ComWrite :02000, OutTlg3, 0, OutLen, NONE, NONE
//TMO na odpoved do určitého času
TmoStart :02001, 15000
EndCase
Case 2
//Udalost Char - prisel znak
ComRead :02000, InTlg, InLen, InLen, NONE
//TMO meziznakovy
TmoStart :02001, 15000
//Prijaty znak
Let InChar = InLen
//Postupné načítání prijatých znaků
If (InChar > 12), :NONE
//Zruseni TMO, všechny znaky jsou načteny
TmoStop :02001
//Zacni prijimat zase od zacatku
Let InLen = 0
Let L2_Event = 1
//Překlad přijatého telegramu na hodnotovou proměnnou
StrParse InTlg, 3, NONE, "", 7, 10, "", M_ODB_okamz, NONE.0, 0.000
EndIf
// Udalost zpracovana, příprava na nové zadání
EndCase
EndSwitch
Proces INIT:
//Komunikacni jadro
:02000 ComInit 0x0002, 1, 9600, 8, 0, 1, :02003, :NONE, :NONE, :NONE, PrijBuf, VyslBuf
//Timeout
:02001 Tmo :02004, 10, 15000
//Instance podprog. preruseni od prijmu
:02003 SubInst Lib100
//Instance podprog. preruseni od timeoutu
:02004 SubInst Lib102
//Pocatecni stav automatu
Let L2_Status = 1
Podprogram od přerušení Lib100:
//Udalost Char - prijem znaku
//Let L2_Event = 2
//Automat L2
Call Lib103
Pokud to lze nastavit tabulkou bude to samozřejmě čitelnější a přehlednější, pokusím se to tak vyřešit. Moc moc děkuji za ochotu a posílám pozdrav.
Dobrý den, ano, takto můžete komunikovat s čímkoli co je na Modbusu, třeba i s elektroměry. Standartně to dělám spoustu let a s různými elektroměry (nejvíce napojuji elektroměry od Eniky). Já nejvíce používám moduly Modbus, kde je jasně definuji kdy se co má udělat (je to pracnější, ale máte vše pod kontrolou). Možná je to také tím, že „tabulka“ mi nějak nepřirostla k srdci.
Konstrukce, co jste použil, není určena pro Modbus, ale pro jakoukoli uživatelskou komunikaci. Lze ji použít, ale nesmíte ji tak hodně zjednodušit ;-) Po rychlé obhlídce, vidím jako zásadní použití konstrukce (InChar > 12) v podprogramu Lib103. Poté vždy po přijetí dvanácti znaků, se bere že to je všechno. Tento algoritmus jsem používal pro M-Bus měřiče. Kdybyste se dostal do úzkých, můžu vytvořit nějaký vzor z mích stávajících aplikací.
Hezký večer pane Valter, Vás ta práce asi hodně baví, že ještě takto po večerech pomáháte. Já Vám moc moc děkuji.
Já mám tu jednotku AMIT doma a postupně k ní přidávám další a další komponenty, dělám to amatérsky. Začínal jsem s regulací přebytků FVE. Postupně jsem přidal několik elektroměrů, měřič tepla, tepelné čerpadlo, zavlažování, filtrace bazénu, čidla na teploty, ...
Ještě k té tabulce, prozatím se mi to nepodařilo spustit, ale když vím že to jde tak to je dobře.
Nastaví jen master (stanice) a tabulka připojené zařízení (elektroměr) nic víc není potřeba? Žádný proces není nutný? Přeji hezký večer a moc moc děkuji za pomoc.
Dobrý den pane Valter, tak už mi to běží. Tabulka je jednoduchá. Problém ale byly krátké komunikační konstanty ToTransmit a ToReceive. Musel jsem je prodloužit.
Vám moc a moc děkuji za pomoc a přeji hodně úspěchů ve Vaší činnosti.
Odesílatel: zdenek@centrum.cz
Poslední komentáře