teleinfo edf

francois42

New Member
bonjour a tous,

nouveau dans la communauté picaxe, j'ai un soucis et besoin de vos expertises :
je souhaite relevé les infos de mon compteur edf avec un picaxe 14M2,
j'ai réalisé une interface edf vers une sortie RS en TTL qui fonctionne très bien
(lecture des infos via HyperTerminal d'un pc)
maintenant je voudrais que ce soit le picaxe qui reçoive ces données et qui les retransmettre
au pc quand je lui dirais.
Cependant, les infos du compteur arrivent en flux continu et en 1200b, 7bits parité pair 1stop
or, d'après la doc du picaxe, la commande SERIN n'est pas modifiable !!! (2400bauds max, 8bits, pas de parité)

donc là, je suis bloqué ...
merci d'avance pour vos aides ...
 

GM39

Senior Member
7+1 et 8 sont des formats compatibles.
A la réception il suffit d'éliminé l'intrus (si toutefois il est effectivement complété, ce qui n'est pas toujours le cas) par masquage :
data and $7f
 

francois42

New Member
re, merci PieM et GM39,

merci pour vos réponse mais (et oui il y a toujours un mais....)
la trame teleinfo dure environ 1 seconde et commence toujours par 02 en hexa et se termine toujours par 03 en hexa
entre ces 2 bornes on trouve la "trame" qui se compose
du caractere LF (0A en hexa) les champs etiquettes et données et le caractere CR (0D en hexa)
(etiquettes et données de longueurs variables)
ci-dessous un exemple concret :
(02h)(0Ah)ADCO(20h)XXXXXXXXXXXX(20h)X(0Dh)
(0Ah)OPTARIF BASE(20h)X(0Dh)
(0Ah)ISOUSC(20h)XX(20h)X(0Dh)
(0Ah)BASE(20h)XXXXXXXXX(20h)X(0Dh)
etc...............jusqu'a (03h)fin de la teleinfo puis recommence du début (flux continu)


j'avoue qu'après avoir passé ma nuit a essaye avec la commande serin , j'en perd mon latin....
dépassement du timeout, variables qui ne remplissent pas correctement .....
je n'obtiens que des suites illogiques

si qqn avait un bout de code a proposer? pour débloquer la situation ...
 

PieM

Senior Member
ci-dessous un exemple concret :
(02h)(0Ah)ADCO(20h)XXXXXXXXXXXX(20h)X(0Dh)
(0Ah)OPTARIF BASE(20h)X(0Dh)
(0Ah)ISOUSC(20h)XX(20h)X(0Dh)
(0Ah)BASE(20h)XXXXXXXXX(20h)X(0Dh)
etc...............jusqu'a (03h)fin de la teleinfo puis recommence du début (flux continu)
Quel est votre programme ?
Vous n'avez aucune donnée à envoyer au compteur ?

En réception, puisque vos données comportent une étiquette, essayez de l'utiliser en tant que qualificatif de vos commandes serin.

Serin x, N1200_4 (?), ("ADCO "), var1, var2 ......
Serin x, N1200_4 (?), ("OPTARIF BASE "), var1
etc...

ne pas oublier le blanc (20h) à la fin du qualificatif.
 

GM39

Senior Member
Au préalable il faut vérifier si oui ou non le bit de parité est complété par l'émetteur, en retournant les octets reçu sur sertxd par exemple.
S'il est bien complété il faut corriger les qualificatifs en conséquence puisqu'on ne peut pas les traiter :

p.ex : $02 -> $82 et ("ADCO ") = ($41,$44,$43,$4f,$20) -> ($41,$44,$c3,$cf,$a0) , sauf erreur
 

francois42

New Member
pour répondre à PieM,
le compteur n'a pas besoin d'info pour lancer sa trame, il le fait en mode continu
en effet, mon programme ne comporte que des séries de
Serin c.0, N1200_4 ("ADCO "), w1
Serin c.0, N1200_4 ("OPTA "), w2
etc...
puis un envoi par serout de toutes mes variables w1,w2,w3...... (pour les recevoir sur le PC à titre de test!)

je ne comprends pas votre (?) après N1200_4 ??

bon là je vais au lit (après une nuit blanche...) ya boulot demain, je reprendrais çà demain soir,
merci à tous bonne soirée
ps à PieM du 34? à coté de Béziers ?, j'y vais tous les ans en vacances!
 

francois42

New Member
après plusieurs essais, voila ce qui ce passe :
Serin c.0, N1200_4 ("AD"), b1 me donne $C3 ce qui ne correspond pas au "C"
Serin c.0, N1200_4 ("ADCO "), b1 ne donne absolument rien (meme le debug est en attente)
en fait, si on met plus de 2 caractère dans le qualifiant, ca plante .....
par contre
Serin c.0, N1200_4 ("BA"), b1 me donne bien le caractère S que j'attend!!! (BASE)
mais si je complète mon qualifiant ("BAS") pour qu'il me donne E ca plante ...
même combat si a la place des caractères dans le qualifiant je met leurs valeurs en $41,$44
c'est a n'y rien comprendre
(ceci dit mes données qui arrivent sont en 7bits alors que la commande serin est sur 8bits)!!!!!!!!! voilà peut être une piste
autre question, si je veux utiliser une variable par exemple data1="ADCO" comment faut_il la déclarer ?
merci pour vos réponse,
ps si cela dit à quelqu'un, je peut fournir le schéma de l'interface entre EDF et le picaxe (un montage qui fonctionne très bien avec de beaux signaux carrés en 0et+5v TTL)
 

GM39

Senior Member
Il faut faire ce que j'ai indiqué en #6

c3 c'est le code ascii de C + le bit de parité

Serin c.0, N1200_4 ("ADCO ") doit être remplacé par Serin c.0, N1200_4 ($41,$44,$c3,$cf,$a0)
 

amatpicax59

New Member
Bonjour à tous
Dans le post #1 de dette discussion, François42 écrit " j'ai réalisé une interface edf vers une sortie RS en TTL qui fonctionne très bien "
De nombreux picaxiens seraient certainement intéréssés par un lien donnant toutes les infos techniques et schémas de cette interface.
Merci d'avance
 

francois42

New Member
teleinfo1.jpg
Je vous donne donc le schéma "qui fonctionne" (contrairement a ceux que l'on peut trouver)
et qui présente le gros avantage de n'utiliser que des composants basic et donc peu coûteux (moins de 3€)
Explications:
La diode 1N4148 permet de prendre qu’une alternance du signal téléinfo (signal modulé sur 50hz),
une résistance de 10K alimente la led de l’opto-coupleur qui permet de s’isoler du montage (on ne sait jamais avec EDF…)
En sortie de l’opto-coupleur, une porte NAND a trigger de shmitt pour mettre en forme le signal et d’obtenir de beaux signaux carrés au format TTL.

Voilà c’est tout pour la partie électronique.
Tout le reste (décodage de la trame téléinfo) se fait en soft.

La trame est une suite de caractères ASCII émise à
1200 bits/s, 7 bits/caractères, parité paire, 1 bit de stop
(voir 1er post pour détail de cette trame)
http://www.erdfdistribution.fr/medias/DTR_Generalites/ERDF-NOI-CPT_44E.pdf
est le lien EDF Officiel dans lequel on retrouve toutes les étiquettes, données, format …

Coté Picaxe, la commande Serin permet de recevoir cette trame (démodulée, traitée) mais en 8bits
il est donc nécessaire de compléter le bit reçu
comme le disait GM39 et PieM QUE JE REMERCIE GRANDEMENT POUR LEUR REACTIVITE (c’est rare sur les forum !!!!!!!)
 

GM39

Senior Member
Comme c'est un peu fastidieux de rechercher à la main le code avec parité, on peut le faire avec la simulation :
Code:
#picaxe 20X2
symbol i=b0
symbol parite=b1
symbol octet=b2
symbol ifort=b3
symbol ifaible=b4
symbol ofort=b5
symbol ofaible=b6


for i=0 to 32
	b1 = nob b0//2
	if b1=1 then
		octet=i+128
	else
		octet=i
	endif
	gosub DecToHex
	sertxd("[",#i,"]",":","$",ifort,ifaible,"->","$",ofort,ofaible)
next i
for i=33 to 127
	b1 = nob b0//2
	if b1=1 then
		octet=i+128
	else
		octet=i
	endif
	gosub DecToHex
	sertxd(i,":","$",ifort,ifaible,"->","$",ofort,ofaible)
next i

end

DecToHex:
	ifort=i/16
	ifaible=i//16
	ofort=octet/16
	ofaible=octet//16
	lookup ifort,("0123456789abcdef"),ifort
	lookup ifaible,("0123456789abcdef"),ifaible
	lookup ofort,("0123456789abcdef"),ofort
	lookup ofaible,("0123456789abcdef"),ofaible
	return
Ce qui donne après nettoyage des commentaires :
Code:
[0]:$00->$00
[1]:$01->$81
[2]:$02->$82
[3]:$03->$03
[4]:$04->$84
[5]:$05->$05
[6]:$06->$06
[7]:$07->$87
[8]:$08->$88
[9]:$09->$09
[10]:$0a->$0a
[11]:$0b->$8b
[12]:$0c->$0c
[13]:$0d->$8d
[14]:$0e->$8e
[15]:$0f->$0f
[16]:$10->$90
[17]:$11->$11
[18]:$12->$12
[19]:$13->$93
[20]:$14->$14
[21]:$15->$95
[22]:$16->$96
[23]:$17->$17
[24]:$18->$18
[25]:$19->$99
[26]:$1a->$9a
[27]:$1b->$1b
[28]:$1c->$9c
[29]:$1d->$1d
[30]:$1e->$1e
[31]:$1f->$9f
[32]:$20->$a0
!:$21->$21
":$22->$22
#:$23->$a3
$:$24->$24
%:$25->$a5
&:$26->$a6
':$27->$27
(:$28->$28
):$29->$a9
*:$2a->$aa
+:$2b->$2b
,:$2c->$ac
-:$2d->$2d
.:$2e->$2e
/:$2f->$af
0:$30->$30
1:$31->$b1
2:$32->$b2
3:$33->$33
4:$34->$b4
5:$35->$35
6:$36->$36
7:$37->$b7
8:$38->$b8
9:$39->$39
::$3a->$3a
;:$3b->$bb
<:$3c->$3c
=:$3d->$bd
>:$3e->$be
?:$3f->$3f
@:$40->$c0
A:$41->$41
B:$42->$42
C:$43->$c3
D:$44->$44
E:$45->$c5
F:$46->$c6
G:$47->$47
H:$48->$48
I:$49->$c9
J:$4a->$ca
K:$4b->$4b
L:$4c->$cc
M:$4d->$4d
N:$4e->$4e
O:$4f->$cf
P:$50->$50
Q:$51->$d1
R:$52->$d2
S:$53->$53
T:$54->$d4
U:$55->$55
V:$56->$56
W:$57->$d7
X:$58->$d8
Y:$59->$59
Z:$5a->$5a
[:$5b->$db
\:$5c->$5c
]:$5d->$dd
^:$5e->$de
_:$5f->$5f
`:$60->$60
a:$61->$e1
b:$62->$e2
c:$63->$63
d:$64->$e4
e:$65->$65
f:$66->$66
g:$67->$e7
h:$68->$e8
i:$69->$69
j:$6a->$6a
k:$6b->$eb
l:$6c->$6c
m:$6d->$ed
n:$6e->$ee
o:$6f->$6f
p:$70->$f0
q:$71->$71
r:$72->$72
s:$73->$f3
t:$74->$74
u:$75->$f5
v:$76->$f6
w:$77->$77
x:$78->$78
y:$79->$f9
z:$7a->$fa
{:$7b->$7b
|:$7c->$fc
}:$7d->$7d
~:$7e->$7e
:$7f->$ff
 

jojojo

Senior Member
J'ai bien lu le document ERDF (très intéressant, d'ailleurs).

Question : Pourquoi l'opto-coupleur ? Il est bien dit dans la doc : isolées galvaniquement côté compteur

Donc ...

Une autre question, tant que j'y suis : Le télé-relevé du compteur semble se faire via une liaison "électro-magnétique" ou "inductive" (le truc rond, sur lequel l'agent pose son capteur).
Quelqu'un a des info's, sur le fonctionnement de ce truc ?

Merci.
,
 

GM39

Senior Member
Une autre question, tant que j'y suis : Le télé-relevé du compteur semble se faire via une liaison "électro-magnétique" ou "inductive" (le truc rond, sur lequel l'agent pose son capteur).
Quelqu'un a des info's, sur le fonctionnement de ce truc ?
C'est la liaison téléreport. C'est également à 50kHz (sans doute identique à téléinfo pour la lecture), mais comme cela permet également la programmation du compteur c'est sécurisé en écriture - Bus Euridis (CEI 62056-31). Le raccordement se fait côté plombé, sans doute pour éviter que de petits curieux espionnent la communication...
http://www.dgcis.gouv.fr/files/files/directions_services/metrologie/approb/decisions99/99005730011.pdf
http://norm.edf.fr/pdf/hn94014.pdf
http://www.euridis.org/solution_details.html
 

durandal

New Member
Bonjour à tous,

Pour faire suite à ce fil et d'accord avec l'avis de jojojo, je reprend cette discussion.
J'ai réalisé il a 2 ans cette lecture de la téléinformation EDF et exploité les infos tempo avec un 40X2. Je m'empresse de préciser qu'à cette époque je découvrais t-o-t-a-l-e-ment
le monde des microcontôleurs en général et celui des PICAXE en particulier. Je vous demande donc d'être indulgent sur les erreurs de mise en forme du code qui a au moins l'avantage de fonctionner et sans doute aussi d'être perfectible.
La difficulté que j'ai rencontrée fut de comprendre qu'il fallait stimuler le PICAXE entre chaque lecture série (d'où les Setfreq m16) et pour laquelle j'ai passé beaucoup de temps. Si cela peut vous en faire gagner.

Cordialement


Code:
Symbol InfTIC = A.5		 ' Sortie TIC du 74LS132
Symbol OutSerial = A.2 
Symbol Tempo = b0
Symbol Etiquette1 = b1
Symbol Etiquette2 = b2
Symbol Etiquette3 = b3
Symbol Etiquette4 = b4
Symbol Etiquette5 = b5
Symbol Etiquette6 = b6
Symbol Space1 = b7
Symbol Data1 = b8
Symbol Data2 = b9
Symbol Data3 = b10
Symbol Data4 = b11
' La variable tempo
' Si bit à 1 =..
' Couleur du jour (Bits  0 à 2)
' Bit 0	= Bleu
' Bit 1	= Blanc
' Bit 2	= Rouge
' Couleur du lendemain (Bits  3 à  5)
' Bit 3	= Bleu
' Bit 4	= Blanc
' Bit 5	= Rouge
' Bit 6 = Heures pleines
' Bit 7 inutilisé

GetPtec:
	' Les infos TIC sont envoyées à 1200 bits/s 7 bits/caractères  1 bit de stop   parité paire
	' Le Picaxe utilise le protocole de 8 bits/caractères  1 bit de stop   sans paritéi
	' Il faut donc éliminer le bit de parité en le forçant à 0 avec la fonction logique octet AND $7F
	Gosub GetTrame ' le caractère "Start Text" STX (002 h) indique le début de la trame
	GetGroupePtec:
	Setfreq m8
	'un caractère "Line Feed" LF (10) indique le début du groupe
	Serin [10000,FinGetPTEC] ,InfTIC,N1200,(10),Etiquette1,Etiquette2,Etiquette3,Etiquette4,Space1,Data1,Data2,Data3,Data4
	Setfreq m16
	Gosub Data7Bits
	If Etiquette1 =3  then ' Le caractère "End Text" ETX (003 h) indique la fin de la trame	
		Goto FinGetPTEC
	Endif
	If  Etiquette1 = 80  and Etiquette2 = 84 and Etiquette3 = 69 and  Etiquette4 = 67 then  ' PTEC
		if Data2 =  67 then ' Creuse :le C de HC
			Bit6 = 0
		Elseif Data2 = 80 then  'Pleine :Le P de HP 
			Bit6 = 1
		Endif
		if  Data4 = 66  then 'Bleu: le B de HCJB
			Bit0 = 1
		Elseif Data4 = 87  then 'Blanc: le W de HCJW	
			Bit1  = 1
		Elseif Data4 =  82 then 'Rouge: le R de HCJR	
			Bit2 = 1
		Endif
		Serout OutSerial,N4800_16,(Tempo) ' juste là pour contrôle
	Else
		Serout OutSerial,N4800_16,(255) ' juste là pour contrôle
		Goto GetGroupePtec	
	Endif
	FinGetPTEC:
	Setfreq m8	
	
Return


Data7Bits:

	Etiquette1 = Etiquette1 and $7F
	Etiquette2 = Etiquette2 and $7F
	Etiquette3 = Etiquette3 and $7F
	Etiquette4 = Etiquette4 and $7F
	Etiquette5 = Etiquette5  and $7F
	Etiquette6 = Etiquette6  and $7F
	Space1 = Space1 and $7F
	Data1 = Data1 and $7F
	Data2 = Data2 and $7F
	Data3 = Data3 and $7F
	Data4 = Data4 and $7F
	
Return

GetTrame:
	Serin [10000,FinGetTrame] ,InfTIC,N1200,Etiquette1
	Etiquette1 = Etiquette1 and $7F
	If Etiquette1 <> 2 then goto GetTrame
	FinGetTrame:
Return
 
Top