# Master IO-Link sur Raspberry Pi

## Master IO-Link Raspberry Pi
Cet article fait suite à la communication entre TwinCAT 3 et un Master IO-Link Profinet. Il est également possible de connecter un Master IO-Link Profinet sur un Raspberry Pi 4 avec le Runtime Codesys. Le schéma du montage utilisé est représenté ci-dessous :

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688462969365.jpg)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688462969365.jpg)

- Le Raspberry Pi va constituer notre PLC. Le Runtime Codesys est installé dessus. Il va gérer la communication Profinet avec le Master IO-Link Profinet AL1100 d'IFM.
  - @IP du Raspberry Pi est ```192.168.1.15```
- Le Master IO-Link Profinet AL1100 d'IFM va être associé à deux capteurs IO-Link
  - Détecteur de distance O5D150
  - Bouton capacitif KT6101
  - @IP du Master IO-Link est ```192.168.1.198```

- Le PC de développement va permettre de générer le code PLC et le transférer sur le Raspberry Pi. Contrairement à TwinCAT où le Runtime est exécuté sur le PC, dans cette application, le Runtime est sur le Raspberry Pi.
  - @IP du PC de dev : ```192.168.1.55```

**Prérequis :** 
- Codesys 3.5 installé (et fonctionel) sur un PC de développement -> cf article
- Runtime Codesys installé sur un Raspberry Pi -> cf article

Il est également nécessaire d'avoir lu l'article sur la communication entre le Master IO-Link Profinet et TwinCAT car plusieurs aspects vont se retrouver ici :
- les fonctions en langage ST pour le décodage des capteurs
- l'association des variables
  
## Projet Codesys
- Créer un Standard New Project
- Choisir pour le Device Codesys Control for Raspberry PI MC SL
- Choisir Ladder Logic pour PLC_PRG
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688462984690.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688462984690.png)
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688462990985.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688462990985.png)

### Gateway et Raspberry Pi
En double cliquant sur Device, dans les Communications Settings:
- Gateway -> Add New Gateway
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463001713.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463001713.png)

- Placer l'adresse IP du PC développement (@IP=192.168.1.55 dans mon cas)
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463009547.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463009547.png)

À droite de la Gateway, 
- placer l'adresse IP du Raspberry Pi
- en appuyant sur Entrée, un fenêtre de Device User Logon apparaît :
  - mettre le User Name du Raspberry pi -> pi 
  - mettre le Password -> 3.14 dans mon cas

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463016891.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463016891.png)

La liaison avec le Raspberry Pi doit passer au vert et indiquer (active)

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463022993.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463022993.png)

Si tout est au vert, on peut passer à la liaison Profinet

### Configuration de la liaison Profinet

Faire un clic droit sur Device :
- Add Device
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463029401.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463029401.png)

Dans l'arborescence Profinet IO :
- Choisir Ethernet
- et faire Add Device
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463035570.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463035570.png)

Sur Ethernet(Ethernet), faire un clic droit :
- Add Device
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463041811.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463041811.png)

Dans l'arborescence Profinet IO Master :
- Choisir PN-Controller
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463048665.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463048665.png)

### GSDML du Master IO-Link Profinet d'IFM
Comme pour TIA Portal, le Master IO-Link Profinet n'est pas installée de base dans Codesys. Il est nécessaire d'ajouter le fichier GSDML correspondant dans le Device Repertory.

Dans l'onglet Tools, faire :
- Device Repertory
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463055522.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463055522.png)

Cliquer sur Install

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463062169.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463062169.png)

et sélectionner le GSDM correspondant à votre Master IO-Link. Pour rappel, le fichier GSDML du Master IO-Link Profinet AL1100 se télécharge directement chez IFM.
 - après avoir sélectionné le fichier, faire open.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463067779.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463067779.png)

### Ajout du Master IO-Link

En cliquant sur PN_Controller (PN-Controller), faire
- Add Device
  
Dans l'arborescence Profinet IO -> IO -> ifm electronic, choisir
  - AL1100, ifm electronic
  - faire Add Device

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463074697.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463074697.png)

### Configuration Profinet et IO-Link

Double cliquer sur Ethernet (Ethernet)
- Dans Network interface, faire Browse
- une fenêtre Network Adapters apparait
  - choisir l'interface ```eth0``` qui correspond à l'interface ethernet du Raspberry Pi

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463080650.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463080650.png)

Double cliquer sur PN_Controller et modifier la plage d'adresses pour les Slave
  - First IP Address : ```192.168.1.2```
  - Last IP Address : ```192.168.1.254```
  - Subnet Mask : ```255.255.255.0```
  - Default Gateway : ```192.168.1.1```
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463091931.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463091931.png)

Double cliquer sur AL1100 (AL1100) et modifier les IP Parameter
  - IP Address : ```192.168.1.198```
  - Subnet Mask : ```255.255.255.0```
  - Default Gateway : ```192.168.1.1```
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463098003.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463098003.png)

Dans _4 _Ports (4 Ports) , sur le Port_1, faire
- Plug Device
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463104290.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463104290.png)

Comme nous avons branché le bouton capacitif KT6101 sur le port 1, il faut lui associer la taille de IO-Link Inpurt + Output adapté au message. Dans notre cas, choisir :
- IO-Link In/Out 4/4 Byte + PQI
- et faire Plug Device
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463110483.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463110483.png)

Avant d'aller plus loin, nous allons tout de suite configurer le rafraichissement automatique des données : 

En double cliquant sur Port 1, en bas à droite, dans le champs Always Update Variables :

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463116297.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463116297.png)

Faire :
- Enabled 1 (uses bus cycle task if not used in any task)
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463123505.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463123505.png)

Vérifier que cela soit bien pris en compte sinon les valeurs des capteurs n'apparaîtrons pas !

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463131002.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463131002.png)

On va procéder de manière analogue pour Port_2 :
- on clic sur Plug Device
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463137987.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463137987.png)

Il s'agit du détecteur de distance O5D150 qui est branché sur Port_2, celui ci nécessite 2 Bytes d'Input pour le message :
- IO-Link 2 Bytes + PQI
- et Plug Device

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463144034.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463144034.png)

Pareil que précédement, on fait attention à autoriser Always update variables avec l'option :
- Enabled 1 (use bus cycle task if not used in any task)
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463152819.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463152819.png)

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463159041.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463159041.png)

Pour les Port_3 et Port_4, comme aucun capteur n'est branché dessus, nous placerons Disabled

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463165745.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463165745.png)


### Test rapide du fonctionnement du Master IO-Link

Sans oublier de faire Save, cliquer sur 
- Generate Code (F11)
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463172112.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463172112.png)

Pour se connecter sur le Raspberry Pi et y transférer le code Automate, cliquer sur la petite prise de courant (Login)
- Codesys peut indiquer ce message en indiquant qu'une application est déjà en Run sur le Raspberry Pi, confirmer avec Yes le tranfert.
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463179257.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463179257.png)

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463196243.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463196243.png)

On clique sur :
 - Start (F5)

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463203616.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463203616.png)

Normalement, tous les éléments passent au vert.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463209025.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463209025.png)


En cliquant sur le Port_2, dans 
- PN/IO SubModule I/O Mapping, en développant l'arborescence, on peut voir les données de distance dans :
  - Input datat 2 Bytes[0] %IB12
  - Input datat 2 Bytes[0] %IB13

Ces données varient avec la distance mesurée. Comme pour TwinCAT, il faudra mapper ces données aux variables du programme Automate.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463217843.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463217843.png)

En cliquant sur le Port_1, dans 
- PN/IO SubModule I/O Mapping, en développant l'arborescence, on peut voir les données de distance dans :
  - Input datat 4 Bytes[0] %IB5
  - Input datat 4 Bytes[1] %IB6
  - ...
Ces données varient avec l'appui sur le bouton capacitfif. Pareillement, nous devrons mapper ces variables capteur au programme automate.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463223962.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463223962.png)

Pour se déconnecter, on clique sur Stop pour Logout.

### Bilan

Cette première étape nous a permis de valider la bonne communication avec le Master IO-Link.
Les prochaines étapes seront:
 - création des fonctions de décodage pour les capteurs
 - mapping des variables automate avec les variables IO-Link
 - création d'une IHM permettant d'afficher ces résultats
 - test de l'IHM sur une tablette

## Programme Automate et fonctions capteurs

Les différentes étapes présentées ci-dessous seront très similaires à celles présentées pour l'association d'un Master IO-Link à TwinCAT.

### Fonction capteur O5D150
Dans Application faire :
- Add Object -> POU...
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463230560.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463230560.png)

Dans Add POU :
- Name : FB_O5D150
- Type : Function block
- Implemention Language : ST

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463238369.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463238369.png)

Le programme de la fonction FB_O5D150 est identique à celui présenté dans TwinCAT :

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463244113.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463244113.png)

De même pour l'instanciation et l'appel de fonction, seule variante, le PLC_PRG est dans notre cas écrit en Ladder, ce qui signifie qu'il est nécessaire d'ajouter un bloc à nommer fbO5D150 pour réaliser l'appel de fonction. 

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463250050.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463250050.png)

On peut ajouter une variable SwitchState de type dans le PLC_PRG simplement en écrivant SwitchState en sortie du bloc.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463255122.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463255122.png)

Nous allons mapper les variables de la fonction O5D150 aux variables IO-Link :
- dans Port_2 -> PN I/O SubModule Mapping
- cliquer à côté de la petite boîte bleue dans variable au niveau de la ligne %IB12 BYTE
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463261826.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463261826.png)

Trois petits points doivent apparaîtrent et lancer l'Input Assistant:
- choisir dan PLC_PRG -> fbO5D150 -> aInputBytes
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463267761.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463267761.png)

Placer à la fin de la variable [0] pour indiquer qu'il s'agit de l'élément 0 de l'array of Byte.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463274538.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463274538.png)

On fait de même pour la ligne %IB13. Noubliez pas de placer à la fin de la variable [1] pour indiquer qu'il s'agit de l'élément 1 de l'array of Byte.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463281498.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463281498.png)

On effectue un Save, suivi d'un Generate, Login et Start 
- et normalement le PLC_PRG indique la valeur de distance mesurée par le capteur O5D150.
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463290913.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463290913.png)

On n'oublie pas de faire Stop et Logout pour faire des modification du programme.

### Fonction bouton capacitif KT6101

Comme pour le capteur O5D150, le code pour le bouton capacitif KT6101 est identique à celui développé pour TwinCAT.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463300721.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463300721.png)

On réalise l'instanciation et l'appel de la fonction fbKT6101 dans PLC_PRG

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463328234.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463328234.png)

Pour le mapping des variables IO-Link, on procède de la même manière que le capteur O5D150

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463336024.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463336024.png)


On fait Generate, Login et Start :
- Le capteur de distance est toujours fonctionnel
- Le bouton capacitif réagit en fonction de l'appui
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463344298.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463344298.png)

Pour finaliser cette démonstration, nous allons intégrer une IHM et réaliser une WebVisu sur tablette.

## Visualisation IHM et WebVisu

Pour intégrer une visualisation :
- Clic droit sur Application -> Add Object ->  Visualization...
- Dans la fenêtre Add Visualization, laisser le Name : Visualization et faire Add  

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463354291.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463354291.png)

Pour simuler les deux couleurs lumineuses Bleue et Verte, j'utilise une astuce sur la visualisation : 
- Je crée un voyant Bleu  que j'associe à la variable PLC_PRG.fbKT6101.bSSC1 que j'inverse avec NOT().
- ce voyant passera au premier place avec la même variable dans Bring to foreground
- -> uand le voyant bleu est allumé, il passe au premier plan

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463361090.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463361090.png)

Pour le voyant vert, je procède de la même manière sans inverser la variable PLC_PRG.fbKT6101.bSSC1

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463367698.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463367698.png)

Je supperpose les deux voyants sur l'IHM :
- si le voyant Bleu est actif, il passera au premier plan
- si le voyant Vert est actif, il passera au premier plan
  
Une jauge de distance est également placée :
- la variable associée à la jauge est ```PLC_PRG.fbO5D150.nCurrentDistance```
- Scale End est configuré à 200 pour la distance max du capteur en cm
- Main Scale est placée à 20
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463374296.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463374296.png)

On souhaite également afficher la distance dans un champ, nous placerons ainsi un rectangle qui servira de champ de visualisation :

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463381369.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463381369.png)

Dans le champ Text, nous mettrons :
- ```%d``` pour la valeur à afficher en Int

Dans le Champ Text variable, nous mettrons :
- ```PLC_PRG.fbO5D150.nCurrentDistance```
  
[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463389208.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463389208.png)

Il reste à faire la connexion au Raspberry Pi et lancer le Runtime :
- Generate, Login, Start

Et l'IHM s'anime en fonction des mesures et appuis sur les capteurs.

[![](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/scaled-1680-/image-1688463399633.png)](https://innovation.iha.unistra.fr/uploads/images/gallery/2023-07/image-1688463399633.png)

## WebVisu

Il est possible de récuperer cette IHM sur une page Web à travers la WebVisu.
- On place l’adresse IP du Raspberry Pi dans le navigateur de la tablette suivi du numéro de port 8080 et l’on charge la page webvisu.htm
- 192.168.1.15:8080/webvisu.htm
- On peut visualiser la mesure de distance faite par le capteur ainsi que les appuis sur le bouton capacitif