C# + Modbus TCP/IP - dekodowanie ramki danych

0

Witam,

Kończę pisać program do obsługi wymiany danych między sterownikiem PLC a urządzeniami pomiarowymi. Urządzenia te spięte są w sieć profinet i przez ww. sterownik zarządzane są lokalnie przez SCADĘ. Przewidziałem też możliwość wpięcia układu do sieci zakładowej i odczyt wartości i nastaw przez Modbus'a.

Odczyt z urządzeń wykonuję przez kody 00x3 oraz 00x4 (nie jest to w tej chwili ważne). W ramach odczytu jednego parametru, dajmy na to ciśnienia pobieram 2 rejestry (w formacie dziesiętnym - 2 words decimal). W tym miejscu pojawia się problem, mianowicie te dwa rejestru muszę przeliczyć na format zmiennoprzecinkowy (float), czyli w skrócie zdekodować je na wartość ciśnienia, a nie wiem jak się za to zabrać.

Operację taką obrazuje arkusz excela który umieszczam w załączniku.
Jeżeli ktoś ma gotową procedurę będę wdzięczny za przykład.

Jest późno, może jak się wyśpię temat będzie dla mnie łatwiejszy.

Pozdrawiam

0

Witam,

z problem poradziłem sobie wieczorem kolejnego dnia, rzeźba straszna - odpowiedź na pytanie opiszęw najbliższym czasie, może komuś się przyda.

Mam teraz inne pytanie:

Przy podłączeniu urządzenia slave mogę czytać z niego dane bez problemu, jednak, gdy podłącze je przez switch'a, nie mogę nawiązać połączenia. Jaki może być tego problem? (w cmd -> ping IP wysyła ramki danych)

Pozdrawiam

0

Witaj
Mam dokładnie ten sam problem jak z 2 liczb 16 bitowych odzyskać wartość zmiennoprzecinkową - napisz proszę jak udało Ci się to rozwiązać.

Pozdrawiam

0

jaki dostajesz komunikat przy próbie połączenia?

0
Przemysław Krygier napisał(a)

Witaj
Mam dokładnie ten sam problem jak z 2 liczb 16 bitowych odzyskać wartość zmiennoprzecinkową - napisz proszę jak udało Ci się to rozwiązać.

w delphi np. tak:

procedure TForm1.Button8Click(Sender: TObject);
type
  TRec = record
    case integer of
      0: (x1, x2: Word);
      1: (x: LongWord);
      2: (y: single);
  end;
var
  a: TRec;
  w: ^Longword;
  s: ^Single;
begin
  //wersja z rekordem wariantowym (w c# chyba nie znajdziesz odpowiednika)
  a.x1 := 32767;
  a.x2 := 17252;
  ShowMessage(Inttostr(a.x) + '  ' + FloatToStr(a.y));

  //wersja ze wskaźnikami - jak najbardzie w c# powinno zadziałać
  new(w);
  s := Pointer(w);
  w^ := (17252 shl 16) or 32767;
  ShowMessage(FloatToStr(s^));
  dispose(w);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1