Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 38 sur 38

la communication via Modbus



  1. #31
    Jack
    Modérateur

    Re : la communication via Modbus


    ------

    mais j'ai pas compris comment mon µC peut savoir que 03 correspond à une fonction pour lire le registre d'adresse 00 02??!
    Très drôle

    Un µC ne sait rien. C'est à toi d'écrire le programme qui le fait travailler. C'est tout de même toi qui sait s'il faut envoyer telle ou telle trame.

    A+

    -----

  2. Publicité
  3. #32
    azizAVR

    Re : la communication via Modbus

    d'accord
    ta pas un petit programme en C (qui utilise au moins les deux fonctions les plus utilisé en modbus (fonct 3, fonct16)) pour débuter avec ce genre de communication.??!!
    merci d'avance

  4. #33
    paulfjujo

    Re : la communication via Modbus

    bonjour,

    Ce n'est pas du C , mais cette vieillerie pourrait t'inspirer
    testé sur un automate APRIL SMC600 et une carte de liaison 5CLIJ2 ( JBUS !)
    decalage d'adresse de 1 entre Modbus et Jbus.

    Code:
    '
    ' Nom    : 5CLI2J3.bas       DOS 4.01    Video : VGA LCD
    ' Date   : 04 SEP 92         Materiel:   KENITEC NOTEBOOK 386SX 20MHZ
    ' Auteur : PF	          Langage :   Turbo Basic Borland v1.5
    ' But    : Dialogue MODBUS AVEC un automate SMC 600 equip‚ d'une 5CLI2J3
    '
    '
    screen 0
    cls
    defint A-Z
    deflng x
    CLS
    AdrMSB=2
    AdrLSB=128
    Longueur=8
    NbMSB=0
    NbLSB=8
    ?"Lecture MODBUS sur automate SMC600 equipe d'une carte com 5CLIJ2  (TBAS 1995)"
    ?"ou de tout autre equipement modbus connecte sur ligne RS232 com1 "
    if len(command$)>0 then
    	a$=command$
            AdrMSB=(val(a$) and &hFF00)/256
            AdrLSB=val(a$) -(AdrMSB*256)
            if (instr(a$,"/")) then
               A$=right$(a$,len(a$)-instr(a$,"/"))
             else
              A$="8"
            end if
            ?" Parametres pass‚s :"
            longueur=val(a$)
    	NbMSB=(val(a$) and &HFF00)/256
            NbLSB=val(a$) -(NbMSB*256)
     else
    
    	?" exemple de Cde :     5CLI2J3 256/8   "
    	?"  pour  adresse=256 et lecture de : 8 mots"
          ?"  Parametres par defaut car pas de commande passee "
    end if
    
            ?" ArdMSB= ";AdrMSB
            ?" AdrLSB= ";AdrLSB
            ?" Nb de mots a lire = ";Longueur
            ?" NbMSB= ";NbMSB
            ?" NbLSB= ";NbLSB
    
    delay 3
    cls
    Debug=2
    $COM1 1024
    $COM2 1024
    CONF$= "COM1:9600,N,8,1,RS,DS"'
    OPEN CONF$ AS #1 LEN=1
    com(1) ON
    
    PRINT "Configuration liaison -> ";CONF$
    ? "Envoi requete de lecture toute les 2 sec en mode interruption,debug actif"
    ? "Appuyer sur ESC pour en terminer   sur <1> pour com1  sur <2> pour com2"
    ON TIMER(2) gosub Lecture
    TIMER ON
    while inkey$<>chr$(27)
    wend
    TIMER OFF
    Beep
    mes$="Fin de mesure..."
    close
    stop
    
    
    Lecture:
    '    NøEsclave  Lecture   @MSB     @LSB       Nb de mots
    Trame$=chr$(1)+chr$(4)+chr$(AdrMSB)+chr$(AdrLSB)+chr$(NbMSB)+chr$(NbLSB)
    Crc&=FNChecksum&(Trame$)
    Trame$=Trame$+chr$(CrcH)+chr$(CrcL)
    print #1,Trame$
    Delay 0.5
    A$=""
    while loc(1)>0
    A$=A$+input$ (1,1)
    wend
    if len(A$)>0 then
     if left$(A$,2)=left$(Trame$,2) then
      if (debug And 2)=2 then
        locate 4,1
        for i=1 to len(A$):?asc(mid$(A$,i,1));:next i
        end if
      for i=0 to 7
      EA&=asc(mid$(A$,4+i*2,1))
      c%=8:call SHL(c%,EA&)
      EA&=EA&+asc(mid$(a$,5+i*2,1))
      if (debug and 2)=2 then locate 5+i,1:?"Lecture mot numero ";i;" =";EA&
      EntreeANA&(i)=EA&
      next i
      CrcLuH=asc(mid$(A$,20,1))
      CrcLuL=asc(mid$(a$,21,1))
      if (debug and 2)=2 then locate 10,1:?"crc lu=";CrcLuH;" ";CrcLuL;
      b$=left$(A$,19)
      CrcR&=FNChecksum(b$)
      if (debug and 2)=2 then  locate 11,1:?" Crc calcul‚ =";CrcH;" ";CrcL
      if ((CrcLuH=CrcH)and(CrcLuL=CrcL)) then
        if debug and 2=2 then locate 12,1 :?"..ok "
        else
        if (debug and 2)=2 then locate 12,1: ?" Beurk."
         for i=0 to 7:EntreeANA&(i)=0:next i
         beep
         Incr CptDef
        end if
      else
      if (debug and 2)=2 then
       ?"Trame envoi";Trame$
       ?"Trame retour ";A$
       ?"No comprendo..";
       end if
     end if
    else
    for i=1000 to 300 step -100 :sound i,0.1:next i
    end if
    return
    
    
    DEF FNChecksum&(Trame$)
    local n,i,crc$,c$
    shared CrcH,CrcL,Crc&,LongTrame
    if debug=1 then ?trame$
    crc&=&hFFFF
    crc$=FNbin$(crc&)
    LongTrame=len(Trame$)
    for n=1 to LongTrame
     c$=mid$(Trame$,n,1)
     k=asc(c$)
     crc&=crc& xor k
     crc$=FNbin$(crc&)
     for i=0 to 7
       if(right$(crc$,1)="1") then
        crc&=FNSHR&(Crc&)
        crc&=crc& XOR &hA001
        else
        crc&=FNSHR&(Crc&)
       end if
       crc$=FNbin$(crc&)
     next i
    next n
    CrcL=FNDEC&(left$(crc$,8))
    CrcH=FNDEC&(right$(crc$,8))
    if debug=1 then ? :?"Crc=";FNhex$(crc&); "Long Trame=";LongTrame
    Crc&=FNSwapBytes&(Crc&)
    if crc&>0 then FNChecksum&=Crc% else FNChecksum&=65536+Crc&
    END DEF
    
    DEF FNSwapBytes&(L&)
    local A&,b&
    a&=L&
    b&=L&
    c%=8:call SHL(c%,a&)
    c%=8:call SHR(c%,b&)
    FNSwapBytes&=a& + b&
    END DEF
    
    Def FNBin$(j&)
    local a$
    A$=bin$(j&)
    while len(a$)<16
     a$="0"+a$
    wend
    FNBIN$=A$
    END DEF
    
    Def FNHEX$(H&)
    h$=hex$(H&)
    while len(H$)<4
    H$="0"+h$
    wend
    H$=H$+"h"
    FNHex$=h$
    end def
    
    Def FNDEC&(a$)
    local j&,i,b
    shared carry
    j&=0
    b=len(a$)
    for i=b to 1 step -1
     c$=mid$(a$,i,1)
     if c$="1" then
      k&=2^(b-i)
      j&=j&+k&
     end if
    next i
    FNDEC&=j&
    end DEF
    
    DEF FNSHR&(A&)
    local A$,j&
    shared carry
    A$=bin$(A&):  while len(A$)<16:  A$="0"+A$:  wend
    carry=val(right$(A$,1))
    A$="0"+left$(A$,15)
    j&=FNDec&(A$)
    FNSHR&=j&
    END DEF
    
    DEF FNSHL&(a&)
    local A$,j&
    shared carry
    A$=bin$(a&):  while len(A$)<16:  A$="0"+A$:  wend
    carry=val(left$(A$,1))
    A$=right$(A$,15)+"0"
    j&=FNDec&(A$)
    FNSHL&=j&
    END DEF
    
    'sub SHR INLINE
    '$inline "B_SHR.com"
    'end sub
    
    sub SHR Inline
    'exemple d'apel : call SHR(carry%,c%,k&)
    'en entree: c%=nb de decalages
    '	   K& = valeur a traiter
    ' en sortie:
    '         K& decal‚ de c%, carry% positionn‚ … 1bit … 1 deborde … droite
    '
    $INLINE &H55,&H8B,&HEC,&H1E,&HC5
    $INLINE &H76,&H6,&H8B,&H4,&HC5
    $INLINE &H76,&HA,&H8B,&HC,&HD3
    $INLINE &HE8,&HC5,&H76,&H6,&H89
    $INLINE &H4,&H9C,&H58,&H25,&H1
    $INLINE &H0,&HC5,&H76,&HE,&H89
    $INLINE &H4,&H1F,&H5D
    end sub
    
    ';12/10/93
    '; Programme B_SHR.asm
    '; utilisee comme ci: Call SHR(carry%,NbDecalages,Valeur&)
    '; recupere en sortie la valeur shiftee et le flag carry du mot d'etat
    '; teste OK
    ';entree : valeur 16 bits dans un mot long de 32bits
    '          nbdecalage dans un mot de 16 bits (8 bits lsb utiles)
    '; sortie: valeur decalee sur mot de 16 bits dans Valeur&
    '	   carry contient l'etat du d‚bordement … droite (1 ou 0)
    ';
    ';
    '        Push Bp
    '        Mov Bp,Sp
    '        push ds
    '        lds si,[bp+6]   ; valeur
    '        mov ax,[si]
    '        lds si,[bp+10]  ;nb decalage
    '        mov cx,[si]
    '        shr ax,cl
    '        lds si,[bp+6]
    '	 mov [si],ax
    '        pushF
    '        pop Ax
    '        and Ax,0001h
    '        lds si,[bp+14]
    '        Mov [si],ax
    '	 pop ds
    '        pop Bp
    
    
    'sub SHL INLINE
    '$inline "B_SHL.com"
    'end sub
    
    Sub SHL Inline
    $INLINE &H55,&H8B,&HEC,&H6,&HC4
    $INLINE &H76,&HA,&H26,&H8B,&HC
    $INLINE &HC4,&H76,&H6,&H26,&H8B
    $INLINE &H4,&HD3,&HE0,&H26,&H89
    $INLINE &H4,&H9C,&H58,&H25,&H1
    $INLINE &H0,&HC4,&H76,&HE,&H26
    $INLINE &H89,&H4,&H7,&H5D
    end sub

  5. #34
    Jack
    Modérateur

    Re : la communication via Modbus

    Citation Envoyé par azizAVR Voir le message
    d'accord
    ta pas un petit programme en C (qui utilise au moins les deux fonctions les plus utilisé en modbus (fonct 3, fonct16)) pour débuter avec ce genre de communication.??!!
    merci d'avance
    Mais ce tu ne veux pas comprendre, c'est que le contenu de la trame dépend de l'esclave (adresse de mots, des compteurs, des entrées TOR, des sorties TOR, etc), ainsi que du nombre de mots auxquels tu veux accéder. Dis moi quelle commande tu veux envoyer à l'esclave et on verra pour le programme.

    A+

  6. #35
    azizAVR

    Re : la communication via Modbus

    salùt,
    donc le programme sera dépend de lla structure de l'esclave,pour le moment je veux envoyé l'état des Alarmes (12alarmes) sur un afficheur LCD, pour affiché l état de chaque alarme ;
    exemple:
    if(PINB.B0==1) //Alarmes AC manque de tension AC
    PORTA.B0=1;//activer relais1(onduleur )
    etc....
    la mem chose pour les autres alarmes
    donc si j'ai bien comprais il faut déclaré d'abord l'adresse de l'esclave exp 01 =>@LCD
    ensuite une fonction qui va lire le contenu de registre(PINB.B0) ..et pourle CRC et la réception?

  7. #36
    Jack
    Modérateur

    Re : la communication via Modbus

    je ne peux pas te répondre. Comme je te le dis depuis un moment déjà, ça dépend de ton esclave modbus. Tu as une doc?

    Pour le CRC, on trouve l'algo de calcul partout sur le net.

    A+
    Dernière modification par Jack ; 27/03/2012 à 22h44. Motif: oubli d'une lettre

  8. Publicité
  9. #37
    azizAVR

    Re : la communication via Modbus

    Re
    salut Jack,
    toujours avec le ModBus ,mais cette je te demande si possible de me proposer un exemple simple de communication en Modbus soit avec RS232 oub RS485 entre un Maitre (exp µC) et un esclave ( mon PC oubien µC)??!!
    j'ai tous le matériel nécessaire (µC max232, ...)
    merci d'avance.

  10. #38
    paulfjujo

    Re : la communication via Modbus

    bonjour,

    exemple d'echange :

    Exemple d’échange entre un maître et un esclave
    Trame émise par le maître : 01 03 00 02 00 01 25 CA
    - Adresse esclave : 01
    - Code fonction 03 = lecture registre
    - N° du registre de début de lecture : MSB : 00 et LSB : 02
    - Nombre de registre de lecture : MSB : 00 et LSB : 01
    - CRC : 25 CA
    Réponse de l’esclave avec erreur : 01 83 02 01 31
    - Adresse esclave : 01
    - Code fonction : lecture avec MSB = 1 : 83
    - Code erreur (n° registre) : 02
    - CRC : 01 31
    Réponse de l’esclave sans erreur : 01 03 02 02 58 B8 DE
    - Adresse esclave : 01
    - Code fonction : lecture registre : 03
    - Nombre d’octets données : 02
    - Données du registre 0002 : MSB 02 et LSB : 58
    - CRC : B8 DE
    Resultat avec Jbus_RTU.exe :
    Trame émise par le maître : >>1 3 0 1 0 3 54 0B
    reception: 02C3 0281 03AB

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Modbus rtu
    Par maccoa dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 03/03/2012, 19h52
  2. Communication modbus sur Ethernet
    Par mayonaise dans le forum Internet - Réseau - Sécurité générale
    Réponses: 6
    Dernier message: 24/11/2011, 20h00
  3. Modbus en Matlab
    Par ouarnadir dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 07/04/2010, 00h12
  4. Protocole Modbus
    Par eul boïau rouge dans le forum Électronique
    Réponses: 7
    Dernier message: 19/11/2008, 19h13
  5. Modbus Protocol Communication
    Par triviaux dans le forum Électronique
    Réponses: 1
    Dernier message: 27/02/2008, 20h40
Découvrez nos comparatifs produits sur l'informatique et les technologies.