PLC - automatisme et iPhone

TIME

Introduction

Affichage de l'heure modifiable pour une alarme par exemple, le format est HHMM dans un word (16 bits), il représente donc une variable mémoire comme MW0 par exemple, avec ce format particulier, la gestion CodeSys est très simple.

Un exemple de temporisateur de remplissage de bassin avec CodeSys plus bas.

TIME

iphone : PLCLink

Code de référence

<item id="N">
  <title>Test</title>
  <name>Réveil</name>
  <description>Alarme horloge</description>
  <affichage>time</affichage>
  <IW><!--#READPI ADR=MW10&FORMAT=%d--></IW>
  <wagolink>http://IP_automate/WRITEPI?ADR1=MW10&amp;VALUE1=%d&amp;FORMAT1=%d</wagolink>
</item>

Fonction

Gestion de l'heure en lecture et en écriture, utilisable pour une alarme. l'heure est au format 100*Heure + minutes dans un WORD. Le décodage CoDeSys est expliqué plus bas.

Présentation

Aspect

La valeur de <IW> ou de <IB> en modBus donne la valeur actuelle sous forme HH:MM, si un lien de retour est présent il est possible d'accéder à la page de modification.
La couleur du cadre est le signe de la valeur : rouge si négatif et bleu si positif. Elle indique à l'utilisateur une information à choisir.

Lien de la commande

L'appel de l'url est réalisé 1 fois lors de la sélection de l'item :
- <link> est une URL complet "http://..." qui réalise l'action.
- <wagolink> est une forme particulière de formulaire qui sera donc passé en POST et sera prioritaire.
- <OB> est une adresse ModBus (Word) ou le nom IEC1131 d'une variable qui prendra la nouvelle valeur lors de la commande, un transfert ModBus sera initié si besoin.

Une seule de ces trois commandes n'est possible par item avec un ordre de priorité en cas de commandes multiples.

La présence d'un lien permet d'accéder au réglage de l'heure. illustration ci dessous :

- PLCLink

exemple HTTP (80) :

- <link>http://IP/commande...</link>
- <wagolink>http://IP_automate/WRITEPI?ADR1=MW0&VALUE1=0&FORMAT1=%d</wagolink> commande SSI Wago

exemple ModBus :

- <OB>MW0</OB> adresse mémoire de word écriture IEC1131
- <OB>12288</OB> adresse décimale directe en mémoire pour le mot MW0

Note

- N'est utilisable que le mode word (MW ou IW)
- l'écriture ModBus est impossible vers une sortie directement : (QW0 etc..), utilisez un flag mémoire intermédiaire.

Priorités

- <wagolink> est prioritaire.
- <link> ensuite
- <OB> Fera un appel ModBus

Montage en ModBus

Code de référence

PLCLink heure

<item id="0">
  <title>Test</title>
  <name>Réveil</name>
  <description>Alarme horloge</description>
  <type>direct</type>
  <affichage>time</affichage>
  <IP>192.168.10.0</IP>
  <unitID>0</unitID>
  <IB>MW0</IB>
  <OB>MW0</OB>
</item>
<item id="1">
  <title>Test</title>
  <name>Activation</name>
  <description>Alarme</description>
  <type>direct</type>
  <affichage>switch</affichage>
  <IP>192.168.10.0</IP>
  <unitID>0</unitID>
  <IB>MX1.0</IB>
  <OB>MX1.0</OB>
</item>

lier ensuite la valeur de MX1.0 dans CodeSys pour inverser le signe de la valeur de MW0 qui indiquera à l'utilisateur l'activation de l'alarme (cadre rouge), voir exemple plus bas le minuteur de bassin.

Montage d'un TIMER de bassin avec CodeSys

Timer

Ce montage donne une cellule ou il est possible de régler le temps sur une période de 24H et un déclencheur. L'activation du bouton 'robinet' lance le timer et ouvre l'eau de remplissage. Ce bouton permet aussi de couper le remplissage avant l'heure. Le timer est constamment affiché avec le temps restant.

Le temps est dans un WORD pour CodeSys il faut transformer la valeur de type HHMM, le calcul de formation par PLCLink est : DATA = Heure * 100 + Minutes.

CodeSys devra donc décomposer cette valeur pour retrouver un type TIME.

Heure := DATA / 100;
Minutes := DATA - 100 * Heure;
TIME := STRING_TO_TIME( T# + Heure + s + Minutes + m )

Code pour PLCLink

PLCLink heure

<items>
<item id="0">
  <title></title>
  <name>Temporisateur</name>
  <description>Bassin</description>
  <affichage>time</affichage>
  <IP>192.168.0.30</IP>
  <unitID>0</unitID>
  <IB>MW11</IB>
  <OB>MW10</OB>
</item>
<item id="1">
  <title>Titre</title>
  <name>Remplissage</name>
  <description>Ouverture remplissage eau</description>
  <type>direct</type>
  <affichage>water</affichage>
  <IP>192.168.0.30</IP>
  <unitID>0</unitID>
  <IB>QX0.3</IB>
  <OB>MX1.0</OB>
</item>
<item id="2">
  <title>Titre</title>
  <name>Eau push</name>
  <description>Force - QX0.3</description>
  <affichage>push</affichage>
  <IP>192.168.0.30</IP>
  <unitID>0</unitID>
  <OB>MX1.1</OB>
</item>
</items>

Trois cellules, le temporisateur de type 'time' va écrire en Modbus en mémoire sur MW10 la valeur qui sera 'tempoMinuteur' sur CodeSys. Il lis sa valeur du décompteur situé à 'MW11' qui est le WORD 'tempsRestant'.

Le bouton déclencheur de type 'water' va lire sa valeur en 'QX0.3' Modbus qui est en CodeSys 'bassin' en adresse '%QX2.3', et écrire une valeur en MX1.0 qui est 'minuteur' sur CodeSys.

On rappelle au passage que les adresses de sortie physique des cartes ne sont pas les mêmes en CodeSys et en Modbus, un offset est rajouté souvent en fonction de la disposition des cartes le bit final reste le même.

Le dernier bouton 'push' ira forcer la valeur de MX1.1 qui est 'bassinOn' et forcera la sortie.

Voici le programme d'appel de la temporisation en CodeSys :

	PROGRAM PLC_PRG
	VAR
		Time_Value: TIME;		(* temps calcule du minuteur donne par PLCLINK  dans MW10 *)
		Time_restant:TIME;
		minute: STRING;
		heure: STRING;
		resteHeures: DWORD;
		secondesReste: DWORD;
		resteMinutes: DWORD;
		reste: WORD;
		tempsRestant: WORD AT 
	END_VAR
	
	VAR_GLOBAL
		minuteur AT %MX1.0:BOOL;	(* depart minuteur bassin par bouton PLCLink *)
		bassinOn AT %MX1.1:BOOL;	(* force bassin ON si besoin *)
		tempoMinuteur AT %MW10:WORD;	(* temps minuteur bassin donne par PLCLink *)
		tempsRestant AT %MW11:WORD;	(* temps restant minuteur sera affiche sur PLCLink *)
		bassin AT %QX2.3:BOOL;		(* sortie 220V relais d'eau du bassin  *)
	END_VAR
	
	(* ---------- BASSIN ------------ *)
	(* Temporisateur de bassin en H:M de tempoMinuteur = %MW10 *)
	heure   	:= WORD_TO_STRING((tempoMinuteur/100));
	minute 		:= WORD_TO_STRING((tempoMinuteur - 100*(tempoMinuteur/100)));
	Time_Value 	:=STRING_TO_TIME( CONCAT(CONCAT(CONCAT(CONCAT('T#',heure),'h'),minute),'m')   );
	PRG_LD_MINUTEUR(Activate_minuteur := minuteur, temp:=Time_Value);
	bassin 	:= minuteur OR bassinOn;
	
	(*Affichage du temps restant sur PLCLink *)
	Time_restant  	:= Time_Value - PRG_LD_MINUTEUR.T1.ET;
	secondesReste  	:= TIME_TO_DWORD(Time_restant)/1000; 		(* en secondes restantes *)
	resteHeures   	:= secondesReste/3600;					(* Heures restantes *)
	resteMinutes   	:= (secondesReste - 3600*resteHeures)/60;	(*Minutes restantes*)
	reste		:= DWORD_TO_WORD(100*resteHeures + resteMinutes);	(* recompose pour PLCLink *)
	IF minuteur THEN
	tempsRestant	:= 0- reste;	(* Affichage cadre en rouge sur PLCLink (1.7.9) *)
	ELSE
	tempsRestant	:= reste;		(* Affichage cadre en bleu sur PLCLink *)
	END_IF

On calcul le temps restant avec une opération inverse pour reconstituer le WORD lisible par PLCLink et le temps en HHMM restant (100*H + M) dans la variable 'reste' elle est soit positive si le compteur est arrêté soit négative pour une affichage avec cadre rouge (PLCLink 1.7.9).

PRG_LD_MINUTEUR est un programme (PRG_LD) comme ci dessous :

PROGRAM PRG_LD_MINUTEUR
VAR_INPUT
	Activate_minuteur:BOOL;		(* depart minuteur de minuteur *)
	temp:TIME;			(* temps donne par PLCLink en MW10 *)
END_VAR
VAR
	Start_minuteur:BOOL;
	End_Minuteur:BOOL;
	T1:TON;
	T2:TON;
	F1:R_TRIG;
	F2:F_TRIG;
END_VAR
VAR_OUTPUT
	Result_minuteur:BOOL;
END_VAR

Avec le code LD ci dessous :

iphone : PLCLink


PLCLink more
index

 

Valid XHTML 1.0 Transitional