Pilotage ouverture/fermeture d'une barrière de sécurité pour boitier TC/USB16IO

Résolu
Wiska Messages postés 15 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 13 août 2012 - 5 juin 2008 à 10:33
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 5 juin 2008 à 16:41
Bonjour,
Avant tout, voici la description de ce fameux boitier:
"Le module TC/USB-16IO est un module d'interface pc, comportant 8 entrées logiques isolées, 2 sortie sur contacts secs par relais NO, 4 sortie sur opto-coupleurs et un compteur pour codeur incrémental.Auto-alimenté par le port USB, ce module permet d'obtenir une grande variété d'entrée-sortie pour un coût réduit et une grande facilité d'installation. Un chien de garde débrayable assure la coupure de la commande des sortie si une fréquence particulière n'est pas exécutée toutes les 2 secondes."

Mon entreprise à donc commandé ce boitier et mon problème est donc de savoir comment faire pour piloter l'ouverture/fermeture d'une barrière de sécurité en créant 3 fonctions. Etant donné que l'on ne se servira que d'une seule de sortie existantes sur ce boitier, je pense créer 3 fonctions:
- un bouton permettant de forcer cette sortie à 0 (relais ouvert)
- un bouton permettant de forcer cette sortie à 1 (relais fermé)
- un bouton permettant de lire l'état de cette sortie.

Voici le source de la démo que 3C-concept nous a fournit pour piloter le boitier:
==============================
unit UDemoTCUSB16IO;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ImgList, ToolWin, ComCtrls, StdCtrls, ExtCtrls, ActnList, Buttons,
VrControls, VrRaster, VrLcd, VrCheckLed, VrSwitch, VrNavigator, VrButtons;
type
TFrmTest = class(TForm)
Panel1: TPanel;
Timer1: TTimer;
Timer2: TTimer;
RefreshBtn: TButton;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
GroupBox2: TGroupBox;
VrRaster1: TVrRaster;
VrNum1: TVrNum;
VrNum2: TVrNum;
VrNum3: TVrNum;
VrNum4: TVrNum;
VrNum5: TVrNum;
VrNum6: TVrNum;
VrNum7: TVrNum;
VrNum8: TVrNum;
Label1: TLabel;
Label3: TLabel;
Label7: TLabel;
VrCheckLed1: TVrCheckLed;
VrCheckLed2: TVrCheckLed;
VrCheckLed3: TVrCheckLed;
VrCheckLed4: TVrCheckLed;
VrCheckLed5: TVrCheckLed;
VrCheckLed6: TVrCheckLed;
Label5: TLabel;
AutoBtn: TButton;
WdgOnBtn: TButton;
WdgOffBtn: TButton;
WdgRearmBtn: TButton;
GroupBox1: TGroupBox;
VrNumCod: TVrNum;
Label4: TLabel;
VrRaster2: TVrRaster;
Label2: TLabel;
RadioGroup1: TRadioGroup;
RAZPosBtn: TButton;
TopZCheck: TCheckBox;
procedure AutoBtnClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure VrCheckLed1Change(Sender: TObject);
procedure VrCheckLed2Change(Sender: TObject);
procedure VrCheckLed3Change(Sender: TObject);
procedure VrCheckLed4Change(Sender: TObject);
procedure VrCheckLed5Change(Sender: TObject);
procedure VrCheckLed6Change(Sender: TObject);
procedure WdgOnBtnClick(Sender: TObject);
procedure WdgOffBtnClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure RefreshBtnClick(Sender: TObject);
procedure WdgRearmBtnClick(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure RAZPosBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmTest: TFrmTest;
{$INCLUDE TCUSB16IO.INC}
implementation
uses uSetup;

var
AffCompteur : array [0..7] of TVrNum;
EtatOut : array [0..5] of TVrCheckLed;
SerialNumber: string;
NumSer: PChar;
SerialNumberN: DWord;
{$R *.DFM}
procedure TraiteData;
var i: integer;
mask,Entree: longword;
Compteur: byte;
Codeur: Integer;
begin
TCUSB16IO_Input(1,Entree);
mask:=1;
for i:=0 to 7 do
begin
if (Entree and (mask shl i))<>0 then FrmTest.VrRaster1.Items[i].Active:=TRUE else FrmTest.VrRaster1.Items[i].Active:=FALSE;
end;
for i:=0 to 2 do
begin
if ((Entree shr 8) and (mask shl i))<>0 then FrmTest.VrRaster2.Items[i].Active:=TRUE else FrmTest.VrRaster2.Items[i].Active:=FALSE;
end;
for i:=0 to 7 do
begin
TCUSB16IO_Counter(1,i+1,Compteur);
AffCompteur[i].Value:=Compteur;
end;
TCUSB16IO_Pos(1,Codeur);
FrmTest.VrNumCod.Value:=Codeur;
end;
procedure TFrmTest.FormActivate(Sender: TObject);
var i : Byte;
begin
for i:=0 to 7 do AffCompteur[i]:=TVrNum(FindComponent('VrNum'+IntToStr(i+1)));
for i:=0 to 5 do EtatOut[i]:=TVrCheckLed(FindComponent('VrCheckLed'+IntToStr(i+1)));
SerialNumber:=GetSerial;
NumSer:=PChar(SerialNumber);
SerialNumberN:=StrToInt64Def(SerialNumber,0);
//i:= TCUSB16IO_Open(1,NumSer);
i:= TCUSB16IO_OpenN(1,SerialNumberN);
SerialNumber:=IntToStr(SerialNumberN);
if i<>erNoError then
begin
MessageDlg('Erreur ouverture module (Erreur '+IntToStr(i)+')', MtError, [mbOk], 0);
Application.Terminate;
end
else
begin
FrmTest.Caption:=FrmTest.Caption+' - N/S Module='+SerialNumber;
TCUSB16IO_WdgStop(1);
AutoBtn.Enabled:=True;
RefreshBtn.Enabled:=True;
TraiteData;
Timer1.Enabled:=True;
end;
end;
procedure TFrmTest.AutoBtnClick(Sender: TObject);
var i: integer;
begin
Timer2.Enabled:=not(Timer2.Enabled);
if Timer2.Enabled then
begin
AutoBtn.Caption:='Sequenceur OFF';
for i:=0 to 5 do EtatOut[i].Enabled:=False;
EtatOut[0].Checked:=True;
end
else
begin
AutoBtn.Caption:='Sequenceur ON';
for i:=0 to 5 do EtatOut[i].Enabled:=True;
end;
end;
procedure TFrmTest.Timer1Timer(Sender: TObject);
var i:integer;
begin
i:=TCUSB16IO_Refresh(1);
if i>0 then MessageDlg('Erreur dialogue module', mtError, [mbOk], 0) else TraiteData;
end;
procedure TFrmTest.Timer2Timer(Sender: TObject);
var i: integer;
begin
for i:=0 to 5 do
if EtatOut[i].Checked then
begin
EtatOut[i].Checked:=False;
if i<5 then EtatOut[i+1].Checked:=True else EtatOut[0].Checked:=True;
break;
end;
TraiteData;
end;
procedure TFrmTest.WdgOnBtnClick(Sender: TObject);
begin
TCUSB16IO_WdgRun(1);
end;
procedure TFrmTest.WdgOffBtnClick(Sender: TObject);
begin
TCUSB16IO_WdgStop(1);
end;
procedure TFrmTest.WdgRearmBtnClick(Sender: TObject);
begin
TCUSB16IO_WdgRearm(1);
end;
procedure TFrmTest.VrCheckLed1Change(Sender: TObject);
begin
if TCUSB16IO_BitReadBack(1,1)=0 then TCUSB16IO_BitOutPut(1,1,1) else TCUSB16IO_BitOutPut(1,1,0);
if not(Timer1.Enabled) then
begin
TCUSB16IO_Refresh(1);
TraiteData;
end;
end;
procedure TFrmTest.VrCheckLed2Change(Sender: TObject);
begin
if TCUSB16IO_BitReadBack(1,2)=0 then TCUSB16IO_BitOutPut(1,2,1) else TCUSB16IO_BitOutPut(1,2,0);
if not(Timer1.Enabled) then
begin
TCUSB16IO_Refresh(1);
TraiteData;
end;
end;
procedure TFrmTest.VrCheckLed3Change(Sender: TObject);
begin
if TCUSB16IO_BitReadBack(1,3)=0 then TCUSB16IO_BitOutPut(1,3,1) else TCUSB16IO_BitOutPut(1,3,0);
if not(Timer1.Enabled) then
begin
TCUSB16IO_Refresh(1);
TraiteData;
end;
end;
procedure TFrmTest.VrCheckLed4Change(Sender: TObject);
begin
if TCUSB16IO_BitReadBack(1,4)=0 then TCUSB16IO_BitOutPut(1,4,1) else TCUSB16IO_BitOutPut(1,4,0);
if not(Timer1.Enabled) then
begin
TCUSB16IO_Refresh(1);
TraiteData;
end;
end;
procedure TFrmTest.VrCheckLed5Change(Sender: TObject);
begin
if TCUSB16IO_BitReadBack(1,5)=0 then TCUSB16IO_BitOutPut(1,5,1) else TCUSB16IO_BitOutPut(1,5,0);
if not(Timer1.Enabled) then
begin
TCUSB16IO_Refresh(1);
TraiteData;
end;
end;
procedure TFrmTest.VrCheckLed6Change(Sender: TObject);
begin
if TCUSB16IO_BitReadBack(1,6)=0 then TCUSB16IO_BitOutPut(1,6,1) else TCUSB16IO_BitOutPut(1,6,0);
if not(Timer1.Enabled) then
begin
TCUSB16IO_Refresh(1);
TraiteData;
end;
end;
procedure TFrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TCUSB16IO_Close(1);
end;
procedure TFrmTest.RefreshBtnClick(Sender: TObject);
begin
Timer1.Enabled:=not(Timer1.Enabled);
if Timer1.Enabled then
begin
WdgOnBtn.Enabled:=False;
WdgOffBtn.Enabled:=False;
WdgRearmBtn.Enabled:=False;
RefreshBtn.Caption:='Stop AutoRefresh'
end
else
begin
WdgOnBtn.Enabled:=True;
WdgOffBtn.Enabled:=True;
WdgRearmBtn.Enabled:=True;
RefreshBtn.Caption:='Start AutoRefresh';
end;
end;
procedure TFrmTest.SpeedButton1Click(Sender: TObject);
var i : Byte;
begin
TCUSB16IO_ResetPort(1);
TCUSB16IO_Close(1);
i:= TCUSB16IO_Open(1,NumSer);
if i<>erNoError then
begin
MessageDlg('Erreur ouverture module', mtError, [mbOk], 0);
Application.Terminate;
end;
end;
procedure TFrmTest.SpeedButton2Click(Sender: TObject);
var i : Byte;
begin
TCUSB16IO_CyclePort(1);
TCUSB16IO_Close(1);
i:= TCUSB16IO_Open(1,NumSer);
if i<>erNoError then
begin
MessageDlg('Erreur ouverture module', mtError, [mbOk], 0);
Application.Terminate;
end;
end;
procedure TFrmTest.RadioGroup1Click(Sender: TObject);
begin
if (TopZCheck.State=CBChecked) then TCUSB16IO_Config(1,8+(6-Radiogroup1.Itemindex))
else TCUSB16IO_Config(1,(6-Radiogroup1.Itemindex));
TCUSB16IO_Refresh(1);
end;
procedure TFrmTest.RAZPosBtnClick(Sender: TObject);
begin
TCUSB16IO_ResetPos(1);
end;
end.
==================================
unit uSetup;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TFrmSetup = class(TForm)
Label1: TLabel;
Edit1: TEdit;
BitBtn2: TBitBtn;
BitBtn1: TBitBtn;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmSetup: TFrmSetup;
function GetSerial: String;
implementation
{$R *.DFM}
function GetSerial: String;
begin
FrmSetup.Edit1.Text:='';
FrmSetup := TFrmSetup.Create(Application);
try
with FrmSetup do
if ShowModal = mrOK then
begin
GetSerial:=Edit1.Text;
end
else GetSerial:='';
finally
FrmSetUp.Free;
end;
end;
end.
===========================
Le problème est que je suis nouveau, que je n'ai jamais programmé en Delphi et encore moins piloter ce genre d'appareil....
Donc si quelqu'un pouvait me donner un coup de main, un conseil, sur la manière d'écrire les 3 fonctions que je souhaite créer, je vous en serait vraiment reconnaissant!

Ps: cette source n'est pas compilable(bibliothèque absente que l'on aura à la reception du boitier sur un cd)

3 réponses

Wiska Messages postés 15 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 13 août 2012
5 juin 2008 à 15:02
Oui et non ^^
Si tu veux, le programme que cette société est une demo qui sert à piloter le boitier, mais dans ce qu'il proposent,il y tout sauf se qui nous interesse.
Dans cette démo on va se servir de quasiment rien.
Normalement, la demo devait arrivé avec le boitier (que l'on a pas encore reçu) sur un cd plus les bibliothéque et la dll.
C'est mon supérieur qui a demandé a avoir la démo en avance pour pouvoir anticiper le problème en créant d'avance la petite appli qui nous faut en fonction de nos besoin...

En gros tout ce que ma boite veux, c'est utiliser une seule sortie sur le boitier, en contrôlant la sortie c'est-à-dire ouvrir (forcer la sortie à 0)et fermer (forcer la sortie à 1) le relais (se sont les 2 premières fonctions que je veux faire) et pouvoir lire l'état de cette sortie (la troisième fonction que je veux faire).
Je sais pas si j'ai été clair...
3
Utilisateur anonyme
5 juin 2008 à 16:31
Salut Pierre,

Tu risques de galérer : Premier projet, pas de connaissance en dev, pas de connaissance en automatisme : ca va etre un peu hard comme batème de l'air .

Ensuite pour répondre à  ta question : Sans doc et sans Dll personne ne pourra t'aiguiller, sauf si par hasard quelqu'un à ce genre de matériel. En attendant que tu recois le matériel, ce que je peux te conseiller c'est de te faire la main sur des petites choses : ca évitera que tu t'arraches trop les cheveux.

Sinon pour les meilleurs solutions :
*Demander  à cette société de vous développez le produit dont vous avez besoin : évidemment ca va couter.
*Payer quelqu'un pour vous faire ce travail : tu as une rubrique emploi si tu veux
*De renvoyez votre boitier et d'acheter une solution complète (boite + logiciel répondant à vos besoins) chez un autre fournisseur.

Si vous optez pour le faire vous meme : déjà je suis pas sur que vous avez le droit de développer un logiciel pour votre entreprise,  sans payer la licence. Ensuite ca risque quand meme de prendre beaucoup de temps avant d'y arriver (quelques mois) si le boitier résiste à vos tests (ce qui n'est pas sur).

A++ et réfléchit
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
5 juin 2008 à 16:41
Et puis la démo sans le boitier..
c'est pas très pro comme démarche..

Je rejoins Francky pour confirmer que du fait du contexte il faut négocier une solution clé en main ou que l'entreprise vienne chez vous
vous faire une démo avec tout le bazar.

cantador
3
Rejoignez-nous