BCB6 hjälp med sockets

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

BCB6 hjälp med sockets

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: BCB6 hjälp med sockets

Inlägg 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"...
kodar-holger
EF Sponsor
Inlägg: 916
Blev medlem: 26 maj 2014, 12:54:35
Ort: Karlskoga

Re: BCB6 hjälp med sockets

Inlägg 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);
}

Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: BCB6 hjälp med sockets

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: BCB6 hjälp med sockets

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45167
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: BCB6 hjälp med sockets

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: BCB6 hjälp med sockets

Inlägg 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?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45167
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: BCB6 hjälp med sockets

Inlägg 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
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: BCB6 hjälp med sockets

Inlägg av baron3d »

Ska du inte använda TClientSocket i stället?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: BCB6 hjälp med sockets

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: BCB6 hjälp med sockets

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: BCB6 hjälp med sockets

Inlägg 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.
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: BCB6 hjälp med sockets

Inlägg av baron3d »

Du kan använda "anonymous pipe".
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: BCB6 hjälp med sockets

Inlägg 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...
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: BCB6 hjälp med sockets

Inlägg 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å.
Skriv svar