Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3385

.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
4.73 Mб
Скачать

―сервер‖ и как ―клиент‖. Это позволяет в значительной степени упростить задачу равноценного обмена измерительной информацией при разработке ВИК.

ТЕХНОЛОГИЯ 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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]