Sida 1 av 2

BCB6 hjälp med sockets

Postat: 7 april 2017, 14:19:46
av Icecap
Scenario:
PC, Win7 Pro

Ska "prata" med (sannolikt) LAN<->COM (RS485) enheter. Om dessa ställs in som "fusk-COM port" eller jag kör med ren IP-adress:Port är oklart i nuläget - men jag ska klara båda scenario oavsett.

Då det kan röra sig om ett större antal enheter (32+ st) som det skal kommuniceras med ser jag ingen anledning att ta ett antal Socket-komponenter att strössla med, jag måste skapa dessa sockets dynamisk.

Men då jag har noll erfarenhet med hur man gör det hoppas jag att någon här kan sparka mig i rätt riktning.

COM-portarna kan jag enkelt skapa dynamisk, det är bara att låtsas att de är filer med namnen "COMxx" och sedan ställa lite parameter, sedan brukar det rulla på som tusan. Och HANDLE's kan jag enkelt reservera minne till.

EDIT: Det finns en INDY-Server som verkar kunde kommunicera med ett antal TCP/IP anslutningar och den kan ställas dynamisk. Alltså borde den vara den rätta grej att använda.

Jag får helt enkelt göra ett testsystem med två datorer och se om jag kan få hål igenom.

Re: BCB6 hjälp med sockets

Postat: 7 april 2017, 16:33:56
av sodjan
Dessa "LAN <-> RS485" enheter har sannolikt någon IP-port som är kopplad till RS485 porten.
D.v.s att du borde kunna skapa en socket "som vanligt" till IP adress för enheten och IP porten.
Alltså i så fall helt vanlig socket kommunikation och några "COM-portar" behövs då inte.

Det brukar vara några "höga" portnummer som 10001, 9001 eller liknande. Kolla
dokumentationen för LAN/RS485 modulen. Men du vet alltså inte vad de heter?

Om man tycker att det är enklare att programmera seriekommun via COM device så kan
man säkert också använda någon programvara som skapar virtuella COM portar och
prorammera seriekommunikation också "som vanligt"...

Re: BCB6 hjälp med sockets

Postat: 7 april 2017, 22:10:02
av kodar-holger
Nu har jag aldrig använt C++-builder men däremot en hel del Delphi och språket är ju bara en syntax...

Komponenterna är inget annat än objekt som vilka som helst. Enda skillnaden är att när man drar in dom på en form eller datamodule så instantieras dom automatiskt.

Du borde alltså kunna skapa en lista med pekare på ett sätt du känner dig bekväm med. Jag skulle i delphi säkert använt en TList. Men en vanligt vektor funkar väl också. Sen skapar du bara instanserna av socketkomponenten och får tillbaka en pekare som du stoppar i listan.

Kod: Markera allt

for(int i=0; i<32; i=i+1)
{
  TSocket* pekarvariabel = new TSocket(lämplig parent eller null om du gör delete själv);
  pekarvariabel->setXxxx(vadunubehöver göra); //Samma samma som du gjort i object inspectorn.
  pekarvariabel->connect();
  listan->append(pekarvariabel);
}


Re: BCB6 hjälp med sockets

Postat: 7 april 2017, 22:58:44
av Icecap
Sodjan: jo, hur enheterna fungerar är inget problem. De kan antingen vara med en driver som låtsas vara en lokal COM-port eller medge riktig Adress:Port kommunikation.

Exakt vilken modell beror på ökonomi och tillgängelighet.

Kodar-holger: bingo! BCB6 är bara en C++ vrapper till Delphi. Kan definitivt använda dina tips. Tack.

Re: BCB6 hjälp med sockets

Postat: 21 april 2017, 15:44:37
av Icecap
Nää, jag är kört fast så det vill något.

Win 7 Pro, Borland C Builder 6.0

Jag ska öppna ett okänd antal kommunikationskanaler via LAN till serieportsservrar, i nuläget 3 st NPort 5150. Tack för råd TomasL, finns här nu.

Varje NPort har en IP:Port på LAN'et (på den jag testar med: 192.168.1.240:4001), jag har testat med HyperTerminal vid att göra en loopback på RS232-donet och kollat med oscilloskop, allt OK. Som förväntat ekas det skrivna tillbaka och Tx flipprar till med de data som kommer.

Men nu kommer problemet:
Testar kodar-holgers tips men det vill sig inte.
Jag har definierat en struct som ska hålla lite sekvenseringsdata för varje enhet som det ska kommuniceras med, pekare osv. och när jag testar att definiera:
TSocket *This_Socket;
får jag "E2303 Type name expected" och "E2139 Declaration missing ;"
Att det skulle fattas ';' låter för mig som om att TSocket möjligen är ofärdig som definition. I hjälp-filen skriver de:
typedef Word TSocket;
för att beskriva den och standard för BCB6 är WORD för en word-variabel.

Nu kommer frågorna:
Datorn ska alltså öppna kontakt med enheter på LAN'et, alltså bör den vara en server. Har jag rätt?

Vilket sätt ska jag använda för att öppna dessa Sockets? Jag har den gamla TServerSocket samt den-inte-lika-gamla TIdTCPServer samt vilka Windows API man vill använda.

Jag ser helst att mitt program är den uppsökande så att man inte måste konfigurera NPort'arna att göra det uppsökande arbejdet (om det ens är möjligt).

Om någon har fungerande generella exempel tar jag GÄRNA emot. Jag är ganska van att jobba med µC på bit-nivå men detta med Sockets är totalt nytt för mig.

Re: BCB6 hjälp med sockets

Postat: 21 april 2017, 16:34:07
av TomasL
En server svarar alltid på anrop, den anropar aldrig själv.
Vad du skall ha är en klient i din dator, som sedan anropar de olika NPort-servrarna.

Re: BCB6 hjälp med sockets

Postat: 21 april 2017, 16:48:41
av sodjan
Lite oklart vad du menar med "server". Normalt är den som gör
anropet/anslutningen "client" och den som svarar på anropet "server".
(Som Tomas också han emellan med... :-) )

Jag är inte helt med på vad problemet är, själva socket programmeringen
borde vara "som vanligt". Här är ett exempel med Delphi 7.

http://etutorials.org/Programming/maste ... lications/

Har problemen med att göra att du vill hantera flera anslutningar på något sätt?

Re: BCB6 hjälp med sockets

Postat: 21 april 2017, 16:57:22
av TomasL
Ja i konceptet KlienT/Server är det klienten som begär och servern serverar.
I Master/Slave är det mastern som bestämmer slaven gör vad den blir tillsagd att göra samt att hålla käft.

Så IceCap, du skall skriva ett Klientprogram till PCn

Re: BCB6 hjälp med sockets

Postat: 21 april 2017, 20:07:04
av baron3d
Ska du inte använda TClientSocket i stället?

Re: BCB6 hjälp med sockets

Postat: 22 april 2017, 00:10:50
av sodjan
Ja, det verkar ju rimligt.

TServerSocket/TIdTCPServer skapar en "listener" som inte gör något mer
än ligger och väntar på en "connect" från en "client". Och det finns ju inte.
Dessa NPort 5150 ligger ju också bara och väntar på en "connect" så
ingenting händer.

Kolla sidan jag länkade till, där finns exempel med TIdTCPClient.

Re: BCB6 hjälp med sockets

Postat: 24 april 2017, 13:44:19
av Icecap
Tack! Jag börjar fatta lite om vad jag håller på med - eller är det Dunning-Kruger-effekten som slår till med full kraft...?

Jag jobbar i alla fall på det och ska se om jag klarar det.

Re: BCB6 hjälp med sockets

Postat: 24 april 2017, 16:08:33
av Icecap
Ja ja, Dunning-Kruger kan semestra lite här.
Jag är mycket medveten om att jag inte kan speciellt bra.

Men det jag har kommit fram till är att jag måste starta en thread (tråd) för varje client jag ska öppna. Att skapa dessa trådar är inget svårt.

Sedan ska dessa trådar ju köra deras grej och jag har hittat lite exempel på detta. Det blir ju i grunden samma programsnudd jag låter alla trådar köra och jag hoppas att få till det rimligt. Ska ju i praxis bara skicka data och ta emot svaren.

Vad jag nu har mest svårt att överse är hur jag ska kommunicera med trådarna.

Min funktionsidé är att öppna de portar som ska öppnas, är et den IP:Port skapas en tråd per enhet.
Sedan ska en inverter frågas om data och det ska väntas en viss maximal tid på svaret.
När det är klart ska nästa inverter frågas osv.
Hastigheten är inte en primär faktor just nu - men såklart är det ju kul om det kan gå fort.

Jag har en samling data för att kommunicera med de olika portar, det finns en block för varje möjlig inverter.
I dessa data ingår tråd-ID och allt annat jag vill använda/behöver.

Re: BCB6 hjälp med sockets

Postat: 24 april 2017, 17:05:18
av baron3d
Du kan använda "anonymous pipe".

Re: BCB6 hjälp med sockets

Postat: 25 april 2017, 11:42:12
av sodjan
> När det är klart ska nästa inverter frågas osv...

Om du nu ändå ska köra varje i separata trådar, så finns det
väl ingen anledning att läsa dom i sekvens, varje tråd jobbar
väl självständigt var för sig oberonde av de andra. Annars blir
det nog en del extra synkronisering mellan trådarna.

Om du vill köra dom en och en i sekvens, så kan du lika gärna
göra det från huvudprogrammet och slippa hanteringen av trådar.

Öppna första, skriv och läs, stäng.
Öppna nästa, skriv och läs, stäng.
O.s.v.

Loopa när alla är lästa.

> men såklart är det ju kul om det kan gå fort.

Du har Ethernet/RS232 konverters, så hastigheten kommer nästan
till 100% att vara beroende på baud rate på RS232 linan. Sen beror
det ju på också om konvertern tar tid på sig att svara...

Re: BCB6 hjälp med sockets

Postat: 25 april 2017, 13:19:54
av Icecap
Fan Janne, bra tänkt!

Har i övrigt fått dom till att leka lokala COM-portar så det är en väg också.