Faire un peu de domotique avec un S7-300
Re: Faire un peu de domotique avec un S7-300
re,
par exemple:
http://www.leboncoin.fr/equipements_ind ... tm?ca=15_s
http://www.leboncoin.fr/equipements_ind ... tm?ca=15_s
J'ai meme deja vu des cp343-1 (ref 21)à 100€ pièce mais j'ai appelé le lendemain mais deja vendu les 3 le jour meme
Apres c'est sur qu'en achat immediat sur bay chez les vendeurs pro c'est tjrs plein pot
par exemple:
http://www.leboncoin.fr/equipements_ind ... tm?ca=15_s
http://www.leboncoin.fr/equipements_ind ... tm?ca=15_s
J'ai meme deja vu des cp343-1 (ref 21)à 100€ pièce mais j'ai appelé le lendemain mais deja vendu les 3 le jour meme
Apres c'est sur qu'en achat immediat sur bay chez les vendeurs pro c'est tjrs plein pot
Re: Faire un peu de domotique avec un S7-300
Un peu d'avancement
Je suis maintenant capable de lire et d'écrire un booleen depuis mon Raspberry
Je me suis aidé de la librairie Snap7
Un petit tuto pour ceux qui ne sont pas familier d'Unix (à noter que ce qui suit à été réalisé depuis un terminal puisque je travaille en connexion distante via SSH):
Un conseil, c'est en PDF, donc télécharger le package depuis Windows et ouvrez le avec votre lecteur PDF favori, c'est bien plus convivial.
Moi je me suis aidé des déclarations de fonctions de Snap7 dispo dans le répértoire /usr/local/lib/python2.7/dist-packages/snap7/, le fichier client.py contient tout ce qui touche aux communication vers l'automate, tel que:![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Exemple de lecture de sorties
On définit l'automate, on s'y connecte.
On définit la zone mémoire à lire(zone_mem), la position du premier byte à lire(debut), le nombre de byte à lire(longueur). Ici le byte 0 correspond a Q0, 1 à Q1, etc...
On lance la lecture avec les paramètres qui vont bien.
On affiche les résultats, pour cela on extrait du byte la valeur du booléen attendu avec get_bool
On se déconnecte.
Ca donne:
Attention: Ecrire une sortie peut engendrer blessure ou mort selon l'actionneur que vous avez au bout, à utiliser sur une sortie inutilisée
Moi j'ai un voyant de connecté dessus
On définit l'automate, on s'y connecte.
On définit les même variable que pour la lecture, les fonctions sont similaires.
On lance la lecture avec les paramètres qui vont bien pour avoir la valeur avant écriture et on affiche les résultats
On prépare un tableau de byte pour affecter le booléen du byte que l'on souhaite transférer grâce a set_bool.
On envoi le tout à l'automate.
On relance une lecture pour vérifier le changements d'état.
On se déconnecte.
Ca donne:
_________________________________________________
Je peux tout lire I,Q,M, tempos et compteurs, il suffit d'adapter.
Par contre je galère un peu à écrire un INT ou un REAL, car toute la communication se fait à base de byte (je le dis si vous ne vous en étiez pas rendu compte
) et donc pour affecter un BOOL, c'est simple, on ne se sert que d'un byte, mais quand il faut affecter un INT sur 2 byte, ou un REAL sur 4, c'est plus tout à fait la même.
Je vous rassure, je vais y arriver, c'est juste une histoire de syntaxe parce que le Python, j'en avais jamais fait avant de toucher ce Raspberry, mais ça rentre vite.
Le but ultime, c'est de récupérer des valeurs de températures de sondes via le Raspberry et d'écrire ces valeurs cycliquement dans l'automate.
La suite au prochain épisode
...
Je suis maintenant capable de lire et d'écrire un booleen depuis mon Raspberry
Je me suis aidé de la librairie Snap7
Un petit tuto pour ceux qui ne sont pas familier d'Unix (à noter que ce qui suit à été réalisé depuis un terminal puisque je travaille en connexion distante via SSH):
- D'abord télécharger la version de Snap7, la décompresser et compiler (la 1.4.0 pour moi, a changer selon le numéro de version):
Code : Tout sélectionner
wget http://sourceforge.net/projects/snap7/f ... 4.0.tar.gz tar -zxvf snap7-full-1.4.0.tar.gz cd snap7-full-1.4.0/build/unix sudo make –f arm_v7_linux.mk all
- Copier la librairie compilée dans les répertoires des librairies du Raspberry:
Code : Tout sélectionner
sudo cp ../bin/arm_v7-linux/libsnap7.so /usr/lib/libsnap7.so sudo cp ../bin/arm_v7-linux/libsnap7.so /usr/local/lib/libsnap7.so
- Installer Python PIP
Code : Tout sélectionner
sudo apt-get install python-pip sudo pip install python-snap7
- Editer le fichier common.py dans le répertoire /usr/local/lib/python2.7/dist-packages/snap7/ pour y ajouter le chemin de votre librairie compilée
La ligne a ajouter est la suivante: lib_location='/usr/local/lib/libsnap7.so'
A mettre en dessous de la ligne: def __init__(self, lib_location=None):Code : Tout sélectionner
class Snap7Library(object): """ Snap7 loader and encapsulator. We make this a singleton to make sure the library is loaded only once. """ _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = object.__new__(cls) cls._instance.lib_location = None cls._instance.cdll = None return cls._instance def __init__(self, lib_location=None): lib_location='/usr/local/lib/libsnap7.so' # Ajoutez la ligne ici if self.cdll: return
- Vous êtes paré pour coder!
Un conseil, c'est en PDF, donc télécharger le package depuis Windows et ouvrez le avec votre lecteur PDF favori, c'est bien plus convivial.
Moi je me suis aidé des déclarations de fonctions de Snap7 dispo dans le répértoire /usr/local/lib/python2.7/dist-packages/snap7/, le fichier client.py contient tout ce qui touche aux communication vers l'automate, tel que:
- connect: Connexion a l'automate
- disconnect: Déconnexion de l'automate
- etc...
- get_bool :Récupération d'un booléen dans un byte
- set_bool : Affectation d'un booléen dans un byte
- get_int
- etc...
![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Exemple de lecture de sorties
Code : Tout sélectionner
from time import sleep
import snap7
from snap7.util import *
import struct
#=========================================
# RAPPEL DES ZONES MEMOIRE
#
# Tempos = 0x1D
# Compteurs = 0x1C
# DB = 0x84
# Momento = 0x83
# Sorties = 0x82
# Entrees = 0X81
#
#=========================================
# Definition de l'automate et connexion
API = snap7.client.Client()
API.connect("192.168.0.250",0,2)
# Definition des variables
zone_mem = 0x82
debut = 8
longueur = 1
# Lecture (2eme argument = numero de DB, a 0 si on ne lit pas un DB)
resultat = API.read_area(zone_mem,0,debut,longueur)
# Affichage des resultats
bit = 0
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
bit = bit + 1
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
bit = bit + 1
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
bit = bit + 1
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
bit = bit + 1
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
bit = bit + 1
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
bit = bit + 1
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
# Deconnexion
API.disconnect()
On définit la zone mémoire à lire(zone_mem), la position du premier byte à lire(debut), le nombre de byte à lire(longueur). Ici le byte 0 correspond a Q0, 1 à Q1, etc...
On lance la lecture avec les paramètres qui vont bien.
On affiche les résultats, pour cela on extrait du byte la valeur du booléen attendu avec get_bool
On se déconnecte.
Ca donne:
Exemple d'écriture de sortiesRaspberry a écrit : pi@raspberrypi ~/S7-300 $ python test_lecture.py
Q 8 . 0 : False
Q 8 . 1 : True
Q 8 . 2 : True
Q 8 . 3 : True
Q 8 . 4 : True
Q 8 . 5 : True
Q 8 . 6 : True
Attention: Ecrire une sortie peut engendrer blessure ou mort selon l'actionneur que vous avez au bout, à utiliser sur une sortie inutilisée
Moi j'ai un voyant de connecté dessus
![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Code : Tout sélectionner
from time import sleep
import snap7
from snap7.util import *
import struct
#=========================================
# RAPPEL DES ZONES MEMOIRE
#
# Tempos = 0x1D
# Compteurs = 0x1C
# DB = 0x84
# Momento = 0x83
# Sorties = 0x82
# Entrees = 0X81
#
#=========================================
# Definition de l'automate et connexion
API = snap7.client.Client()
API.connect("192.168.0.250",0,2)
# Definition des variables
zone_mem = 0x82
debut = 0
longueur = 1
# Lecture (2eme argument = numero de DB, a 0 si on ne lit pas un DB)
resultat = API.read_area(zone_mem,0,debut,longueur)
bit = 0
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
# Creation du bytearray et affectation de la valeur TRUE
element = [0]
TabBool = bytearray(element)
set_bool(TabBool,0,0,1)
# Ecriture
API.write_area(zone_mem,0,debut,TabBool)
# Lecture (2eme argument = numero de DB, a 0 si on ne lit pas un DB)
resultat = API.read_area(zone_mem,0,debut,longueur)
bit = 0
print "Q",debut,".",bit,":",get_bool(resultat,0,bit)
# Deconnexion
API.disconnect()
On définit les même variable que pour la lecture, les fonctions sont similaires.
On lance la lecture avec les paramètres qui vont bien pour avoir la valeur avant écriture et on affiche les résultats
On prépare un tableau de byte pour affecter le booléen du byte que l'on souhaite transférer grâce a set_bool.
On envoi le tout à l'automate.
On relance une lecture pour vérifier le changements d'état.
On se déconnecte.
Ca donne:
Et mon voyant s'allume.Raspberry a écrit :pi@raspberrypi ~/S7-300 $ python test_ecriture.py
Q 0 . 0 : False
Q 0 . 0 : True
_________________________________________________
Je peux tout lire I,Q,M, tempos et compteurs, il suffit d'adapter.
Par contre je galère un peu à écrire un INT ou un REAL, car toute la communication se fait à base de byte (je le dis si vous ne vous en étiez pas rendu compte
![Tire la langue :P](./images/smilies/icon_razz.gif)
Je vous rassure, je vais y arriver, c'est juste une histoire de syntaxe parce que le Python, j'en avais jamais fait avant de toucher ce Raspberry, mais ça rentre vite.
Le but ultime, c'est de récupérer des valeurs de températures de sondes via le Raspberry et d'écrire ces valeurs cycliquement dans l'automate.
La suite au prochain épisode
![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Re: Faire un peu de domotique avec un S7-300
As-tu testé sur un Raspberry 2 (car il faut compiler pour ARM7 pour le nouveau )
Python c'est bien pour faire joujou mieux vaut passer tout de suite à QT qui est un compileur c++ ou lazarus en pascal on peut poser au moins un bouton sur une fiche et configurer en cross-compiling ( mais pour le CP bon courage si on connait pas, mais on peut tjrs jouer avec VNC)
les applis interressante sont dans ...\snap7-full-1.3.0\rich-demos\Raspberry
pour les swap de bytes tout est prêt en C c'est par ex:
en C ils sont dans les helpers--> float GetRealAt(void *Buffer, int Pos); ça doit etre un truck du style pour python
en pascal c'est getter setter sur proprieté ( property ValReal[pval : pointer]) j'ai fais une proprité pour les strings)
@+
Python c'est bien pour faire joujou mieux vaut passer tout de suite à QT qui est un compileur c++ ou lazarus en pascal on peut poser au moins un bouton sur une fiche et configurer en cross-compiling ( mais pour le CP bon courage si on connait pas, mais on peut tjrs jouer avec VNC)
les applis interressante sont dans ...\snap7-full-1.3.0\rich-demos\Raspberry
pour les swap de bytes tout est prêt en C c'est par ex:
en C ils sont dans les helpers--> float GetRealAt(void *Buffer, int Pos); ça doit etre un truck du style pour python
en pascal c'est getter setter sur proprieté ( property ValReal[pval : pointer]) j'ai fais une proprité pour les strings)
@+
Re: Faire un peu de domotique avec un S7-300
Ha ha, je viens de me rendre compte que je me suis trompé en compilant, donc sur un Raspberry 2 l'ARM6 fonctionne =pkosbor a écrit :As-tu testé sur un Raspberry 2 (car il faut compiler pour ARM7 pour le nouveau )
Merci c'est corrigé.
Je ne connais pas du tout les logiciels que tu viens de citer. De ce que je viens d'en voir en faisant une recherche rapide, ça ne correspond pas trop a mes besoins. Je n'ai aucunement besoin d'interface graphique d'ailleurs.kosbor a écrit :Python c'est bien pour faire joujou mieux vaut passer tout de suite à QT qui est un compileur c++ ou lazarus en pascal on peut poser au moins un bouton sur une fiche et configurer en cross-compiling ( mais pour le CP bon courage si on connait pas, mais on peut tjrs jouer avec VNC)
Je souhaite simplement transformer un signal analogique récupéré sur le GPIO et transférer sa valeur dans un DB, l'automate fera le reste.
Le Raspberry est simplement la pour faire passerelle.
Re: Faire un peu de domotique avec un S7-300
Il faut aussi compiler le .so (celui dans le repertoire est probablement pour 6 vu sa date)
qui peut le plus peut le moins ces compileurs permettent tout ce que fait python avec ou sans fiches
qui peut le plus peut le moins ces compileurs permettent tout ce que fait python avec ou sans fiches
Re: Faire un peu de domotique avec un S7-300
[EDIT] J'ai du mal à cette heure-ci, tu me disais en gros de recompiler le v7?kosbor a écrit :Il faut aussi compiler le .so (celui dans le repertoire est probablement pour 6 vu sa date)
Re: Faire un peu de domotique avec un S7-300
les make file sont là pour ça c'est comme libnodave
Linux Arm boards
There are two makefiles ready to use with single/dual-core ARM boards.
· arm_v6_linux.mk for V6 ARMHF boards (like Raspberry PI)
· arm_v7_linux.mk for V7 ARMHF boards (like BeagleBone Black, pcDuino and CubieBoard 2).
(They are a bit different, the second one needs the -mword-relocations switch)
As usually, in build/unix , type :
make –f arm_v6_linux.mk all (or clean or install)
or
make –f arm_v7_linux.mk all (or clean or install)
In the folder bin/arm_vX-linux/ you will find libsnap7.so.
You need to copy it into /usr/lib (if you didn't use install switch) or set accordingly LD_PATH_LIBRARY.
Remarks
The build process is quite slow on these boards cause the switch –pedantic that ensures the ISO compliance. You can disable it temporarily to speed up the process.
From Version 1.2.1 there is an additional optional parameter that can be passed to the makefile that overrides the default target lib path LibInstall=<path>
So, if you want to rebuild the library and copy it into /mylib instead of /usr/lib the above example becames:
make –f arm_v6_linux.mk install LibInstall=/mylib
Re: Faire un peu de domotique avec un S7-300
Il faut recompiler la lib
celui ds \snap7-full-1.3.0\release\Linux\ARMHF\Raspberry date de dec 2014 chez moi donc c'est du V6 je pense mais dans le doute il faut recompiler en 7
celui ds \snap7-full-1.3.0\release\Linux\ARMHF\Raspberry date de dec 2014 chez moi donc c'est du V6 je pense mais dans le doute il faut recompiler en 7
- steph31
- Forcené des structures
- Messages : 177
- Enregistré le : 20 oct. 2015, 19:17
- Localisation : Toulouse
Re: Faire un peu de domotique avec un S7-300
Merci pour votre tuto et vos conseil pour le raspberry. Consternant les entrées ana, c'est géré par mes cartes. Je vais me pencher sur un raspberry dans le but d'avoir un serveur web de mon automate sans passé par le panel PC.
Mais bon! n'ayant jamais utilisé un raspberry, je part a Zéro.
Mais bon! n'ayant jamais utilisé un raspberry, je part a Zéro.
Re: Faire un peu de domotique avec un S7-300
J'avais bien mal compris.kosbor a écrit :Il faut recompiler la lib
celui ds \snap7-full-1.3.0\release\Linux\ARMHF\Raspberry date de dec 2014 chez moi donc c'est du V6 je pense mais dans le doute il faut recompiler en 7
Oui oui, j'ai recompilé la bonne version juste après que tu ai mis en évidence mon erreur.
![Clin d’œil ;)](./images/smilies/icon_e_wink.gif)
Pour le serveur Web, ce sera pour bientôt, je ferai un petit tuto de ce genre même s'il en existe déjà pas mal déjà sur internet.steph31 a écrit :Merci pour votre tuto et vos conseil pour le raspberry. Consternant les entrées ana, c'est géré par mes cartes. Je vais me pencher sur un raspberry dans le but d'avoir un serveur web de mon automate sans passé par le panel PC.
Mais bon! n'ayant jamais utilisé un raspberry, je part a Zéro.