# Modbus RTU Slave offset Codesys 2.3



## MW22 (29 April 2022)

Hallo Ich habe mal eine Frage:

Modbus Master: Wago 750-890
Modbus Slave   : Wago 750-890

Ich habe über rs 485 eine verbindung zwischen den 2 CPUS aufgebaut.

Wenn ich den Modbus_slave_extended Baustein verwende und in mein Daten array mit einen offset von MW350 / MD175 
versehe bekomme ich am Master einen einen Fehler (illegal address).

Wenn ich das ganze mit MD0 starte funktioniert alles.

Am Master habe ich einfach den Internen Baustein verwendet über die Steuerungsconfiguration Modbus Master.
Im leseregister habe ich folgendes eingetragen:

MD0 Adresse 12288 -> lesen -> Funktion Ok

MD175 Adresse 12638 -> lesen Illegal Address

Hatte jemand schon das gleiche Problem?

MfG MW22


----------



## holgermaik (29 April 2022)

Da gibt es mehrer Möglichkeiten 
im Master:
- falscher Funktionscode
- Adresse falsch
- Zugriff (lesend, schreibend, kein)

im Slave
- Zielsystemeinstellungen -> Speicheraufteilung -> Retain - Größe zu klein

Poste doch mal den Deklarationsteil von dem generiertem Baustein (MBCFG_ModbusSlave)


----------



## MW22 (29 April 2022)

PROGRAM MBCFG_ModbusSlave0 (* generated by config, one prg for each slave *)

VAR_INPUT RETAIN

END_VAR 

VAR_OUTPUT RETAIN

END_VAR 


VAR_INPUT

END_VAR

VAR_OUTPUT
           var1       :    DWORD;       (**) 
       var2       :    DWORD;       (**) 


    (*--- system variables (read only) -------------------------*)
    MBCFG_SlaveAddress  :   USINT := 20; (* valid range 1..247   *)
    MBCFG_TimeOut       :   TIME  := t#1000ms;
    MBCFG_RequestDelay  :   TIME  := t#200ms; (* 0 means no delay *)
    MBCFG_Error         :   MBCFG_eERROR := MBCFG_START_UP;
    MBCFG_SERCOM_ERROR  :     BYTE; (* generated by sercomm.lib -> see documentation of sercomm.lib *)
    MBCFG_LastJob       :   MBCFG_typCOM_JOB;
    (*----------------------------------------------------------*)
END_VAR

{library private}
VAR CONSTANT
    zz_VARIABLECOUNT    :   INT := 2;   (* number of variables  *)
    zz_JOBCOUNT         :   INT := 1;   (* number of jobs       *)
END_VAR
VAR

    (*=== VARIABLE LIST ===============================================================================*)
    zz_VariableList :   ARRAY[1..zz_VARIABLECOUNT] OF MBCFG_typVARIABLE :=
        (    DataType        := MBCFG_TYPE_DWORD,
        ByteOrder       := MBCFG_BYTE_ORDER_0,
        BitSize         := 32,
        ptVar           := 0,
        ReadJobIndex    := 1,
        ReadStartBitNo  := 0,
        WriteJobIndex   := 0,
        WriteStartBitNo := 0 ),
    (    DataType        := MBCFG_TYPE_DWORD,
        ByteOrder       := MBCFG_BYTE_ORDER_0,
        BitSize         := 32,
        ptVar           := 0,
        ReadJobIndex    := 1,
        ReadStartBitNo  := 32,
        WriteJobIndex   := 0,
        WriteStartBitNo := 0 )

                        ;
    (*=================================================================================================*)

    (*=== JOB LIST ====================================================================================*)
    zz_JobList      :   ARRAY[1..zz_JOBCOUNT] OF MBCFG_typCOM_JOB :=
         (   Functioncode            := 3,
        ReadStartAddress        := 12638,
        ReadQuantity            := 4,
        WriteStartAddress       := 0,
        WriteQuantity           := 0,
        ptReadData              := 0, 
        ptWriteData             := 0 )

                        ;
    (*=================================================================================================*)

    (*### MODBUS MASTER ##### FIXED CODE ###########################################*)
    zz_MBCFG_MASTER            :    MBCFG_MASTER_SERIAL; (* for serial modbus RTU/ASCII *)
    (*##############################################################################*)

END_VAR



Programm:

(*--- for each variable one entry ------------------------------------*)
   zz_VariableList[1].ptVar := ADR(var1);
   zz_VariableList[2].ptVar := ADR(var2);

(*--------------------------------------------------------------------*)


(*=== call of the master for this slave ====================================================*)
zz_MBCFG_MASTER(   usiSlaveAddress  := MBCFG_SlaveAddress,               (* fixed entry     *)
                    tTimeOut        := MBCFG_TimeOut,                    (* fixed entry     *)
                    iVariableCount  := zz_VARIABLECOUNT,                 (* fixed entry     *)
                    ptVariableList  := ADR(zz_VariableList),             (* fixed entry     *)
                    iJobCount       := zz_JOBCOUNT,                      (* fixed entry     *)
                    ptJobList       := ADR(zz_JobList),                  (* fixed entry     *)
                    tRequestDelay   := MBCFG_RequestDelay,               (* fixed entry     *)
                    MB_ComObject    := MBCFG_COM_OBJECTS.MBCFG_MB_COM_2,(* generated entry *)
                    eError          => MBCFG_Error,                      (* fixed entry     *)
                    LastJob         => MBCFG_LastJob                     (* fixed entry     *)
                );
(*==========================================================================================*)

MBCFG_SERCOM_ERROR := MBCFG_COM_OBJECTS.MBCFG_MB_COM_2.bInterfaceError;


----------



## Thruser (30 April 2022)

Moin,

die bekannten Wago Modbus Adressen mit Mapping auf Merker (12288 für MW0) gilt nur für den internen Modbus TCP Slave der Controller unter Codesys 2.3.

Hier verwendest Du aber den Modbus_slave_extended FB, um mit einer seriellen Verbindung arbeiten zu können. Da werden die Adressen anders belegt. Leider scheint es da wenig Doku außer den Informationen der Bibliothek selbst zu geben. Soweit ich es gesehen habe übergibst Du dort ein Array von Word über die INOUT Schnittstelle in den die Daten abgelegt werden. 

Grundsätzlich würde ich jetzt erst einmal sagen, daß man über die Adresse 0 und aufwärts darauf zugreifen kann. Es gibt aber noch den Eingang iBit... (sitze gerade an einem anderen Rechner). Über den kann man eventuell die Startadresse vorgeben. So verstehe ich den Kommentar aus dem Deklarationsteil.

Da wirst Du mal ausprobieren müssen. Oder vielleicht haben die Kollegen von Wago da ein Beispiel oder mehr Informationen zu.

Gruß


----------



## MW22 (12 Mai 2022)

Ich habe eine Lösung gefunden. 

Ich kann den Baustein mit typData AT%MD175  : typSlaveData; anparametrieren. 

Jetzt kommt aber das tükische:

In der Wago Liegt sozusagen der Realwert bei 12638.

Im Modbuspoll wieder hingegeben liegt der Wert auf 12288.

Somit kann ich in der Wago alle Werte mappen und auf einen Bereich legen und der andere Teilnehmer bekommt dann 
das array immer von 12288 bis array ende.

MfG MW22


----------

