Avatar billede tcru Nybegynder
23. maj 2010 - 23:53 Der er 19 kommentarer og
1 løsning

Kommunikation mellem PHP og en PLC-styring

Hey, mangler hjælp til kommunikation melllem en PHP hjemmesiden og en PLC kodet i basic.

Jeg mangler hjælp til at forbinde en hjemmeside med en simpel PLC styring. Har prøvet med fsocketopen() osv.. men intet virker.

Pt. ligger styringen på et lokalt netværk - men planen er den skal være global.
Derfor skal vi kunne "ringe" op til den og modtage et svar.
PLC er på forhånd kodet til at registrere et opkald og en kode, men hvordan sender jeg forespørgslen i PHP?

PLC KODE:
(* PLC START *)
        Dim s As Socket = Nothing
        Dim address As IPAddress
        address = IPAddress.Parse(url)
        Dim port As Integer
        port = 59004
        Dim endPoint As New IPEndPoint(address, port)

        Dim tempSocket As New Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)

        If ReadThis = "Open" Then
            tempSocket.Connect(address, 59004)

            If tempSocket.Connected Then
                tempSocket.Send(bytesSentSend, bytesSentSend.Length, 0)
                For x = 1 To 2

                    bytes = tempSocket.Receive(bytesReceived, bytesReceived.Length, 0)
                    Data = Data + Encoding.ASCII.GetString(bytesReceived, 0, bytes) + ControlChars.CrLf
                Next x
            End If
            tempSocket.Close()

        End If
(* PLC SLUT)

Forespørglsen skulle også gerne kunne virke på "forskellige" PLC anlæg.
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 00:15 #1
Har du et link til manual/datablad for den pågældende PLC?
Avatar billede tcru Nybegynder
24. maj 2010 - 00:24 #2
Avatar billede tcru Nybegynder
24. maj 2010 - 00:25 #3
Tidligere kode er laver i Visual Web Developer, og den skal gerne konverteres til PHP!
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 01:05 #4
Jeg skal lige forstå dig helt rigtigt:

er plc'en på dit lokalnetværk som en ethernet node (via XPORT modulet) eller er den tilsluttet en pc på netværket via rs232?

Pdf filen omhandler mange forskellige moduler. Hvilke af disse har du?

Hvis plc'en, som den er programmeret nu, fungerer med koden lavet i Visual Web Developer, kan du så ikke lige poste lidt af denne kode?

Og endelig (hvis kommunikationsfladen er rs232) kører den pc, som skal afvikle php koden, Windows eller Linux?
Avatar billede js_delphi Nybegynder
24. maj 2010 - 01:19 #5
Fed lille styring, lytter lige med...
Maa man spoerge, hvad I bruger den til at styre?
Avatar billede tcru Nybegynder
24. maj 2010 - 01:32 #6
Styrringen der er brugt er modellen CB290 og den har en XPORT som er en dongle fra seriel til ethernet. Selve styrringen sender data når den modtager en kode der fortæller hvilke registre der skal sendes.

Selve Plc koden og VWD koden er taget fra http://www.shelato.com/SecurityRobot/ og plc koden er ændret en lille smule for at kunne sende forskellige data.

Ønsket er dog at have samme funktion i PHP som der er lavet i VWD så der kan oprettes forbindelsen mellem siden og styrringen.

Serveren der skal afvikle PHP koden er windows baseret.
Avatar billede arne_v Ekspert
24. maj 2010 - 01:35 #7
Den VB.NET kode bruger helt almindelig socket kode med TCP til port 59004.

Det kan du sagtens lave i PHP.

Start her:

http://www.php.net/manual/en/function.fsockopen.php
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 03:33 #8
Prøv dette:

<html><body><pre>
<?php
// Disse 4 værdier ændres efter behov.
$plcIP = "192.168.1.100";
$plcPort = 80;
$plcQuery = "GET / HTTP/1.1\n\n";
$plcAnswerMaxLength = 1024;
/*****************/
$plcAnswer = "";

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket == false) {
    echo "socket_create FAILED"; exit();
}
echo "socket_create OK\n";
if(socket_connect($socket, $plcIP, $plcPort) == false) {
    echo "socket_connect FAILED"; exit();
}
echo "socket_connect OK\n";
if(socket_write($socket, $plcQuery) == false) {
    echo "socket_write FAILED"; exit();
}
echo "socket_write OK\n";
sleep(2); //PLC'en skal lige vågne
if(socket_recv($socket, $plcAnswer, $plcAnswerMaxLength, MSG_DONTWAIT) == false) {
    echo "socket_recv FAILED"; exit();
}
echo "socket_recv OK\n\nAnswer from PLC:\n\n";
echo $plcAnswer;

socket_close($socket);
?>
</pre></body></html>
Avatar billede tcru Nybegynder
24. maj 2010 - 11:55 #9
Den melder fatal fejl i socket_create ?
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 12:14 #10
Jamen så er hele problemet jo, at din php ikke har installeret support for sockets. Hmmmmm.

Hvad er det for en webserver du kører (apache, IIS....)?

Jeg kan anbefale WAMP server til windows. Den installerer Apache, PHP og MySql.

Alternativt skal du have din nuværende PHP til at kunne håndtere sockets.
Da min sidste Windows computer blev slagtet for næsten et år siden, til fordel for Linux, så er jeg ikke lige den rette til at svare på, hvordan du installerer et socket modul til din PHP.
Avatar billede tcru Nybegynder
24. maj 2010 - 12:22 #11
Det er en linuxmaskine den til slut skal ligge på men lige nu er wamp kørende på min egen...
Har lige sat sockets til... nu melder den bare fejl i forbindelsen... Måske der kunne være en firewall i router.. ?!
Avatar billede tcru Nybegynder
24. maj 2010 - 12:33 #12
socket_create OK
socket_connect OK
socket_write OK

Notice:  Use of undefined constant MSG_DONTWAIT - assumed 'MSG_DONTWAIT' in C:\Web\PLC\plc.php on line 25

Warning:  socket_recv() expects parameter 4 to be long, string given in C:\Web\PLC\plc.php on line 25
socket_recv FAILED
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 12:57 #13
Konstanten MSG_DONTWAIT = 64 - så udskift MSG_DONTWAIT med tallet 64.
Avatar billede tcru Nybegynder
24. maj 2010 - 13:51 #14
Weee, fået skidtet til at virke på en win-server... Lige testet på unix.. Det dutter ikke... Har prøvet at ændre AF_INET til AF_UNIX.. Dutter nix... Point når vi lige får den til at virke der...

Den skriver den slet ikke kender funktionen socket_create()
Avatar billede tcru Nybegynder
24. maj 2010 - 14:15 #15
Oh, socket er ikke aktiveret... Nåhr, jeg giver point og må få webhotel til at ændre!


Taak.
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 14:16 #16
AF_UNIX er en unix/linux intern protokol, som bruges til at kommunikere internt mellem applikationer på unix/linux, så på Linux skal du også bruge AF_INET.
AF_INET (Address Family INET) = IP addressering = nnn.nnn.nnn.nnn

Så denne kode virker lige så godt på Linux (jeg har KUN Linux).
Her er iøvrigt en kortere (og meget hurtigere) version, hvor følgende er ændret:
Sleep(2) er fjernet.
Til gængæld er sidste parameter i socket_recv() ændret til 0, hvilket betyder at funktionen venter på svar. Dette skulle efter min mening være ok, da funktionen kun kaldes hvis PLC'en har accepteret connection.


<html><body><pre>
<?php
$plcIP = "192.168.1.100";
$plcPort = 80;
$plcQuery = "GET / HTTP/1.0\n\n";
$plcAnswerMaxLength = 1024;
if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) == false) {
    echo "socket_create FAILED"; exit();
} echo "socket_create OK\n";
if(socket_connect($socket, $plcIP, $plcPort) == false) {
    echo "socket_connect FAILED"; exit();
} echo "socket_connect OK\n";
if(socket_write($socket, $plcQuery) == false) {
    echo "socket_write FAILED"; exit();
} echo "socket_write OK\n";
if(socket_recv($socket, $plcAnswer, $plcAnswerMaxLength, 0) == false) {
    echo "socket_recv FAILED"; exit();
} echo "socket_recv OK\n\nAnswer from PLC:\n\n{$plcAnswer}";
socket_close($socket);
?>
</pre></body></html>
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 14:33 #17
Når du prøver koden på dit webhotel, har du så husket at ændre PLCens IP i php scriptet? Så skal IP jo være din wan ip, ikke ip'en på dit lokale net...

Din wan ip kan du let og elegant se her wami.dk
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 14:36 #18
... og derudover skal din router jo route PLC porten til den lokale IP.
Avatar billede jesperhgh Nybegynder
24. maj 2010 - 16:13 #19
Efter at have testet php scriptet hos min webhoster, kan jeg konstatere, at her virker sockets.

Min webhoster er netplads.dk/gratisdns.dk - og det koster næsten ikke noget, og det er 'taletid' princippet: Du sætter lidt penge ind, når du synes - og så bli'r der trukket nogle øre pr dag. Og hvis du køber f.eks. et .DK domæne, så er du EJER af dette domæne, hvilket vil sige at den fremtidige pris kun er kr. 45,- årligt, afregnet direkte med DK-HOSTMASTER.

Så:
Køb et domain, og få en fast IP (det kan din netudbyder forsyne dig med)
Avatar billede jesperhgh Nybegynder
26. maj 2010 - 17:10 #20
Jo, selvtak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester