Komunikacja aplikacji Delphi z aplikacja C# - PLC

Komunikacja aplikacji Delphi z aplikacja C# - PLC
0

Witam. Mam następujące pytanie. Posiadam sterownik PLC, z którym możliwa jest komunikacja za pomocą bibliotek DLL z aplikacjami napisanymi w C# (.NET). Jednak dodatkowo moja aplikacja (C#), która działa z PLC musi komunikować się (dynamicznie) z aplikacją napisaną w Delphi (brak bibliotek do komunikacji z PLC). Z założenia miała to być odrębna biblioteka DLL, która przesyłałaby dane z C# do Delphi i odwrotnie. Jednak nie jest to takie proste. Jaki byłby najlepszy sposób rozwiązania tego problemu? Jakieś pomysły? Pozdrawiam.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:32 minuty
0

Po dwukrotnym przeczytaniu posta (więcej nie będzie) nie do końca rozumiem co ma być aplikacją a co biblioteką.

Napisz jeszcze raz, powoli, co musi być a co chcesz, wyraźnie rozróżniając co jest odgórnym założeniem a co twoim pomysłem na rozwiązanie.

edytowany 1x, ostatnio: Azarien
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0

@Azarien - jemu chodzi o warstwę pośrednią:

Kopiuj
PLC -> C# -> Delphi
Delphi -> C# -> PLC

Chodzi o to jak wysyłać dane z programu napisanego w Delphi do tego napisanego w C# (który komunikuje się ze sterownikiem) i na odwrót - sterownik wysyła do programu napisanego w C#, a ten do aplikacji napisanej w Delphi; Program napisany w C# pośredniczy komunikacji; Przynajmniej ja to tak rozumiem.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Azarien
nie wiadomo która część jest założeniem, a która wymysłem - czy ten "program napisany w C#" istnieje i musi zostać, czy jest tylko pomysłem na rozwiązanie problemu Delphi <=> PLC.
flowCRANE
No nie wiem - mnie to właśnie tak wygląda jak opisałem;
0

Witam ponownie. Dokładnie tak jak przedstawił kolega.

PLC <--> C# <-->Delphi

Aplikacja na Delphi istnieje, jest to rodzaj cad-cama maszynowego.
Aplikacja na C# to moja aplikacja - touch panel do sterowania maszyną.
Jako, że Delphi nie może się skomunikować z PLC, a moja aplikacja może (gotowe biblioteki DLL producenta), muszę jakoś przekazywać niektóre parametry poprzez swoja aplikację do tego Cad-cama.
Pozdrawiam.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

no dobrze ale skoro app w delphi nie jest Twoja to ma ona jakąkolwiek możliwość odbierania (albo pytania o) tych "niektórych parametrów"? Bo jeśli autor nie przewidział to jak chcesz to zrealizować?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
0

Autor tej aplikacji w Delphi współpracuje ze mną i wprowadzi zmiany. Ale on tylko Delphi, i jeśli ma cokolwiek zmienić to muszę mu powiedzieć co i jak. Rozważałem również przekazywanie parametrów poprzez Rejestr Windowsa? Pozdrawiam.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:32 minuty
0

Jako, że Delphi nie może się skomunikować z PLC
Błędne założenie.

a moja aplikacja może (gotowe biblioteki DLL producenta), muszę jakoś przekazywać niektóre parametry poprzez swoja aplikację do tego Cad-cama.
Non sequitur.

Kombinujesz. Dlaczego nie zapytasz "jak pod Delphi użyć biblioteki DLL która jest napisana dla C#"?
A skoro Nie ty jesteś autorem aplikacji pod Delphi, to dlaczego jej autor zwala problem na ciebie? ;-)

Należałoby napisać DLL-kę w C++/CLI która będzie pomostem między programem w Delphi a C#-ową DLL-ką producenta PLC.
Twój program w C# nie musi być w to zaangażowany.

0

Jako, że Delphi nie może się skomunikować z PLC

Błędne założenie.

Siemens - producent sterownika, w swojej obszernej dokumentacji zaznacza, że dołączone biblioteki DLL działają poprawnie tylko z aplikacjami C#/VB/.NET lub C++. Nie wnikałem więc jak zrobić, żeby skomunikować w Delphi, ponieważ kompletnie nie znam Delphi.

a moja aplikacja może (gotowe biblioteki DLL producenta), muszę jakoś przekazywać niektóre parametry poprzez swoja aplikację do tego Cad-cama.
Non sequitur.

Nie ważny jest sposób przekazywania. Ważna jest logika działania. Nie chciałem rozpisywać się do szczegółów, dlaczego Delphi, dlaczego C#. Moje pytanie jaki sposób byłby najprostszy i najszybszy. Bo za pomocą DLL też dałoby radę, ale nie byłoby to ani prosto ani szybko.

Kombinujesz. Dlaczego nie zapytasz "jak pod Delphi użyć biblioteki DLL która jest napisana dla C#"?

Zważając, iż jest to Siemens, ciężko jest użyć tych DLLek dedykowanych dla C#, nawet w C#. Żeby to działało, tak jak ma działać.

A skoro Nie ty jesteś autorem aplikacji pod Delphi, to dlaczego jej autor zwala problem na ciebie? ;-)

W sumie to on robi mi przysługę, że dopasuje coś do mojej aplikacji :) Muszę mu dać najprostsze rozwiązanie.

Należałoby napisać DLL-kę w C++/CLI która będzie pomostem między programem w Delphi a C#-ową DLL-ką producenta PLC.
Twój program w C# nie musi być w to zaangażowany.

Czy to rozwiązanie będzie najprostsze? Ta DLLka to nic skomplikowanego. Potrzebuje po prostu 10, może 15 zmiennych różnych typów(int, double, string), do których będę przelewał wartości (parametry maszyny). Np. ustawiam na CNC punkt zerowy, punkt ten będzie zapisany w 5 zmiennych PLC (5 osi maszyny), mój panel odczyta sobie te zmienne i pokaże wszystkie parametry, ale dodatkowo w tym programie camowskim tenże zerowy punkt musi się narysować (zaznaczyć), więc muszę jakoś te parametry "podać".

poprawienie skopanych komentarzy - fp

edytowany 1x, ostatnio: flowCRANE
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:32 minuty
1

DLL-ka w C++/CLI jest rozwiązaniem zdecydowanie prostszym, niż komunikacja między dwoma osobnymi programami.

C++/CLI służy właśnie do łączenia kodu zarządzanego (.NET) z natywnym (w tym przypadku Delphi). Z jednej strony masz normalny dostęp do bibliotek .NET-owych (do samego .NET Frameworka jak i do DLL-ek napisanych w C#), a z drugiej strony możesz wyeksportować funkcje która będą normalnie widzialne pod Delphi.

mychal
Chyba, że ta DLL-ka jest zgodna z COM. Wtedy wystarczy ją zaimportować do Delphi.
L3
dokładnie, zależy jak mocno skomplikowana była by ta dllka, ale pamietam ze w ten sposob działało szyfrowanie u nas, musiało być zgodne z DLPHI C# i PHP - Biblioteka .net używana przez Com w delphi rozwiązała temat :)
litrmleka
  • Rejestracja:około 11 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:lubuskie
  • Postów:201
0

A jakbym przekazywał parametry przez rejestr Windowsa?

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
0

Taaa, zprzęgnijmy armate do ubicia muchy i zaśmiećmy userowi rejestr. Jeżeli nie możesz wykorzystać Pipes, to najprościej chyba na logikę gdy chcesz przekazać jakieś dane między dwona aplikacjami, to ja bym to oparł o ukryte okna (ewentualne puste - niewidoczne dialogi) i wysyłał komunikaty. Nie słyszałeś nigdy o SendMessageA/W i choćby o WM_COPYDATA, ewentualne własne komunikaty typu WM_USER + XXX?. Ewentualnie HWND_BROADCAST. Jeśli nie to pogoogluj.

Mogę się mylić. Ale podejrzewam, że skoro robiąc rzutowanie na przykład WParam na cokolwiek - jakiś obiekt, można to wysłać i odebrać (jeśli nie z wykorzystaniem dedykowanemu do tego celu WM_COPYDATA) pod Delphi. To i można pewnie w większości normalnych języków programowania własnym komunikatem, zarowno ogarniając odebranie i wysłanie. Ewentualnie są mechanizmy DDE do tego celu stworzone. Ale najprościej kombinował bym z komunikatami. Imo banał.


Pozdrawiam.
edytowany 4x, ostatnio: olesio
litrmleka
  • Rejestracja:około 11 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:lubuskie
  • Postów:201
0

Witam. Tylko nie wiem czy takie rozwiązanie dałoby radę z wydajnością, ponieważ maszyna idzie z dokładnością do 3 miejsc po przecinku (mm), więc jeśli wrzeciono przesunie się o jeden metr, to mamy do "wyeksportowania" 1 milion współrzędnych w sekundę. I to na jednej osi. Jeśli 3 osie na raz, to parametrów będzie 3 miliony.

SE
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:68
0

Miałem styczność z łączeniem dwóch zewnętrznych aplikacji. Na początku łączone były poprzez właśnie wysyłanie komunikatów windowsa, potem z pewnych względów zostało to przerobione an sockety, i powiem, że przynajmniej w tej implementacji komunikacja poprzez kolejkę komunikatów jest o wile szybsza niż przez sockety.

crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

jesli masz mozliwosc zmiany kodu dll z C# polecam sprawdzenie czegos takiego
https://sites.google.com/site/robertgiesecke/

Mozesz w c# wygenerowac dll natywnie ladowane w delphi przez LoadLibrary i pozniej GetProcAddress.
Komunikacja na poziomie interface i wymiana danych poprzez OleVariant(Delphi) = object (C#)


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
edytowany 1x, ostatnio: crowa
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)