0
Under review

Connection between Beckhoff PLC I/O adress to Modbus adress

Michel Smeysters 3 years ago in Products / Modbus • updated by Aäron Leman 10 months ago 25

Hi all,


I 'm new to iRidium and i am working on my first project.

I have a Beckhoff PLC CX8090 and communication to iRidium over Modbus TCP. I am having trouble adressing my variables in Modbus. Because I have little to no experience with Modbus TCP ....

Below you can see what i have found:


ModbusTCP: commands:


Name MW0 as adress in the PLC (just as reminder)


Push button to activate M0.0


Settings:


Send number 1 (dec) -> bin 0000 0001 this is M0.0 in PLC


Push button to activate M1.0


Settings:


Send number 256 (dec) -> bin 0000 0001 0000 0000 this is M1.0 in PLC


I can't find a way how to connect with the I/O's directly to the PLC.

Can anyone give a concrete example to me how I can retrieve / send certain addresses ? The inputs of the PLC i am using is starting from I19.0 , the outputs from Q19.0.


Twincat manager:



Inputs:



Outputs:



Dimmer module:



Thanks in advanced


Michel

Mag een Belg ook helpen Theo? :)

Met Beckhoff heb ik geen ervaring wel met Allen Bradley. Maar dit zal wel iets gelijkaardigs zijn.

Eerst en vooral naar een input of output rechtstreeks schrijven gaat nooit lukken vanuit Iridium Mobile (ook niet vanuit andere scada software)

Als je bv een simpel PLC-programmatje hebt en je schrijft naar een output via een input, dan ga je over die input een merker moeten plaatsen en naar deze merker moeten schrijven om de output te sturen.


Je hebt reeds gevonden hoe je een merker moet aansturen.


Bij Allen Bradley heb je dus een mapping lijst en daarin moet je bv. zeggen dat drukknop1(merker1) = aan modbusadres 00001 maar ook dat lamp1 = aan modbusadres 100001 en dat bv een integerwaarde 1 = aan modbusadres 400001


Als je die lijst dan hebt aangevuld kun je aan de slag in Iridium Mobile

En bij mij ziet dit er dan zo uit voor Output 0:



Om een Integerwaarde op te vragen vanuit de PLC ziet dit er dan zo uit:




Hopelijk ben je hier wat wijzer mee.

mvg


Jurgen





Dag Jurgen,


Natuurlijk, ook Belgen mogen antwoorden; graag zelfs!


Hartelijk dank voor je toelichting, ik hoop dat Michel er wat aan heeft!


Theo


Bedankt voor je reactie Jurgen. Ik denk dat er misschien wat mis is met mijn mapping, als ik straks tijd heb kijk ik het in.


Michel

Allen,


Zelf zit ik ook met het probleem dat ik geen connectie kan maken met mijn beckhoff CX5130.


Ik geef het IP adres op dat ik kan vinden op de Beckhoff via twincat3.


Ik zou al blij zijn moest ik een uitgang kunnen uitlezen of een merker hoog zetten om een uitgang te sturen.


Het iridium for modbus programma heb ik ook al gestart (dat te vinden is op de wiki site Iridium) maar deze blijft ook steeds offline staan.


Zelf werk ik hier met de verkregen demo licentie om alles te testen.


Wat is de eenvoudigste manier al om een connectie te testen?

Alvast bedankt!

Peter

Dag Peter,


Ondersteund je PLC modbus tcp? Indien ja, heb je hem actief staan?


Hier alleszins de link naar TwinCat Modbus TCP Configurator:

http://infosys.beckhoff.com/english.php?content=../content/1033/tcpipserver/html/tcpipserver_overview.htm&id=

Via deze configurator ga je een .xml file aanmaken die je mapping gaat doen.


Hier ook een link naar een default mapping file:

http://infosys.beckhoff.com/english.php?content=../content/1033/tcpipserver/html/tcpipserver_overview.htm&id=


Connectie van je PLC checken kan makkelijk als je bijgevoegd youtube filmpje volgt:

Succes


Michel

Michel,


Bedankt al voor de info.


Ik heb een CX5130 draaiende op twincat 3 hier. Ik heb de library er op gezet van modbus TCP server. Dat gaat zonder problemen.

Voor de TCP configurator, deze heb ik op de CX5130 geInstalleerd en geeft poort 502 aan maar geen IP adres. (Ik vermoed dat deze default is ingesteld.


Via IPconfig heb ik een aanvraag gedaan voor het IP adres (192.168.0.100).

Momenteel steekt een netwerkkabel rechtstreeks van PC (waarop iridium staat) naar de CX5130.


Dus dat lukt me allemaal, enkel krijg ik nog steeds geen connectie via de modbus driver.

Daar moet ik nog verder aan puzzelen.

Het moet wel lukken want ik heb een (concurrentieel programma) ook al gehad, en dit werktte.


Mss iemand nog een idee?

alvast bedankt voor de moeite!


Hey allemaal,


Ik heb al een paar keer Iridium gebruikt met Beckhoff PLC's (CX8090 en CX9020).


Voor Beckhoff PLC's op TwinCAT 2 moet je zeker zijn dat de PLC de TCModbusTCP driver hierop hebt staan. (Kan je met Cerhost en een FTP programma hier op zetten).

Voor TwinCAT 3 heb ik geen idee, maar het idee zal ongeveer hetzelfde zijn. (Gewoon bij beckhoff support vragen ivm licenses)


Het linken van de variabelen is niet zo ingewikkeld ookal is er niet veel documentatie van:

Het eerste dat je moet voorzien is een globale variabele genaamd outputs, deze moeten voorzien zijn als output array. Deze mogen niet met hardware gelinked worden, ze worden zuiver voor modbus TCP gebruikt.

Dit is eigenlijk de array waar Iridium meer communiceert (in beide richtingen).

Vergeet deze niet te activeren in u configuratie!


Het enige wat je dan te doen staat in een programma te schrijven dat deze globals gebruikt en niet vergeten het juiste IP adres in het Iridium programma te zetten.


Als er nog vragen zijn wil ik altijd wel helpen :)


mvg,

Sven

Sven,


Bedankt voor je uitleg.

Ik heb nog steeds het probleem dat ik merkers op bit niveau wil aansturen en me niet lukt. bv M2.4, deze zal op zijn beurt mijn buiten verlichting aansturen in de PLC QX21.4


Ik heb een default .xml file gebruikt voor de mapping (van Beckhoff zelf):

<Configuration>
    <!-- Modbus TCP port, default = 502-->
    <Port>502</Port>
    <!-- optional IP configuration for Modbus TCP server-->
    <IpAddr/>
    <Mapping>
        <InputCoils>
            <MappingInfo>
                <!-- AdsPort: TwinCAT2 PLC1 = 801, PLC2 = 811...-->
                <AdsPort>801</AdsPort>
                <StartAddress>0</StartAddress>
                <EndAddress>32767</EndAddress>
                <!-- IndexGroup 61473 = 0xF021 -> physical plc inputs %IX -->
                <IndexGroup>61473</IndexGroup>
                <!-- Bit offset-->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <!-- Modbus input coils -->
                <StartAddress>32768</StartAddress>
                <EndAddress>33023</EndAddress>
                <VarName>.mb_Input_Coils</VarName>
            </MappingInfo>
        </InputCoils>
        <OutputCoils>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <EndAddress>32767</EndAddress>
                <!-- IndexGroup 61489 = 0xF031 -> physical plc outputs %QX -->
                <IndexGroup>61489</IndexGroup>
                <!-- Bit offset-->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <!-- Modbus output coils-->
                <StartAddress>32768</StartAddress>
                <EndAddress>33023</EndAddress>
                <VarName>.mb_Output_Coils</VarName>
            </MappingInfo>
        </OutputCoils>
        <InputRegisters>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <StartAddress>0</StartAddress>
                <EndAddress>32767</EndAddress>
                <!-- IndexGroup 61472 = 0xF020 -> physical plc input register %I -->
                <IndexGroup>61472</IndexGroup>
                <!-- Byte offset-->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <!-- Modbus input registers -->
                <StartAddress>32768</StartAddress>
                <EndAddress>33023</EndAddress>
                <VarName>.mb_Input_Registers</VarName>
            </MappingInfo>
        </InputRegisters>
        <OutputRegisters>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <StartAddress>0</StartAddress>
                <EndAddress>12287</EndAddress>
                <!-- IndexGroup 61488 = 0xF030 -> physical plc output register %Q -->
                <IndexGroup>61488</IndexGroup>
                <!-- Byte offset-->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <StartAddress>12288</StartAddress>
                <EndAddress>24575</EndAddress>
                <!-- IndexGroup 16416 = 0x4020 -> plc memory area %M -->
                <IndexGroup>16416</IndexGroup>
                <!-- Byte offset-->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <StartAddress>24576</StartAddress>
                <EndAddress>32767</EndAddress>
                <!-- IndexGroup 16448 = 0x4040 -> plc data area -->
                <IndexGroup>16448</IndexGroup>
                <!-- Byte offset-->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
            <MappingInfo>
                <AdsPort>801</AdsPort>
                <!-- Modbus output registers -->
                <StartAddress>32768</StartAddress>
                <EndAddress>33023</EndAddress>
                <VarName>.mb_Output_Registers</VarName>
            </MappingInfo>
        </OutputRegisters>
    </Mapping>
</Configuration>

In mijn globale variabelen heb ik het volgende aangemaakt:

Om nu vervolgens merkers aan te sturen via iRidium, bv M2.4 lukt me dit enkel door ze op "Word"-niveau aan te spreken:


Address 12289


Nummer 16 sturen om 5de bit te sturen => M2.4

Met deze instellingen lukt het me om een bit te sturen


Een bit aansturen via "Coil" in iRidium lukt me momenteel nog niet...


Een bit visualiseren lukt me enkel door het volgende:



Type Coil

address 32768 => volgens .xml file

                <!-- Modbus output coils-->
                <StartAddress>32768</StartAddress>
                <EndAddress>33023</EndAddress>



Dit werkt, maar welk address moet ik nemen om QX19.1 op te vragen?

Als ik address 32769 ingeef visualiseert er QX20.0...



Kortom, modbus runt, alleen krijg ik geen hoogte van de mapping... Indien jij daar een tooltje of tips voor hebt, dan hoor ik het graag.

Hartelijk dank, Sven, voor deze toelichting!


Ik hoop dat het duidelijk is voor de vragenstellers, zo niet dan horen we het graag weer hier!


Ook super dat je wil helpen als het niet duidelijk is, bedankt!


Theo Derks


Allen,


Ik wil jullie al bedanken voor jullie tijd en hulp.

De communicatie is me nog niet gelukt, maar ik hoop dat ik er wel zal uitgeraken. Ergens doe ik nog iets (stoms) fout blijkbaar!!


Wat heb ik tot nu toe al gedaan :


Licentie is in orde

Installatie Iridium GUI en transfer oke


Op Beckhoff CX5130 heb ik de modbus TCP supplement TF6250 installatie gedaan


in de globale variabelen het volgende gezet

outputs AT%QB0:ARRAY [0..300] OF WORD;


Bij broadcast search in twincat geeft deze als IP address 192.168.0.100 aan.


Dit adres geef ik in bij modbus TCP driver (in project device panel in de GUI, onder local connection), port 502 en update time 1000


Ik stuur nog geen I/O's of dergelijke, ik wil enkel de communicatie laten werken tussen PC, testprogramma via de emulator en de beckhoff plc.


De beckhoff staat in run en is in werking online.


netwerkkabel tussen PC en de plc.


klein vb programma genomen om de driver tokens uit te lezen:


Token online : geeft enkel offline

Token status: geeft 0 en 1 weer om de paar seconden, geen online

Token IP : 0.0.0.0


In iridium transfer :

Staat groen op on

via system menu update op enable.

Host Ip adres??? al gewisseld tsn 192.168.0.121 (Ip PC) en 192.168.0.100 (Beckhoff)

Port : 10000 genomen of 502

Device:

Host/port 192.168.0.100 port 502

parameters: 1000,0,0


ik heb verder nog geen mapping gedaan, of xml bestanden geschreven of csv...

Weet niet of dat ik deze fase al moet?


Ik zie nog iets over het hoofd waardoor het niet werkt.

Iemand de puzzel opgelost??







+1

Hallo Michel


Merkers kan je dacht ik in modbus(bij beckhoff) niet op bit niveau sturen. Zie de link naar beckhoff. De merkers horen thuis bij de output registers en beginnen vanaf adres 12288 en het data type is 16bits. Dus MW0 is adres 12288 MW2 is adres 12289 enz.

https://infosys.beckhoff.com/english.php?content=../content/1033/tcmodbussrv/html/tcmodbussrv_configuration.htm&id=


Zie foto hoe ik mijn global variables zou maken. In het plc programma stuurt dL1 dan de lamp. Wanneer ik modbus adres 12288 naar 1 stuur zal hij het hele merkerwoord 0 op 1 sturen. En merkwoord 0 bestaat uit byte 0 en 1, ik gebruik daarom van byte 0 bit 0 om mijn lamp L1 te sturen.

Ik weet niet of dit duidelijk is maar ik kan het niet anders uitleggen. Wanneer ik adres 12289 stuur zal hij merkerwoord 2 op 1 sturen. En merkwoord 2 bestaat uit byte 2 en 3, ik neem dan van byte 2 bit 0 om de volgende lamp te sturen enz.


Nog een kleine tip ik gebruik thuis ook het programma modbus master zie ook foto hier kan je modbus adressen lezen en schrijven.

https://sourceforge.net/projects/qmodmaster/

Wanneer ik dan in het blauwe vak een 1 zet op adres 12302 en klik en ik ga online op de plc zal MW28 ook 1 worden. Zo kan je eventueel eens een test doen, je moet wel zien dat je de instellingen juist hebt staan.

Hiermee bedoel ik het Ip adres van jouw plc en dan bij function code kan je kiezen voor inputs, outputs, input registers en output registers.


Als er nog vragen zijn hoor ik het wel. Ik weet niet waar je ergens woont in Belgie of Nederland maar ik woon in Lommel. Ik wil altijd wel eens afspreken dan kunnen we onze kennis delen.


MVG Niels

nielsmertens@telenet.be



Bedankt voor de tips, goed programma, wist niet dat die bestond


mvg


Michel

Michel:


Je hebt je outputs niet naar buiten gelinkt (met een AT%QB0 ofzo), ik zie ook dat je je variabelen hebt opgesplits in de 4 categorieën, maar ik gebruik er zelf maar 1 (om modbus adres 0 te gebruiken en omdat woord kan worden opgesplitst in 16 bools). Je kan de outputs manueel splitsen, maar zie ik het nut niet van in.


De commands en feedbacks in Iridium zijn ook afhankelijk van je beckhoff configuratie, als je index 0 gebruikt (AT %QB0) dan moet je in iridium ook beginnen met 0.


Dit is hoe ik het doe:


Je maakt een array aan in beckhoff:

outputs AT%QB0 : ARRAY [0..255]OF WORD ;


De grootte van de array maakt vrij weinig uit, het enige belangrijke is dat je %QB0 gebruikt omdat daar de modbus registers binnenkomen. (met index 0x8000 krijg ik het niet aan de praat) Zowel de in als uitputs komen in dit register en zowel bools als woorden. (dubbelwoorden is een ander verhaal, maar die gebruik ik nooit).


Je moet ook oppassen met je iridium variabelen. Deze benoemen is redelijk raar.

Hier zijn wat voorbeelden:


Een coil op adres 0 komt in outputs array uit op [0].0

Een coil op adres 15 komt in outputs array uit op [0].15

Een coil op adres 16 komt in outputs array uit op [1].0

Een coil op adres 130 komt in outputs array uit op [8].2

etc...


Maar dit is wel een beetje irritant als je een mix van holding registers(16) in de mix gooit dan :


Een holding register(16) op adres 0 komt in outputs array uit op [0]

Een holding register(16) op adres 1 komt in outputs array uit op [1]

Een holding register(16) op adres 12 komt in outputs array uit op [12]


Je kan ze niet uit elkaar houden op dezelfde range, moet je gewoon even rekening mee houden.


Als je wilt kan ik je een projectje op TC2 bezorgen met een iridium file en wat instructies. Dan zie je hoe het werkt.


Peter:


Ik krijg het spijtig genoeg bij TwinCAT 3 ook niet echt aan de praat.

En ik heb niet echt een methode om te monitoren wat er gaande is. Heb geen idee eigenlijk, en vrij weinig tijd om het te testen.


mvg,

Sven

Thanks, de array's van mijn globale variabelen heb ik van de Beckhoff website. Maar straks mijn globale variabelen eens aanpassen als ik de tijd krijg, hopelijk lukt het dan wel deftig.


Benieuwd of ik dan mijn uitgangen kan visualiseren op bit niveau. Het moet alleszins een instellings-, configuratie fout zijn denk ik.

Momenteel merk ik het volgende op:

Coil address 32768 afvragen, dan krijg ik de toestand van QX19.0 (Lamp Aanrecht)

Coil address 32769 geeft me de toestand van QX20.0 (Lamp Bureau)

Het PLC programma aanpassen zodat het uitkomt per WORD is ook mogelijk, maar niet echt de juiste manier...


Sven,


Bedankt voor de moeite voor alles.

Idd spijtig dat het blijkbaar niet werkt in de nieuwe versie van Twincat.


Ik zal het moeten blijven doen met mijn ander programma :-(


Mss geraakt het ooooit opgelost.



Met Twincat 3 heb ik ook geen ervaring...

Sven,


Moest je tijd hebben, dan mag je me dat klein projectje eens sturen als je wil. Heb net de globale variabelen aangepast en werkt nog steeds niet zoals ik wil...

Als ik de links van u kan inkijken kom ik er misschien wel uit.

smeystersmichel@gmail.com


Alvast bedankt


Michel

Het komt niet echt uit per word, maar een word is gewoon 16 bools.

Je kan een word gewoon opsplitsen:

[0].0, [0].1, [0].2, ... [0].15 deze gelden dan als bools.


Ik denk dat je ook een array van bools kan maken maar dan moet je eens kijken hoe dat werkt :)

Het is me ondertussen gelukt om merkers te sturen en uitgangen de visualiseren.

Merker woorden sturen gaat ook om men dimmers aan te sturen, alleen het uitgangswoord visualiseren lukt momenteel nog niet. Maar komt goed...


Bij mij was het trouwens een adresseringsfout ivm feedback van output bits, werkt nu perfect. Thanks for the help

@Michel:

Is het nu dus uiteindelijk gelukt met Twincat 3 van Beckhoff, of een oudere versie?


Ook voor Peter (PvG) van belang ;-)


bedankt!


Theo


Ik had Peter al gezegd dat ik geen ervaring heb met Twincat 3. Mijn geval gaat over Twincat 2. En het was een "mapping" probleem, de link tussen mijn merkers en outputs in de PLC naar iRidium over Modbus. Over Modbus is niet erg veel info te vinden op het net ivm de mapping...


Met de tips die ik hier gekregen heb en wat trial en error is het uiteindelijk gelukt :)

Hallo,


Ik heb een Beckhoff CX9020 voor de aansturing van mijn verlichting thuis.

Graag zou ik deze ook willen aansturen via Iridium. Zou ik een voorbeeld kunnen krijgen in TwinCat en Iridium ?

Snap niet alles zoals hierboven beschreven.


Alvast bedankt !

Filip

Hallo Filip,

mail mij eens dan zal ik mijn twincat -en iridium programma eens doorsturen.

Mvg Niels

niels.mertens@telenet.be

Beste,


Na ongeveer een week testen zijn we er toch in geslaagd om data te versturen en ontvangen met TwinCAT 3. Mijn ondervinding is dat de PLC met TwinCAT 3 momenteel nog niet als server kan werken (Andere definitie van mapping?). Door gebruik te maken van de iRidium TCP server driver kan je waarden ontvangen en versturen. Dit werkt heel eenvoudig zonder enige moeilijkheden met ADS mapping. 


Vriendelijke groeten,

Aäron