timer s callback

MP
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:29
0

Witam,

Sczytuje wartości rejestrów z urządzenia poprzez ModbusTCP (EasyModbus library) poprzez metode gvgvgv.

Wartości się sczytują tylko wtedy kiedy wywołam metodę.

Chciałbym zapętlić / zrobić timer's callback(mało umiem) by te wartości były sprawdzane cały czas.

Nie wiem jak to zrobić, nie mogę zrobić pętli w klasie. Ma ktoś propozycje, mógłby ktoś pomóc?

Kopiuj
class bbbbb
{

     // deklaracja_obiektu
     public static ModbusClient modbusClient = new ModbusClient();

     // metoda
     void gvgvgv
     {
            int[] registers = modbusClient.ReadHoldingRegisters(2500, 5);
     }


}
fasadin
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

https://www.google.com/search?client=firefox-b-d&q=call+method+every+x+seconds+c%23

https://stackoverflow.com/questions/13019433/calling-a-method-every-x-minutes/21590665

Kopiuj
var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromMinutes(5);

var timer = new System.Threading.Timer((e) =>
{
    MyMethod();   
}, null, startTimeSpan, periodTimeSpan);

Czy o to Ci chodzilo?

edytowany 1x, ostatnio: fasadin
MP
the contextual keyword 'var' may appear within a local variable declaration or in script code
fasadin
na pewno uzywasz C#? jaka to wersja? mozesz opisac wiecej? Ale jako nowy psot
MP
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:29
0

w odpowiedzi opisuje więcej jako nowy post.

Uzywam WPF, mam .xaml i .cs, w .cs klase partial

// teraz tak, mam sterownik motion z którym komunikuje się poprzez modbus tcp / kabel ethernet / easymodbus library
// mam listę zmiennych globalnych w tym sterowniku, i załóżmy zmieniam zmienną nr 2500 i muszę odczytać teraz tą zmienną poprzez aplikacje na komputerze,
// aplikacja** musi nasłuchiwać czy ta zmienna się zmieniła** (pooling (?) / timers callback), ponieważ modbus nie oferuję takich możliwości < zmiana tej zmiennej ma wykonywać metodę (załóżmy ta metoda ma nazwę MetodaWykonywanaPoprzezZmienna )

Kopiuj
using easymodbus;

 public partial class bbbbb
 {

  public static ModbusClient modbusClient = new ModbusClient();

// kod który wczytuję zmienne globalne ze sterownika wygląda tak:
// int[] registers = modbusClient.ReadHoldingRegisters(2500, 5);  << tego może użyć tylko w danej metodzie, nie mogę bezpośrednio w klasie, muszę wywołać metodę daną by sczytać te rejestry

// dalej logika będzie wyglądała tak:
// ≈ if registers[1] == 1 then wykonaj raz MetodaWykonywanaPoprzezZmienna () then after registers[1] = 0

  void MetodaWykonywanaPoprzezZmienna ()
  {
    // sth się tu robi
  }

}

edit..

aha to ma wyglądać tak? jakieś rozkojarzenie dzisiaj mam..

Kopiuj
        void rejestry()
        {

            int[] registers_MC6N = modbusClient.ReadHoldingRegisters(2500, 5);

            var startTimeSpan = TimeSpan.Zero;
            var periodTimeSpan = TimeSpan.FromMinutes(5);

            var timer = new System.Threading.Timer((e) =>
            {
                rejestry();
            }, null, startTimeSpan, periodTimeSpan);
        }

edytowany 2x, ostatnio: Michał Parzych
fasadin
prawie ma tak wygladac. Ten Timer wrzuc do osobnej funkcji bo teraz rejestry bedzie odpalal nowy timer i ten nowy timer bedzie Ci odpalal nowy timer
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:7 dni
1
Kopiuj
        void rejestry()
        {
            //int[] registers_MC6N = modbusClient.ReadHoldingRegisters(2500, 5);
            var timer = new System.Threading.Timer((e) => rejestry(), null, (int)TimeSpan.FromMinutes(5).TotalMilliseconds, Timeout.Infinite);
        }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
Zobacz pozostałe 3 komentarze
_13th_Dragon
Czyli nie do końca nie przemyślałeś wszystkie skutki
Sunnyline2
Sunnyline2
Milliseconds zwraca milisekundy do pełnej sekundy. Chyba nie o to Ci chodziło?
_13th_Dragon
Trzeba podać w milisekundach, 5 minut przekształcono w milisekundy
SO
Żeby przekształcić na milisekundy to chyba trzeba użyć TotalMilliseconds.
_13th_Dragon
Racja, poprawiam.
MP
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:29
0

title

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.