PHP et Modbus TCP

Signaler
Messages postés
2
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
7 juillet 2008
-
Messages postés
8
Date d'inscription
mercredi 7 juillet 2010
Statut
Membre
Dernière intervention
20 juillet 2010
-
Salut tout le monde!!

J'suis actuellement en 2ème année de BTS info et réseaux et pour mon projet de fin d'année, de dois réaliser uen application capable de piloter un système automatisé en modbus tcp via un programme php.

J'ai fait pas mal de recherches pour trouver comment se construisait la trame, mais là je sèche.

J'ai donc ce code (je vous passe l'étape création/connexion du socket) :

$idtransaction = 0x00;
$idtransaction2 = 0x00;
$idprotocole = 0x00;
$idprotocole2 = 0x00;
$esclave = 0x01;
$longueur = 0x00;
$longueur2 = 0x05;
$fonction = 0x06;
$adressemot = 0x00;
//$comptemot = 0x01;
//$compteoctet = 0x02;
$valeur = 0x0f;





$req = $idtransaction.$idtransaction2.$idprotocole.$idprotocole2.$esclave.$longueur.$longueur2.$fonction.$adressemot.$valeur;



echo '
Requete Modbus : '.$req;



$write_len=strlen($req);
socket_write($sock,$req,$write_len);




En sachant qu'une trame modbus tcp se construit de cette façon :

id_transaction (2 octets) | id-protocole (2 octets) | longueur (2 octets) | identifiant (1 octet) | puis les données modbus

Je devrais être pas mal!

Seulement quand j'analyse les trames avec ethereal, mon id_transaction se transforme en 0x30 0x30, idem pour le protocole, la longueur en 0x31 0x30, mon identifiant en 0x35 et la fonction modbus en 0x36...


Du coup aucun chance que la trame fonctionne !

J'aimerai donc avoir un peu d'aide s'il vous plait, par pitié pour mes cheveux !!

4 réponses

Messages postés
1
Date d'inscription
jeudi 15 mai 2003
Statut
Membre
Dernière intervention
7 juillet 2008

Bonjour

Il semble pour commencer que tu transmette dans ta trame le code ASCII et non pas la valeur en binaire.
Une conversion devrais suffire ex: hexdec bin2hex ...

Reste un point a voir la trame doit ce finir par un CRC si mais souvenir sont bon.
calcul du crc en VB :

    Public Function Calcul_CRC16(ByVal Chaine As Byte()) As Integer
        Return Calcul_CRC16(Chaine, Chaine.GetLength(0))
    End Function



    Public Function Calcul_CRC16(ByVal Chaine As Byte(), ByVal Taille As Integer) As Integer
        Dim Val_Crc As Integer      ' Variable pour reçevoir la valeur du CRC16
        Dim Crc_Tampon As Integer   ' Variable recevant le CRC16 avant le décallage
        Dim i As Integer            ' Variable de boucle pour le calcul du CRC16
        Dim j As Byte               ' Variable de boucle pour le calcul du CRC16



        ' Initialisation de la variable Crc à la valeur hexadécimal "HFFFF"
        Val_Crc = &HFFFF&



        ' La grandeur de la chaîne totale moins 2 octets
        For i = 0 To Taille - 1
            ' Ou exclusif
            Val_Crc = Val_Crc Xor Chaine(i)



            ' Les opérations sont faites sur les 8 bits de l'octet
            For j = 1 To 8
                ' mise à jour de la variable avant le décallage
                Crc_Tampon = Val_Crc



                ' Décallage d'un bit vers la droite
                Val_Crc = (Val_Crc \ 2)



                If ((Crc_Tampon And 1) = 1) Then
                    ' Ou exclusif avec la valeur hexadécimal "HA001"
                    Val_Crc = Val_Crc Xor &HA001&
                End If
            Next j
        Next i



        Return Val_Crc
    End Function


Si ca peut aider dis moi si ca fontionne.

JanusM
Messages postés
2
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
7 juillet 2008

Merci pour ton aide mais en fait ça va j'ai finit le projet et eu le BTS!

En fait il "suffisait" d'envoyer l'octet convertit en caractère via la fonction chr().

Sinon en Modbus TCP il n'y a pas besoin de CRC, c'est juste pour le modbus série ça.

Voila et si quelqu'un à besoin d'aide qu'il me demande!

@++
Messages postés
1
Date d'inscription
vendredi 21 novembre 2008
Statut
Membre
Dernière intervention
23 novembre 2009

Bonjour,

J'ai un projet à faire, je dois pouvoir superviser un système à distance. Sachant que ce système communique en Modbus/TCP, je dois créer une application capable de piloter le systeme via un programme php.

J'ai essayé de comprendre ce protocole, mais la je sèche, j'ai suivi votre discussion mais l'histoire des sockets je ne comprend pas. J'aurai besoin d'un coup d'main.

Mercii+++
Messages postés
8
Date d'inscription
mercredi 7 juillet 2010
Statut
Membre
Dernière intervention
20 juillet 2010

Bonjour,

j'ai également un projet similaire à réaliser pour mon stage de DUT.

Je dois créer une page sous dreamweaver pour pouvoir lire depuis mon PC, un mot (variable) dans l'automate et afficher ensuite son état sur ma page.

Je suis un peu perdu sur la démarche à suivre, et je pense que ce que je veux faire fait référence à une petite partie de ton programme.

Merci