Інтерфейси автоматизованих систем управління

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”























Реферат на тему:

“ІНТЕРФЕЙСИ АВТОМАТИЗОВАНИХ СИСТЕМ УПРАВЛІННЯ”



























Львів – 2011


1. ТЕОРЕТИЧНІ ВІДОМОСТІ



Послідовна шина USB (Universal Serial Bus - універсальна послідовна шина) з'явилася по комп'ютерних мірках досить давно - версія першого затвердженого варіанту стандарту з'явилася 15 січня 1996 року. Розробка стандарту була ініційована вельми авторитетними фірмами - Intel, DEC, IBM, NEC, Northen Telecom і Compaq.

Основна мета стандарту – створити можливість користувачам працювати в режимі Plug&Play з периферійними пристроями. Це передбачає автоматичне розпізнавання пристрою відразу ж після підключення і наступного встановлення відповідних драйверів. Окрім цього, бажане живлення малопотужних пристроїв подається з самої шини. Швидкість шини є достатньою для більшості периферійних пристроїв. Контролер USB займає тільки одне переривання незалежно від кількості підключених до шини пристроїв.



1.1 Технічні характеристики USB



висока швидкість обміну (high-speed signaling bit rate, стандарт USB 2.0) – 480 Мбіт/с;

повна швидкість обміну (full-speed signaling bit rate, стандарт USB 1.1) - 12 Мбіт/с;

максимальна довжина кабелю (екранована вита пара) для високої та повної швидкості обміну - 5 м;

низька швидкість обміну (low-speed signaling bit rate, стандарт USB 1.0) - 1.5 Мбіт/с;

максимальна довжина кабелю (з’єднання за допомогою провідників) для низької швидкості обміну - 3 м;

максимальна кількість підключених пристроїв або навантажувальна здатність порту “ведучого” комп’ютера (включаючи розмножувачі) – 127;

можливе підключення пристроїв з різними швидкостями обміну;

напруга живлення для периферійних пристроїв USB - 5 В;

максимальний струм споживання на один периферійний пристрій - 500 мА.

Те, що довжини кабелів обмежені до 5-ти метрів для високих та повних швидкостей, і, до 3-х метрів для низької швидкості обумовлюється використанням кабелів стійких до електромагнітних завад (наводок) та звичайних кабелів, де з’єднання відбувається за допомогою провідників.

Особливо зручний цей інтерфейс для підключення пристроїв, які часто підключаються/відключаються, таких як цифрові фотокамери, флеш носії інформації і т.д. Конструкція роз'ємів для USB розрахована на багатократне приєднання/від’єднання.

Можливість використання тільки трьох швидкостей обміну даними обмежує вживаність шини, але істотно зменшує кількість ліній інтерфейсу і спрощує апаратну реалізацію.

Живлення безпосередньо від USB можливо тільки для пристроїв з малим споживанням струму до 500mA, таких як клавіатури, миші, джойстики і тому подібне.



1.2 Конструктивні особливості інтерфейсу USB



Для підключення периферійних пристроїв використовується 4-х жильний кабель. Кожен такий кабель має “A” роз'єм (Рис.1) на одній стороні і “B” на іншій (див. рис.2).






Рис. 1. Конструкція USB роз’єму - "А"



Роз'єм серії “A” призначений тільки для підключення до джерела, тобто до “ведучого” комп'ютера або до концентратора. Під “ведучим” комп’ютером тут і надалі розуміється комп’ютер, який містить кореневий концентратор.





Рис.2. Конструкція USB роз’єму "В"



Роз'єм серії “B” призначені тільки для підключення до периферійних пристроїв.

Призначення кожного контакту роз'ємів «А» та «В» наведено в табл. 1.



Таблиця 1

Призначення контактів

Номер контакту 

Призначення

Колір дроту

1

V BUS

Червоний

2

D-

Білий

3

D+

Зелений

4

GND

Чорний

Обплетення

екран

---



GND – корпус «земля»

VBus - +5 В

D+ - шина для передачі даних

D- - шина для прийому даних.

Кабель для підтримки повної швидкості шини (full-speed) виконується як кручена пара, захищається екраном і він може використовуватися для роботи в режимі мінімальної швидкості (low-speed). Кабель для роботи тільки на мінімальній швидкості (наприклад, для підключення миші) може бути неекранованим.



1.3 Передача даних



Інтерфейс USB сполучає між собою хост (host - головний управляючий пристрій, до якого під'єднуються однин або декілька USB-пристроїв) та безпосередньо самі пристрої. Хост знаходиться усередині персонального комп'ютера і управляє роботою всього інтерфейсу. Для того, щоб до одного порту USB можна було підключати більше ніж один пристрій, застосовуються USB хаб (usb hub - пристрій, що забезпечує підключення багатьох USB присторів до хоста комп'ютера). Кореневий хаб (root hub – хаб, який стоїть в ієрархії USB пристроїв найвище) знаходиться всередині комп'ютера і підключений безпосередньо до хосту комп'ютера. У інтерфейсі USB використовується спеціальний термін "функція" - це логічно завершений пристрій, який виконує яку-небудь специфічну процедуру. Топологія інтерфейсу USB є набором з 7 рівнів: на першому рівні знаходиться хост і кореневий хаб, а на останньому - тільки функції. Пристрій, до складу якого входить хаб і одна або декілька функцій, називається складеним.

Порт хаба або функції, що підключаються до хабу більш високого рівня, називається висхідним портом, а порт хаба, що підключається до хабу нижчого рівня або до функції називається низхідним портом.

Хост породжує всі передачі даних по інтерфейсу. Дані передаються у вигляді пакетів. У інтерфейсі USB використовується декілька пакетів: 

пакет-маркер (token paсket) описує тип і напрям передачі даних, адресу пристрою і порядковий номер кінцевої точки (кінцевої точка - частина USB-пристрою, що адресується); пакети-маркери бувають декількох типів: IN, OUT, SOF, SETUP;

пакет з даними (data packet) містить дані, що передаються;

пакет узгодження (handshake packet) призначений для повідомлення про результати пересилки даних; пакети узгодження бувають декількох типів: ACK, NAK, STALL.

Таким чином кожна транзакція складається з трьох фаз: фаза передачі пакету-маркера, фаза передачі даних і фаза узгодження.

У інтерфейсі USB використовуються декілька типів пересилань інформації:

управляюче пересилання (control transfer) використовується для конфігурації пристрою, а також для інших специфічних для конкретного пристрою цілей;

потокове пересилання (bulk transfer) використовується для передачі відносно великого об'єму інформації;

пересилання з перериванням (iterrupt transfer) використовується для передачі відносно невеликого об'єму інформації, для якого важлива своєчасна його пересилка. Має обмежену тривалість і підвищений пріоритет щодо інших типів пересилання;

ізохронне пересилання (isochronous transfer) також називається потоковим пересилання реального часу. Інформація, що передається в такому пересиланні, вимагає реального масштабу часу при її створенні, пересиланні і прийомі.

Потокові пересилання характеризуються гарантованою безпомилковою передачею даних між хостом і функцією за допомогою виявлення помилок при передачі і повторного запиту інформації.

Коли хост стає готовим приймати дані від функції, він передає IN-пакет типу пакет-маркер до функції. У відповідь на це функція передає хосту пакет з даними або, якщо вона не може зробити цього, передає NAK- або STALL-пакет. NAK-пакет повідомляє про тимчасову неготовність функції передавати дані, а STALL-пакет повідомляє про необхідність втручання хоста. Якщо хост успішно отримав дані, то він у фазі узгодження посилає функції ACK-пакет. Інакше - транзакція завершується.

Коли хост стає готовим передавати дані, він посилає функції OUT-пакет, що супроводжується пакетом з даними. Якщо функція успішно отримала дані, вона посилає хосту ACK-пакет, інакше відсилається NAK- або STALL-пакет.

Управляючі пересилання містять не менше двох стадій: стадія налаштування і статусна стадія. Між ними може також розміщуватись стадія передачі даних. Стадія налаштування використовується для виконання SETUP-транзакції, в процесі якої пересилається інформація в кінцевій точці, якою управляють. SETUP-транзакція містить SETUP-пакет, пакет з даним і пакет узгодження. Якщо пакет з даними отриманий функцією успішно, то вона посилає хосту ACK-пакет. Інакше транзакція завершується.

Всі транзакції у стадії передачі даних повинні проводитися в одному напрямі.

У статусній стадії проводиться остання транзакція, яка використовує ті ж принципи, що і в потокових пересиланнях. Напрям цієї транзакції протилежний тому, який використовувався у стадії передачі даних. Статусна стадія служить для повідомлення про результат виконання SETUP-стадії і стадії передачі даних. Статусна інформація завжди передається від функції до хоста. При управляючому записі (Control Write Transfer) статусна інформація передається у стані передачі даних статусної стадії транзакції. При управляючому читанні (Control Read Transfer) статусна інформація повертається у фазі узгодження статусної стадії транзакції після того, як хост відправить пакет даних нульової довжини в попередній фазі передачі даних.

Пересилання з перериванням можуть містити IN- або OUT-пересилання. При отриманні IN-пакета функція може повернути пакет з даними, NAK-пакет або STALL-пакет. Якщо у функції немає інформації про переривання, то у фазі передачі даних функція повертає NAK-пакет. Якщо робота КТ з перериванням припинена, то функція повертає STALL-пакет. При необхідності переривання функція повертає необхідну інформацію у фазі передачі даних. Якщо хост успішно отримав дані, то він посилає ACK-пакет. В протилежному випадку хост не відправляє узгоджувальний пакет.

Ізохронні транзакції містять фазу передачі маркера і фазу передачі даних, але не мають фази узгодження. Хост посилає IN- або OUT-маркер, після чого у фазі передачі даних контрольна точка (для IN- маркера) або хост (для OUT- маркера) пересилає дані. Ізохронні транзакції не підтримують фазу узгодження і повторні пересилання даних у разі виникнення помилок.



1.4 Міст USB-USB



1.4.1 Загальний опис

Найлегший шлях для з’єднання двох комп’ютерів – це використати USB-USB міст показаний на рис.3 та рис.4. Комутуючи два комп’ютери таким кабелем можна передавати файли з одного комп’ютера на інший, і навіть, створити мережу для доступу в інтернет через комп’ютер до якого підключені за допомогою такого кабелю (за умов, що цей комп’ютер має вихід в інтернет).





Рис.3. Вигляд USB-USB моста

інтерфейс шина хост мережа


Щодо швидкості, то мікроконтроллер USB моста може підтримувати стандарт USB 1.1 (12 Мбіт/с) або USB 2.0 (480 Мбіт/с).





Рис.4. Вигляд моста зсередини



1.4.2 Встановлення

USB-USB міст може працювати у двох режимах: режим прямого з’єднання та в режимі мережі (див. рис.5). 

Для режиму прямого з’єднання передбачене програмне забезпечення, яке додається в комплекті з кабелем. Воно дозволяє пересилати чи копіювати вибрані файли на\або з віддаленого комп’ютера. 

Процес встановлення драйверів для USB-USB кабелю залежить від виробника. Потрібно буде, перш за все встановити драйвери, а також програмне забезпечення, що йдуть в комплекті з кабелем на CD. Ця процедура повинна бути здійснена на обох комп’ютерах, без підключеного кабелю.

Деякі виробники постачають два різні файли установки, один для режиму прямого з’єднання, інший – для режиму мережі. Інші виробники постачають тільки один установочний файл, який підходить для обох режимів.





Рис.5. Вибір режиму роботи з програми пересилки


В режимі мережі, є можливість створити малу мережі між двома комп’ютерами. Після створення такої мережі з’являється можливість організації спільних папок, принтерів та доступу до Інтернет. 



1.4.2 Використання USB-USB моста

В даній лабораторній роботі використовується PCLinq2 Hi-Speed USB Bridge Cable кабель який дозволяє легко з’єднати два комп’ютери просто приєднавши кабель до кожного з них. Перед тим як розпочати роботу з програмою PCLinq2 (див. рис.7) потрібно в першу чергу запустити програму Setup на кожному з комп’ютерів.







Рис.6. Можливі режими роботи PCLinq2 кабелю





Рис.7. Програма пересилки PCLinq2, яка відповідає за взаємодію та файлову пересилку між двома комп’ютерами по PCLinq2 Hi-Speed USB Bridge Cable кабелю


Додаток 1. 



Код програми для роботи із COM портом

using System;

using System.IO;

using System.IO.Ports;

using System.Collections;

using System.Threading;



namespace Termie

{

public sealed class CommPort

 {

 SerialPort _serialPort;

Thread _readThread;

volatile bool _keepReading;



 //begin Singleton pattern

 static readonly CommPort instance = new CommPort();



// Explicit static constructor to tell C# compiler

 // not to mark type as beforefieldinit

 static CommPort()

 {

 }



 CommPort()

 {

_serialPort = new SerialPort();

_readThread = null;

_keepReading = false;

}



public static CommPort Instance

 {

 get

 {

 return instance;

 }

 }

 //end Singleton pattern



//begin Observer pattern

 public delegate void EventHandler(string param);

 public EventHandler StatusChanged;

 public EventHandler DataReceived;

 //end Observer pattern



private void StartReading()

{

if (!_keepReading)

{

_keepReading = true;

_readThread = new Thread(ReadPort);

_readThread.Start();

}

}



private void StopReading()

{

if (_keepReading)

{

_keepReading = false;

_readThread.Join();//block until exits

_readThread = null;

}

}



/// <summary> Get the data and pass it on. </summary>

private void ReadPort()

{

while (_keepReading)

{

if (_serialPort.IsOpen)

{

byte[] readBuffer = new byte[_serialPort.ReadBufferSize + 1];

try

{

// If there are bytes available on the serial port,

// Read returns up to "count" bytes, but will not block (wait)

// for the remaining bytes. If there are no bytes available

// on the serial port, Read will block until at least one byte

// is available on the port, up until the ReadTimeout milliseconds

// have elapsed, at which time a TimeoutException will be thrown.

int count = _serialPort.Read(readBuffer, 0, _serialPort.ReadBufferSize);

String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer,0,count);

DataReceived(SerialIn);

}

catch (TimeoutException) { }

}

else

{

TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);

Thread.Sleep(waitTime);

}

}

}



/// <summary> Open the serial port with current settings. </summary>

 public void Open()

 {

Close();



 try

 {

 _serialPort.PortName = Settings.Port.PortName;

 _serialPort.BaudRate = Settings.Port.BaudRate;

 _serialPort.Parity = Settings.Port.Parity;

 _serialPort.DataBits = Settings.Port.DataBits;

 _serialPort.StopBits = Settings.Port.StopBits;

 _serialPort.Handshake = Settings.Port.Handshake;



// Set the read/write timeouts

_serialPort.ReadTimeout = 50;

_serialPort.WriteTimeout = 50;



_serialPort.Open();

StartReading();

}

 catch (IOException)

 {

 StatusChanged(String.Format("{0} does not exist", Settings.Port.PortName));

 }

 catch (UnauthorizedAccessException)

 {

 StatusChanged(String.Format("{0} already in use", Settings.Port.PortName));

 }

 catch (Exception ex)

 {

 StatusChanged(String.Format("{0}", ex.ToString()));

 }



 // Update the status

 if (_serialPort.IsOpen)

 {

 string p = _serialPort.Parity.ToString().Substring(0, 1); //First char

 string h = _serialPort.Handshake.ToString();

 if (_serialPort.Handshake == Handshake.None)

 h = "no handshake"; // more descriptive than "None"



 StatusChanged(String.Format("{0}: {1} bps, {2}{3}{4}, {5}",

 _serialPort.PortName, _serialPort.BaudRate,

 _serialPort.DataBits, p, (int)_serialPort.StopBits, h));

 }

 else

 {

 StatusChanged(String.Format("{0} already in use", Settings.Port.PortName));

 }

 }



 /// <summary> Close the serial port. </summary>

 public void Close()

 {

StopReading();

_serialPort.Close();

 StatusChanged("connection closed");

 }



 /// <summary> Get the status of the serial port. </summary>

 public bool IsOpen

 {

 get

 {

 return _serialPort.IsOpen;

 }

 }



 /// <summary> Get a list of the available ports. Already opened ports

 /// are not returend. </summary>

 public string[] GetAvailablePorts()

 {

 return SerialPort.GetPortNames();

 }



 /// <summary>Send data to the serial port after appending line ending. </summary>

 /// <param name="data">An string containing the data to send. </param>

 public void Send(string data)

 {

 if (IsOpen)

 {

 string lineEnding = "";

 switch (Settings.Option.AppendToSend)

 {

 case Settings.Option.AppendType.AppendCR:

 lineEnding = "\r"; break;

 case Settings.Option.AppendType.AppendLF:

 lineEnding = "\n"; break;

 case Settings.Option.AppendType.AppendCRLF:

 lineEnding = "\r\n"; break;

 }



 _serialPort.Write(data + lineEnding);

 }

 }

 }

}