3385
.pdf―сервер‖ и как ―клиент‖. Это позволяет в значительной степени упростить задачу равноценного обмена измерительной информацией при разработке ВИК.
ТЕХНОЛОГИЯ DDE
В WINDOWS имеются несколько технологий, позволяющих организовать эффективное взаимодействие группы приложений, одной из них является технология DDE, осуществляющая динамический обмен данными. С еѐ помощью программа – сервер осуществляет обмен данными с программой – клиент, используя для этого протокол обмена DDE. Абсолютное большинство приложений корпорации Micrjsoft поддерживают данный протокол и поэтому к ним можно обращаться при реализации своих программ, требующих обращения к стандартным «виндовским» процедурам. При наличии программы – сервера и программы – клиента до начала передачи данных меду ними необходимо установить связь. После осуществления этого возможна передача и приѐм данных в обеих направлениях. Технология DDE позволяет осуществить такую задачу наименее простым способом, что является значительным преимуществом при реализации ВИК для обеспечения максимального быстродействия системы в целом (особенно при реализации обмена меду внешними и внутренними приборами)
ОРГАНИЗАЦИЯ ОБМЕНА И РАСШИРЕНИЕ СОСТАВА ВИК
Для расширения функциональных возможностей ВИК необходимо выполнить ряд операций:
- при передаче данных от источника сигнала ,например, генератора вы ставляется команда «data» в поле Text (или нулевом элементе массива Lines), после чего элементам от 1 до 300 этого массива присваиваются значения времени и значение сигнала (в такой последовательности) в этот момент времени
(Lines 1 , time, Lines 2 - signal);
-при выключении прибора генерирующего сигналы (источника сигна ла) он должен выставить слово «poweroff» (маленькими буквами) в поле Text (или нулевом элементе массива Lines), для того, чтобы программа – клиент (например, осциллограф, частотомер или вольтметр) восприняли эту информацию должным образом и отреагировали на неѐ:
-при закрытии прибора, генерирующего сигналы, он должен выставить команду (сообщение) в виде «genclose» в поле Text (или нулевом элементе
массива Lines), для того, чтобы программы – клиенты отключили связь с программой – сервером;
- при добавлении нового виртуального средства измерений в состав ВИК необходимо, чтобы при его закрытии оно отсылало сообщение «менеджеру» для изменения информации об активизированных устройствах, это можно выполнить с помощью процедуры:
SendMessage(FindWindows(«TFExp»,«Менеджер устройств»),WM_XXXClose,0,0);
Application-ProcessMessages();
Slepp(500);
Здесь константа WM_XXXClose должна быть определена как
#define WM_XXXClose WM_USER – i, где i – любое целое число, кроме 2 и 3 (они уже заняты имеющимися ВСИ);
- в менеджере устройств добавить новое устройство, добавив код в программу – менеджер по аналогии с имеющимися в его составе ВСИ (смотри следующий раздел).
4.4.6. Программное обеспечение ВИК
Управляющая программа
WM_XXXClose//-------------------------------------------------------------------------
--
#ifndef ExpDeviceH #define ExpDeviceH
//---------------------------------------------------------------------------
#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <Menus.hpp>
#define WM_GenClose WM_USER-2 #define WM_OscClose WM_USER-3
//---------------------------------------------------------------------------
class TFExp : public TForm
{
__published: // IDE-managed Components TButton *Button1;
TButton *Button2;
TListBox *LBox1;
TListBox *LBox2; TLabel *Label1; TLabel *Label2;
TMainMenu *MainMenu1; TBevel *Bevel1; TMenuItem *Help; TMenuItem *About; TMenuItem *Sp;
TMenuItem *N1; TMenuItem *Close;
void __fastcall FormCreate(TObject *Sender); void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall CloseClick(TObject *Sender); void __fastcall AboutClick(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action); void __fastcall SpClick(TObject *Sender);
private: // User declarations bool tagosc,taggen,bootclic;
void __fastcall GenClose(TMessage& a); void __fastcall OscClose(TMessage& a); void __fastcall MyOnOsc();
void __fastcall MyOnGen();
public: // User declarations __fastcall TFExp(TComponent* Owner); BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_GenClose,TMessage,GenClose) MESSAGE_HANDLER(WM_OscClose,TMessage,OscClose) END_MESSAGE_MAP(TComponent)
}; //---------------------------------------------------------------------------
extern PACKAGE TFExp *FExp; //---------------------------------------------------------------------------
#endif
Программа – менеджер
object FExp: TFExp Left = 190
Top = 116
BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle
Caption = 'Менеджер устройств' ClientHeight = 304
ClientWidth = 422 Color = clBtnFace
Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
HelpFile = 'help\help.hlp'
Icon.Data = {
0000010001002020100000000000E8020000160000002800000020000000400
0
000001000400000000008002000000000000000000000000000000000000000
0
000000008000008000000080800080000000800080008080000080808000C0C
0
C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00
9999
999999999999999999999999999994444F00F40F444444444444444444499C4
4
4F00F40F444444444444444444499CC44F0F0F0F444444440000004444499 CCC
4F0F0F0F444440008888880044499CCCCF04F00F444008888888888804499 CCC
CF00000F4008F8F8F8F8888804499CCCCF04F00F0F8F8888888880000449
9CCC
CF0F0040F8F8F8F8F800078804499CCCCCF0040F8F888F88007778780449
9CCC
CCCFC0F8F8F8F8F00787878044499CCCCCCC0F8F8F8F80070878788044
499CCC
CCC0F8F8F8F807770787880444499CCCCCC0FFFF8F80777808787804444
99CCC
CC08F8F8F80F77870787804444499CCCCC0FFF8F80F0F778087804444449
9CCC
C0F8F8F8078F0F870787044444499CCCC0FF8FF07777F0F8088044444449
9CCC
C0F8F8F077878F0F0804444444499CCC0FFFFF07777878F00044444444499 CCC
0FF8F000000000000F4F444444499CCC0FFFF07778787880F0F0F44444499 CCC
0FF807878787870CCF00F44444499CCC0FFF0778787870CCF000F4444449
9CCC
0FF8078787800CCCCFFF0F4444499CCC0FF07878780CCCCCCCCCFF444
4499CCC
C0F0777700CCCCCCCCCCCC4444499CCCC0F07700CCCCCCCCCCCCC
CC444499CCC
CC0000CCCCCCCCCCCCCCCCCC44499CCCCCCCCCCCCCCCCCCCCC
CCCCCCC4499CCC
CCCCCCCCCCCCCCCCCCCCCCCCCC49999999999999999999999999999
999990000
000000000000000000000000000000000000000000000000000000000000000
0
000000000000000000000000000000000000000000000000000000000000000
0
000000000000000000000000000000000000000000000000000000000000000
0
000000000000000000000000000000000000000000000000000000000000} Menu = MainMenu1
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13
object Label1: TLabel Left = 48
Top = 8 Width = 189 Height = 16
Caption = 'Список имеющихся приборов' Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue Font.Height = -13 Font.Name = 'MS Sans Serif' Font.Style = []
ParentFont = False end
object Label2: TLabel Left = 32
Top = 160 Width = 242 Height = 16
Caption = 'Список активизированных приборов' Font.Charset = DEFAULT_CHARSET Font.Color = clBlue
Font.Height = -13 Font.Name = 'MS Sans Serif' Font.Style = []
ParentFont = False end
object Bevel1: TBevel Left = 0
Top = 0 Width = 422 Height = 2 Align = alTop
end
object Button1: TButton Left = 320
Top = 80 Width = 95 Height = 25
Caption = 'Вызвать прибор' TabOrder = 0
OnClick = Button1Click end
object Button2: TButton Left = 320
Top = 232
Width = 95
Height = 25
Caption = 'Убрать прибор' TabOrder = 1
OnClick = Button2Click end
object LBox1: TListBox Left = 0
Top = 32 Width = 310 Height = 120
ItemHeight = 13 TabOrder = 2
end
object LBox2: TListBox Left = 0
Top = 184 Width = 310 Height = 120 ItemHeight = 13 TabOrder = 3
end
object MainMenu1: TMainMenu Left = 344
Top = 264
object N1: TMenuItem Caption = '&Управление' object Close: TMenuItem
Caption = '&Закрыть'
OnClick = CloseClick end
end
object Help: TMenuItem Caption = '&Помощь' object Sp: TMenuItem
Caption = '&Справка' OnClick = SpClick
end
object About: TMenuItem Caption = '&Об авторах' OnClick = AboutClick
end end
end end
Программа – осциллограф
//---------------------------------------------------------------------------
#ifndef osilogH #define osilogH
//---------------------------------------------------------------------------
#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include "piereg.h" #include "Switch.h" #include <math.h> #include <ExtCtrls.hpp> #include <Graphics.hpp> #include <DdeMan.hpp> #include <Menus.hpp>
#define WM_OscClose WM_USER-3 //---------------------------------------------------------------------------
class STData
{
public:
__fastcall STData(); double t;
double u; };
STData* data[301];
class TFC167 : public TForm
{
__published: // IDE-managed Components TSwitch *SwTdel;
TPie *Pie1; TBevel *Bevel1; TLabel *Label3; TLabel *Label7; TImage *Power; TLabel *Label4; TLabel *Label6; TLabel *Label8; TLabel *Label9; TLabel *Label10; TLabel *Label11; TLabel *Label12; TLabel *Label13; TLabel *Label14; TLabel *Label15; TLabel *Label16;
TLabel *Label17; TLabel *Label18; TLabel *Label19; TLabel *Label20; TLabel *Label21; TLabel *Label22; TLabel *Label23; TLabel *Label24; TLabel *lst; TLabel *Label25; TImage *ImTrub; TPanel *Panel2; TImage *Image2; TImage *Image5; TLabel *Label5; TPanel *Panel1; TImage *Image3; TImage *Image4; TLabel *Label1; TLabel *Label2; TPanel *Panel3; TImage *ImSync; TPanel *PanelSwU; TSwitch *SwUdel; TLabel *Label27; TLabel *Label26; TLabel *Label28; TLabel *Label29; TLabel *Label30; TLabel *Label31; TLabel *Label32; TLabel *Label33; TLabel *Label34; TLabel *Label35; TLabel *Label36; TLabel *Label37; TLabel *Label38; TLabel *Label39; TTimer *Timer1; TImage *Image1; TLabel *Label40;
TPopupMenu *PMenu; TMenuItem *EnableS; TMenuItem *DisableS;
TDdeClientConv *ClientConv;
TDdeClientItem *ClientItem;
void __fastcall Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Image5MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Image2MouseUp(TObject *Sender, TMouseButton But-
ton,
TShiftState Shift, int X, int Y);
void __fastcall Image5MouseUp(TObject *Sender, TMouseButton But-
ton,
TShiftState Shift, int X, int Y);
void __fastcall FormShow(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); void __fastcall PowerClick(TObject *Sender); void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Image4MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Image4MouseUp(TObject *Sender, TMouseButton But-
ton,
TShiftState Shift, int X, int Y);
void __fastcall ImSyncMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall ImSyncMouseUp(TObject *Sender, TMouseButton But-
ton,
TShiftState Shift, int X, int Y);
void __fastcall SwTdelChangePos(TObject *Sender); void __fastcall EnableSClick(TObject *Sender); void __fastcall DisableSClick(TObject *Sender); void __fastcall ClientItemChange(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: |
// User declarations |
int HPos; |
|
int VPos; int YSync;
int RandStep; int FPos;
int dde;
// int FScal; bool cikl,power;
Graphics::TBitmap* overlay;